Skip to content

Commit ba58ae5

Browse files
authored
Add initial conformance tests for lists ext (#528)
1 parent 80d2da3 commit ba58ae5

1 file changed

Lines changed: 293 additions & 0 deletions

File tree

Lines changed: 293 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,293 @@
1+
# proto-file: ../../../proto/cel/expr/conformance/test/simple.proto
2+
# proto-message: cel.expr.conformance.test.SimpleTestFile
3+
4+
name: "lists_ext"
5+
description: "Tests for the lists extension library."
6+
section: {
7+
name: "slice"
8+
description: "slice: since version 0"
9+
test: {
10+
name: "sublist"
11+
expr: "[1, 2, 3, 4].slice(1, 3) == [2, 3]"
12+
}
13+
test: {
14+
name: "full"
15+
expr: "[1, 2, 3, 4].slice(0, 4) == [1, 2, 3, 4]"
16+
}
17+
test: {
18+
name: "empty_start"
19+
expr: "[1, 2, 3, 4].slice(0, 0) == []"
20+
}
21+
test: {
22+
name: "empty_middle"
23+
expr: "[1, 2, 3, 4].slice(2, 2) == []"
24+
}
25+
test: {
26+
name: "empty_end"
27+
expr: "[1, 2, 3, 4].slice(4, 4) == []"
28+
}
29+
test: {
30+
name: "start_greater_than_end"
31+
expr: "[1, 2, 3, 4].slice(3, 1)"
32+
eval_error: {
33+
errors: {
34+
message: "invalid_argument"
35+
}
36+
}
37+
}
38+
test: {
39+
name: "end_greater_than_length"
40+
expr: "[1, 2, 3, 4].slice(1, 5)"
41+
eval_error: {
42+
errors: {
43+
message: "invalid_argument"
44+
}
45+
}
46+
}
47+
test: {
48+
name: "negative_start_index"
49+
expr: "[1, 2, 3, 4].slice(-1, 2)"
50+
eval_error: {
51+
errors: {
52+
message: "invalid_argument"
53+
}
54+
}
55+
}
56+
test: {
57+
name: "negative_end_index"
58+
expr: "[1, 2, 3, 4].slice(1, -1)"
59+
eval_error: {
60+
errors: {
61+
message: "invalid_argument"
62+
}
63+
}
64+
}
65+
}
66+
section: {
67+
name: "flatten"
68+
description: "flatten: since version 1"
69+
test: {
70+
name: "default_depth"
71+
expr: "[1, [2, 3], [4]].flatten() == [1, 2, 3, 4]"
72+
}
73+
test: {
74+
name: "default_depth_nested"
75+
expr: "[1, [2, [3, 4]]].flatten() == [1, 2, [3, 4]]"
76+
}
77+
test: {
78+
name: "empty_sublists"
79+
expr: "[1, 2, [], [], [3, 4]].flatten() == [1, 2, 3, 4]"
80+
}
81+
test: {
82+
name: "depth_two"
83+
expr: "[1, [2, [3, [4]]]].flatten(2) == [1, 2, 3, [4]]"
84+
}
85+
test: {
86+
name: "depth_zero"
87+
expr: "[1, [2, 3]].flatten(0) == [1, [2, 3]]"
88+
}
89+
test: {
90+
name: "empty_list"
91+
expr: "dyn([]).flatten() == []"
92+
}
93+
test: {
94+
name: "already_flat"
95+
expr: "dyn([1, 2, 3]).flatten() == [1, 2, 3]"
96+
}
97+
test: {
98+
name: "negative_depth"
99+
expr: "[1, [2, 3]].flatten(-1)"
100+
eval_error: {
101+
errors: {
102+
message: "invalid_argument"
103+
}
104+
}
105+
}
106+
}
107+
section: {
108+
name: "distinct"
109+
description: "distinct: since version 2"
110+
test: {
111+
name: "ints"
112+
expr: "[1, 2, 2, 3, 3, 3].distinct() == [1, 2, 3]"
113+
}
114+
test: {
115+
name: "strings"
116+
expr: "[\"b\", \"b\", \"c\", \"a\", \"c\"].distinct() == [\"b\", \"c\", \"a\"]"
117+
}
118+
test: {
119+
name: "heterogeneous"
120+
expr: "[1, \"b\", 2, \"b\"].distinct() == [1, \"b\", 2]"
121+
}
122+
test: {
123+
name: "empty"
124+
expr: "[].distinct() == []"
125+
}
126+
test: {
127+
name: "single_element"
128+
expr: "[1].distinct() == [1]"
129+
}
130+
test: {
131+
name: "uints"
132+
expr: "[2u, 5u, 100u, 1u, 1u, 5u].distinct() == [2u, 5u, 100u, 1u]"
133+
}
134+
test: {
135+
name: "bools"
136+
expr: "[false, true, true, false].distinct() == [false, true]"
137+
}
138+
}
139+
section: {
140+
name: "range"
141+
description: "lists.range: since version 2"
142+
test: {
143+
name: "positive"
144+
expr: "lists.range(5) == [0, 1, 2, 3, 4]"
145+
}
146+
test: {
147+
name: "zero"
148+
expr: "lists.range(0) == []"
149+
}
150+
test: {
151+
name: "single"
152+
expr: "lists.range(1) == [0]"
153+
}
154+
test: {
155+
name: "negative_error"
156+
expr: "lists.range(-1)"
157+
eval_error: {
158+
errors: {
159+
message: "invalid_argument"
160+
}
161+
}
162+
}
163+
test: {
164+
name: "limit_exceeded_error"
165+
# Assumed to be overridable, but check that a reasonable limit is in place
166+
# by default.
167+
expr: "lists.range(1000001)"
168+
eval_error: {
169+
errors: {
170+
message: "invalid_argument"
171+
}
172+
}
173+
}
174+
}
175+
section: {
176+
name: "reverse"
177+
description: "reverse: since version 2"
178+
test: {
179+
name: "integers"
180+
expr: "[5, 3, 1, 2].reverse() == [2, 1, 3, 5]"
181+
}
182+
test: {
183+
name: "strings"
184+
expr: "[\"are\", \"you\", \"as\", \"bored\"].reverse() == [\"bored\", \"as\", \"you\", \"are\"]"
185+
}
186+
test: {
187+
name: "empty"
188+
expr: "[].reverse() == []"
189+
}
190+
test: {
191+
name: "single"
192+
expr: "[1].reverse() == [1]"
193+
}
194+
test: {
195+
name: "double_reverse"
196+
expr: "[false, true, true].reverse().reverse() == [false, true, true]"
197+
}
198+
}
199+
section: {
200+
name: "sort"
201+
description: "sort: since version 2"
202+
test: {
203+
name: "integers"
204+
expr: "[3, 2, 1].sort() == [1, 2, 3]"
205+
}
206+
test: {
207+
name: "uints"
208+
expr: "[42u, 3u, 1337u].sort() == [3u, 42u, 1337u]"
209+
}
210+
test: {
211+
name: "doubles"
212+
expr: "[1.0, -1.5, 2.0].sort() == [-1.5, 1.0, 2.0]"
213+
}
214+
test: {
215+
name: "strings"
216+
expr: "[\"b\", \"c\", \"a\"].sort() == [\"a\", \"b\", \"c\"]"
217+
}
218+
test: {
219+
name: "bytes"
220+
expr: "[b\"d\", b\"a\", b\"aa\"].sort() == [b\"a\", b\"aa\", b\"d\"]"
221+
}
222+
test: {
223+
name: "bools"
224+
expr: "[true, false, true].sort() == [false, true, true]"
225+
}
226+
test: {
227+
name: "durations"
228+
expr: "[duration('1m'), duration('2s'), duration('3h')].sort() == [duration('2s'), duration('1m'), duration('3h')]"
229+
}
230+
test: {
231+
name: "timestamps"
232+
expr: "[timestamp('2024-01-03T00:00:00Z'), timestamp('2024-01-01T00:00:00Z')].sort() == [timestamp('2024-01-01T00:00:00Z'), timestamp('2024-01-03T00:00:00Z')]"
233+
}
234+
test: {
235+
name: "empty"
236+
expr: "[].sort() == []"
237+
}
238+
test: {
239+
name: "single"
240+
expr: "[1].sort() == [1]"
241+
}
242+
test: {
243+
name: "mixed_types_error"
244+
expr: "[1, \"b\"].sort()"
245+
eval_error: {
246+
errors: {
247+
message: "invalid_argument"
248+
}
249+
}
250+
}
251+
test: {
252+
name: "incomparable_type_error"
253+
expr: "dyn([[1, 2, 3]]).sort()"
254+
eval_error: {
255+
errors: {
256+
message: "invalid_argument"
257+
}
258+
}
259+
}
260+
}
261+
section: {
262+
name: "sortBy"
263+
description: "sortBy: since version 2"
264+
test: {
265+
name: "number_key"
266+
expr: "[-3, 1, -5, -2, 4].sortBy(e, -(e * e)) == [-5, 4, -3, -2, 1]"
267+
}
268+
test: {
269+
name: "identity_key"
270+
expr: "[1, 2, 3].sortBy(e, -e) == [3, 2, 1]"
271+
}
272+
test: {
273+
name: "string_key"
274+
expr: "[\"a\", \"c\", \"b\", \"first\"].sortBy(e, e == \"first\" ? \"\" : e) == [\"first\", \"a\", \"b\", \"c\"]"
275+
}
276+
test: {
277+
name: "empty"
278+
expr: "[].sortBy(e, e) == []"
279+
}
280+
test: {
281+
name: "single"
282+
expr: "[\"a\"].sortBy(e, e) == [\"a\"]"
283+
}
284+
test: {
285+
name: "mixed_key_types_error"
286+
expr: "[[1], [\"a\"]].sortBy(e, e[0])"
287+
eval_error: {
288+
errors: {
289+
message: "invalid_argument"
290+
}
291+
}
292+
}
293+
}

0 commit comments

Comments
 (0)