{
  "_": "Общие случаи для PHP и JavaScript. Условия видимости считаются дважды — на сервере при сохранении и на клиенте при рисовании формы, — и расхождение приводит к тому, что поле молча не сохраняется. Поэтому обе реализации проверяются ОДНИМ набором случаев, а не двумя похожими списками. Смотри docs/admin.md.",
  "cases": [
    {
      "name": "always",
      "condition": { "op": "always" },
      "values": {},
      "expected": true
    },
    {
      "name": "equals: строка совпала",
      "condition": { "op": "equals", "key": "mode", "value": "pro" },
      "values": { "mode": "pro" },
      "expected": true
    },
    {
      "name": "equals: строка не совпала",
      "condition": { "op": "equals", "key": "mode", "value": "pro" },
      "values": { "mode": "lite" },
      "expected": false
    },
    {
      "name": "equals: число против числовой строки — сравнение числами",
      "condition": { "op": "equals", "key": "limit", "value": 10 },
      "values": { "limit": "10" },
      "expected": true
    },
    {
      "name": "equals: число против нечисловой строки — сравнение строками",
      "condition": { "op": "equals", "key": "limit", "value": 0 },
      "values": { "limit": "много" },
      "expected": false
    },
    {
      "name": "equals: ключа нет вовсе",
      "condition": { "op": "equals", "key": "missing", "value": "x" },
      "values": {},
      "expected": false
    },
    {
      "name": "equals: null против пустой строки",
      "condition": { "op": "equals", "key": "title", "value": "" },
      "values": { "title": null },
      "expected": true
    },
    {
      "name": "not_equals",
      "condition": { "op": "not_equals", "key": "mode", "value": "lite" },
      "values": { "mode": "pro" },
      "expected": true
    },
    {
      "name": "in: значение из списка",
      "condition": { "op": "in", "key": "mode", "value": ["pro", "max"] },
      "values": { "mode": "max" },
      "expected": true
    },
    {
      "name": "in: значение вне списка",
      "condition": { "op": "in", "key": "mode", "value": ["pro", "max"] },
      "values": { "mode": "lite" },
      "expected": false
    },
    {
      "name": "in: числовая строка против чисел",
      "condition": { "op": "in", "key": "size", "value": [1, 2, 3] },
      "values": { "size": "2" },
      "expected": true
    },
    {
      "name": "truthy: включённый флаг",
      "condition": { "op": "truthy", "key": "enabled" },
      "values": { "enabled": true },
      "expected": true
    },
    {
      "name": "truthy: строка '0' ложна, как в PHP",
      "condition": { "op": "truthy", "key": "enabled" },
      "values": { "enabled": "0" },
      "expected": false
    },
    {
      "name": "truthy: пустая строка ложна",
      "condition": { "op": "truthy", "key": "enabled" },
      "values": { "enabled": "" },
      "expected": false
    },
    {
      "name": "truthy: ноль ложен",
      "condition": { "op": "truthy", "key": "enabled" },
      "values": { "enabled": 0 },
      "expected": false
    },
    {
      "name": "truthy: пустой массив ложен",
      "condition": { "op": "truthy", "key": "list" },
      "values": { "list": [] },
      "expected": false
    },
    {
      "name": "truthy: непустой массив истинен",
      "condition": { "op": "truthy", "key": "list" },
      "values": { "list": ["a"] },
      "expected": true
    },
    {
      "name": "truthy: строка '1' истинна",
      "condition": { "op": "truthy", "key": "enabled" },
      "values": { "enabled": "1" },
      "expected": true
    },
    {
      "name": "falsy: ключа нет",
      "condition": { "op": "falsy", "key": "missing" },
      "values": {},
      "expected": true
    },
    {
      "name": "filled: пустая строка не заполнена",
      "condition": { "op": "filled", "key": "title" },
      "values": { "title": "" },
      "expected": false
    },
    {
      "name": "filled: ноль заполнен",
      "condition": { "op": "filled", "key": "count" },
      "values": { "count": 0 },
      "expected": true
    },
    {
      "name": "filled: строка '0' заполнена",
      "condition": { "op": "filled", "key": "count" },
      "values": { "count": "0" },
      "expected": true
    },
    {
      "name": "filled: пустой массив не заполнен",
      "condition": { "op": "filled", "key": "list" },
      "values": { "list": [] },
      "expected": false
    },
    {
      "name": "all: обе ветки истинны",
      "condition": {
        "op": "all",
        "children": [
          { "op": "truthy", "key": "enabled" },
          { "op": "equals", "key": "mode", "value": "pro" }
        ]
      },
      "values": { "enabled": true, "mode": "pro" },
      "expected": true
    },
    {
      "name": "all: одна ветка ложна",
      "condition": {
        "op": "all",
        "children": [
          { "op": "truthy", "key": "enabled" },
          { "op": "equals", "key": "mode", "value": "lite" }
        ]
      },
      "values": { "enabled": true, "mode": "pro" },
      "expected": false
    },
    {
      "name": "any: одна ветка истинна",
      "condition": {
        "op": "any",
        "children": [
          { "op": "equals", "key": "mode", "value": "lite" },
          { "op": "truthy", "key": "enabled" }
        ]
      },
      "values": { "enabled": true, "mode": "pro" },
      "expected": true
    },
    {
      "name": "not",
      "condition": {
        "op": "not",
        "children": [{ "op": "equals", "key": "mode", "value": "lite" }]
      },
      "values": { "mode": "pro" },
      "expected": true
    },
    {
      "name": "вложенность: not поверх all",
      "condition": {
        "op": "not",
        "children": [
          {
            "op": "all",
            "children": [
              { "op": "truthy", "key": "enabled" },
              { "op": "filled", "key": "title" }
            ]
          }
        ]
      },
      "values": { "enabled": true, "title": "" },
      "expected": true
    }
  ]
}
