[
{
"description"
:
"root pointer ref"
,
"schema"
: {
"properties"
: {
"foo"
: {
"$ref"
:
"#"
}
},
"additionalProperties"
:
false
},
"tests"
: [
{
"description"
:
"match"
,
"data"
: {
"foo"
:
false
},
"valid"
:
true
},
{
"description"
:
"recursive match"
,
"data"
: {
"foo"
: {
"foo"
:
false
}},
"valid"
:
true
},
{
"description"
:
"mismatch"
,
"data"
: {
"bar"
:
false
},
"valid"
:
false
},
{
"description"
:
"recursive mismatch"
,
"data"
: {
"foo"
: {
"bar"
:
false
}},
"valid"
:
false
}
]
},
{
"description"
:
"relative pointer ref to object"
,
"schema"
: {
"properties"
: {
"foo"
: {
"type"
:
"integer"
},
"bar"
: {
"$ref"
:
"#/properties/foo"
}
}
},
"tests"
: [
{
"description"
:
"match"
,
"data"
: {
"bar"
: 3},
"valid"
:
true
},
{
"description"
:
"mismatch"
,
"data"
: {
"bar"
:
true
},
"valid"
:
false
}
]
},
{
"description"
:
"relative pointer ref to array"
,
"schema"
: {
"prefixItems"
: [
{
"type"
:
"integer"
},
{
"$ref"
:
"#/prefixItems/0"
}
]
},
"tests"
: [
{
"description"
:
"match array"
,
"data"
: [1, 2],
"valid"
:
true
},
{
"description"
:
"mismatch array"
,
"data"
: [1,
"foo"
],
"valid"
:
false
}
]
},
{
"description"
:
"escaped pointer ref"
,
"schema"
: {
"$defs"
: {
"tilde~field"
: {
"type"
:
"integer"
},
"slash/field"
: {
"type"
:
"integer"
},
"percent%field"
: {
"type"
:
"integer"
}
},
"properties"
: {
"tilde"
: {
"$ref"
:
"#/$defs/tilde~0field"
},
"slash"
: {
"$ref"
:
"#/$defs/slash~1field"
},
"percent"
: {
"$ref"
:
"#/$defs/percent%25field"
}
}
},
"tests"
: [
{
"description"
:
"slash invalid"
,
"data"
: {
"slash"
:
"aoeu"
},
"valid"
:
false
},
{
"description"
:
"tilde invalid"
,
"data"
: {
"tilde"
:
"aoeu"
},
"valid"
:
false
},
{
"description"
:
"percent invalid"
,
"data"
: {
"percent"
:
"aoeu"
},
"valid"
:
false
},
{
"description"
:
"slash valid"
,
"data"
: {
"slash"
: 123},
"valid"
:
true
},
{
"description"
:
"tilde valid"
,
"data"
: {
"tilde"
: 123},
"valid"
:
true
},
{
"description"
:
"percent valid"
,
"data"
: {
"percent"
: 123},
"valid"
:
true
}
]
},
{
"description"
:
"nested refs"
,
"schema"
: {
"$defs"
: {
"a"
: {
"type"
:
"integer"
},
"b"
: {
"$ref"
:
"#/$defs/a"
},
"c"
: {
"$ref"
:
"#/$defs/b"
}
},
"$ref"
:
"#/$defs/c"
},
"tests"
: [
{
"description"
:
"nested ref valid"
,
"data"
: 5,
"valid"
:
true
},
{
"description"
:
"nested ref invalid"
,
"data"
:
"a"
,
"valid"
:
false
}
]
},
{
"description"
:
"ref applies alongside sibling keywords"
,
"schema"
: {
"$defs"
: {
"reffed"
: {
"type"
:
"array"
}
},
"properties"
: {
"foo"
: {
"$ref"
:
"#/$defs/reffed"
,
"maxItems"
: 2
}
}
},
"tests"
: [
{
"description"
:
"ref valid, maxItems valid"
,
"data"
: {
"foo"
: [] },
"valid"
:
true
},
{
"description"
:
"ref valid, maxItems invalid"
,
"data"
: {
"foo"
: [1, 2, 3] },
"valid"
:
false
},
{
"description"
:
"ref invalid"
,
"data"
: {
"foo"
:
"string"
},
"valid"
:
false
}
]
},
{
"description"
:
"remote ref, containing refs itself"
,
"schema"
: {
},
"tests"
: [
{
"description"
:
"remote ref valid"
,
"data"
: {
"minLength"
: 1},
"valid"
:
true
},
{
"description"
:
"remote ref invalid"
,
"data"
: {
"minLength"
: -1},
"valid"
:
false
}
]
},
{
"description"
:
"property named $ref that is not a reference"
,
"schema"
: {
"properties"
: {
"$ref"
: {
"type"
:
"string"
}
}
},
"tests"
: [
{
"description"
:
"property named $ref valid"
,
"data"
: {
"$ref"
:
"a"
},
"valid"
:
true
},
{
"description"
:
"property named $ref invalid"
,
"data"
: {
"$ref"
: 2},
"valid"
:
false
}
]
},
{
"description"
:
"property named $ref, containing an actual $ref"
,
"schema"
: {
"properties"
: {
"$ref"
: {
"$ref"
:
"#/$defs/is-string"
}
},
"$defs"
: {
"is-string"
: {
"type"
:
"string"
}
}
},
"tests"
: [
{
"description"
:
"property named $ref valid"
,
"data"
: {
"$ref"
:
"a"
},
"valid"
:
true
},
{
"description"
:
"property named $ref invalid"
,
"data"
: {
"$ref"
: 2},
"valid"
:
false
}
]
},
{
"description"
:
"$ref to boolean schema true"
,
"schema"
: {
"$ref"
:
"#/$defs/bool"
,
"$defs"
: {
"bool"
:
true
}
},
"tests"
: [
{
"description"
:
"any value is valid"
,
"data"
:
"foo"
,
"valid"
:
true
}
]
},
{
"description"
:
"$ref to boolean schema false"
,
"schema"
: {
"$ref"
:
"#/$defs/bool"
,
"$defs"
: {
"bool"
:
false
}
},
"tests"
: [
{
"description"
:
"any value is invalid"
,
"data"
:
"foo"
,
"valid"
:
false
}
]
},
{
"description"
:
"Recursive references between schemas"
,
"schema"
: {
"description"
:
"tree of nodes"
,
"type"
:
"object"
,
"properties"
: {
"meta"
: {
"type"
:
"string"
},
"nodes"
: {
"type"
:
"array"
,
"items"
: {
"$ref"
:
"node"
}
}
},
"required"
: [
"meta"
,
"nodes"
],
"$defs"
: {
"node"
: {
"description"
:
"node"
,
"type"
:
"object"
,
"properties"
: {
"value"
: {
"type"
:
"number"
},
"subtree"
: {
"$ref"
:
"tree"
}
},
"required"
: [
"value"
]
}
}
},
"tests"
: [
{
"description"
:
"valid tree"
,
"data"
: {
"meta"
:
"root"
,
"nodes"
: [
{
"value"
: 1,
"subtree"
: {
"meta"
:
"child"
,
"nodes"
: [
{
"value"
: 1.1},
{
"value"
: 1.2}
]
}
},
{
"value"
: 2,
"subtree"
: {
"meta"
:
"child"
,
"nodes"
: [
{
"value"
: 2.1},
{
"value"
: 2.2}
]
}
}
]
},
"valid"
:
true
},
{
"description"
:
"invalid tree"
,
"data"
: {
"meta"
:
"root"
,
"nodes"
: [
{
"value"
: 1,
"subtree"
: {
"meta"
:
"child"
,
"nodes"
: [
{
"value"
:
"string is invalid"
},
{
"value"
: 1.2}
]
}
},
{
"value"
: 2,
"subtree"
: {
"meta"
:
"child"
,
"nodes"
: [
{
"value"
: 2.1},
{
"value"
: 2.2}
]
}
}
]
},
"valid"
:
false
}
]
},
{
"description"
:
"refs with quote"
,
"schema"
: {
"properties"
: {
"foo\"bar"
: {
"$ref"
:
"#/$defs/foo%22bar"
}
},
"$defs"
: {
"foo\"bar"
: {
"type"
:
"number"
}
}
},
"tests"
: [
{
"description"
:
"object with numbers is valid"
,
"data"
: {
"foo\"bar"
: 1
},
"valid"
:
true
},
{
"description"
:
"object with strings is invalid"
,
"data"
: {
"foo\"bar"
:
"1"
},
"valid"
:
false
}
]
},
{
"description"
:
"ref creates new scope when adjacent to keywords"
,
"schema"
: {
"$defs"
: {
"A"
: {
"unevaluatedProperties"
:
false
}
},
"properties"
: {
"prop1"
: {
"type"
:
"string"
}
},
"$ref"
:
"#/$defs/A"
},
"tests"
: [
{
"description"
:
"referenced subschema doesn't see annotations from properties"
,
"data"
: {
"prop1"
:
"match"
},
"valid"
:
false
}
]
},
{
"description"
:
"naive replacement of $ref with its destination is not correct"
,
"schema"
: {
"$defs"
: {
"a_string"
: {
"type"
:
"string"
}
},
"enum"
: [
{
"$ref"
:
"#/$defs/a_string"
}
]
},
"tests"
: [
{
"description"
:
"do not evaluate the $ref inside the enum, matching any string"
,
"data"
:
"this is a string"
,
"valid"
:
false
},
{
"description"
:
"do not evaluate the $ref inside the enum, definition exact match"
,
"data"
: {
"type"
:
"string"
},
"valid"
:
false
},
{
"description"
:
"match the enum exactly"
,
"data"
: {
"$ref"
:
"#/$defs/a_string"
},
"valid"
:
true
}
]
},
{
"description"
:
"refs with relative uris and defs"
,
"schema"
: {
"properties"
: {
"foo"
: {
"$id"
:
"schema-relative-uri-defs2.json"
,
"$defs"
: {
"inner"
: {
"properties"
: {
"bar"
: {
"type"
:
"string"
}
}
}
},
"$ref"
:
"#/$defs/inner"
}
},
"$ref"
:
"schema-relative-uri-defs2.json"
},
"tests"
: [
{
"description"
:
"invalid on inner field"
,
"data"
: {
"foo"
: {
"bar"
: 1
},
"bar"
:
"a"
},
"valid"
:
false
},
{
"description"
:
"invalid on outer field"
,
"data"
: {
"foo"
: {
"bar"
:
"a"
},
"bar"
: 1
},
"valid"
:
false
},
{
"description"
:
"valid on both fields"
,
"data"
: {
"foo"
: {
"bar"
:
"a"
},
"bar"
:
"a"
},
"valid"
:
true
}
]
},
{
"description"
:
"relative refs with absolute uris and defs"
,
"schema"
: {
"properties"
: {
"foo"
: {
"$defs"
: {
"inner"
: {
"properties"
: {
"bar"
: {
"type"
:
"string"
}
}
}
},
"$ref"
:
"#/$defs/inner"
}
},
"$ref"
:
"schema-refs-absolute-uris-defs2.json"
},
"tests"
: [
{
"description"
:
"invalid on inner field"
,
"data"
: {
"foo"
: {
"bar"
: 1
},
"bar"
:
"a"
},
"valid"
:
false
},
{
"description"
:
"invalid on outer field"
,
"data"
: {
"foo"
: {
"bar"
:
"a"
},
"bar"
: 1
},
"valid"
:
false
},
{
"description"
:
"valid on both fields"
,
"data"
: {
"foo"
: {
"bar"
:
"a"
},
"bar"
:
"a"
},
"valid"
:
true
}
]
},
{
"description"
:
"$id must be resolved against nearest parent, not just immediate parent"
,
"schema"
: {
"$defs"
: {
"x"
: {
"not"
: {
"$defs"
: {
"y"
: {
"$id"
:
"d.json"
,
"type"
:
"number"
}
}
}
}
},
"allOf"
: [
{
}
]
},
"tests"
: [
{
"description"
:
"number is valid"
,
"data"
: 1,
"valid"
:
true
},
{
"description"
:
"non-number is invalid"
,
"data"
:
"a"
,
"valid"
:
false
}
]
},
{
"description"
:
"order of evaluation: $id and $ref"
,
"schema"
: {
"$comment"
:
"$id must be evaluated before $ref to get the proper $ref destination"
,
"$ref"
:
"int.json"
,
"$defs"
: {
"bigint"
: {
"$id"
:
"int.json"
,
"maximum"
: 10
},
"smallint"
: {
"$id"
:
"/draft/next/ref-and-id1-int.json"
,
"maximum"
: 2
}
}
},
"tests"
: [
{
"description"
:
"data is valid against first definition"
,
"data"
: 5,
"valid"
:
true
},
{
"description"
:
"data is invalid against first definition"
,
"data"
: 50,
"valid"
:
false
}
]
},
{
"description"
:
"order of evaluation: $id and $anchor and $ref"
,
"schema"
: {
"$comment"
:
"$id must be evaluated before $ref to get the proper $ref destination"
,
"$ref"
:
"#bigint"
,
"$defs"
: {
"bigint"
: {
"$anchor"
:
"bigint"
,
"maximum"
: 10
},
"smallint"
: {
"$id"
:
"/draft/next/ref-and-id2/"
,
"$anchor"
:
"bigint"
,
"maximum"
: 2
}
}
},
"tests"
: [
{
"description"
:
"data is valid against first definition"
,
"data"
: 5,
"valid"
:
true
},
{
"description"
:
"data is invalid against first definition"
,
"data"
: 50,
"valid"
:
false
}
]
},
{
"description"
:
"simple URN base URI with $ref via the URN"
,
"schema"
: {
"$comment"
:
"URIs do not have to have HTTP(s) schemes"
,
"$id"
:
"urn:uuid:deadbeef-1234-ffff-ffff-4321feebdaed"
,
"minimum"
: 30,
"properties"
: {
"foo"
: {
"$ref"
:
"urn:uuid:deadbeef-1234-ffff-ffff-4321feebdaed"
}
}
},
"tests"
: [
{
"description"
:
"valid under the URN IDed schema"
,
"data"
: {
"foo"
: 37},
"valid"
:
true
},
{
"description"
:
"invalid under the URN IDed schema"
,
"data"
: {
"foo"
: 12},
"valid"
:
false
}
]
},
{
"description"
:
"simple URN base URI with JSON pointer"
,
"schema"
: {
"$comment"
:
"URIs do not have to have HTTP(s) schemes"
,
"$id"
:
"urn:uuid:deadbeef-1234-00ff-ff00-4321feebdaed"
,
"properties"
: {
"foo"
: {
"$ref"
:
"#/$defs/bar"
}
},
"$defs"
: {
"bar"
: {
"type"
:
"string"
}
}
},
"tests"
: [
{
"description"
:
"a string is valid"
,
"data"
: {
"foo"
:
"bar"
},
"valid"
:
true
},
{
"description"
:
"a non-string is invalid"
,
"data"
: {
"foo"
: 12},
"valid"
:
false
}
]
},
{
"description"
:
"URN base URI with NSS"
,
"schema"
: {
"$comment"
:
"RFC 8141 §2.2"
,
"$id"
:
"urn:example:1/406/47452/2"
,
"properties"
: {
"foo"
: {
"$ref"
:
"#/$defs/bar"
}
},
"$defs"
: {
"bar"
: {
"type"
:
"string"
}
}
},
"tests"
: [
{
"description"
:
"a string is valid"
,
"data"
: {
"foo"
:
"bar"
},
"valid"
:
true
},
{
"description"
:
"a non-string is invalid"
,
"data"
: {
"foo"
: 12},
"valid"
:
false
}
]
},
{
"description"
:
"URN base URI with r-component"
,
"schema"
: {
"$comment"
:
"RFC 8141 §2.3.1"
,
"$id"
:
"urn:example:foo-bar-baz-qux?+CCResolve:cc=uk"
,
"properties"
: {
"foo"
: {
"$ref"
:
"#/$defs/bar"
}
},
"$defs"
: {
"bar"
: {
"type"
:
"string"
}
}
},
"tests"
: [
{
"description"
:
"a string is valid"
,
"data"
: {
"foo"
:
"bar"
},
"valid"
:
true
},
{
"description"
:
"a non-string is invalid"
,
"data"
: {
"foo"
: 12},
"valid"
:
false
}
]
},
{
"description"
:
"URN base URI with q-component"
,
"schema"
: {
"$comment"
:
"RFC 8141 §2.3.2"
,
"$id"
:
"urn:example:weather?=op=map&lat=39.56&lon=-104.85&datetime=1969-07-21T02:56:15Z"
,
"properties"
: {
"foo"
: {
"$ref"
:
"#/$defs/bar"
}
},
"$defs"
: {
"bar"
: {
"type"
:
"string"
}
}
},
"tests"
: [
{
"description"
:
"a string is valid"
,
"data"
: {
"foo"
:
"bar"
},
"valid"
:
true
},
{
"description"
:
"a non-string is invalid"
,
"data"
: {
"foo"
: 12},
"valid"
:
false
}
]
},
{
"description"
:
"URN base URI with f-component"
,
"schema"
: {
"$comment"
:
"RFC 8141 §2.3.3, but we don't allow fragments"
,
},
"tests"
: [
{
"description"
:
"is invalid"
,
"data"
: {
"$id"
:
"urn:example:foo-bar-baz-qux#somepart"
},
"valid"
:
false
}
]
},
{
"description"
:
"URN base URI with URN and JSON pointer ref"
,
"schema"
: {
"$id"
:
"urn:uuid:deadbeef-1234-0000-0000-4321feebdaed"
,
"properties"
: {
"foo"
: {
"$ref"
:
"urn:uuid:deadbeef-1234-0000-0000-4321feebdaed#/$defs/bar"
}
},
"$defs"
: {
"bar"
: {
"type"
:
"string"
}
}
},
"tests"
: [
{
"description"
:
"a string is valid"
,
"data"
: {
"foo"
:
"bar"
},
"valid"
:
true
},
{
"description"
:
"a non-string is invalid"
,
"data"
: {
"foo"
: 12},
"valid"
:
false
}
]
},
{
"description"
:
"URN base URI with URN and anchor ref"
,
"schema"
: {
"$id"
:
"urn:uuid:deadbeef-1234-ff00-00ff-4321feebdaed"
,
"properties"
: {
"foo"
: {
"$ref"
:
"urn:uuid:deadbeef-1234-ff00-00ff-4321feebdaed#something"
}
},
"$defs"
: {
"bar"
: {
"$anchor"
:
"something"
,
"type"
:
"string"
}
}
},
"tests"
: [
{
"description"
:
"a string is valid"
,
"data"
: {
"foo"
:
"bar"
},
"valid"
:
true
},
{
"description"
:
"a non-string is invalid"
,
"data"
: {
"foo"
: 12},
"valid"
:
false
}
]
},
{
"description"
:
"URN ref with nested pointer ref"
,
"schema"
: {
"$ref"
:
"urn:uuid:deadbeef-4321-ffff-ffff-1234feebdaed"
,
"$defs"
: {
"foo"
: {
"$id"
:
"urn:uuid:deadbeef-4321-ffff-ffff-1234feebdaed"
,
"$defs"
: {
"bar"
: {
"type"
:
"string"
}},
"$ref"
:
"#/$defs/bar"
}
}
},
"tests"
: [
{
"description"
:
"a string is valid"
,
"data"
:
"bar"
,
"valid"
:
true
},
{
"description"
:
"a non-string is invalid"
,
"data"
: 12,
"valid"
:
false
}
]
},
{
"description"
:
"ref to if"
,
"schema"
: {
"if"
: {
"type"
:
"integer"
}
},
"tests"
: [
{
"description"
:
"a non-integer is invalid due to the $ref"
,
"data"
:
"foo"
,
"valid"
:
false
},
{
"description"
:
"an integer is valid"
,
"data"
: 12,
"valid"
:
true
}
]
},
{
"description"
:
"ref to then"
,
"schema"
: {
"then"
: {
"type"
:
"integer"
}
},
"tests"
: [
{
"description"
:
"a non-integer is invalid due to the $ref"
,
"data"
:
"foo"
,
"valid"
:
false
},
{
"description"
:
"an integer is valid"
,
"data"
: 12,
"valid"
:
true
}
]
},
{
"description"
:
"ref to else"
,
"schema"
: {
"else"
: {
"type"
:
"integer"
}
},
"tests"
: [
{
"description"
:
"a non-integer is invalid due to the $ref"
,
"data"
:
"foo"
,
"valid"
:
false
},
{
"description"
:
"an integer is valid"
,
"data"
: 12,
"valid"
:
true
}
]
},
{
"description"
:
"ref with absolute-path-reference"
,
"schema"
: {
"$defs"
: {
"a"
: {
"type"
:
"number"
},
"b"
: {
"type"
:
"string"
}
},
"$ref"
:
"/absref/foobar.json"
},
"tests"
: [
{
"description"
:
"a string is valid"
,
"data"
:
"foo"
,
"valid"
:
true
},
{
"description"
:
"an integer is invalid"
,
"data"
: 12,
"valid"
:
false
}
]
},
{
"description"
:
"$id with file URI still resolves pointers - *nix"
,
"schema"
: {
"$defs"
: {
"foo"
: {
"type"
:
"number"
}
},
"$ref"
:
"#/$defs/foo"
},
"tests"
: [
{
"description"
:
"number is valid"
,
"data"
: 1,
"valid"
:
true
},
{
"description"
:
"non-number is invalid"
,
"data"
:
"a"
,
"valid"
:
false
}
]
},
{
"description"
:
"$id with file URI still resolves pointers - windows"
,
"schema"
: {
"$defs"
: {
"foo"
: {
"type"
:
"number"
}
},
"$ref"
:
"#/$defs/foo"
},
"tests"
: [
{
"description"
:
"number is valid"
,
"data"
: 1,
"valid"
:
true
},
{
"description"
:
"non-number is invalid"
,
"data"
:
"a"
,
"valid"
:
false
}
]
},
{
"description"
:
"empty tokens in $ref json-pointer"
,
"schema"
: {
"$defs"
: {
""
: {
"$defs"
: {
""
: {
"type"
:
"number"
}
}
}
},
"allOf"
: [
{
"$ref"
:
"#/$defs//$defs/"
}
]
},
"tests"
: [
{
"description"
:
"number is valid"
,
"data"
: 1,
"valid"
:
true
},
{
"description"
:
"non-number is invalid"
,
"data"
:
"a"
,
"valid"
:
false
}
]
}
]