| 449 | } |
| 450 | |
| 451 | void |
| 452 | testString() |
| 453 | { |
| 454 | TEST_GOOD(R"jv( "x" )jv"); |
| 455 | TEST_GOOD(R"jv( "xy" )jv"); |
| 456 | TEST_GOOD(R"jv( "x y" )jv"); |
| 457 | |
| 458 | // escapes |
| 459 | TEST_GOOD(R"jv(" \" ")jv"); |
| 460 | TEST_GOOD(R"jv(" \\ ")jv"); |
| 461 | TEST_GOOD(R"jv(" \/ ")jv"); |
| 462 | TEST_GOOD(R"jv(" \b ")jv"); |
| 463 | TEST_GOOD(R"jv(" \f ")jv"); |
| 464 | TEST_GOOD(R"jv(" \n ")jv"); |
| 465 | TEST_GOOD(R"jv(" \r ")jv"); |
| 466 | TEST_GOOD(R"jv(" \t ")jv"); |
| 467 | |
| 468 | // utf-16 escapes |
| 469 | TEST_GOOD(R"jv( " \u0000 " )jv"); |
| 470 | TEST_GOOD(R"jv( " \ud7ff " )jv"); |
| 471 | TEST_GOOD(R"jv( " \ue000 " )jv"); |
| 472 | TEST_GOOD(R"jv( " \uffff " )jv"); |
| 473 | TEST_GOOD(R"jv( " \ud800\udc00 " )jv"); |
| 474 | TEST_GOOD(R"jv( " \udbff\udfff " )jv"); |
| 475 | TEST_GOOD(R"jv( " \n\u0000 " )jv"); |
| 476 | |
| 477 | // escape in key |
| 478 | TEST_GOOD(R"jv( {" \n":null} )jv"); |
| 479 | |
| 480 | // incomplete |
| 481 | TEST_BAD ("\""); |
| 482 | |
| 483 | // illegal control character |
| 484 | TEST_BAD ((string_view{ "\"" "\x00" "\"", 3 })); |
| 485 | TEST_BAD ("\"" "\x1f" "\""); |
| 486 | TEST_BAD ("\"" "\\n" "\x1f" "\""); |
| 487 | |
| 488 | // incomplete escape |
| 489 | TEST_BAD (R"jv( "\" )jv"); |
| 490 | |
| 491 | // invalid escape |
| 492 | TEST_BAD (R"jv( "\z" )jv"); |
| 493 | |
| 494 | // utf-16 escape, fast path, |
| 495 | // invalid surrogate |
| 496 | TEST_BAD (R"jv( " \u---- " )jv"); |
| 497 | TEST_BAD (R"jv( " \ud--- " )jv"); |
| 498 | TEST_BAD (R"jv( " \ud8-- " )jv"); |
| 499 | TEST_BAD (R"jv( " \ud80- " )jv"); |
| 500 | // invalid low surrogate |
| 501 | TEST_BAD (R"jv( " \ud800------ " )jv"); |
| 502 | TEST_BAD (R"jv( " \ud800\----- " )jv"); |
| 503 | TEST_BAD (R"jv( " \ud800\u---- " )jv"); |
| 504 | TEST_BAD (R"jv( " \ud800\ud--- " )jv"); |
| 505 | TEST_BAD (R"jv( " \ud800\udc-- " )jv"); |
| 506 | TEST_BAD (R"jv( " \ud800\udc0- " )jv"); |
| 507 | // illegal leading surrogate |
| 508 | TEST_BAD (R"jv( " \udc00 " )jv"); |