1[ 2 { 3 "description": "uniqueItems validation", 4 "schema": { 5 "$schema": "https://json-schema.org/draft/2019-09/schema", 6 "uniqueItems": true 7 }, 8 "tests": [ 9 { 10 "description": "unique array of integers is valid", 11 "data": [1, 2], 12 "valid": true 13 }, 14 { 15 "description": "non-unique array of integers is invalid", 16 "data": [1, 1], 17 "valid": false 18 }, 19 { 20 "description": "non-unique array of more than two integers is invalid", 21 "data": [1, 2, 1], 22 "valid": false 23 }, 24 { 25 "description": "numbers are unique if mathematically unequal", 26 "data": [1.0, 1.00, 1], 27 "valid": false 28 }, 29 { 30 "description": "false is not equal to zero", 31 "data": [0, false], 32 "valid": true 33 }, 34 { 35 "description": "true is not equal to one", 36 "data": [1, true], 37 "valid": true 38 }, 39 { 40 "description": "unique array of strings is valid", 41 "data": ["foo", "bar", "baz"], 42 "valid": true 43 }, 44 { 45 "description": "non-unique array of strings is invalid", 46 "data": ["foo", "bar", "foo"], 47 "valid": false 48 }, 49 { 50 "description": "unique array of objects is valid", 51 "data": [{"foo": "bar"}, {"foo": "baz"}], 52 "valid": true 53 }, 54 { 55 "description": "non-unique array of objects is invalid", 56 "data": [{"foo": "bar"}, {"foo": "bar"}], 57 "valid": false 58 }, 59 { 60 "description": "property order of array of objects is ignored", 61 "data": [{"foo": "bar", "bar": "foo"}, {"bar": "foo", "foo": "bar"}], 62 "valid": false 63 }, 64 { 65 "description": "unique array of nested objects is valid", 66 "data": [ 67 {"foo": {"bar" : {"baz" : true}}}, 68 {"foo": {"bar" : {"baz" : false}}} 69 ], 70 "valid": true 71 }, 72 { 73 "description": "non-unique array of nested objects is invalid", 74 "data": [ 75 {"foo": {"bar" : {"baz" : true}}}, 76 {"foo": {"bar" : {"baz" : true}}} 77 ], 78 "valid": false 79 }, 80 { 81 "description": "unique array of arrays is valid", 82 "data": [["foo"], ["bar"]], 83 "valid": true 84 }, 85 { 86 "description": "non-unique array of arrays is invalid", 87 "data": [["foo"], ["foo"]], 88 "valid": false 89 }, 90 { 91 "description": "non-unique array of more than two arrays is invalid", 92 "data": [["foo"], ["bar"], ["foo"]], 93 "valid": false 94 }, 95 { 96 "description": "1 and true are unique", 97 "data": [1, true], 98 "valid": true 99 }, 100 { 101 "description": "0 and false are unique", 102 "data": [0, false], 103 "valid": true 104 }, 105 { 106 "description": "[1] and [true] are unique", 107 "data": [[1], [true]], 108 "valid": true 109 }, 110 { 111 "description": "[0] and [false] are unique", 112 "data": [[0], [false]], 113 "valid": true 114 }, 115 { 116 "description": "nested [1] and [true] are unique", 117 "data": [[[1], "foo"], [[true], "foo"]], 118 "valid": true 119 }, 120 { 121 "description": "nested [0] and [false] are unique", 122 "data": [[[0], "foo"], [[false], "foo"]], 123 "valid": true 124 }, 125 { 126 "description": "unique heterogeneous types are valid", 127 "data": [{}, [1], true, null, 1, "{}"], 128 "valid": true 129 }, 130 { 131 "description": "non-unique heterogeneous types are invalid", 132 "data": [{}, [1], true, null, {}, 1], 133 "valid": false 134 }, 135 { 136 "description": "different objects are unique", 137 "data": [{"a": 1, "b": 2}, {"a": 2, "b": 1}], 138 "valid": true 139 }, 140 { 141 "description": "objects are non-unique despite key order", 142 "data": [{"a": 1, "b": 2}, {"b": 2, "a": 1}], 143 "valid": false 144 }, 145 { 146 "description": "{\"a\": false} and {\"a\": 0} are unique", 147 "data": [{"a": false}, {"a": 0}], 148 "valid": true 149 }, 150 { 151 "description": "{\"a\": true} and {\"a\": 1} are unique", 152 "data": [{"a": true}, {"a": 1}], 153 "valid": true 154 } 155 ] 156 }, 157 { 158 "description": "uniqueItems with an array of items", 159 "schema": { 160 "$schema": "https://json-schema.org/draft/2019-09/schema", 161 "items": [{"type": "boolean"}, {"type": "boolean"}], 162 "uniqueItems": true 163 }, 164 "tests": [ 165 { 166 "description": "[false, true] from items array is valid", 167 "data": [false, true], 168 "valid": true 169 }, 170 { 171 "description": "[true, false] from items array is valid", 172 "data": [true, false], 173 "valid": true 174 }, 175 { 176 "description": "[false, false] from items array is not valid", 177 "data": [false, false], 178 "valid": false 179 }, 180 { 181 "description": "[true, true] from items array is not valid", 182 "data": [true, true], 183 "valid": false 184 }, 185 { 186 "description": "unique array extended from [false, true] is valid", 187 "data": [false, true, "foo", "bar"], 188 "valid": true 189 }, 190 { 191 "description": "unique array extended from [true, false] is valid", 192 "data": [true, false, "foo", "bar"], 193 "valid": true 194 }, 195 { 196 "description": "non-unique array extended from [false, true] is not valid", 197 "data": [false, true, "foo", "foo"], 198 "valid": false 199 }, 200 { 201 "description": "non-unique array extended from [true, false] is not valid", 202 "data": [true, false, "foo", "foo"], 203 "valid": false 204 } 205 ] 206 }, 207 { 208 "description": "uniqueItems with an array of items and additionalItems=false", 209 "schema": { 210 "$schema": "https://json-schema.org/draft/2019-09/schema", 211 "items": [{"type": "boolean"}, {"type": "boolean"}], 212 "uniqueItems": true, 213 "additionalItems": false 214 }, 215 "tests": [ 216 { 217 "description": "[false, true] from items array is valid", 218 "data": [false, true], 219 "valid": true 220 }, 221 { 222 "description": "[true, false] from items array is valid", 223 "data": [true, false], 224 "valid": true 225 }, 226 { 227 "description": "[false, false] from items array is not valid", 228 "data": [false, false], 229 "valid": false 230 }, 231 { 232 "description": "[true, true] from items array is not valid", 233 "data": [true, true], 234 "valid": false 235 }, 236 { 237 "description": "extra items are invalid even if unique", 238 "data": [false, true, null], 239 "valid": false 240 } 241 ] 242 }, 243 { 244 "description": "uniqueItems=false validation", 245 "schema": { 246 "$schema": "https://json-schema.org/draft/2019-09/schema", 247 "uniqueItems": false 248 }, 249 "tests": [ 250 { 251 "description": "unique array of integers is valid", 252 "data": [1, 2], 253 "valid": true 254 }, 255 { 256 "description": "non-unique array of integers is valid", 257 "data": [1, 1], 258 "valid": true 259 }, 260 { 261 "description": "numbers are unique if mathematically unequal", 262 "data": [1.0, 1.00, 1], 263 "valid": true 264 }, 265 { 266 "description": "false is not equal to zero", 267 "data": [0, false], 268 "valid": true 269 }, 270 { 271 "description": "true is not equal to one", 272 "data": [1, true], 273 "valid": true 274 }, 275 { 276 "description": "unique array of objects is valid", 277 "data": [{"foo": "bar"}, {"foo": "baz"}], 278 "valid": true 279 }, 280 { 281 "description": "non-unique array of objects is valid", 282 "data": [{"foo": "bar"}, {"foo": "bar"}], 283 "valid": true 284 }, 285 { 286 "description": "unique array of nested objects is valid", 287 "data": [ 288 {"foo": {"bar" : {"baz" : true}}}, 289 {"foo": {"bar" : {"baz" : false}}} 290 ], 291 "valid": true 292 }, 293 { 294 "description": "non-unique array of nested objects is valid", 295 "data": [ 296 {"foo": {"bar" : {"baz" : true}}}, 297 {"foo": {"bar" : {"baz" : true}}} 298 ], 299 "valid": true 300 }, 301 { 302 "description": "unique array of arrays is valid", 303 "data": [["foo"], ["bar"]], 304 "valid": true 305 }, 306 { 307 "description": "non-unique array of arrays is valid", 308 "data": [["foo"], ["foo"]], 309 "valid": true 310 }, 311 { 312 "description": "1 and true are unique", 313 "data": [1, true], 314 "valid": true 315 }, 316 { 317 "description": "0 and false are unique", 318 "data": [0, false], 319 "valid": true 320 }, 321 { 322 "description": "unique heterogeneous types are valid", 323 "data": [{}, [1], true, null, 1], 324 "valid": true 325 }, 326 { 327 "description": "non-unique heterogeneous types are valid", 328 "data": [{}, [1], true, null, {}, 1], 329 "valid": true 330 } 331 ] 332 }, 333 { 334 "description": "uniqueItems=false with an array of items", 335 "schema": { 336 "$schema": "https://json-schema.org/draft/2019-09/schema", 337 "items": [{"type": "boolean"}, {"type": "boolean"}], 338 "uniqueItems": false 339 }, 340 "tests": [ 341 { 342 "description": "[false, true] from items array is valid", 343 "data": [false, true], 344 "valid": true 345 }, 346 { 347 "description": "[true, false] from items array is valid", 348 "data": [true, false], 349 "valid": true 350 }, 351 { 352 "description": "[false, false] from items array is valid", 353 "data": [false, false], 354 "valid": true 355 }, 356 { 357 "description": "[true, true] from items array is valid", 358 "data": [true, true], 359 "valid": true 360 }, 361 { 362 "description": "unique array extended from [false, true] is valid", 363 "data": [false, true, "foo", "bar"], 364 "valid": true 365 }, 366 { 367 "description": "unique array extended from [true, false] is valid", 368 "data": [true, false, "foo", "bar"], 369 "valid": true 370 }, 371 { 372 "description": "non-unique array extended from [false, true] is valid", 373 "data": [false, true, "foo", "foo"], 374 "valid": true 375 }, 376 { 377 "description": "non-unique array extended from [true, false] is valid", 378 "data": [true, false, "foo", "foo"], 379 "valid": true 380 } 381 ] 382 }, 383 { 384 "description": "uniqueItems=false with an array of items and additionalItems=false", 385 "schema": { 386 "$schema": "https://json-schema.org/draft/2019-09/schema", 387 "items": [{"type": "boolean"}, {"type": "boolean"}], 388 "uniqueItems": false, 389 "additionalItems": false 390 }, 391 "tests": [ 392 { 393 "description": "[false, true] from items array is valid", 394 "data": [false, true], 395 "valid": true 396 }, 397 { 398 "description": "[true, false] from items array is valid", 399 "data": [true, false], 400 "valid": true 401 }, 402 { 403 "description": "[false, false] from items array is valid", 404 "data": [false, false], 405 "valid": true 406 }, 407 { 408 "description": "[true, true] from items array is valid", 409 "data": [true, true], 410 "valid": true 411 }, 412 { 413 "description": "extra items are invalid even if unique", 414 "data": [false, true, null], 415 "valid": false 416 } 417 ] 418 } 419] 420