| // Copyright 2015 Google Inc. All rights reserved |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package kati |
| |
| import ( |
| "fmt" |
| "reflect" |
| "testing" |
| ) |
| |
| func TestSplitSpaces(t *testing.T) { |
| for _, tc := range []struct { |
| in string |
| want []string |
| }{ |
| { |
| in: "foo", |
| want: []string{"foo"}, |
| }, |
| { |
| in: " ", |
| want: nil, |
| }, |
| { |
| in: " foo bar ", |
| want: []string{"foo", "bar"}, |
| }, |
| { |
| in: " foo bar", |
| want: []string{"foo", "bar"}, |
| }, |
| { |
| in: "foo bar ", |
| want: []string{"foo", "bar"}, |
| }, |
| } { |
| got := splitSpaces(tc.in) |
| if !reflect.DeepEqual(got, tc.want) { |
| t.Errorf(`splitSpaces(%q)=%q, want %q`, tc.in, got, tc.want) |
| } |
| } |
| } |
| |
| func TestWordScanner(t *testing.T) { |
| for _, tc := range []struct { |
| in string |
| want []string |
| }{ |
| { |
| in: "foo", |
| want: []string{"foo"}, |
| }, |
| { |
| in: " ", |
| want: nil, |
| }, |
| { |
| in: " foo bar ", |
| want: []string{"foo", "bar"}, |
| }, |
| { |
| in: " foo bar", |
| want: []string{"foo", "bar"}, |
| }, |
| { |
| in: "foo bar ", |
| want: []string{"foo", "bar"}, |
| }, |
| } { |
| ws := newWordScanner([]byte(tc.in)) |
| var got []string |
| for ws.Scan() { |
| got = append(got, string(ws.Bytes())) |
| } |
| if !reflect.DeepEqual(got, tc.want) { |
| t.Errorf(`wordScanner(%q)=%q, want %q`, tc.in, got, tc.want) |
| } |
| } |
| } |
| |
| func TestSubstPattern(t *testing.T) { |
| concatStr := func(pre, subst, post []byte) string { |
| var s []byte |
| s = append(s, pre...) |
| s = append(s, subst...) |
| s = append(s, post...) |
| return string(s) |
| } |
| |
| for _, tc := range []struct { |
| pat string |
| repl string |
| in string |
| want string |
| }{ |
| { |
| pat: "%.c", |
| repl: "%.o", |
| in: "x.c", |
| want: "x.o", |
| }, |
| { |
| pat: "c.%", |
| repl: "o.%", |
| in: "c.x", |
| want: "o.x", |
| }, |
| { |
| pat: "%.c", |
| repl: "%.o", |
| in: "x.c.c", |
| want: "x.c.o", |
| }, |
| { |
| pat: "%.c", |
| repl: "%.o", |
| in: "x.x y.c", |
| want: "x.x y.o", |
| }, |
| { |
| pat: "%.%.c", |
| repl: "OK", |
| in: "x.%.c", |
| want: "OK", |
| }, |
| { |
| pat: "x.c", |
| repl: "XX", |
| in: "x.c", |
| want: "XX", |
| }, |
| { |
| pat: "x.c", |
| repl: "XX", |
| in: "x.c.c", |
| want: "x.c.c", |
| }, |
| { |
| pat: "x.c", |
| repl: "XX", |
| in: "x.x.c", |
| want: "x.x.c", |
| }, |
| } { |
| got := substPattern(tc.pat, tc.repl, tc.in) |
| if got != tc.want { |
| t.Errorf(`substPattern(%q,%q,%q)=%q, want %q`, tc.pat, tc.repl, tc.in, got, tc.want) |
| } |
| |
| got = concatStr(substPatternBytes([]byte(tc.pat), []byte(tc.repl), []byte(tc.in))) |
| if got != tc.want { |
| fmt.Printf("substPatternBytes(%q,%q,%q)=%q, want %q\n", tc.pat, tc.repl, tc.in, got, tc.want) |
| t.Errorf(`substPatternBytes(%q,%q,%q)=%q, want %q`, tc.pat, tc.repl, tc.in, got, tc.want) |
| } |
| } |
| } |
| |
| func TestRemoveComment(t *testing.T) { |
| for _, tc := range []struct { |
| in string |
| want string |
| removed bool |
| }{ |
| { |
| in: "foo", |
| want: "foo", |
| }, |
| { |
| in: "foo #bar", |
| want: "foo ", |
| removed: true, |
| }, |
| { |
| in: `foo \#bar`, |
| want: "foo #bar", |
| }, |
| { |
| in: `foo \#bar # baz`, |
| want: `foo #bar `, |
| removed: true, |
| }, |
| { |
| in: `foo \\ \# \: \; \% \= \a \? \+`, |
| want: `foo \\ # \: \; \% \= \a \? \+`, |
| }, |
| { |
| in: `foo \\#bar`, |
| want: `foo \`, |
| removed: true, |
| }, |
| { |
| in: `foo \\\#bar`, |
| want: `foo \#bar`, |
| }, |
| { |
| in: `PASS:=\#PASS`, |
| want: `PASS:=#PASS`, |
| }, |
| } { |
| got, removed := removeComment([]byte(tc.in)) |
| if string(got) != tc.want { |
| t.Errorf("removeComment(%q)=%q, _; want=%q, _", tc.in, got, tc.want) |
| } |
| if removed != tc.removed { |
| t.Errorf("removeComment(%q)=_, %t; want=_, %t", tc.in, removed, tc.removed) |
| } |
| } |
| } |
| |
| func TestConcatline(t *testing.T) { |
| for _, tc := range []struct { |
| in string |
| want string |
| }{ |
| { |
| in: "foo", |
| want: "foo", |
| }, |
| { |
| in: "foo \\\n\t bar", |
| want: "foo bar", |
| }, |
| { |
| in: "foo \\\n \\\n\t bar", |
| want: "foo bar", |
| }, |
| { |
| in: `foo \`, |
| want: `foo `, |
| }, |
| { |
| in: `foo \\`, |
| want: `foo \\`, |
| }, |
| } { |
| got := string(concatline([]byte(tc.in))) |
| if got != tc.want { |
| t.Errorf("concatline(%q)=%q; want=%q\n", tc.in, got, tc.want) |
| } |
| } |
| } |