blob: 7e842a51b4ad0c12dec505b61545b27cedbf5834 [file] [log] [blame]
Colin Crossd00350c2017-11-17 10:55:38 -08001// Copyright 2017 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Colin Cross3f40fa42015-01-30 17:27:36 -080015package parser
16
17import (
18 "strings"
19 "testing"
20)
21
22var splitNTestCases = []struct {
23 in *MakeString
24 expected []*MakeString
25 sep string
26 n int
27}{
28 {
Sasha Smundakcbc17ee2020-11-29 12:51:55 -080029 // "a b c$(var1)d e f$(var2) h i j"
30 in: genMakeString("a b c", "var1", "d e f", "var2", " h i j"),
Colin Cross3f40fa42015-01-30 17:27:36 -080031 sep: " ",
32 n: -1,
33 expected: []*MakeString{
Sasha Smundakcbc17ee2020-11-29 12:51:55 -080034 genMakeString("a"),
35 genMakeString("b"),
36 genMakeString("c", "var1", "d"),
37 genMakeString("e"),
38 genMakeString("f", "var2", ""),
39 genMakeString("h"),
40 genMakeString("i"),
41 genMakeString("j"),
Colin Cross3f40fa42015-01-30 17:27:36 -080042 },
43 },
44 {
Sasha Smundakcbc17ee2020-11-29 12:51:55 -080045 // "a b c$(var1)d e f$(var2) h i j"
46 in: genMakeString("a b c", "var1", "d e f", "var2", " h i j"),
Colin Cross3f40fa42015-01-30 17:27:36 -080047 sep: " ",
48 n: 3,
49 expected: []*MakeString{
Sasha Smundakcbc17ee2020-11-29 12:51:55 -080050 genMakeString("a"),
51 genMakeString("b"),
52 genMakeString("c", "var1", "d e f", "var2", " h i j"),
53 },
54 },
55 {
56 // "$(var1) $(var2)"
57 in: genMakeString("", "var1", " ", "var2", ""),
58 sep: " ",
59 n: -1,
60 expected: []*MakeString{
61 genMakeString("", "var1", ""),
62 genMakeString("", "var2", ""),
63 },
64 },
65 {
66 // "a,,b,c,"
67 in: genMakeString("a,,b,c,"),
68 sep: ",",
69 n: -1,
70 expected: []*MakeString{
71 genMakeString("a"),
72 genMakeString(""),
73 genMakeString("b"),
74 genMakeString("c"),
75 genMakeString(""),
Colin Cross3f40fa42015-01-30 17:27:36 -080076 },
77 },
Cole Faust13238772022-04-28 14:29:57 -070078 {
79 // "x$(var1)y bar"
80 in: genMakeString("x", "var1", "y bar"),
81 sep: " ",
82 n: 2,
83 expected: []*MakeString{
84 genMakeString("x", "var1", "y"),
85 genMakeString("bar"),
86 },
87 },
Colin Cross3f40fa42015-01-30 17:27:36 -080088}
89
90func TestMakeStringSplitN(t *testing.T) {
91 for _, test := range splitNTestCases {
92 got := test.in.SplitN(test.sep, test.n)
93 gotString := dumpArray(got)
94 expectedString := dumpArray(test.expected)
95 if gotString != expectedString {
96 t.Errorf("expected:\n%s\ngot:\n%s", expectedString, gotString)
97 }
98 }
99}
100
Dan Willemsen43398532018-02-21 02:10:29 -0800101var valueTestCases = []struct {
102 in *MakeString
103 expected string
104}{
105 {
Sasha Smundakcbc17ee2020-11-29 12:51:55 -0800106 in: genMakeString("a b"),
Dan Willemsen43398532018-02-21 02:10:29 -0800107 expected: "a b",
108 },
109 {
Sasha Smundakcbc17ee2020-11-29 12:51:55 -0800110 in: genMakeString("a\\ \\\tb\\\\"),
Dan Willemsen43398532018-02-21 02:10:29 -0800111 expected: "a \tb\\",
112 },
113 {
Sasha Smundakcbc17ee2020-11-29 12:51:55 -0800114 in: genMakeString("a\\b\\"),
Dan Willemsen43398532018-02-21 02:10:29 -0800115 expected: "a\\b\\",
116 },
117}
118
119func TestMakeStringValue(t *testing.T) {
120 for _, test := range valueTestCases {
121 got := test.in.Value(nil)
122 if got != test.expected {
123 t.Errorf("\nwith: %q\nwant: %q\n got: %q", test.in.Dump(), test.expected, got)
124 }
125 }
126}
127
128var splitWordsTestCases = []struct {
129 in *MakeString
130 expected []*MakeString
131}{
132 {
Sasha Smundakcbc17ee2020-11-29 12:51:55 -0800133 in: genMakeString(""),
Dan Willemsen43398532018-02-21 02:10:29 -0800134 expected: []*MakeString{},
135 },
136 {
Sasha Smundakcbc17ee2020-11-29 12:51:55 -0800137 in: genMakeString(` a b\ c d`),
Dan Willemsen43398532018-02-21 02:10:29 -0800138 expected: []*MakeString{
Sasha Smundakcbc17ee2020-11-29 12:51:55 -0800139 genMakeString("a"),
140 genMakeString(`b\ c`),
141 genMakeString("d"),
Dan Willemsen43398532018-02-21 02:10:29 -0800142 },
143 },
144 {
Sasha Smundakcbc17ee2020-11-29 12:51:55 -0800145 in: SimpleMakeString(" a\tb"+`\`+"\t"+`\ c d `, NoPos),
Dan Willemsen43398532018-02-21 02:10:29 -0800146 expected: []*MakeString{
Sasha Smundakcbc17ee2020-11-29 12:51:55 -0800147 genMakeString("a"),
148 genMakeString("b" + `\` + "\t" + `\ c`),
149 genMakeString("d"),
Dan Willemsen43398532018-02-21 02:10:29 -0800150 },
151 },
152 {
Sasha Smundakcbc17ee2020-11-29 12:51:55 -0800153 in: genMakeString(`a\\ b\\\ c d`),
Dan Willemsen43398532018-02-21 02:10:29 -0800154 expected: []*MakeString{
Sasha Smundakcbc17ee2020-11-29 12:51:55 -0800155 genMakeString(`a\\`),
156 genMakeString(`b\\\ c`),
157 genMakeString("d"),
158 },
159 },
160 {
161 in: genMakeString(`\\ a`),
162 expected: []*MakeString{
163 genMakeString(`\\`),
164 genMakeString("a"),
165 },
166 },
167 {
168 // " "
169 in: &MakeString{
170 Strings: []string{" \t \t"},
171 Variables: nil,
172 },
173 expected: []*MakeString{},
174 },
175 {
176 // " a $(X)b c "
177 in: genMakeString(" a ", "X", "b c "),
178 expected: []*MakeString{
179 genMakeString("a"),
180 genMakeString("", "X", "b"),
181 genMakeString("c"),
182 },
183 },
184 {
185 // " a b$(X)c d"
186 in: genMakeString(" a b", "X", "c d"),
187 expected: []*MakeString{
188 genMakeString("a"),
189 genMakeString("b", "X", "c"),
190 genMakeString("d"),
191 },
192 },
193 {
194 // "$(X) $(Y)"
195 in: genMakeString("", "X", " ", "Y", ""),
196 expected: []*MakeString{
197 genMakeString("", "X", ""),
198 genMakeString("", "Y", ""),
199 },
200 },
201 {
202 // " a$(X) b"
203 in: genMakeString(" a", "X", " b"),
204 expected: []*MakeString{
205 genMakeString("a", "X", ""),
206 genMakeString("b"),
207 },
208 },
209 {
210 // "a$(X) b$(Y) "
211 in: genMakeString("a", "X", " b", "Y", " "),
212 expected: []*MakeString{
213 genMakeString("a", "X", ""),
214 genMakeString("b", "Y", ""),
Dan Willemsen43398532018-02-21 02:10:29 -0800215 },
216 },
217}
218
219func TestMakeStringWords(t *testing.T) {
220 for _, test := range splitWordsTestCases {
221 got := test.in.Words()
222 gotString := dumpArray(got)
223 expectedString := dumpArray(test.expected)
224 if gotString != expectedString {
225 t.Errorf("with:\n%q\nexpected:\n%s\ngot:\n%s", test.in.Dump(), expectedString, gotString)
226 }
227 }
228}
229
Cole Faust35b994e2022-04-27 13:37:32 -0700230var endsWithTestCases = []struct {
231 in *MakeString
232 endsWith rune
233 expected bool
234}{
235 {
236 in: genMakeString("foo", "X", "bar ="),
237 endsWith: '=',
238 expected: true,
239 },
240 {
241 in: genMakeString("foo", "X", "bar ="),
242 endsWith: ':',
243 expected: false,
244 },
245 {
246 in: genMakeString("foo", "X", ""),
247 endsWith: '=',
248 expected: false,
249 },
250}
251
252func TestMakeStringEndsWith(t *testing.T) {
253 for _, test := range endsWithTestCases {
254 if test.in.EndsWith(test.endsWith) != test.expected {
255 t.Errorf("with:\n%q\nexpected:\n%t\ngot:\n%t", test.in.Dump(), test.expected, !test.expected)
256 }
257 }
258}
259
Colin Cross3f40fa42015-01-30 17:27:36 -0800260func dumpArray(a []*MakeString) string {
261 ret := make([]string, len(a))
262
263 for i, s := range a {
264 ret[i] = s.Dump()
265 }
266
267 return strings.Join(ret, "|||")
268}
Sasha Smundakcbc17ee2020-11-29 12:51:55 -0800269
270// generates MakeString from alternating string chunks and variable names,
271// e.g., genMakeString("a", "X", "b") returns MakeString for "a$(X)b"
272func genMakeString(items ...string) *MakeString {
273 n := len(items) / 2
274 if len(items) != (2*n + 1) {
275 panic("genMakeString expects odd number of arguments")
276 }
277
278 ms := &MakeString{Strings: make([]string, n+1), Variables: make([]Variable, n)}
279 ms.Strings[0] = items[0]
280 for i := 1; i <= n; i++ {
281 ms.Variables[i-1] = Variable{Name: SimpleMakeString(items[2*i-1], NoPos)}
282 ms.Strings[i] = items[2*i]
283 }
284 return ms
285}