[
  {
    "description": "patternProperties validates properties matching a regex",
    "database": {
      "schemas": [
        {
          "patternProperties": {
            "f.*o": {
              "type": "integer"
            }
          },
          "items": {},
          "$id": "patternProperties_0_0"
        }
      ]
    },
    "tests": [
      {
        "description": "a single valid match is valid",
        "data": {
          "foo": 1
        },
        "schema_id": "patternProperties_0_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "multiple valid matches is valid",
        "data": {
          "foo": 1,
          "foooooo": 2
        },
        "schema_id": "patternProperties_0_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "a single invalid match is invalid",
        "data": {
          "foo": "bar",
          "fooooo": 2
        },
        "schema_id": "patternProperties_0_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      },
      {
        "description": "multiple invalid matches is invalid",
        "data": {
          "foo": "bar",
          "foooooo": "baz"
        },
        "schema_id": "patternProperties_0_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      },
      {
        "description": "ignores arrays",
        "data": [
          "foo"
        ],
        "schema_id": "patternProperties_0_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "ignores strings",
        "data": "foo",
        "schema_id": "patternProperties_0_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "ignores other non-objects",
        "data": 12,
        "schema_id": "patternProperties_0_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "extra property not matching pattern is INVALID (strict by default)",
        "data": {
          "foo": 1,
          "extra": 2
        },
        "schema_id": "patternProperties_0_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      }
    ]
  },
  {
    "description": "multiple simultaneous patternProperties are validated",
    "database": {
      "schemas": [
        {
          "patternProperties": {
            "a*": {
              "type": "integer"
            },
            "aaa*": {
              "maximum": 20
            }
          },
          "$id": "patternProperties_1_0"
        }
      ]
    },
    "tests": [
      {
        "description": "a single valid match is valid",
        "data": {
          "a": 21
        },
        "schema_id": "patternProperties_1_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "a simultaneous match is valid",
        "data": {
          "aaaa": 18
        },
        "schema_id": "patternProperties_1_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "multiple matches is valid",
        "data": {
          "a": 21,
          "aaaa": 18
        },
        "schema_id": "patternProperties_1_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "an invalid due to one is invalid",
        "data": {
          "a": "bar"
        },
        "schema_id": "patternProperties_1_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      },
      {
        "description": "an invalid due to the other is invalid",
        "data": {
          "aaaa": 31
        },
        "schema_id": "patternProperties_1_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      },
      {
        "description": "an invalid due to both is invalid",
        "data": {
          "aaa": "foo",
          "aaaa": 31
        },
        "schema_id": "patternProperties_1_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      }
    ]
  },
  {
    "description": "regexes are not anchored by default and are case sensitive",
    "database": {
      "schemas": [
        {
          "patternProperties": {
            "[0-9]{2,}": {
              "type": "boolean"
            },
            "X_": {
              "type": "string"
            }
          },
          "extensible": true,
          "$id": "patternProperties_2_0"
        }
      ]
    },
    "tests": [
      {
        "description": "non recognized members are ignored",
        "data": {
          "answer 1": "42"
        },
        "schema_id": "patternProperties_2_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "recognized members are accounted for",
        "data": {
          "a31b": null
        },
        "schema_id": "patternProperties_2_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      },
      {
        "description": "regexes are case sensitive",
        "data": {
          "a_x_3": 3
        },
        "schema_id": "patternProperties_2_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "regexes are case sensitive, 2",
        "data": {
          "a_X_3": 3
        },
        "schema_id": "patternProperties_2_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      }
    ]
  },
  {
    "description": "patternProperties with boolean schemas",
    "database": {
      "schemas": [
        {
          "patternProperties": {
            "f.*": true,
            "b.*": false
          },
          "$id": "patternProperties_3_0"
        }
      ]
    },
    "tests": [
      {
        "description": "object with property matching schema true is valid",
        "data": {
          "foo": 1
        },
        "schema_id": "patternProperties_3_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "object with property matching schema false is invalid",
        "data": {
          "bar": 2
        },
        "schema_id": "patternProperties_3_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      },
      {
        "description": "object with both properties is invalid",
        "data": {
          "foo": 1,
          "bar": 2
        },
        "schema_id": "patternProperties_3_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      },
      {
        "description": "object with a property matching both true and false is invalid",
        "data": {
          "foobar": 1
        },
        "schema_id": "patternProperties_3_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      },
      {
        "description": "empty object is valid",
        "data": {},
        "schema_id": "patternProperties_3_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      }
    ]
  },
  {
    "description": "patternProperties with null valued instance properties",
    "database": {
      "schemas": [
        {
          "patternProperties": {
            "^.*bar$": {
              "type": "null"
            }
          },
          "$id": "patternProperties_4_0"
        }
      ]
    },
    "tests": [
      {
        "description": "allows null values",
        "data": {
          "foobar": null
        },
        "schema_id": "patternProperties_4_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      }
    ]
  },
  {
    "description": "extensible: true allows extra properties NOT matching pattern",
    "database": {
      "schemas": [
        {
          "patternProperties": {
            "f.*o": {
              "type": "integer"
            }
          },
          "extensible": true,
          "$id": "patternProperties_5_0"
        }
      ]
    },
    "tests": [
      {
        "description": "extra property not matching pattern is valid",
        "data": {
          "bar": 1
        },
        "schema_id": "patternProperties_5_0",
        "action": "validate",
        "expect": {
          "success": true
        }
      },
      {
        "description": "property matching pattern MUST still be valid",
        "data": {
          "foo": "invalid string"
        },
        "schema_id": "patternProperties_5_0",
        "action": "validate",
        "expect": {
          "success": false
        }
      }
    ]
  }
]