{
  "schema": "https://bars.commonsware.com/conformance/schema/render-fixture.schema.json",
  "version": "0.1.0",
  "cases": [
    {
      "name": "or-true-true",
      "description": "Both operands truthy: or evaluates to true.",
      "template": "{{ a or b }}",
      "context": {
        "a": true,
        "b": true
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "true"
      }
    },
    {
      "name": "or-true-false",
      "description": "One truthy operand suffices: or evaluates to true.",
      "template": "{{ a or b }}",
      "context": {
        "a": true,
        "b": false
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "true"
      }
    },
    {
      "name": "or-false-true",
      "description": "One truthy operand suffices regardless of position: or evaluates to true.",
      "template": "{{ a or b }}",
      "context": {
        "a": false,
        "b": true
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "true"
      }
    },
    {
      "name": "or-false-false",
      "description": "Both operands falsy: or evaluates to false.",
      "template": "{{ a or b }}",
      "context": {
        "a": false,
        "b": false
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "false"
      }
    },
    {
      "name": "or-uppercase",
      "description": "OR in all-caps is recognised identically to lowercase.",
      "template": "{{ a OR b }}",
      "context": {
        "a": true,
        "b": false
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "true"
      }
    },
    {
      "name": "or-mixed-case",
      "description": "Or with mixed case is recognised identically to lowercase.",
      "template": "{{ a Or b }}",
      "context": {
        "a": false,
        "b": false
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "false"
      }
    },
    {
      "name": "and-true-true",
      "description": "Both operands truthy: and evaluates to true.",
      "template": "{{ a and b }}",
      "context": {
        "a": true,
        "b": true
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "true"
      }
    },
    {
      "name": "and-true-false",
      "description": "One falsy operand: and evaluates to false.",
      "template": "{{ a and b }}",
      "context": {
        "a": true,
        "b": false
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "false"
      }
    },
    {
      "name": "and-empty-string-and-nonempty",
      "description": "Empty string is falsy under kBars truthiness; and short-circuits to false.",
      "template": "{{ a and b }}",
      "context": {
        "a": "",
        "b": "x"
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "false"
      }
    },
    {
      "name": "and-empty-array-and-object",
      "description": "Empty array is falsy and any object is truthy: and evaluates to false.",
      "template": "{{ a and b }}",
      "context": {
        "a": [],
        "b": {}
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "false"
      }
    },
    {
      "name": "or-missing-and-literal",
      "description": "Missing identifier resolves to null (falsy); a non-empty string literal is truthy; or evaluates to true.",
      "template": "{{ missing or \"x\" }}",
      "context": {},
      "expect": {
        "kind": "output",
        "expectedOutput": "true"
      }
    },
    {
      "name": "or-zero-and-zero-point-zero",
      "description": "Numeric literal 0 and 0.0 are both falsy under truthiness: or evaluates to false.",
      "template": "{{ 0 or 0.0 }}",
      "context": {},
      "expect": {
        "kind": "output",
        "expectedOutput": "false"
      }
    },
    {
      "name": "or-zero-and-one",
      "description": "0 is falsy, 1 is truthy: or evaluates to true.",
      "template": "{{ 0 or 1 }}",
      "context": {},
      "expect": {
        "kind": "output",
        "expectedOutput": "true"
      }
    },
    {
      "name": "and-in-if-block",
      "description": "Logical operators flow naturally through #if expression slots.",
      "template": "{{#if a and b }}yes{{else}}no{{/if}}",
      "context": {
        "a": true,
        "b": true
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "yes"
      }
    },
    {
      "name": "or-in-unless-block",
      "description": "Logical operators flow through #unless expression slots; both operands falsy means the body renders.",
      "template": "{{#unless a or b }}neither{{/unless}}",
      "context": {
        "a": false,
        "b": false
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "neither"
      }
    },
    {
      "name": "or-triple-mustache",
      "description": "Triple-mustache renders the binary result (a boolean) verbatim; the HTML-looking literal '<b>' does not appear in the output because the operator returned the boolean true.",
      "template": "{{{ a or \"<b>\" }}}",
      "context": {
        "a": false
      },
      "expect": {
        "kind": "output",
        "expectedOutput": "true"
      }
    }
  ]
}
