// 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) } } }