=== unterminated object
{"a": 1
---
Unexpected end of input on line 1.

    {"a": 1
    .......^

=== unterminated array
[1, 2
---
Unexpected end of input on line 1.

    [1, 2
    .....^

=== unterminated string
"Hello
---
Unexpected character "\n" on line 1.

    "Hello
    ......^

=== newline in string literal
"line1
line2"
---
Unexpected character "\n" on line 1.

    "line1
    ......^


=== backslash at end of string
"abc\
---
Invalid escape sequence "\n" on line 1.

    "abc\
    .....^

=== invalid escape sequence
"bad \q escape"
---
Invalid escape sequence "q" on line 1.

    "bad \q escape"
    ......^

=== invalid unicode escape (JSON style)
"\u0022"
---
Invalid escape sequence "0" (expected "{") on line 1.

    "\u0022"
    ...^

=== invalid unicode escape (now closed)
"\u{263"
---
Invalid escape sequence "\"" on line 1.

    "\u{263"
    .......^

=== invalid unicode escape (bad hex)
"\u{26G4}"
---
Invalid escape sequence "G" on line 1.

    "\u{26G4}"
    ......^

=== invalid unicode escape (too short)
"\u{}"
---
Invalid escape sequence on line 1.

    "\u{}"
    ....^

=== invalid unicode escape (too big)
"\u{111FFFA}"
---
Invalid escape sequence (too many hex digits) on line 1.

    "\u{111FFFA}"
    ..........^

=== invalid unicode escape (outside the valid Unicode range)
"\u{110000}"
---
Invalid escape sequence (out of range) on line 1.

    "\u{110000}"
    ..........^

=== newline in string literal
"line1
line2"
---
Unexpected character "\n" on line 1.

    "line1
    ......^

=== multiple values in a single document
{}[]
---
Unexpected character "[" on line 1.

    {}[]
    ..^

=== object missing colon
{"a" 1}
---
Unexpected character "1" on line 1.

    {"a" 1}
    .....^

=== object double colon
{"a"::1}
---
Unexpected character ":" on line 1.

    {"a"::1}
    .....^

=== object key without value
{"a":}
---
Unexpected character "}" on line 1.

    {"a":}
    .....^

=== value without key
{:1}
---
Unexpected character ":" on line 1.

    {:1}
    .^

=== single quotes not allowed
{'a': 1}
---
Unexpected character "'" on line 1.

    {'a': 1}
    .^

=== missing separator between pairs (same line)
{"a":1 "b":2}
---
Expected comma or newline between key-value pairs on line 1.

    {"a":1 "b":2}
    .......^

=== leading comma in array
[,1]
---
Unexpected character "," on line 1.

    [,1]
    .^

=== leading comma in object
{,"a":1}
---
Unexpected character "," on line 1.

    {,"a":1}
    .^

=== double comma in array
[1,,2]
---
Unexpected character "," on line 1.

    [1,,2]
    ...^

=== missing separator in array
[1 2]
---
Expected comma or newline between values on line 1.

    [1 2]
    ...^

=== trailing data after value
{"a":1} {"b":2}
---
Unexpected character "{" on line 1.

    {"a":1} {"b":2}
    ........^

=== invalid number: leading zero
01
---
Unexpected character "1" on line 1.

    01
    .^

=== invalid number: explicit plus sign
+1
---
Unexpected character "+" on line 1.

    +1
    ^

=== invalid number: leading decimal point
.5
---
Unexpected character "." on line 1.

    .5
    ^

=== invalid digit after minus
-a
---
Unexpected character "a" on line 1.

    -a
    .^

=== invalid digit in float
1.a
---
Unexpected character "a" on line 1.

    1.a
    ..^

=== invalid exponent (missing digits)
1e
---
Unexpected character "\n" on line 1.

    1e
    ..^

=== invalid exponent sign only
1e+
---
Unexpected character "\n" on line 1.

    1e+
    ...^

=== NaN not allowed
NaN
---
Unexpected character "N" on line 1.

    NaN
    ^

=== Infinity not allowed
Infinity
---
Unexpected character "I" on line 1.

    Infinity
    ^

=== colon after complete value
{"a":1}:2
---
Unexpected character ":" on line 1.

    {"a":1}:2
    .......^

=== whitespace only

---
Unexpected end of input on line 1.


    ^

=== comment without value
# comment only
---
Unexpected end of input on line 1.

    # comment only
    ..............^

=== wrong keyword
falze
---
Unexpected character "z" on line 1.

    falze
    ...^

=== character after a keyword
nullnull
---
Unexpected character "n" on line 1.

    nullnull
    ....^

=== identifier with dot (invalid char)
{a.b:1}
---
Unexpected character "." on line 1.

    {a.b:1}
    ..^

=== identifier with slash (invalid char)
{a/b:1}
---
Unexpected character "/" on line 1.

    {a/b:1}
    ..^

=== identifier with at-sign (invalid char)
{foo@bar:1}
---
Unexpected character "@" on line 1.

    {foo@bar:1}
    ....^

=== space between identifier and value (missing colon)
{a 1}
---
Unexpected character "1" on line 1.

    {a 1}
    ...^

=== missing separator between pairs (identifiers, same line)
{a:1 b:2}
---
Expected comma or newline between key-value pairs on line 1.

    {a:1 b:2}
    .....^

=== bare identifier as a top-level value (not allowed)
foo
---
Unexpected character "o" on line 1.

    foo
    .^

=== identifier used as value (must be quoted or literal)
{key: value}
---
Unexpected character "v" on line 1.

    {key: value}
    ......^

=== identifier as array element (not allowed as bare value)
[foo]
---
Unexpected character "o" on line 1.

    [foo]
    ..^

=== non-ASCII letter in identifier key
{ä:1}
---
Unexpected character "ä" on line 1.

    {ä:1}
    .^

=== leading dot before identifier
{.a:1}
---
Unexpected character "." on line 1.

    {.a:1}
    .^

=== emoji in identifier key
{😀:1}
---
Unexpected character "\ud83d" on line 1.

    {😀:1}
    .^

=== digit+dot in identifier key (dot invalid)
{0.1:1}
---
Unexpected character "." on line 1.

    {0.1:1}
    ..^

=== exponent-like key with plus (plus invalid in identifier)
{1e+2:1}
---
Unexpected character "+" on line 1.

    {1e+2:1}
    ...^

=== dollar sign in identifier
{a$:1}
---
Unexpected character "$" on line 1.

    {a$:1}
    ..^

=== decimal point in digit-only identifier
{1234.5: 1}
---
Unexpected character "." on line 1.

    {1234.5: 1}
    .....^

=== identifier followed by comma instead of colon
{a,}
---
Unexpected character "," on line 1.

    {a,}
    ..^

=== identifier key without value
{a:}
---
Unexpected character "}" on line 1.

    {a:}
    ...^

=== object in array missing separator (between elements)
[{a:1} {b:2}]
---
Expected comma or newline between values on line 1.

    [{a:1} {b:2}]
    .......^

=== tilde in identifier (invalid char)
{a~b:1}
---
Unexpected character "~" on line 1.

    {a~b:1}
    ..^

=== double colon after identifier key
{a::1}
---
Unexpected character ":" on line 1.

    {a::1}
    ...^

=== backslash in identifier key
{a\b:1}
---
Unexpected character "\\" on line 1.

    {a\b:1}
    ..^

=== array object missing colon after identifier key
[{a 1}]
---
Unexpected character "1" on line 1.

    [{a 1}]
    ....^

=== raw string without closing
"""
foo
---
Unexpected end of input on line 2.

    foo
    ...^

=== empty raw single-line
""""""
---
Raw strings cannot be empty on line 1.

    """"""
    ......^

=== duplicate keys
{
  foo: 1
  foo: 2
}
---
Duplicate key "foo" on line 3.

      foo: 2
    ..^

=== case-sensitive: True is not a keyword
True
---
Unexpected character "T" on line 1.

    True
    ^

=== case-sensitive: TRUE is not a keyword
TRUE
---
Unexpected character "T" on line 1.

    TRUE
    ^

=== case-sensitive: False is not a keyword
False
---
Unexpected character "F" on line 1.

    False
    ^

=== case-sensitive: FALSE is not a keyword
FALSE
---
Unexpected character "F" on line 1.

    FALSE
    ^

=== case-sensitive: Null is not a keyword
Null
---
Unexpected character "N" on line 1.

    Null
    ^

=== case-sensitive: NULL is not a keyword
NULL
---
Unexpected character "N" on line 1.

    NULL
    ^

=== duplicate keys
{
  foo: 1
  "foo": 2
}
---
Duplicate key "foo" on line 3.

      "foo": 2
    ..^

=== unicode escape: high surrogate start U+D800
"\u{D800}"
---
Invalid escape sequence (out of range) on line 1.

    "\u{D800}"
    ........^

=== unicode escape: high surrogate end U+DBFF
"\u{DBFF}"
---
Invalid escape sequence (out of range) on line 1.

    "\u{DBFF}"
    ........^

=== unicode escape: low surrogate start U+DC00
"\u{DC00}"
---
Invalid escape sequence (out of range) on line 1.

    "\u{DC00}"
    ........^

=== unicode escape: low surrogate end U+DFFF
"\u{DFFF}"
---
Invalid escape sequence (out of range) on line 1.

    "\u{DFFF}"
    ........^

=== unicode escape: middle of surrogate range U+D900
"\u{D900}"
---
Invalid escape sequence (out of range) on line 1.

    "\u{D900}"
    ........^

=== unicode escape: 6 hex digits above max code point U+FFFFFF
"\u{FFFFFF}"
---
Invalid escape sequence (out of range) on line 1.

    "\u{FFFFFF}"
    ..........^

=== invalid escape: lowercase hex digits not accepted
"\u{263a}"
---
Invalid escape sequence "a" on line 1.

    "\u{263a}"
    .......^

=== invalid escape: \b not supported (unlike JSON)
"\b"
---
Invalid escape sequence "b" on line 1.

    "\b"
    ..^

=== invalid escape: \f not supported (unlike JSON)
"\f"
---
Invalid escape sequence "f" on line 1.

    "\f"
    ..^

=== invalid escape: \/ solidus not supported (unlike JSON)
"\/"
---
Invalid escape sequence "/" on line 1.

    "\/"
    ..^

=== invalid escape: \v not supported
"\v"
---
Invalid escape sequence "v" on line 1.

    "\v"
    ..^

=== invalid escape: \0 not supported
"\0"
---
Invalid escape sequence "0" on line 1.

    "\0"
    ..^

=== invalid escape: \a not supported
"\a"
---
Invalid escape sequence "a" on line 1.

    "\a"
    ..^

=== partial keyword in object value
{a: trux}
---
Unexpected character "x" on line 1.

=== invalid escape in quoted key
{"\q": 1}
---
Invalid escape sequence "q" on line 1.
