{
  "schema": "https://bars.commonsware.com/conformance/schema/render-fixture.schema.json",
  "version": "0.1.0",
  "cases": [
    {
      "name": "url_decode-basic",
      "spotlight": true,
      "description": "Plus signs become spaces; percent-sequences become their literal characters.",
      "template": "{{{ q | url_decode }}}",
      "context": {
        "q": "hello+world%21"
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "hello world!"
      }
    },
    {
      "name": "url_decode-lowercase-hex",
      "description": "Lowercase hex digits in percent-sequences decode correctly.",
      "template": "{{{ q | url_decode }}}",
      "context": {
        "q": "%c3%a9"
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "\u00e9"
      }
    },
    {
      "name": "url_decode-uppercase-hex-multibyte",
      "spotlight": true,
      "description": "Multi-byte UTF-8 sequences decode to the original character.",
      "template": "{{{ q | url_decode }}}",
      "context": {
        "q": "caf%C3%A9"
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "caf\u00e9"
      }
    },
    {
      "name": "url_decode-empty",
      "description": "Empty input decodes to empty output.",
      "template": "{{{ q | url_decode }}}",
      "context": {
        "q": ""
      },
      "expect": {
        "kind": "output",
        "expectedOutput": ""
      }
    },
    {
      "name": "url_decode-malformed-non-hex-is-null",
      "description": "Percent-sequence whose digits are not hex is a soft failure, so url_decode yields null.",
      "template": "{{{ q | url_decode }}}",
      "context": {
        "q": "bad%G1value"
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "null"
      }
    },
    {
      "name": "url_decode-malformed-low-nibble-is-null",
      "description": "Percent-sequence whose second digit is not hex is a soft failure, so url_decode yields null.",
      "template": "{{{ q | url_decode }}}",
      "context": {
        "q": "ab%1Gcd"
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "null"
      }
    },
    {
      "name": "url_decode-trailing-percent-is-null",
      "description": "Trailing percent with no digits is a soft failure, so url_decode yields null.",
      "template": "{{{ q | url_decode }}}",
      "context": {
        "q": "ab%"
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "null"
      }
    },
    {
      "name": "url_decode-with-arg-is-error",
      "description": "Any argument is an arity error.",
      "template": "{{ q | url_decode: \"x\" }}",
      "context": {
        "q": "hi"
      },
      "expect": {
        "kind": "error",
        "errorCode": "KB-2002"
      }
    }
  ]
}
