syntax.json (13448B)
1 [{ 2 "comment": "Dot syntax", 3 "given": {"type": "object"}, 4 "cases": [ 5 { 6 "expression": "foo.bar", 7 "result": null 8 }, 9 { 10 "expression": "foo.1", 11 "error": "syntax" 12 }, 13 { 14 "expression": "foo.-11", 15 "error": "syntax" 16 }, 17 { 18 "expression": "foo", 19 "result": null 20 }, 21 { 22 "expression": "foo.", 23 "error": "syntax" 24 }, 25 { 26 "expression": "foo.", 27 "error": "syntax" 28 }, 29 { 30 "expression": ".foo", 31 "error": "syntax" 32 }, 33 { 34 "expression": "foo..bar", 35 "error": "syntax" 36 }, 37 { 38 "expression": "foo.bar.", 39 "error": "syntax" 40 }, 41 { 42 "expression": "foo[.]", 43 "error": "syntax" 44 } 45 ] 46 }, 47 { 48 "comment": "Simple token errors", 49 "given": {"type": "object"}, 50 "cases": [ 51 { 52 "expression": ".", 53 "error": "syntax" 54 }, 55 { 56 "expression": ":", 57 "error": "syntax" 58 }, 59 { 60 "expression": ",", 61 "error": "syntax" 62 }, 63 { 64 "expression": "]", 65 "error": "syntax" 66 }, 67 { 68 "expression": "[", 69 "error": "syntax" 70 }, 71 { 72 "expression": "}", 73 "error": "syntax" 74 }, 75 { 76 "expression": "{", 77 "error": "syntax" 78 }, 79 { 80 "expression": ")", 81 "error": "syntax" 82 }, 83 { 84 "expression": "(", 85 "error": "syntax" 86 }, 87 { 88 "expression": "((&", 89 "error": "syntax" 90 }, 91 { 92 "expression": "a[", 93 "error": "syntax" 94 }, 95 { 96 "expression": "a]", 97 "error": "syntax" 98 }, 99 { 100 "expression": "a][", 101 "error": "syntax" 102 }, 103 { 104 "expression": "!", 105 "error": "syntax" 106 } 107 ] 108 }, 109 { 110 "comment": "Boolean syntax errors", 111 "given": {"type": "object"}, 112 "cases": [ 113 { 114 "expression": "![!(!", 115 "error": "syntax" 116 } 117 ] 118 }, 119 { 120 "comment": "Wildcard syntax", 121 "given": {"type": "object"}, 122 "cases": [ 123 { 124 "expression": "*", 125 "result": ["object"] 126 }, 127 { 128 "expression": "*.*", 129 "result": [] 130 }, 131 { 132 "expression": "*.foo", 133 "result": [] 134 }, 135 { 136 "expression": "*[0]", 137 "result": [] 138 }, 139 { 140 "expression": ".*", 141 "error": "syntax" 142 }, 143 { 144 "expression": "*foo", 145 "error": "syntax" 146 }, 147 { 148 "expression": "*0", 149 "error": "syntax" 150 }, 151 { 152 "expression": "foo[*]bar", 153 "error": "syntax" 154 }, 155 { 156 "expression": "foo[*]*", 157 "error": "syntax" 158 } 159 ] 160 }, 161 { 162 "comment": "Flatten syntax", 163 "given": {"type": "object"}, 164 "cases": [ 165 { 166 "expression": "[]", 167 "result": null 168 } 169 ] 170 }, 171 { 172 "comment": "Simple bracket syntax", 173 "given": {"type": "object"}, 174 "cases": [ 175 { 176 "expression": "[0]", 177 "result": null 178 }, 179 { 180 "expression": "[*]", 181 "result": null 182 }, 183 { 184 "expression": "*.[0]", 185 "error": "syntax" 186 }, 187 { 188 "expression": "*.[\"0\"]", 189 "result": [[null]] 190 }, 191 { 192 "expression": "[*].bar", 193 "result": null 194 }, 195 { 196 "expression": "[*][0]", 197 "result": null 198 }, 199 { 200 "expression": "foo[#]", 201 "error": "syntax" 202 } 203 ] 204 }, 205 { 206 "comment": "Multi-select list syntax", 207 "given": {"type": "object"}, 208 "cases": [ 209 { 210 "expression": "foo[0]", 211 "result": null 212 }, 213 { 214 "comment": "Valid multi-select of a list", 215 "expression": "foo[0, 1]", 216 "error": "syntax" 217 }, 218 { 219 "expression": "foo.[0]", 220 "error": "syntax" 221 }, 222 { 223 "expression": "foo.[*]", 224 "result": null 225 }, 226 { 227 "comment": "Multi-select of a list with trailing comma", 228 "expression": "foo[0, ]", 229 "error": "syntax" 230 }, 231 { 232 "comment": "Multi-select of a list with trailing comma and no close", 233 "expression": "foo[0,", 234 "error": "syntax" 235 }, 236 { 237 "comment": "Multi-select of a list with trailing comma and no close", 238 "expression": "foo.[a", 239 "error": "syntax" 240 }, 241 { 242 "comment": "Multi-select of a list with extra comma", 243 "expression": "foo[0,, 1]", 244 "error": "syntax" 245 }, 246 { 247 "comment": "Multi-select of a list using an identifier index", 248 "expression": "foo[abc]", 249 "error": "syntax" 250 }, 251 { 252 "comment": "Multi-select of a list using identifier indices", 253 "expression": "foo[abc, def]", 254 "error": "syntax" 255 }, 256 { 257 "comment": "Multi-select of a list using an identifier index", 258 "expression": "foo[abc, 1]", 259 "error": "syntax" 260 }, 261 { 262 "comment": "Multi-select of a list using an identifier index with trailing comma", 263 "expression": "foo[abc, ]", 264 "error": "syntax" 265 }, 266 { 267 "comment": "Valid multi-select of a hash using an identifier index", 268 "expression": "foo.[abc]", 269 "result": null 270 }, 271 { 272 "comment": "Valid multi-select of a hash", 273 "expression": "foo.[abc, def]", 274 "result": null 275 }, 276 { 277 "comment": "Multi-select of a hash using a numeric index", 278 "expression": "foo.[abc, 1]", 279 "error": "syntax" 280 }, 281 { 282 "comment": "Multi-select of a hash with a trailing comma", 283 "expression": "foo.[abc, ]", 284 "error": "syntax" 285 }, 286 { 287 "comment": "Multi-select of a hash with extra commas", 288 "expression": "foo.[abc,, def]", 289 "error": "syntax" 290 }, 291 { 292 "comment": "Multi-select of a hash using number indices", 293 "expression": "foo.[0, 1]", 294 "error": "syntax" 295 } 296 ] 297 }, 298 { 299 "comment": "Multi-select hash syntax", 300 "given": {"type": "object"}, 301 "cases": [ 302 { 303 "comment": "No key or value", 304 "expression": "a{}", 305 "error": "syntax" 306 }, 307 { 308 "comment": "No closing token", 309 "expression": "a{", 310 "error": "syntax" 311 }, 312 { 313 "comment": "Not a key value pair", 314 "expression": "a{foo}", 315 "error": "syntax" 316 }, 317 { 318 "comment": "Missing value and closing character", 319 "expression": "a{foo:", 320 "error": "syntax" 321 }, 322 { 323 "comment": "Missing closing character", 324 "expression": "a{foo: 0", 325 "error": "syntax" 326 }, 327 { 328 "comment": "Missing value", 329 "expression": "a{foo:}", 330 "error": "syntax" 331 }, 332 { 333 "comment": "Trailing comma and no closing character", 334 "expression": "a{foo: 0, ", 335 "error": "syntax" 336 }, 337 { 338 "comment": "Missing value with trailing comma", 339 "expression": "a{foo: ,}", 340 "error": "syntax" 341 }, 342 { 343 "comment": "Accessing Array using an identifier", 344 "expression": "a{foo: bar}", 345 "error": "syntax" 346 }, 347 { 348 "expression": "a{foo: 0}", 349 "error": "syntax" 350 }, 351 { 352 "comment": "Missing key-value pair", 353 "expression": "a.{}", 354 "error": "syntax" 355 }, 356 { 357 "comment": "Not a key-value pair", 358 "expression": "a.{foo}", 359 "error": "syntax" 360 }, 361 { 362 "comment": "Missing value", 363 "expression": "a.{foo:}", 364 "error": "syntax" 365 }, 366 { 367 "comment": "Missing value with trailing comma", 368 "expression": "a.{foo: ,}", 369 "error": "syntax" 370 }, 371 { 372 "comment": "Valid multi-select hash extraction", 373 "expression": "a.{foo: bar}", 374 "result": null 375 }, 376 { 377 "comment": "Valid multi-select hash extraction", 378 "expression": "a.{foo: bar, baz: bam}", 379 "result": null 380 }, 381 { 382 "comment": "Trailing comma", 383 "expression": "a.{foo: bar, }", 384 "error": "syntax" 385 }, 386 { 387 "comment": "Missing key in second key-value pair", 388 "expression": "a.{foo: bar, baz}", 389 "error": "syntax" 390 }, 391 { 392 "comment": "Missing value in second key-value pair", 393 "expression": "a.{foo: bar, baz:}", 394 "error": "syntax" 395 }, 396 { 397 "comment": "Trailing comma", 398 "expression": "a.{foo: bar, baz: bam, }", 399 "error": "syntax" 400 }, 401 { 402 "comment": "Nested multi select", 403 "expression": "{\"\\\\\":{\" \":*}}", 404 "result": {"\\": {" ": ["object"]}} 405 } 406 ] 407 }, 408 { 409 "comment": "Or expressions", 410 "given": {"type": "object"}, 411 "cases": [ 412 { 413 "expression": "foo || bar", 414 "result": null 415 }, 416 { 417 "expression": "foo ||", 418 "error": "syntax" 419 }, 420 { 421 "expression": "foo.|| bar", 422 "error": "syntax" 423 }, 424 { 425 "expression": " || foo", 426 "error": "syntax" 427 }, 428 { 429 "expression": "foo || || foo", 430 "error": "syntax" 431 }, 432 { 433 "expression": "foo.[a || b]", 434 "result": null 435 }, 436 { 437 "expression": "foo.[a ||]", 438 "error": "syntax" 439 }, 440 { 441 "expression": "\"foo", 442 "error": "syntax" 443 } 444 ] 445 }, 446 { 447 "comment": "Filter expressions", 448 "given": {"type": "object"}, 449 "cases": [ 450 { 451 "expression": "foo[?bar==`\"baz\"`]", 452 "result": null 453 }, 454 { 455 "expression": "foo[? bar == `\"baz\"` ]", 456 "result": null 457 }, 458 { 459 "expression": "foo[ ?bar==`\"baz\"`]", 460 "error": "syntax" 461 }, 462 { 463 "expression": "foo[?bar==]", 464 "error": "syntax" 465 }, 466 { 467 "expression": "foo[?==]", 468 "error": "syntax" 469 }, 470 { 471 "expression": "foo[?==bar]", 472 "error": "syntax" 473 }, 474 { 475 "expression": "foo[?bar==baz?]", 476 "error": "syntax" 477 }, 478 { 479 "expression": "foo[?a.b.c==d.e.f]", 480 "result": null 481 }, 482 { 483 "expression": "foo[?bar==`[0, 1, 2]`]", 484 "result": null 485 }, 486 { 487 "expression": "foo[?bar==`[\"a\", \"b\", \"c\"]`]", 488 "result": null 489 }, 490 { 491 "comment": "Literal char not escaped", 492 "expression": "foo[?bar==`[\"foo`bar\"]`]", 493 "error": "syntax" 494 }, 495 { 496 "comment": "Literal char escaped", 497 "expression": "foo[?bar==`[\"foo\\`bar\"]`]", 498 "result": null 499 }, 500 { 501 "comment": "Unknown comparator", 502 "expression": "foo[?bar<>baz]", 503 "error": "syntax" 504 }, 505 { 506 "comment": "Unknown comparator", 507 "expression": "foo[?bar^baz]", 508 "error": "syntax" 509 }, 510 { 511 "expression": "foo[bar==baz]", 512 "error": "syntax" 513 }, 514 { 515 "comment": "Quoted identifier in filter expression no spaces", 516 "expression": "[?\"\\\\\">`\"foo\"`]", 517 "result": null 518 }, 519 { 520 "comment": "Quoted identifier in filter expression with spaces", 521 "expression": "[?\"\\\\\" > `\"foo\"`]", 522 "result": null 523 } 524 ] 525 }, 526 { 527 "comment": "Filter expression errors", 528 "given": {"type": "object"}, 529 "cases": [ 530 { 531 "expression": "bar.`\"anything\"`", 532 "error": "syntax" 533 }, 534 { 535 "expression": "bar.baz.noexists.`\"literal\"`", 536 "error": "syntax" 537 }, 538 { 539 "comment": "Literal wildcard projection", 540 "expression": "foo[*].`\"literal\"`", 541 "error": "syntax" 542 }, 543 { 544 "expression": "foo[*].name.`\"literal\"`", 545 "error": "syntax" 546 }, 547 { 548 "expression": "foo[].name.`\"literal\"`", 549 "error": "syntax" 550 }, 551 { 552 "expression": "foo[].name.`\"literal\"`.`\"subliteral\"`", 553 "error": "syntax" 554 }, 555 { 556 "comment": "Projecting a literal onto an empty list", 557 "expression": "foo[*].name.noexist.`\"literal\"`", 558 "error": "syntax" 559 }, 560 { 561 "expression": "foo[].name.noexist.`\"literal\"`", 562 "error": "syntax" 563 }, 564 { 565 "expression": "twolen[*].`\"foo\"`", 566 "error": "syntax" 567 }, 568 { 569 "comment": "Two level projection of a literal", 570 "expression": "twolen[*].threelen[*].`\"bar\"`", 571 "error": "syntax" 572 }, 573 { 574 "comment": "Two level flattened projection of a literal", 575 "expression": "twolen[].threelen[].`\"bar\"`", 576 "error": "syntax" 577 } 578 ] 579 }, 580 { 581 "comment": "Identifiers", 582 "given": {"type": "object"}, 583 "cases": [ 584 { 585 "expression": "foo", 586 "result": null 587 }, 588 { 589 "expression": "\"foo\"", 590 "result": null 591 }, 592 { 593 "expression": "\"\\\\\"", 594 "result": null 595 } 596 ] 597 }, 598 { 599 "comment": "Combined syntax", 600 "given": [], 601 "cases": [ 602 { 603 "expression": "*||*|*|*", 604 "result": null 605 }, 606 { 607 "expression": "*[]||[*]", 608 "result": [] 609 }, 610 { 611 "expression": "[*.*]", 612 "result": [null] 613 } 614 ] 615 } 616 ]