[
  {
    "description": "nested refs",
    "database": {
      "schemas": [
        {
          "$ref": "c_212",
          "$id": "ref_4_0"
        },
        {
          "$id": "a_212",
          "type": "integer"
        },
        {
          "$id": "b_212",
          "$ref": "a_212"
        },
        {
          "$id": "c_212",
          "$ref": "b_212"
        }
      ]
    },
    "tests": [
      {
        "description": "nested ref valid",
        "data": 5,
        "schema_id": "ref_4_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "nested ref invalid",
        "data": "a",
        "schema_id": "ref_4_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      }
    ]
  },
  {
    "description": "ref applies alongside sibling keywords",
    "database": {
      "schemas": [
        {
          "properties": {
            "foo": {
              "$ref": "reffed_248",
              "maxItems": 2
            }
          },
          "$id": "ref_5_0"
        },
        {
          "$id": "reffed_248",
          "type": "array"
        }
      ]
    },
    "tests": [
      {
        "description": "ref valid, maxItems valid",
        "data": {
          "foo": []
        },
        "schema_id": "ref_5_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "ref valid, maxItems invalid",
        "data": {
          "foo": [
            1,
            2,
            3
          ]
        },
        "schema_id": "ref_5_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      },
      {
        "description": "ref invalid",
        "data": {
          "foo": "string"
        },
        "schema_id": "ref_5_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      }
    ]
  },
  {
    "description": "property named $ref that is not a reference",
    "database": {
      "schemas": [
        {
          "properties": {
            "$ref": {
              "type": "string"
            }
          },
          "$id": "ref_6_0"
        }
      ]
    },
    "tests": [
      {
        "description": "property named $ref valid",
        "data": {
          "$ref": "a"
        },
        "schema_id": "ref_6_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "property named $ref invalid",
        "data": {
          "$ref": 2
        },
        "schema_id": "ref_6_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      }
    ]
  },
  {
    "description": "property named $ref, containing an actual $ref",
    "database": {
      "schemas": [
        {
          "properties": {
            "$ref": {
              "$ref": "is-string_344"
            }
          },
          "$id": "ref_7_0"
        },
        {
          "$id": "is-string_344",
          "type": "string"
        }
      ]
    },
    "tests": [
      {
        "description": "property named $ref valid",
        "data": {
          "$ref": "a"
        },
        "schema_id": "ref_7_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "property named $ref invalid",
        "data": {
          "$ref": 2
        },
        "schema_id": "ref_7_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      }
    ]
  },
  {
    "description": "$ref to boolean schema true",
    "database": {
      "schemas": [
        {
          "$ref": "bool_378",
          "$id": "ref_8_0"
        },
        {
          "$id": "bool_378",
          "extensible": true
        }
      ]
    },
    "tests": [
      {
        "description": "any value is valid",
        "data": "foo",
        "schema_id": "ref_8_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      }
    ]
  },
  {
    "description": "$ref to boolean schema false",
    "database": {
      "schemas": [
        {
          "$ref": "bool_400",
          "$id": "ref_9_0"
        },
        {
          "$id": "bool_400",
          "extensible": false,
          "not": {}
        }
      ]
    },
    "tests": [
      {
        "description": "any value is invalid",
        "data": "foo",
        "schema_id": "ref_9_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      }
    ]
  },
  {
    "description": "refs with quote",
    "database": {
      "schemas": [
        {
          "properties": {
            "foo\"bar": {
              "$ref": "foo%22bar_550"
            }
          },
          "$id": "ref_11_0"
        },
        {
          "$id": "foo%22bar_550",
          "type": "number"
        }
      ]
    },
    "tests": [
      {
        "description": "object with numbers is valid",
        "data": {
          "foo\"bar": 1
        },
        "schema_id": "ref_11_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "object with strings is invalid",
        "data": {
          "foo\"bar": "1"
        },
        "schema_id": "ref_11_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      }
    ]
  },
  {
    "description": "$ref boundary resets to loose",
    "database": {
      "schemas": [
        {
          "$ref": "target_1465",
          "$id": "ref_35_0"
        },
        {
          "$id": "target_1465",
          "properties": {
            "foo": {
              "type": "string"
            }
          }
        }
      ]
    },
    "tests": [
      {
        "description": "extra property in ref target is invalid (strict by default)",
        "data": {
          "foo": "bar",
          "extra": 1
        },
        "schema_id": "ref_35_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      }
    ]
  },
  {
    "description": "$ref target can enforce strictness",
    "database": {
      "schemas": [
        {
          "$ref": "target_1496",
          "$id": "ref_36_0"
        },
        {
          "$id": "target_1496",
          "extensible": false,
          "properties": {
            "foo": {
              "type": "string"
            }
          }
        }
      ]
    },
    "tests": [
      {
        "description": "extra property in ref target is invalid",
        "data": {
          "foo": "bar",
          "extra": 1
        },
        "schema_id": "ref_36_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      }
    ]
  },
  {
    "description": "strictness: boundary reset at $ref",
    "database": {
      "schemas": [
        {
          "extensible": true,
          "properties": {
            "inline_child": {
              "properties": {
                "a": {
                  "type": "integer"
                }
              }
            },
            "ref_child": {
              "$ref": "strict_node_1544"
            },
            "extensible_ref_child": {
              "$ref": "extensible_node_1551"
            }
          },
          "$id": "ref_37_0"
        },
        {
          "$id": "strict_node_1544",
          "properties": {
            "b": {
              "type": "integer"
            }
          }
        },
        {
          "$id": "extensible_node_1551",
          "extensible": true,
          "properties": {
            "c": {
              "type": "integer"
            }
          }
        }
      ]
    },
    "tests": [
      {
        "description": "inline child inherits looseness",
        "data": {
          "inline_child": {
            "a": 1,
            "extra": 2
          }
        },
        "schema_id": "ref_37_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "ref child resets to strict (default)",
        "data": {
          "ref_child": {
            "b": 1,
            "extra": 2
          }
        },
        "schema_id": "ref_37_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      },
      {
        "description": "ref child with explicit extensible=true is loose",
        "data": {
          "extensible_ref_child": {
            "c": 1,
            "extra": 2
          }
        },
        "schema_id": "ref_37_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      }
    ]
  },
  {
    "description": "arrays: ref items inherit strictness (reset at boundary)",
    "database": {
      "schemas": [
        {
          "properties": {
            "list": {
              "type": "array",
              "items": {
                "$ref": "strict_node_1614"
              }
            }
          },
          "$id": "ref_38_0"
        },
        {
          "$id": "strict_node_1614",
          "properties": {
            "a": {
              "type": "integer"
            }
          }
        }
      ]
    },
    "tests": [
      {
        "description": "ref item with extra property is invalid (strict by default)",
        "data": {
          "list": [
            {
              "a": 1,
              "extra": 2
            }
          ]
        },
        "schema_id": "ref_38_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      }
    ]
  },
  {
    "description": "implicit keyword shadowing",
    "database": {
      "schemas": [
        {
          "$ref": "parent_1648",
          "properties": {
            "type": {
              "const": "child"
            },
            "age": {
              "minimum": 15
            }
          },
          "$id": "ref_39_0"
        },
        {
          "$id": "parent_1648",
          "type": "object",
          "properties": {
            "type": {
              "const": "parent"
            },
            "age": {
              "minimum": 10,
              "maximum": 20
            }
          },
          "required": [
            "type",
            "age"
          ]
        }
      ]
    },
    "tests": [
      {
        "description": "child type overrides parent type",
        "data": {
          "type": "child",
          "age": 15
        },
        "schema_id": "ref_39_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "parent type is now invalid (shadowed)",
        "data": {
          "type": "parent",
          "age": 15
        },
        "schema_id": "ref_39_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      },
      {
        "description": "child min age (15) is enforced",
        "data": {
          "type": "child",
          "age": 12
        },
        "schema_id": "ref_39_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      },
      {
        "description": "parent max age (20) is shadowed (replaced) by child definition",
        "data": {
          "type": "child",
          "age": 21
        },
        "schema_id": "ref_39_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      }
    ]
  },
  {
    "description": "Entities extending entities (Physical Birth)",
    "database": {
      "types": [
        {
          "name": "entity",
          "variations": [
            "entity",
            "organization",
            "person"
          ],
          "schemas": [
            {
              "$id": "entity",
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "type": {
                  "type": "string"
                }
              }
            }
          ]
        },
        {
          "name": "organization",
          "variations": [
            "organization",
            "person"
          ],
          "schemas": [
            {
              "$id": "organization",
              "$ref": "entity",
              "properties": {
                "name": {
                  "type": "string"
                }
              }
            }
          ]
        },
        {
          "name": "person",
          "variations": [
            "person"
          ],
          "schemas": [
            {
              "$id": "person",
              "$ref": "organization",
              "properties": {
                "first_name": {
                  "type": "string"
                }
              }
            }
          ]
        }
      ],
      "puncs": [
        {
          "name": "save_org",
          "schemas": [
            {
              "$id": "save_org.request",
              "$ref": "organization"
            }
          ]
        }
      ]
    },
    "tests": [
      {
        "description": "Valid person against organization schema (implicit type allowance from physical hierarchy)",
        "schema_id": "save_org.request",
        "data": {
          "id": "1",
          "type": "person",
          "name": "ACME"
        },
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "Valid organization against organization schema",
        "schema_id": "save_org.request",
        "data": {
          "id": "2",
          "type": "organization",
          "name": "ACME"
        },
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "Invalid entity against organization schema (ancestor not allowed)",
        "schema_id": "save_org.request",
        "data": {
          "id": "3",
          "type": "entity"
        },
        "action": "validate",
        "expect": {
          "success": false,
          "errors": [
            {
              "code": "TYPE_MISMATCH",
              "path": "/type"
            }
          ]
        }
      }
    ]
  },
  {
    "description": "Viral Infection: Ad-hocs inheriting entity boundaries via $ref",
    "database": {
      "types": [
        {
          "name": "entity",
          "variations": [
            "entity",
            "person"
          ],
          "schemas": [
            {
              "$id": "entity",
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "type": {
                  "type": "string"
                }
              }
            }
          ]
        },
        {
          "name": "person",
          "variations": [
            "person"
          ],
          "schemas": [
            {
              "$id": "person",
              "$ref": "entity",
              "properties": {
                "first_name": {
                  "type": "string"
                }
              }
            },
            {
              "$id": "light.person",
              "$ref": "entity",
              "properties": {
                "first_name": {
                  "type": "string"
                }
              }
            }
          ]
        }
      ],
      "puncs": [
        {
          "name": "save_person_light",
          "schemas": [
            {
              "$id": "save_person_light.request",
              "$ref": "light.person",
              "properties": {
                "extra_request_field": {
                  "type": "string"
                }
              }
            }
          ]
        }
      ]
    },
    "tests": [
      {
        "description": "Valid person against ad-hoc request schema (request virally inherited person variations)",
        "schema_id": "save_person_light.request",
        "data": {
          "id": "1",
          "type": "person",
          "first_name": "John",
          "extra_request_field": "test"
        },
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "Invalid entity against ad-hoc request schema (viral inheritance enforces person boundary)",
        "schema_id": "save_person_light.request",
        "data": {
          "id": "1",
          "type": "entity",
          "first_name": "John"
        },
        "action": "validate",
        "expect": {
          "success": false,
          "errors": [
            {
              "code": "TYPE_MISMATCH",
              "path": "/type"
            }
          ]
        }
      }
    ]
  },
  {
    "description": "Ad-hocs extending ad-hocs (No type property)",
    "database": {
      "puncs": [
        {
          "name": "save_address",
          "schemas": [
            {
              "$id": "address",
              "type": "object",
              "properties": {
                "street": {
                  "type": "string"
                },
                "city": {
                  "type": "string"
                }
              }
            },
            {
              "$id": "us_address",
              "$ref": "address",
              "properties": {
                "state": {
                  "type": "string"
                },
                "zip": {
                  "type": "string"
                }
              }
            },
            {
              "$id": "save_address.request",
              "$ref": "us_address"
            }
          ]
        }
      ]
    },
    "tests": [
      {
        "description": "Valid us_address",
        "schema_id": "save_address.request",
        "data": {
          "street": "123 Main",
          "city": "Anytown",
          "state": "CA",
          "zip": "12345"
        },
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "Invalid base address against us_address",
        "schema_id": "save_address.request",
        "data": {
          "street": "123 Main",
          "city": "Anytown"
        },
        "action": "validate",
        "expect": {
          "success": true
        }
      }
    ]
  },
  {
    "description": "Ad-hocs extending ad-hocs (with string type property, no magic)",
    "database": {
      "puncs": [
        {
          "name": "save_config",
          "schemas": [
            {
              "$id": "config_base",
              "type": "object",
              "properties": {
                "type": {
                  "type": "string",
                  "const": "config_base"
                },
                "setting": {
                  "type": "string"
                }
              }
            },
            {
              "$id": "config_advanced",
              "$ref": "config_base",
              "properties": {
                "type": {
                  "type": "string",
                  "const": "config_advanced"
                },
                "advanced_setting": {
                  "type": "string"
                }
              }
            },
            {
              "$id": "save_config.request",
              "$ref": "config_base"
            }
          ]
        }
      ]
    },
    "tests": [
      {
        "description": "Valid config_base against config_base",
        "schema_id": "save_config.request",
        "data": {
          "type": "config_base",
          "setting": "on"
        },
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "Invalid config_advanced against config_base (no type magic, const is strictly 'config_base')",
        "schema_id": "save_config.request",
        "data": {
          "type": "config_advanced",
          "setting": "on",
          "advanced_setting": "off"
        },
        "action": "validate",
        "expect": {
          "success": false
        }
      }
    ]
  }
]