...
1-- in.cue --
2import (
3 "encoding/json"
4 "list"
5 "struct"
6)
7
8// non-monotonic builtins must fail with an "incomplete" error if there
9// is a possibility the constraint can get resolved by becoming more specific.
10incompleteError1: {
11 MyType: {
12 kv: struct.MinFields(1)
13 }
14
15 foo: MyType & {
16 kv: joel: "testing"
17 }
18}
19
20incompleteError2: {
21 MyType: {
22 kv: [string]: string
23 kv: struct.MinFields(1)
24 }
25
26 foo: MyType & {
27 kv: joel: "testing"
28 }
29}
30
31incompleteError3: {
32 t: string
33 t: json.Validate(string)
34}
35
36uniqueConstrains1: {
37 t: string
38 t: json.Validate(string)
39 t: json.Validate(string)
40}
41
42uniqueConstrains2: {
43 t: struct.MaxFields(1)
44 t: struct.MaxFields(1)
45}
46
47violation: {
48 #MyType: {
49 kv: [string]: string
50 kv: struct.MinFields(1)
51 }
52
53 foo: #MyType & {
54 kv: joel: "testing"
55 kv: tony: "testing"
56 }
57}
58
59conjuncts: {
60 kv: struct.MinFields(1)
61 kv: struct.MaxFields(3)
62}
63
64// TODO: stripe off conflicting pairs
65// conflicting: {
66// kv: struct.MinFields(3)
67// kv: struct.MaxFields(1)
68// }
69
70// Builtins with bool return that can be used as validator.
71
72bareBuiltin: {
73 a: json.Valid
74 a: json.Valid
75}
76
77bareBuiltinCheck: {
78 a: json.Valid
79 a: "3"
80}
81
82builtinValidator: {
83 a: json.Valid()
84 a: json.Valid()
85}
86
87builtinValidatorCheck: {
88 a: json.Valid()
89 a: "3"
90}
91
92callOfCallToValidator: {
93 a: json.Valid
94 b: a()
95 e: b() // not allowed
96 e: "5"
97}
98
99validatorAsFunction: {
100 a: json.Valid
101 b: a("3")
102 c: json.Valid("3")
103}
104
105issue2098: ok1: {
106 _a: [1, ...]
107 _a: list.MinItems(1)
108 _a[0]
109}
110
111issue2098: incomplete1: {
112 _a: [...]
113 _a: list.MinItems(1)
114 _a[0]
115}
116
117-- out/eval/stats --
118Leaks: 0
119Freed: 50
120Reused: 45
121Allocs: 5
122Retain: 0
123
124Unifications: 50
125Conjuncts: 91
126Disjuncts: 52
127-- out/evalalpha --
128Errors:
129callOfCallToValidator.e: cannot call previously called validator b:
130 ./in.cue:94:5
131
132Result:
133(_|_){
134 // [eval]
135 incompleteError1: (struct){
136 MyType: (struct){
137 kv: (struct){ struct.MinFields(1) }
138 }
139 foo: (struct){
140 kv: (struct){
141 joel: (string){ "testing" }
142 }
143 }
144 }
145 incompleteError2: (struct){
146 MyType: (struct){
147 kv: (_|_){
148 // [incomplete] incompleteError2.MyType.kv: invalid value {} (does not satisfy struct.MinFields(1)): len(fields) < MinFields(1) (0 < 1):
149 // ./in.cue:22:7
150 // ./in.cue:22:24
151 }
152 }
153 foo: (struct){
154 kv: (struct){
155 joel: (string){ "testing" }
156 }
157 }
158 }
159 incompleteError3: (struct){
160 t: (string){ &("encoding/json".Validate(string), string) }
161 }
162 uniqueConstrains1: (struct){
163 t: (string){ &("encoding/json".Validate(string), string) }
164 }
165 uniqueConstrains2: (struct){
166 t: (struct){ struct.MaxFields(1) }
167 }
168 violation: (struct){
169 #MyType: (#struct){
170 kv: (_|_){
171 // [incomplete] violation.#MyType.kv: invalid value {} (does not satisfy struct.MinFields(1)): len(fields) < MinFields(1) (0 < 1):
172 // ./in.cue:49:7
173 // ./in.cue:49:24
174 }
175 }
176 foo: (#struct){
177 kv: (#struct){
178 joel: (string){ "testing" }
179 tony: (string){ "testing" }
180 }
181 }
182 }
183 conjuncts: (struct){
184 kv: (struct){ &(struct.MinFields(1), struct.MaxFields(3)) }
185 }
186 bareBuiltin: (struct){
187 a: ((string|bytes)){ "encoding/json".Valid() }
188 }
189 bareBuiltinCheck: (struct){
190 a: (string){ "3" }
191 }
192 builtinValidator: (struct){
193 a: ((string|bytes)){ "encoding/json".Valid() }
194 }
195 builtinValidatorCheck: (struct){
196 a: (string){ "3" }
197 }
198 callOfCallToValidator: (_|_){
199 // [eval]
200 a: ((string|bytes)){ "encoding/json".Valid() }
201 b: ((string|bytes)){ "encoding/json".Valid() }
202 e: (_|_){
203 // [eval] callOfCallToValidator.e: cannot call previously called validator b:
204 // ./in.cue:94:5
205 }
206 }
207 validatorAsFunction: (struct){
208 a: ((string|bytes)){ "encoding/json".Valid() }
209 b: (bool){ true }
210 c: (bool){ true }
211 }
212 issue2098: (struct){
213 ok1: (int){
214 1
215 _a: (list){
216 0: (int){ 1 }
217 }
218 }
219 incomplete1: (struct){
220 _a: (_|_){
221 // [incomplete] issue2098.incomplete1._a: invalid value [] (does not satisfy list.MinItems(1)): len(list) < MinItems(1) (0 < 1):
222 // ./in.cue:112:6
223 // ./in.cue:112:20
224 }
225 }
226 }
227}
228-- diff/-out/evalalpha<==>+out/eval --
229diff old new
230--- old
231+++ new
232@@ -20,7 +20,6 @@
233 kv: (_|_){
234 // [incomplete] incompleteError2.MyType.kv: invalid value {} (does not satisfy struct.MinFields(1)): len(fields) < MinFields(1) (0 < 1):
235 // ./in.cue:22:7
236- // ./in.cue:21:7
237 // ./in.cue:22:24
238 }
239 }
240@@ -44,7 +43,6 @@
241 kv: (_|_){
242 // [incomplete] violation.#MyType.kv: invalid value {} (does not satisfy struct.MinFields(1)): len(fields) < MinFields(1) (0 < 1):
243 // ./in.cue:49:7
244- // ./in.cue:48:7
245 // ./in.cue:49:24
246 }
247 }
248@@ -91,15 +89,10 @@
249 0: (int){ 1 }
250 }
251 }
252- incomplete1: (_|_){
253- // [incomplete] issue2098.incomplete1._a: invalid value [] (does not satisfy list.MinItems(1)): len(list) < MinItems(1) (0 < 1):
254- // ./in.cue:112:6
255- // ./in.cue:111:6
256- // ./in.cue:112:20
257+ incomplete1: (struct){
258 _a: (_|_){
259 // [incomplete] issue2098.incomplete1._a: invalid value [] (does not satisfy list.MinItems(1)): len(list) < MinItems(1) (0 < 1):
260 // ./in.cue:112:6
261- // ./in.cue:111:6
262 // ./in.cue:112:20
263 }
264 }
265-- diff/todo/p2 --
266Missing error at incomplete1: index 0 is erased.
267-- out/eval --
268Errors:
269callOfCallToValidator.e: cannot call previously called validator b:
270 ./in.cue:94:5
271
272Result:
273(_|_){
274 // [eval]
275 incompleteError1: (struct){
276 MyType: (struct){
277 kv: (struct){ struct.MinFields(1) }
278 }
279 foo: (struct){
280 kv: (struct){
281 joel: (string){ "testing" }
282 }
283 }
284 }
285 incompleteError2: (struct){
286 MyType: (struct){
287 kv: (_|_){
288 // [incomplete] incompleteError2.MyType.kv: invalid value {} (does not satisfy struct.MinFields(1)): len(fields) < MinFields(1) (0 < 1):
289 // ./in.cue:22:7
290 // ./in.cue:21:7
291 // ./in.cue:22:24
292 }
293 }
294 foo: (struct){
295 kv: (struct){
296 joel: (string){ "testing" }
297 }
298 }
299 }
300 incompleteError3: (struct){
301 t: (string){ &("encoding/json".Validate(string), string) }
302 }
303 uniqueConstrains1: (struct){
304 t: (string){ &("encoding/json".Validate(string), string) }
305 }
306 uniqueConstrains2: (struct){
307 t: (struct){ struct.MaxFields(1) }
308 }
309 violation: (struct){
310 #MyType: (#struct){
311 kv: (_|_){
312 // [incomplete] violation.#MyType.kv: invalid value {} (does not satisfy struct.MinFields(1)): len(fields) < MinFields(1) (0 < 1):
313 // ./in.cue:49:7
314 // ./in.cue:48:7
315 // ./in.cue:49:24
316 }
317 }
318 foo: (#struct){
319 kv: (#struct){
320 joel: (string){ "testing" }
321 tony: (string){ "testing" }
322 }
323 }
324 }
325 conjuncts: (struct){
326 kv: (struct){ &(struct.MinFields(1), struct.MaxFields(3)) }
327 }
328 bareBuiltin: (struct){
329 a: ((string|bytes)){ "encoding/json".Valid() }
330 }
331 bareBuiltinCheck: (struct){
332 a: (string){ "3" }
333 }
334 builtinValidator: (struct){
335 a: ((string|bytes)){ "encoding/json".Valid() }
336 }
337 builtinValidatorCheck: (struct){
338 a: (string){ "3" }
339 }
340 callOfCallToValidator: (_|_){
341 // [eval]
342 a: ((string|bytes)){ "encoding/json".Valid() }
343 b: ((string|bytes)){ "encoding/json".Valid() }
344 e: (_|_){
345 // [eval] callOfCallToValidator.e: cannot call previously called validator b:
346 // ./in.cue:94:5
347 }
348 }
349 validatorAsFunction: (struct){
350 a: ((string|bytes)){ "encoding/json".Valid() }
351 b: (bool){ true }
352 c: (bool){ true }
353 }
354 issue2098: (struct){
355 ok1: (int){
356 1
357 _a: (list){
358 0: (int){ 1 }
359 }
360 }
361 incomplete1: (_|_){
362 // [incomplete] issue2098.incomplete1._a: invalid value [] (does not satisfy list.MinItems(1)): len(list) < MinItems(1) (0 < 1):
363 // ./in.cue:112:6
364 // ./in.cue:111:6
365 // ./in.cue:112:20
366 _a: (_|_){
367 // [incomplete] issue2098.incomplete1._a: invalid value [] (does not satisfy list.MinItems(1)): len(list) < MinItems(1) (0 < 1):
368 // ./in.cue:112:6
369 // ./in.cue:111:6
370 // ./in.cue:112:20
371 }
372 }
373 }
374}
375-- out/compile --
376--- in.cue
377{
378 incompleteError1: {
379 MyType: {
380 kv: 〈import;struct〉.MinFields(1)
381 }
382 foo: (〈0;MyType〉 & {
383 kv: {
384 joel: "testing"
385 }
386 })
387 }
388 incompleteError2: {
389 MyType: {
390 kv: {
391 [string]: string
392 }
393 kv: 〈import;struct〉.MinFields(1)
394 }
395 foo: (〈0;MyType〉 & {
396 kv: {
397 joel: "testing"
398 }
399 })
400 }
401 incompleteError3: {
402 t: string
403 t: 〈import;"encoding/json"〉.Validate(string)
404 }
405 uniqueConstrains1: {
406 t: string
407 t: 〈import;"encoding/json"〉.Validate(string)
408 t: 〈import;"encoding/json"〉.Validate(string)
409 }
410 uniqueConstrains2: {
411 t: 〈import;struct〉.MaxFields(1)
412 t: 〈import;struct〉.MaxFields(1)
413 }
414 violation: {
415 #MyType: {
416 kv: {
417 [string]: string
418 }
419 kv: 〈import;struct〉.MinFields(1)
420 }
421 foo: (〈0;#MyType〉 & {
422 kv: {
423 joel: "testing"
424 }
425 kv: {
426 tony: "testing"
427 }
428 })
429 }
430 conjuncts: {
431 kv: 〈import;struct〉.MinFields(1)
432 kv: 〈import;struct〉.MaxFields(3)
433 }
434 bareBuiltin: {
435 a: 〈import;"encoding/json"〉.Valid
436 a: 〈import;"encoding/json"〉.Valid
437 }
438 bareBuiltinCheck: {
439 a: 〈import;"encoding/json"〉.Valid
440 a: "3"
441 }
442 builtinValidator: {
443 a: 〈import;"encoding/json"〉.Valid()
444 a: 〈import;"encoding/json"〉.Valid()
445 }
446 builtinValidatorCheck: {
447 a: 〈import;"encoding/json"〉.Valid()
448 a: "3"
449 }
450 callOfCallToValidator: {
451 a: 〈import;"encoding/json"〉.Valid
452 b: 〈0;a〉()
453 e: 〈0;b〉()
454 e: "5"
455 }
456 validatorAsFunction: {
457 a: 〈import;"encoding/json"〉.Valid
458 b: 〈0;a〉("3")
459 c: 〈import;"encoding/json"〉.Valid("3")
460 }
461 issue2098: {
462 ok1: {
463 _a: [
464 1,
465 ...,
466 ]
467 _a: 〈import;list〉.MinItems(1)
468 〈0;_a〉[0]
469 }
470 }
471 issue2098: {
472 incomplete1: {
473 _a: [
474 ...,
475 ]
476 _a: 〈import;list〉.MinItems(1)
477 〈0;_a〉[0]
478 }
479 }
480}
View as plain text