blob: 1c791b240e103a89dfbba0ad64a1560e6e2775e5 [file] [log] [blame]
Colin Crossb6715442017-10-24 11:13:31 -07001// 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
15package android
16
17import (
18 "reflect"
19 "testing"
20)
21
22var firstUniqueStringsTestCases = []struct {
23 in []string
24 out []string
25}{
26 {
27 in: []string{"a"},
28 out: []string{"a"},
29 },
30 {
31 in: []string{"a", "b"},
32 out: []string{"a", "b"},
33 },
34 {
35 in: []string{"a", "a"},
36 out: []string{"a"},
37 },
38 {
39 in: []string{"a", "b", "a"},
40 out: []string{"a", "b"},
41 },
42 {
43 in: []string{"b", "a", "a"},
44 out: []string{"b", "a"},
45 },
46 {
47 in: []string{"a", "a", "b"},
48 out: []string{"a", "b"},
49 },
50 {
51 in: []string{"a", "b", "a", "b"},
52 out: []string{"a", "b"},
53 },
54 {
55 in: []string{"liblog", "libdl", "libc++", "libdl", "libc", "libm"},
56 out: []string{"liblog", "libdl", "libc++", "libc", "libm"},
57 },
58}
59
60func TestFirstUniqueStrings(t *testing.T) {
61 for _, testCase := range firstUniqueStringsTestCases {
62 out := FirstUniqueStrings(testCase.in)
63 if !reflect.DeepEqual(out, testCase.out) {
64 t.Errorf("incorrect output:")
65 t.Errorf(" input: %#v", testCase.in)
66 t.Errorf(" expected: %#v", testCase.out)
67 t.Errorf(" got: %#v", out)
68 }
69 }
70}
71
72var lastUniqueStringsTestCases = []struct {
73 in []string
74 out []string
75}{
76 {
77 in: []string{"a"},
78 out: []string{"a"},
79 },
80 {
81 in: []string{"a", "b"},
82 out: []string{"a", "b"},
83 },
84 {
85 in: []string{"a", "a"},
86 out: []string{"a"},
87 },
88 {
89 in: []string{"a", "b", "a"},
90 out: []string{"b", "a"},
91 },
92 {
93 in: []string{"b", "a", "a"},
94 out: []string{"b", "a"},
95 },
96 {
97 in: []string{"a", "a", "b"},
98 out: []string{"a", "b"},
99 },
100 {
101 in: []string{"a", "b", "a", "b"},
102 out: []string{"a", "b"},
103 },
104 {
105 in: []string{"liblog", "libdl", "libc++", "libdl", "libc", "libm"},
106 out: []string{"liblog", "libc++", "libdl", "libc", "libm"},
107 },
108}
109
110func TestLastUniqueStrings(t *testing.T) {
111 for _, testCase := range lastUniqueStringsTestCases {
112 out := LastUniqueStrings(testCase.in)
113 if !reflect.DeepEqual(out, testCase.out) {
114 t.Errorf("incorrect output:")
115 t.Errorf(" input: %#v", testCase.in)
116 t.Errorf(" expected: %#v", testCase.out)
117 t.Errorf(" got: %#v", out)
118 }
119 }
120}
Logan Chien5e877b12018-03-08 18:14:19 +0800121
122func TestJoinWithPrefix(t *testing.T) {
123 testcases := []struct {
124 name string
125 input []string
126 expected string
127 }{
128 {
129 name: "zero_inputs",
130 input: []string{},
131 expected: "",
132 },
133 {
134 name: "one_input",
135 input: []string{"a"},
136 expected: "prefix:a",
137 },
138 {
139 name: "two_inputs",
140 input: []string{"a", "b"},
141 expected: "prefix:a prefix:b",
142 },
143 }
144
145 prefix := "prefix:"
146
147 for _, testCase := range testcases {
148 t.Run(testCase.name, func(t *testing.T) {
149 out := JoinWithPrefix(testCase.input, prefix)
150 if out != testCase.expected {
151 t.Errorf("incorrect output:")
152 t.Errorf(" input: %#v", testCase.input)
153 t.Errorf(" prefix: %#v", prefix)
154 t.Errorf(" expected: %#v", testCase.expected)
155 t.Errorf(" got: %#v", out)
156 }
157 })
158 }
159}
160
161func TestIndexList(t *testing.T) {
162 input := []string{"a", "b", "c"}
163
164 testcases := []struct {
165 key string
166 expected int
167 }{
168 {
169 key: "a",
170 expected: 0,
171 },
172 {
173 key: "b",
174 expected: 1,
175 },
176 {
177 key: "c",
178 expected: 2,
179 },
180 {
181 key: "X",
182 expected: -1,
183 },
184 }
185
186 for _, testCase := range testcases {
187 t.Run(testCase.key, func(t *testing.T) {
188 out := IndexList(testCase.key, input)
189 if out != testCase.expected {
190 t.Errorf("incorrect output:")
191 t.Errorf(" key: %#v", testCase.key)
192 t.Errorf(" input: %#v", input)
193 t.Errorf(" expected: %#v", testCase.expected)
194 t.Errorf(" got: %#v", out)
195 }
196 })
197 }
198}
199
200func TestInList(t *testing.T) {
201 input := []string{"a"}
202
203 testcases := []struct {
204 key string
205 expected bool
206 }{
207 {
208 key: "a",
209 expected: true,
210 },
211 {
212 key: "X",
213 expected: false,
214 },
215 }
216
217 for _, testCase := range testcases {
218 t.Run(testCase.key, func(t *testing.T) {
219 out := InList(testCase.key, input)
220 if out != testCase.expected {
221 t.Errorf("incorrect output:")
222 t.Errorf(" key: %#v", testCase.key)
223 t.Errorf(" input: %#v", input)
224 t.Errorf(" expected: %#v", testCase.expected)
225 t.Errorf(" got: %#v", out)
226 }
227 })
228 }
229}
230
231func TestPrefixInList(t *testing.T) {
232 prefixes := []string{"a", "b"}
233
234 testcases := []struct {
235 str string
236 expected bool
237 }{
238 {
239 str: "a-example",
240 expected: true,
241 },
242 {
243 str: "b-example",
244 expected: true,
245 },
246 {
247 str: "X-example",
248 expected: false,
249 },
250 }
251
252 for _, testCase := range testcases {
253 t.Run(testCase.str, func(t *testing.T) {
254 out := PrefixInList(testCase.str, prefixes)
255 if out != testCase.expected {
256 t.Errorf("incorrect output:")
257 t.Errorf(" str: %#v", testCase.str)
258 t.Errorf(" prefixes: %#v", prefixes)
259 t.Errorf(" expected: %#v", testCase.expected)
260 t.Errorf(" got: %#v", out)
261 }
262 })
263 }
264}
265
266func TestFilterList(t *testing.T) {
267 input := []string{"a", "b", "c", "c", "b", "d", "a"}
268 filter := []string{"a", "c"}
269 remainder, filtered := FilterList(input, filter)
270
271 expected := []string{"b", "b", "d"}
272 if !reflect.DeepEqual(remainder, expected) {
273 t.Errorf("incorrect remainder output:")
274 t.Errorf(" input: %#v", input)
275 t.Errorf(" filter: %#v", filter)
276 t.Errorf(" expected: %#v", expected)
277 t.Errorf(" got: %#v", remainder)
278 }
279
280 expected = []string{"a", "c", "c", "a"}
281 if !reflect.DeepEqual(filtered, expected) {
282 t.Errorf("incorrect filtered output:")
283 t.Errorf(" input: %#v", input)
284 t.Errorf(" filter: %#v", filter)
285 t.Errorf(" expected: %#v", expected)
286 t.Errorf(" got: %#v", filtered)
287 }
288}
289
290func TestRemoveListFromList(t *testing.T) {
291 input := []string{"a", "b", "c", "d", "a", "c", "d"}
292 filter := []string{"a", "c"}
293 expected := []string{"b", "d", "d"}
294 out := RemoveListFromList(input, filter)
295 if !reflect.DeepEqual(out, expected) {
296 t.Errorf("incorrect output:")
297 t.Errorf(" input: %#v", input)
298 t.Errorf(" filter: %#v", filter)
299 t.Errorf(" expected: %#v", expected)
300 t.Errorf(" got: %#v", out)
301 }
302}
Logan Chien7922ab82018-03-06 18:29:27 +0800303
304func TestRemoveFromList(t *testing.T) {
305 testcases := []struct {
306 name string
307 key string
308 input []string
309 expectedFound bool
310 expectedOut []string
311 }{
312 {
313 name: "remove_one_match",
314 key: "a",
315 input: []string{"a", "b", "c"},
316 expectedFound: true,
317 expectedOut: []string{"b", "c"},
318 },
319 {
320 name: "remove_three_matches",
321 key: "a",
322 input: []string{"a", "b", "a", "c", "a"},
323 expectedFound: true,
324 expectedOut: []string{"b", "c"},
325 },
326 {
327 name: "remove_zero_matches",
328 key: "X",
329 input: []string{"a", "b", "a", "c", "a"},
330 expectedFound: false,
331 expectedOut: []string{"a", "b", "a", "c", "a"},
332 },
333 {
334 name: "remove_all_matches",
335 key: "a",
336 input: []string{"a", "a", "a", "a"},
337 expectedFound: true,
338 expectedOut: []string{},
339 },
340 }
341
342 for _, testCase := range testcases {
343 t.Run(testCase.name, func(t *testing.T) {
344 found, out := RemoveFromList(testCase.key, testCase.input)
345 if found != testCase.expectedFound {
346 t.Errorf("incorrect output:")
347 t.Errorf(" key: %#v", testCase.key)
348 t.Errorf(" input: %#v", testCase.input)
349 t.Errorf(" expected: %#v", testCase.expectedFound)
350 t.Errorf(" got: %#v", found)
351 }
352 if !reflect.DeepEqual(out, testCase.expectedOut) {
353 t.Errorf("incorrect output:")
354 t.Errorf(" key: %#v", testCase.key)
355 t.Errorf(" input: %#v", testCase.input)
356 t.Errorf(" expected: %#v", testCase.expectedOut)
357 t.Errorf(" got: %#v", out)
358 }
359 })
360 }
361}