xref: /aosp_15_r20/external/json-schema-validator/src/test/suite/tests/draft2020-12/unevaluatedItems.json (revision 78c4dd6aa35290980cdcd1623a7e337e8d021c7c)
1[
2    {
3        "description": "unevaluatedItems true",
4        "schema": {
5            "$schema": "https://json-schema.org/draft/2020-12/schema",
6            "unevaluatedItems": true
7        },
8        "tests": [
9            {
10                "description": "with no unevaluated items",
11                "data": [],
12                "valid": true
13            },
14            {
15                "description": "with unevaluated items",
16                "data": ["foo"],
17                "valid": true
18            }
19        ]
20    },
21    {
22        "description": "unevaluatedItems false",
23        "schema": {
24            "$schema": "https://json-schema.org/draft/2020-12/schema",
25            "unevaluatedItems": false
26        },
27        "tests": [
28            {
29                "description": "with no unevaluated items",
30                "data": [],
31                "valid": true
32            },
33            {
34                "description": "with unevaluated items",
35                "data": ["foo"],
36                "valid": false
37            }
38        ]
39    },
40    {
41        "description": "unevaluatedItems as schema",
42        "schema": {
43            "$schema": "https://json-schema.org/draft/2020-12/schema",
44            "unevaluatedItems": { "type": "string" }
45        },
46        "tests": [
47            {
48                "description": "with no unevaluated items",
49                "data": [],
50                "valid": true
51            },
52            {
53                "description": "with valid unevaluated items",
54                "data": ["foo"],
55                "valid": true
56            },
57            {
58                "description": "with invalid unevaluated items",
59                "data": [42],
60                "valid": false
61            }
62        ]
63    },
64    {
65        "description": "unevaluatedItems with uniform items",
66        "schema": {
67            "$schema": "https://json-schema.org/draft/2020-12/schema",
68            "items": { "type": "string" },
69            "unevaluatedItems": false
70        },
71        "tests": [
72            {
73                "description": "unevaluatedItems doesn't apply",
74                "data": ["foo", "bar"],
75                "valid": true
76            }
77        ]
78    },
79    {
80        "description": "unevaluatedItems with tuple",
81        "schema": {
82            "$schema": "https://json-schema.org/draft/2020-12/schema",
83            "prefixItems": [
84                { "type": "string" }
85            ],
86            "unevaluatedItems": false
87        },
88        "tests": [
89            {
90                "description": "with no unevaluated items",
91                "data": ["foo"],
92                "valid": true
93            },
94            {
95                "description": "with unevaluated items",
96                "data": ["foo", "bar"],
97                "valid": false
98            }
99        ]
100    },
101    {
102        "description": "unevaluatedItems with items and prefixItems",
103        "schema": {
104            "$schema": "https://json-schema.org/draft/2020-12/schema",
105            "prefixItems": [
106                { "type": "string" }
107            ],
108            "items": true,
109            "unevaluatedItems": false
110        },
111        "tests": [
112            {
113                "description": "unevaluatedItems doesn't apply",
114                "data": ["foo", 42],
115                "valid": true
116            }
117        ]
118    },
119    {
120        "description": "unevaluatedItems with items",
121        "schema": {
122            "$schema": "https://json-schema.org/draft/2020-12/schema",
123            "items": {"type": "number"},
124            "unevaluatedItems": {"type": "string"}
125        },
126        "tests": [
127            {
128                "description": "valid under items",
129                "comment": "no elements are considered by unevaluatedItems",
130                "data": [5, 6, 7, 8],
131                "valid": true
132            },
133            {
134                "description": "invalid under items",
135                "data": ["foo", "bar", "baz"],
136                "valid": false
137            }
138        ]
139    },
140    {
141        "description": "unevaluatedItems with nested tuple",
142        "schema": {
143            "$schema": "https://json-schema.org/draft/2020-12/schema",
144            "prefixItems": [
145                { "type": "string" }
146            ],
147            "allOf": [
148                {
149                    "prefixItems": [
150                        true,
151                        { "type": "number" }
152                    ]
153                }
154            ],
155            "unevaluatedItems": false
156        },
157        "tests": [
158            {
159                "description": "with no unevaluated items",
160                "data": ["foo", 42],
161                "valid": true
162            },
163            {
164                "description": "with unevaluated items",
165                "data": ["foo", 42, true],
166                "valid": false
167            }
168        ]
169    },
170    {
171        "description": "unevaluatedItems with nested items",
172        "schema": {
173            "$schema": "https://json-schema.org/draft/2020-12/schema",
174            "unevaluatedItems": {"type": "boolean"},
175            "anyOf": [
176                { "items": {"type": "string"} },
177                true
178            ]
179        },
180        "tests": [
181            {
182                "description": "with only (valid) additional items",
183                "data": [true, false],
184                "valid": true
185            },
186            {
187                "description": "with no additional items",
188                "data": ["yes", "no"],
189                "valid": true
190            },
191            {
192                "description": "with invalid additional item",
193                "data": ["yes", false],
194                "valid": false
195            }
196        ]
197    },
198    {
199        "description": "unevaluatedItems with nested prefixItems and items",
200        "schema": {
201            "$schema": "https://json-schema.org/draft/2020-12/schema",
202            "allOf": [
203                {
204                    "prefixItems": [
205                        { "type": "string" }
206                    ],
207                    "items": true
208                }
209            ],
210            "unevaluatedItems": false
211        },
212        "tests": [
213            {
214                "description": "with no additional items",
215                "data": ["foo"],
216                "valid": true
217            },
218            {
219                "description": "with additional items",
220                "data": ["foo", 42, true],
221                "valid": true
222            }
223        ]
224    },
225    {
226        "description": "unevaluatedItems with nested unevaluatedItems",
227        "schema": {
228            "$schema": "https://json-schema.org/draft/2020-12/schema",
229            "allOf": [
230                {
231                    "prefixItems": [
232                        { "type": "string" }
233                    ]
234                },
235                { "unevaluatedItems": true }
236            ],
237            "unevaluatedItems": false
238        },
239        "tests": [
240            {
241                "description": "with no additional items",
242                "data": ["foo"],
243                "valid": true
244            },
245            {
246                "description": "with additional items",
247                "data": ["foo", 42, true],
248                "valid": true
249            }
250        ]
251    },
252    {
253        "description": "unevaluatedItems with anyOf",
254        "schema": {
255            "$schema": "https://json-schema.org/draft/2020-12/schema",
256            "prefixItems": [
257                { "const": "foo" }
258            ],
259            "anyOf": [
260                {
261                    "prefixItems": [
262                        true,
263                        { "const": "bar" }
264                    ]
265                },
266                {
267                    "prefixItems": [
268                        true,
269                        true,
270                        { "const": "baz" }
271                    ]
272                }
273            ],
274            "unevaluatedItems": false
275        },
276        "tests": [
277            {
278                "description": "when one schema matches and has no unevaluated items",
279                "data": ["foo", "bar"],
280                "valid": true
281            },
282            {
283                "description": "when one schema matches and has unevaluated items",
284                "data": ["foo", "bar", 42],
285                "valid": false
286            },
287            {
288                "description": "when two schemas match and has no unevaluated items",
289                "data": ["foo", "bar", "baz"],
290                "valid": true
291            },
292            {
293                "description": "when two schemas match and has unevaluated items",
294                "data": ["foo", "bar", "baz", 42],
295                "valid": false
296            }
297        ]
298    },
299    {
300        "description": "unevaluatedItems with oneOf",
301        "schema": {
302            "$schema": "https://json-schema.org/draft/2020-12/schema",
303            "prefixItems": [
304                { "const": "foo" }
305            ],
306            "oneOf": [
307                {
308                    "prefixItems": [
309                        true,
310                        { "const": "bar" }
311                    ]
312                },
313                {
314                    "prefixItems": [
315                        true,
316                        { "const": "baz" }
317                    ]
318                }
319            ],
320            "unevaluatedItems": false
321        },
322        "tests": [
323            {
324                "description": "with no unevaluated items",
325                "data": ["foo", "bar"],
326                "valid": true
327            },
328            {
329                "description": "with unevaluated items",
330                "data": ["foo", "bar", 42],
331                "valid": false
332            }
333        ]
334    },
335    {
336        "description": "unevaluatedItems with not",
337        "schema": {
338            "$schema": "https://json-schema.org/draft/2020-12/schema",
339            "prefixItems": [
340                { "const": "foo" }
341            ],
342            "not": {
343                "not": {
344                    "prefixItems": [
345                        true,
346                        { "const": "bar" }
347                    ]
348                }
349            },
350            "unevaluatedItems": false
351        },
352        "tests": [
353            {
354                "description": "with unevaluated items",
355                "data": ["foo", "bar"],
356                "valid": false
357            }
358        ]
359    },
360    {
361        "description": "unevaluatedItems with if/then/else",
362        "schema": {
363            "$schema": "https://json-schema.org/draft/2020-12/schema",
364            "prefixItems": [
365                { "const": "foo" }
366            ],
367            "if": {
368                "prefixItems": [
369                    true,
370                    { "const": "bar" }
371                ]
372            },
373            "then": {
374                "prefixItems": [
375                    true,
376                    true,
377                    { "const": "then" }
378                ]
379            },
380            "else": {
381                "prefixItems": [
382                    true,
383                    true,
384                    true,
385                    { "const": "else" }
386                ]
387            },
388            "unevaluatedItems": false
389        },
390        "tests": [
391            {
392                "description": "when if matches and it has no unevaluated items",
393                "data": ["foo", "bar", "then"],
394                "valid": true
395            },
396            {
397                "description": "when if matches and it has unevaluated items",
398                "data": ["foo", "bar", "then", "else"],
399                "valid": false
400            },
401            {
402                "description": "when if doesn't match and it has no unevaluated items",
403                "data": ["foo", 42, 42, "else"],
404                "valid": true
405            },
406            {
407                "description": "when if doesn't match and it has unevaluated items",
408                "data": ["foo", 42, 42, "else", 42],
409                "valid": false
410            }
411        ]
412    },
413    {
414        "description": "unevaluatedItems with boolean schemas",
415        "schema": {
416            "$schema": "https://json-schema.org/draft/2020-12/schema",
417            "allOf": [true],
418            "unevaluatedItems": false
419        },
420        "tests": [
421            {
422                "description": "with no unevaluated items",
423                "data": [],
424                "valid": true
425            },
426            {
427                "description": "with unevaluated items",
428                "data": ["foo"],
429                "valid": false
430            }
431        ]
432    },
433    {
434        "description": "unevaluatedItems with $ref",
435        "schema": {
436            "$schema": "https://json-schema.org/draft/2020-12/schema",
437            "$ref": "#/$defs/bar",
438            "prefixItems": [
439                { "type": "string" }
440            ],
441            "unevaluatedItems": false,
442            "$defs": {
443              "bar": {
444                  "prefixItems": [
445                      true,
446                      { "type": "string" }
447                  ]
448              }
449            }
450        },
451        "tests": [
452            {
453                "description": "with no unevaluated items",
454                "data": ["foo", "bar"],
455                "valid": true
456            },
457            {
458                "description": "with unevaluated items",
459                "data": ["foo", "bar", "baz"],
460                "valid": false
461            }
462        ]
463    },
464    {
465        "description": "unevaluatedItems before $ref",
466        "schema": {
467            "$schema": "https://json-schema.org/draft/2020-12/schema",
468            "unevaluatedItems": false,
469            "prefixItems": [
470                { "type": "string" }
471            ],
472            "$ref": "#/$defs/bar",
473            "$defs": {
474              "bar": {
475                  "prefixItems": [
476                      true,
477                      { "type": "string" }
478                  ]
479              }
480            }
481        },
482        "tests": [
483            {
484                "description": "with no unevaluated items",
485                "data": ["foo", "bar"],
486                "valid": true
487            },
488            {
489                "description": "with unevaluated items",
490                "data": ["foo", "bar", "baz"],
491                "valid": false
492            }
493        ]
494    },
495    {
496        "description": "unevaluatedItems with $dynamicRef",
497        "schema": {
498            "$schema": "https://json-schema.org/draft/2020-12/schema",
499            "$id": "https://example.com/unevaluated-items-with-dynamic-ref/derived",
500
501            "$ref": "./baseSchema",
502
503            "$defs": {
504                "derived": {
505                    "$dynamicAnchor": "addons",
506                    "prefixItems": [
507                        true,
508                        { "type": "string" }
509                    ]
510                },
511                "baseSchema": {
512                    "$id": "./baseSchema",
513
514                    "$comment": "unevaluatedItems comes first so it's more likely to catch bugs with implementations that are sensitive to keyword ordering",
515                    "unevaluatedItems": false,
516                    "type": "array",
517                    "prefixItems": [
518                        { "type": "string" }
519                    ],
520                    "$dynamicRef": "#addons",
521
522                    "$defs": {
523                        "defaultAddons": {
524                            "$comment": "Needed to satisfy the bookending requirement",
525                            "$dynamicAnchor": "addons"
526                        }
527                    }
528                }
529            }
530        },
531        "tests": [
532            {
533                "description": "with no unevaluated items",
534                "data": ["foo", "bar"],
535                "valid": true
536            },
537            {
538                "description": "with unevaluated items",
539                "data": ["foo", "bar", "baz"],
540                "valid": false
541            }
542        ]
543    },
544    {
545        "description": "unevaluatedItems can't see inside cousins",
546        "schema": {
547            "$schema": "https://json-schema.org/draft/2020-12/schema",
548            "allOf": [
549                {
550                    "prefixItems": [ true ]
551                },
552                { "unevaluatedItems": false }
553            ]
554        },
555        "tests": [
556            {
557                "description": "always fails",
558                "data": [ 1 ],
559                "valid": false
560            }
561        ]
562    },
563    {
564        "description": "item is evaluated in an uncle schema to unevaluatedItems",
565        "schema": {
566            "$schema": "https://json-schema.org/draft/2020-12/schema",
567            "properties": {
568                "foo": {
569                    "prefixItems": [
570                        { "type": "string" }
571                    ],
572                    "unevaluatedItems": false
573                  }
574            },
575            "anyOf": [
576                {
577                    "properties": {
578                        "foo": {
579                            "prefixItems": [
580                                true,
581                                { "type": "string" }
582                            ]
583                        }
584                    }
585                }
586            ]
587        },
588        "tests": [
589            {
590                "description": "no extra items",
591                "data": {
592                    "foo": [
593                        "test"
594                    ]
595                },
596                "valid": true
597            },
598            {
599                "description": "uncle keyword evaluation is not significant",
600                "data": {
601                    "foo": [
602                        "test",
603                        "test"
604                    ]
605                },
606                "valid": false
607            }
608        ]
609    },
610    {
611        "description": "unevaluatedItems depends on adjacent contains",
612        "schema": {
613            "$schema": "https://json-schema.org/draft/2020-12/schema",
614            "prefixItems": [true],
615            "contains": {"type": "string"},
616            "unevaluatedItems": false
617        },
618        "tests": [
619            {
620                "description": "second item is evaluated by contains",
621                "data": [ 1, "foo" ],
622                "valid": true
623            },
624            {
625                "description": "contains fails, second item is not evaluated",
626                "data": [ 1, 2 ],
627                "valid": false
628            },
629            {
630                "description": "contains passes, second item is not evaluated",
631                "data": [ 1, 2, "foo" ],
632                "valid": false
633            }
634        ]
635    },
636    {
637        "description": "unevaluatedItems depends on multiple nested contains",
638        "schema": {
639            "$schema": "https://json-schema.org/draft/2020-12/schema",
640            "allOf": [
641                { "contains": { "multipleOf": 2 } },
642                { "contains": { "multipleOf": 3 } }
643            ],
644            "unevaluatedItems": { "multipleOf": 5 }
645        },
646        "tests": [
647            {
648                "description": "5 not evaluated, passes unevaluatedItems",
649                "data": [ 2, 3, 4, 5, 6 ],
650                "valid": true
651            },
652            {
653                "description": "7 not evaluated, fails unevaluatedItems",
654                "data": [ 2, 3, 4, 7, 8 ],
655                "valid": false
656            }
657        ]
658    },
659    {
660        "description": "unevaluatedItems and contains interact to control item dependency relationship",
661        "schema": {
662            "$schema": "https://json-schema.org/draft/2020-12/schema",
663            "if": {
664                "contains": {"const": "a"}
665            },
666            "then": {
667                "if": {
668                    "contains": {"const": "b"}
669                },
670                "then": {
671                    "if": {
672                        "contains": {"const": "c"}
673                    }
674                }
675            },
676            "unevaluatedItems": false
677        },
678        "tests": [
679            {
680                "description": "empty array is valid",
681                "data": [],
682                "valid": true
683            },
684            {
685                "description": "only a's are valid",
686                "data": [ "a", "a" ],
687                "valid": true
688            },
689            {
690                "description": "a's and b's are valid",
691                "data": [ "a", "b", "a", "b", "a" ],
692                "valid": true
693            },
694            {
695                "description": "a's, b's and c's are valid",
696                "data": [ "c", "a", "c", "c", "b", "a" ],
697                "valid": true
698            },
699            {
700                "description": "only b's are invalid",
701                "data": [ "b", "b" ],
702                "valid": false
703            },
704            {
705                "description": "only c's are invalid",
706                "data": [ "c", "c" ],
707                "valid": false
708            },
709            {
710                "description": "only b's and c's are invalid",
711                "data": [ "c", "b", "c", "b", "c" ],
712                "valid": false
713            },
714            {
715                "description": "only a's and c's are invalid",
716                "data": [ "c", "a", "c", "a", "c" ],
717                "valid": false
718            }
719        ]
720    },
721    {
722        "description": "non-array instances are valid",
723        "schema": {
724            "$schema": "https://json-schema.org/draft/2020-12/schema",
725            "unevaluatedItems": false
726        },
727        "tests": [
728            {
729                "description": "ignores booleans",
730                "data": true,
731                "valid": true
732            },
733            {
734                "description": "ignores integers",
735                "data": 123,
736                "valid": true
737            },
738            {
739                "description": "ignores floats",
740                "data": 1.0,
741                "valid": true
742            },
743            {
744                "description": "ignores objects",
745                "data": {},
746                "valid": true
747            },
748            {
749                "description": "ignores strings",
750                "data": "foo",
751                "valid": true
752            },
753            {
754                "description": "ignores null",
755                "data": null,
756                "valid": true
757            }
758        ]
759    },
760    {
761        "description": "unevaluatedItems with null instance elements",
762        "schema": {
763            "$schema": "https://json-schema.org/draft/2020-12/schema",
764            "unevaluatedItems": {
765                "type": "null"
766            }
767        },
768        "tests": [
769            {
770                "description": "allows null elements",
771                "data": [ null ],
772                "valid": true
773            }
774        ]
775    },
776    {
777        "description": "unevaluatedItems can see annotations from if without then and else",
778        "schema": {
779            "$schema": "https://json-schema.org/draft/2020-12/schema",
780            "if": {
781                "prefixItems": [{"const": "a"}]
782            },
783            "unevaluatedItems": false
784        },
785        "tests": [
786            {
787                "description": "valid in case if is evaluated",
788                "data": [ "a" ],
789                "valid": true
790            },
791            {
792                "description": "invalid in case if is evaluated",
793                "data": [ "b" ],
794                "valid": false
795            }
796
797        ]
798    }
799]
800