{
  "$schema": "https://raw.githubusercontent.com/unicode-org/message-format-wg/main/test/schemas/v0/tests.schema.json",
  "scenario": "Syntax",
  "description": "Test cases that do not depend on any registry definitions.",
  "defaultTestProperties": {
    "bidiIsolation": "none",
    "locale": "en-US"
  },
  "tests": [
    {
      "description": "message -> simple-message -> <empty>",
      "src": "",
      "exp": ""
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> simple-start-char",
      "src": "a",
      "exp": "a"
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> simple-start-char pattern -> ...",
      "src": "hello",
      "exp": "hello"
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> escaped-char",
      "src": "\\\\",
      "exp": "\\"
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> 1*escaped-char",
      "src": "\\\\\\{\\|\\}",
      "exp": "\\{|}"
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> simple-start-char pattern -> ... -> simple-start-char *text-char placeholder",
      "src": "hello {world}",
      "exp": "hello world"
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> simple-start-char pattern -> ... -> simple-start-char *text-char placeholder",
      "src": "hello {|world|}",
      "exp": "hello world"
    },
    {
      "description": "message -> simple-message -> s simple-start pattern -> s simple-start-char pattern -> ...",
      "src": "\n hello\t",
      "exp": "\n hello\t"
    },
    {
      "src": "hello {$place}",
      "params": [
        {
          "name": "place",
          "value": "world"
        }
      ],
      "exp": "hello world"
    },
    {
      "src": "hello {$place-.}",
      "params": [
        {
          "name": "place-.",
          "value": "world"
        }
      ],
      "exp": "hello world"
    },
    {
      "src": "hello {$place}",
      "expErrors": [
        {
          "type": "unresolved-variable"
        }
      ],
      "exp": "hello {$place}"
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> placeholder -> expression -> literal-expression -> \"{\" literal \"}\"",
      "src": "{a}",
      "exp": "a"
    },
    {
      "description": "... -> literal-expression -> \"{\" literal s annotation \"}\" -> \"{\" literal s function \"}\" -> \"{\" literal s \":\" identifier \"}\" -> \"{\" literal s \":\" name \"}\"",
      "src": "{a :f}",
      "exp": "{|a|}",
      "expErrors": [{ "type": "unknown-function" }]
    },
    {
      "description": "... -> \"{\" literal s \":\" namespace \":\" name \"}\"",
      "src": "{a :u:f}",
      "exp": "{|a|}",
      "expErrors": [{ "type": "unknown-function" }]
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> placeholder -> expression -> variable-expression -> \"{\" variable \"}\"",
      "src": "{$x}",
      "exp": "{$x}",
      "expErrors": [{ "type": "unresolved-variable" }]
    },
    {
      "description": "... -> variable-expression -> \"{\" variable s annotation \"}\" -> \"{\" variable s function \"}\" -> \"{\" variable s \":\" identifier \"}\" -> \"{\" variable s \":\" name \"}\"",
      "src": "{$x :f}",
      "exp": "{$x}",
      "expErrors": [{ "type": "unresolved-variable" }, { "type": "unknown-function" }]
    },
    {
      "description": "... -> \"{\" variable s \":\" namespace \":\" name \"}\"",
      "src": "{$x :u:f}",
      "exp": "{$x}",
      "expErrors": [{ "type": "unresolved-variable" }, { "type": "unknown-function" }]
    },
    {
      "description": "... -> annotation-expression -> function -> \"{\" \":\" namespace \":\" name \"}\"",
      "src": "{:u:f}",
      "exp": "{:u:f}",
      "expErrors": [{ "type": "unknown-function" }]
    },
    {
      "description": "... -> annotation-expression -> function -> \"{\" \":\" name \"}\"",
      "src": "{:f}",
      "exp": "{:f}",
      "expErrors": [{ "type": "unknown-function" }]
    },
    {
      "description": "message -> complex-message -> complex-body -> quoted-pattern -> \"{{\" pattern \"}}\" -> \"{{\"\"}}\"",
      "src": "{{}}",
      "exp": ""
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"#\" identifier \"}\"", 
      "src": "{#tag}",
      "exp": "",
      "expParts": [
        {
          "type": "markup",
          "kind": "open",
          "name": "tag"
        }
      ]
    },
    {
      "description": "message -> complex-message -> *(declaration [s]) complex-body -> declaration complex-body -> input-declaration complex-body -> input variable-expression complex-body",
      "src": ".input{$x}{{}}",
      "exp": ""
    },
    {
      "description": "message -> complex-message -> s *(declaration [s]) complex-body s -> s declaration complex-body s -> s input-declaration complex-body s -> s input variable-expression complex-body s",
      "src": "\t.input{$x}{{}}\n",
      "exp": ""
    },
    {
      "description": "message -> complex-message -> *(declaration [s]) complex-body -> declaration declaration complex-body -> input-declaration input-declaration complex-body -> input variable-expression input variable-expression complex-body",
      "src": ".input{$x}.input{$y}{{}}",
      "exp": ""
    },
    {
      "description": "message -> complex-message -> *(declaration [s]) complex-body -> declaration s declaration complex-body -> input-declaration s input-declaration complex-body -> input variable-expression s input variable-expression complex-body",
      "src": ".input{$x} .input{$y}{{}}",
      "exp": ""
    },
    {
      "description": "message -> complex-message -> s *(declaration [s]) complex-body s -> s complex-body s",
      "src": "  {{}}  ",
      "exp": ""
    },
    {
      "description": "message -> complex-message -> *(declaration [s]) complex-body -> declaration declaration complex-body -> local-declaration input-declaration complex-body -> local s variable [s] \"=\" [s] expression input variable-expression complex-body",
      "src": ".local $x ={a}.input{$y}{{}}",
      "exp": ""
    },
    {
      "description": "message -> complex-message -> complex-body -> ... -> matcher -> match-statement variant -> match selector key quoted-pattern -> \".match\" variable literal quoted-pattern",
      "src": ".local $a={a :f}.match $a a{{}}*{{}}",
      "exp": "",
      "expErrors": [{ "type": "unknown-function" }, { "type": "bad-selector" }]
    },
    {
      "description": "... input-declaration -> input s variable-expression ...",
      "src": ".input {$x}{{}}",
      "exp": ""
    },
    {
      "description": "... local-declaration -> local s variable s \"=\" expression ...",
      "src": ".local $x ={a}{{}}",
      "exp": ""
    },
    {
      "description": "... local-declaration -> local s variable \"=\" s expression ...",
      "src": ".local $x= {a}{{}}",
      "exp": ""
    },
    {
      "description": "... local-declaration -> local s variable s \"=\" expression ...",
      "src": ".local $x = {a}{{}}",
      "exp": ""
    },
    {
      "description": "input-declaration-like content in complex-message",
      "src": "{{.input {$x}}}",
      "params": [{ "name": "x", "value": "X" }],
      "exp": ".input X"
    },
    {
      "description": "local-declaration-like content in complex-message with leading whitespace",
      "src": "{{ .local $x = {$y}}}",
      "params": [{ "name": "y", "value": "Y" }],
      "exp": " .local $x = Y"
    },
    {
      "description": "... matcher -> match-statement [s] variant -> match 1*([s] selector) variant -> match selector selector variant -> match selector selector variant key s key quoted-pattern",
      "src": ".local $a={a :f}.local $b={b :f}.match $a $b a b{{}}* *{{}}",
      "exp": "",
      "expErrors": [
        { "type": "unknown-function" },
        { "type": "bad-selector" },
        { "type": "unknown-function" },
        { "type": "bad-selector" }
      ]
    },
    {
      "description": "... matcher -> match-statement [s] variant -> match 1*([s] selector) variant -> match selector variant variant ...",
      "src": ".local $a={a :f}.match $a a{{}}b{{}}*{{}}",
      "exp": "",
      "expErrors": [{ "type": "unknown-function" }, { "type": "bad-selector" }]
    },
    {
      "description": "... variant -> key s quoted-pattern -> ...",
      "src": ".local $a={a :f}.match $a a {{}}*{{}}",
      "exp": "",
      "expErrors": [{ "type": "unknown-function" }, { "type": "bad-selector" }]
    },
    {
      "description": "... variant -> key s key s quoted-pattern -> ...",
      "src": ".local $a={a :f}.local $b={b :f}.match $a $b a b {{}}* *{{}}",
      "exp": "",
      "expErrors": [
        { "type": "unknown-function" },
        { "type": "bad-selector" },
        { "type": "unknown-function" },
        { "type": "bad-selector" }
      ]
    },
    {
      "description": "... key -> \"*\" ...",
      "src": ".local $a={a :f}.match $a *{{}}",
      "exp": "",
      "expErrors": [{ "type": "unknown-function" }, { "type": "bad-selector" }]
    },
    {
      "description": "simple-message -> simple-start pattern -> placeholder -> expression -> literal-expression -> \"{\" s literal \"}\"",
      "src": "{ a}",
      "exp": "a"
    },
    {
      "description": "... literal-expression -> \"{\" literal s attribute \"}\" -> \"{\" literal s \"@\" identifier \"}\"",
      "src": "{a @c}",
      "exp": "a"
    },
    {
      "description": "... -> literal-expression -> \"{\" literal s \"}\"",
      "src": "{a }",
      "exp": "a"
    },
    {
      "description": "simple-message -> simple-start pattern -> placeholder -> expression -> variable-expression -> \"{\" s variable \"}\"",
      "src": "{ $x}",
      "exp": "{$x}",
      "expErrors": [{ "type": "unresolved-variable" }]
    },
    {
      "description": "... variable-expression -> \"{\" variable s attribute \"}\" -> \"{\" variable s \"@\" identifier \"}\"",
      "src": "{$x @c}",
      "exp": "{$x}",
      "expErrors": [{ "type": "unresolved-variable" }]
    },
    {
      "description": "... -> variable-expression -> \"{\" variable s \"}\"",
      "src": "{$x }",
      "exp": "{$x}",
      "expErrors": [{ "type": "unresolved-variable" }]
    },
    {
      "description": "simple-message -> simple-start pattern -> placeholder -> expression -> annotation-expression -> \"{\" s annotation \"}\"",
      "src": "{ :f}",
      "exp": "{:f}",
      "expErrors": [{ "type": "unknown-function" }]
    },
    {
      "description": "... annotation-expression -> \"{\" annotation s attribute \"}\" -> \"{\" annotation s \"@\" identifier \"}\"",
      "src": "{:f @c}",
      "exp": "{:f}",
      "expErrors": [{ "type": "unknown-function" }]
    },
    {
      "description": "... -> annotation-expression -> \"{\" annotation s \"}\"",
      "src": "{:f }",
      "exp": "{:f}",
      "expErrors": [{ "type": "unknown-function" }]
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" s \"#\" identifier \"}\"", 
      "src": "{ #a}",
      "exp": ""
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"#\" identifier option \"}\" -> \"{\" \"#\" identifier identifier \"=\" literal \"}\"",
      "src": "{#tag foo=bar}",
      "exp": "",
      "expParts": [
        {
          "type": "markup",
          "kind": "open",
          "name": "tag",
          "options": {
            "foo": "bar"
          }
        }
      ]
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"#\" identifier attribute \"}\" -> \"{\" \"#\" identifier identifier \"=\" literal \"}\"",
      "src": "{#a @c}",
      "exp": ""
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"#\" identifier s \"}\" -> \"{\" \"#\" identifier identifier \"=\" literal \"}\"",
      "src": "{#a }",
      "exp": ""
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"#\" identifier \"/\" \"}\" -> \"{\" \"#\" identifier identifier \"=\" literal \"}\"",
      "src": "{#a/}",
      "exp": ""
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"/\" identifier \"}\"",
      "src": "{/a}",
      "exp": ""
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" s \"/\" identifier \"}\"",
      "src": "{ /a}",
      "exp": ""
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"/\" identifier option \"}\"",
      "src": "{/tag foo=bar}",
      "exp": "",
      "expParts": [
        {
          "type": "markup",
          "kind": "close",
          "name": "tag",
          "options": {
            "foo": "bar"
          }
        }
      ]
    },
    {
      "description": "message -> simple-message -> simple-start pattern -> placeholder -> markup -> \"{\" \"/\" identifier s \"}\"",
      "src": "{/a }",
      "exp": ""
    },
    {
      "description": "... annotation-expression -> function -> \":\" identifier option",
      "src": "{:f k=v}",
      "exp": "{:f}",
      "expErrors": [{ "type": "unknown-function" }]
    },
    {
      "description": "... option -> identifier s \"=\" literal",
      "src": "{:f k =v}",
      "exp": "{:f}",
      "expErrors": [{ "type": "unknown-function" }]
    },
    {
      "description": "... option -> identifier \"=\" s literal",
      "src": "{:f k= v}",
      "exp": "{:f}",
      "expErrors": [{ "type": "unknown-function" }]
    },
    {
      "description": "... option -> identifier s \"=\" s literal",
      "src": "{:f k = v}",
      "exp": "{:f}",
      "expErrors": [{ "type": "unknown-function" }]
    },
    {
      "description": "... attribute -> \"@\" identifier \"=\" literal ...",
      "src": "{a @c=d}",
      "exp": "a"
    },
    {
      "description": "... attribute -> \"@\" identifier s \"=\" literal ...",
      "src": "{a @c =d}",
      "exp": "a"
    },
    {
      "description": "... attribute -> \"@\" identifier \"=\" s literal ...",
      "src": "{a @c= d}",
      "exp": "a"
    },
    {
      "description": "... attribute -> \"@\" identifier s \"=\" s literal ...",
      "src": "{a @c = d}",
      "exp": "a"
    },
    {
      "description": "... attribute -> \"@\" identifier s \"=\" s quoted-literal ...",
      "src": "{42 @foo=|bar|}",
      "exp": "42",
      "expParts": [
        {
          "type": "string",
          "source": "|42|",
          "value": "42"
        }
      ]
    },
    {
      "description": "... quoted-literal",
      "src": "{||}",
      "exp": ""
    },
    {
      "description": "... quoted-literal",
      "src": "{|a|}",
      "exp": "a"
    },
    {
      "description": "... quoted-literal",
      "src": "{|\\\\|}",
      "exp": "\\"
    },
    {
      "description": "... quoted-literal",
      "src": "{|a\\\\\\{\\|\\}|}",
      "exp": "a\\{|}"
    },
    {
      "description": "... unquoted-literal",
      "src": "{0}",
      "exp": "0"
    },
    {
      "description": "... unquoted-literal",
      "src": "{-0}",
      "exp": "-0"
    },
    {
      "description": "... unquoted-literal",
      "src": "{1}",
      "exp": "1"
    },
    {
      "description": "... unquoted-literal",
      "src": "{11}",
      "exp": "11"
    },
    {
      "description": "... unquoted-literal",
      "src": "{0.1}",
      "exp": "0.1"
    },
    {
      "description": "... unquoted-literal",
      "src": "{0.12}",
      "exp": "0.12"
    },
    {
      "description": "... unquoted-literal",
      "src": "{0e1}",
      "exp": "0e1"
    },
    {
      "description": "... unquoted-literal",
      "src": "{0E1}",
      "exp": "0E1"
    },
    {
      "description": "... unquoted-literal",
      "src": "{0E-1}",
      "exp": "0E-1"
    },
    {
      "description": "... unquoted-literal",
      "src": "{0E-1}",
      "exp": "0E-1"
    },
    {
      "description": "+ as unquoted-literal",
      "src": "{+}",
      "exp": "+"
    },
    {
      "description": "- as unquoted-literal",
      "src": "{-}",
      "exp": "-"
    },
    {
      "description": ". as unquoted-literal",
      "src": "{·}",
      "exp": "·"
    },
    {
      "description": "emoji as unquoted-literal",
      "src": "{🥔}",
      "exp": "🥔"
    },
    {
      "description": "emoji above U+FFFF as unquoted-literal, ",
      "src": "{🀄️}",
      "exp": "🀄️"
    },
    {
      "description": "multi-code-point emoji as unquoted-literal",
      "src": "{🏳️‍🌈}",
      "exp": "🏳️‍🌈"
    },
    {
      "description": "various characters as unquoted-literal",
      "src": "{\u00a1\u061d\u1681\u200b\u2010\u2030\u2060\u206a\u3001\ue000\ufdf0}",
      "exp": "\u00a1\u061d\u1681\u200b\u2010\u2030\u2060\u206a\u3001\ue000\ufdf0"
    },
    {
      "src": "hello { world\t\n}",
      "exp": "hello world"
    },
    {
      "src": "hello {\u3000world\r}",
      "exp": "hello world"
    },
    {
      "src": "{$one} and {$two}",
      "params": [
        {
          "name": "one",
          "value": 1.3
        },
        {
          "name": "two",
          "value": 4.2
        }
      ],
      "exp": "1.3 and 4.2"
    },
    {
      "src": "{$one} et {$two}",
      "locale": "fr",
      "params": [
        {
          "name": "one",
          "value": 1.3
        },
        {
          "name": "two",
          "value": 4.2
        }
      ],
      "exp": "1,3 et 4,2"
    },
    {
      "src": ".local $foo = {bar} {{bar {$foo}}}",
      "exp": "bar bar"
    },
    {
      "src": ".local $foo = {|bar|} {{bar {$foo}}}",
      "exp": "bar bar"
    },
    {
      "src": ".local $foo = {|bar|} {{bar {$foo}}}",
      "params": [
        {
          "name": "foo",
          "value": "foo"
        }
      ],
      "exp": "bar bar"
    },
    {
      "src": ".local $foo = {$bar} {{bar {$foo}}}",
      "params": [
        {
          "name": "bar",
          "value": "foo"
        }
      ],
      "exp": "bar foo"
    },
    {
      "src": ".local $foo = {$baz} .local $bar = {$foo} {{bar {$bar}}}",
      "params": [
        {
          "name": "baz",
          "value": "foo"
        }
      ],
      "exp": "bar foo"
    },
    {
      "src": ".input {$foo} {{bar {$foo}}}",
      "params": [
        {
          "name": "foo",
          "value": "foo"
        }
      ],
      "exp": "bar foo"
    },
    {
      "src": ".input {$foo} .local $bar = {$foo} {{bar {$bar}}}",
      "params": [
        {
          "name": "foo",
          "value": "foo"
        }
      ],
      "exp": "bar foo"
    },
    {
      "src": ".local $foo = {$baz} .local $bar = {$foo} {{bar {$bar}}}",
      "params": [
        {
          "name": "baz",
          "value": "foo"
        }
      ],
      "exp": "bar foo"
    },
    {
      "src": ".local $x = {42} .local $y = {$x} {{{$x} {$y}}}",
      "exp": "42 42"
    },
    {
      "src": "{#tag}content",
      "exp": "content",
      "expParts": [
        {
          "type": "markup",
          "kind": "open",
          "name": "tag"
        },
        {
          "type": "literal",
          "value": "content"
        }
      ]
    },
    {
      "src": "{#ns:tag}content{/ns:tag}",
      "exp": "content",
      "expParts": [
        {
          "type": "markup",
          "kind": "open",
          "name": "ns:tag"
        },
        {
          "type": "literal",
          "value": "content"
        },
        {
          "type": "markup",
          "kind": "close",
          "name": "ns:tag"
        }
      ]
    },
    {
      "src": "{/tag}content",
      "exp": "content",
      "expParts": [
        {
          "type": "markup",
          "kind": "close",
          "name": "tag"
        },
        {
          "type": "literal",
          "value": "content"
        }
      ]
    },
    {
      "src": "{#tag foo=bar/}",
      "exp": "",
      "expParts": [
        {
          "type": "markup",
          "kind": "standalone",
          "name": "tag",
          "options": {
            "foo": "bar"
          }
        }
      ]
    },
    {
      "src": "{#tag a:foo=|foo| b:bar=$bar}",
      "params": [
        {
          "name": "bar",
          "value": "b a r"
        }
      ],
      "exp": "",
      "expParts": [
        {
          "type": "markup",
          "kind": "open",
          "name": "tag",
          "options": {
            "a:foo": "foo",
            "b:bar": "b a r"
          }
        }
      ]
    },
    {
      "src": "{42 @foo @bar=13}",
      "exp": "42",
      "expParts": [
        {
          "type": "string",
          "source": "|42|",
          "value": "42"
        }
      ]
    },
    {
      "src": "{{trailing whitespace}} \n",
      "exp": "trailing whitespace"
    },
    {
      "description": "NFC: text is not normalized",
      "src": "\u1E0A\u0323",
      "exp": "\u1E0A\u0323"
    },
    {
      "description": "NFC: variables are compared to each other as-if normalized; decl is non-normalized, use is",
      "src": ".local $\u0044\u0323\u0307 = {foo} {{{$\u1E0c\u0307}}}",
      "exp": "foo"
    },
    {
      "description": "NFC: variables are compared to each other as-if normalized; decl is normalized, use isn't",
      "src": ".local $\u1E0c\u0307 = {foo} {{{$\u0044\u0323\u0307}}}",
      "exp": "foo"
    },
    {
      "description": "NFC: variables are compared to each other as-if normalized; decl is normalized, use isn't",
      "src": ".input {$\u1E0c\u0307} {{{$\u0044\u0323\u0307}}}",
      "params": [{"name": "\u1E0c\u0307", "value": "foo"}],
      "exp": "foo"
    },
    {
      "description": "NFC: variables are compared to each other as-if normalized; decl is non-normalized, use is",
      "src": ".input {$\u0044\u0323\u0307} {{{$\u1E0c\u0307}}}",
      "params": [{"name": "\u0044\u0323\u0307", "value": "foo"}],
      "exp": "foo"
    },
    {
      "description": "NFC: variables are compared to each other as-if normalized; decl is non-normalized, use is; reordering",
      "src": ".local $\u0044\u0307\u0323 = {foo} {{{$\u1E0c\u0307}}}",
      "exp": "foo"
    },
    {
      "description": "NFC: variables are compared to each other as-if normalized; decl is non-normalized, use is; special case mapping",
      "src": ".local $\u0041\u030A\u0301 = {foo} {{{$\u01FA}}}",
      "exp": "foo"
    }
  ]
}
