blob: a50c2cf6af9a25b0b84fba40624e5f8973d8ce63 [file]
[
{
"description": "A $dynamicRef to a $dynamicAnchor in the same schema resource behaves like a normal $ref to an $anchor",
"schema": {
"$schema": "https://json-schema.org/v1",
"$id": "https://test.json-schema.org/dynamicRef-dynamicAnchor-same-schema/root",
"type": "array",
"items": { "$dynamicRef": "#items" },
"$defs": {
"foo": {
"$dynamicAnchor": "items",
"type": "string"
}
}
},
"tests": [
{
"description": "An array of strings is valid",
"data": ["foo", "bar"],
"valid": true
},
{
"description": "An array containing non-strings is invalid",
"data": ["foo", 42],
"valid": false
}
]
},
{
"description": "A $dynamicRef resolves to the first $dynamicAnchor still in scope that is encountered when the schema is evaluated",
"schema": {
"$schema": "https://json-schema.org/v1",
"$id": "https://test.json-schema.org/typical-dynamic-resolution/root",
"$ref": "list",
"$defs": {
"foo": {
"$dynamicAnchor": "items",
"type": "string"
},
"list": {
"$id": "list",
"type": "array",
"items": { "$dynamicRef": "#items" }
}
}
},
"tests": [
{
"description": "An array of strings is valid",
"data": ["foo", "bar"],
"valid": true
},
{
"description": "An array containing non-strings is invalid",
"data": ["foo", 42],
"valid": false
}
]
},
{
"description": "A $dynamicRef with intermediate scopes that don't include a matching $dynamicAnchor does not affect dynamic scope resolution",
"schema": {
"$schema": "https://json-schema.org/v1",
"$id": "https://test.json-schema.org/dynamic-resolution-with-intermediate-scopes/root",
"$ref": "intermediate-scope",
"$defs": {
"foo": {
"$dynamicAnchor": "items",
"type": "string"
},
"intermediate-scope": {
"$id": "intermediate-scope",
"$ref": "list"
},
"list": {
"$id": "list",
"type": "array",
"items": { "$dynamicRef": "#items" }
}
}
},
"tests": [
{
"description": "An array of strings is valid",
"data": ["foo", "bar"],
"valid": true
},
{
"description": "An array containing non-strings is invalid",
"data": ["foo", 42],
"valid": false
}
]
},
{
"description": "An $anchor with the same name as a $dynamicAnchor is not used for dynamic scope resolution",
"schema": {
"$schema": "https://json-schema.org/v1",
"$id": "https://test.json-schema.org/dynamic-resolution-ignores-anchors/root",
"$ref": "list",
"$defs": {
"foo": {
"$anchor": "items",
"type": "string"
},
"list": {
"$id": "list",
"type": "array",
"items": { "$dynamicRef": "#items" },
"$defs": {
"items": {
"$dynamicAnchor": "items"
}
}
}
}
},
"tests": [
{
"description": "Any array is valid",
"data": ["foo", 42],
"valid": true
}
]
},
{
"description": "after leaving a dynamic scope, it is not used by a $dynamicRef",
"schema": {
"$id": "https://test.json-schema.org/dynamic-ref-leaving-dynamic-scope/main",
"if": {
"$id": "first_scope",
"$defs": {
"thingy": {
"$comment": "this is first_scope#thingy",
"$dynamicAnchor": "thingy",
"type": "number"
}
}
},
"then": {
"$id": "second_scope",
"$ref": "start",
"$defs": {
"thingy": {
"$comment": "this is second_scope#thingy, the final destination of the $dynamicRef",
"$dynamicAnchor": "thingy",
"type": "null"
}
}
},
"$defs": {
"start": {
"$comment": "this is the landing spot from $ref",
"$id": "start",
"$ref": "inner_scope"
},
"thingy": {
"$id": "inner_scope",
"$dynamicRef": "#thingy",
"$defs": {
"": {
"$comment": "this is the first stop for the $dynamicRef",
"$dynamicAnchor": "thingy",
"type": "string"
}
}
}
}
},
"tests": [
{
"description": "string matches /$defs/thingy, but the $dynamicRef does not stop here",
"data": "a string",
"valid": false
},
{
"description": "first_scope is not in dynamic scope for the $dynamicRef",
"data": 42,
"valid": false
},
{
"description": "/then/$defs/thingy is the final stop for the $dynamicRef",
"data": null,
"valid": true
}
]
},
{
"description": "strict-tree schema, guards against misspelled properties",
"schema": {
"$schema": "https://json-schema.org/v1",
"$id": "http://localhost:1234/v1/strict-tree.json",
"$dynamicAnchor": "node",
"$ref": "tree.json",
"unevaluatedProperties": false
},
"tests": [
{
"description": "instance with misspelled field",
"data": {
"children": [{
"daat": 1
}]
},
"valid": false
},
{
"description": "instance with correct field",
"data": {
"children": [{
"data": 1
}]
},
"valid": true
}
]
},
{
"description": "tests for implementation dynamic anchor and reference link",
"schema": {
"$schema": "https://json-schema.org/v1",
"$id": "http://localhost:1234/v1/strict-extendible.json",
"$ref": "extendible-dynamic-ref.json",
"$defs": {
"elements": {
"$dynamicAnchor": "elements",
"properties": {
"a": true
},
"required": ["a"],
"additionalProperties": false
}
}
},
"tests": [
{
"description": "incorrect parent schema",
"data": {
"a": true
},
"valid": false
},
{
"description": "incorrect extended schema",
"data": {
"elements": [
{ "b": 1 }
]
},
"valid": false
},
{
"description": "correct extended schema",
"data": {
"elements": [
{ "a": 1 }
]
},
"valid": true
}
]
},
{
"description": "$ref and $dynamicAnchor are independent of order - $defs first",
"schema": {
"$schema": "https://json-schema.org/v1",
"$id": "http://localhost:1234/v1/strict-extendible-allof-defs-first.json",
"allOf": [
{
"$ref": "extendible-dynamic-ref.json"
},
{
"$defs": {
"elements": {
"$dynamicAnchor": "elements",
"properties": {
"a": true
},
"required": ["a"],
"additionalProperties": false
}
}
}
]
},
"tests": [
{
"description": "incorrect parent schema",
"data": {
"a": true
},
"valid": false
},
{
"description": "incorrect extended schema",
"data": {
"elements": [
{ "b": 1 }
]
},
"valid": false
},
{
"description": "correct extended schema",
"data": {
"elements": [
{ "a": 1 }
]
},
"valid": true
}
]
},
{
"description": "$ref and $dynamicAnchor are independent of order - $ref first",
"schema": {
"$schema": "https://json-schema.org/v1",
"$id": "http://localhost:1234/v1/strict-extendible-allof-ref-first.json",
"allOf": [
{
"$defs": {
"elements": {
"$dynamicAnchor": "elements",
"properties": {
"a": true
},
"required": ["a"],
"additionalProperties": false
}
}
},
{
"$ref": "extendible-dynamic-ref.json"
}
]
},
"tests": [
{
"description": "incorrect parent schema",
"data": {
"a": true
},
"valid": false
},
{
"description": "incorrect extended schema",
"data": {
"elements": [
{ "b": 1 }
]
},
"valid": false
},
{
"description": "correct extended schema",
"data": {
"elements": [
{ "a": 1 }
]
},
"valid": true
}
]
},
{
"description": "$ref to $dynamicRef finds detached $dynamicAnchor",
"schema": {
"$ref": "http://localhost:1234/v1/detached-dynamicref.json#/$defs/foo"
},
"tests": [
{
"description": "number is valid",
"data": 1,
"valid": true
},
{
"description": "non-number is invalid",
"data": "a",
"valid": false
}
]
},
{
"description": "$dynamicRef skips over intermediate resources - direct reference",
"schema": {
"$schema": "https://json-schema.org/v1",
"$id": "https://test.json-schema.org/dynamic-ref-skips-intermediate-resource/main",
"type": "object",
"properties": {
"bar-item": {
"$ref": "item"
}
},
"$defs": {
"bar": {
"$id": "bar",
"type": "array",
"items": {
"$ref": "item"
},
"$defs": {
"item": {
"$id": "item",
"type": "object",
"properties": {
"content": {
"$dynamicRef": "#content"
}
},
"$defs": {
"defaultContent": {
"$dynamicAnchor": "content",
"type": "integer"
}
}
},
"content": {
"$dynamicAnchor": "content",
"type": "string"
}
}
}
}
},
"tests": [
{
"description": "integer property passes",
"data": { "bar-item": { "content": 42 } },
"valid": true
},
{
"description": "string property fails",
"data": { "bar-item": { "content": "value" } },
"valid": false
}
]
},
{
"description": "$dynamicRef avoids the root of each schema, but scopes are still registered",
"schema": {
"$schema": "https://json-schema.org/v1",
"$id": "https://test.json-schema.org/dynamic-ref-avoids-root-of-each-schema/base",
"$ref": "first#/$defs/stuff",
"$defs": {
"first": {
"$id": "first",
"$defs": {
"stuff": {
"$ref": "second#/$defs/stuff"
},
"length": {
"$comment": "unused, because there is no $dynamicAnchor here",
"maxLength": 1
}
}
},
"second": {
"$id": "second",
"$defs": {
"stuff": {
"$ref": "third#/$defs/stuff"
},
"length": {
"$dynamicAnchor": "length",
"maxLength": 2
}
}
},
"third": {
"$id": "third",
"$defs": {
"stuff": {
"$dynamicRef": "#length"
},
"length": {
"$dynamicAnchor": "length",
"maxLength": 3
}
}
}
}
},
"tests": [
{
"description": "data is sufficient for schema at second#/$defs/length",
"data": "hi",
"valid": true
},
{
"description": "data is not sufficient for schema at second#/$defs/length",
"data": "hey",
"valid": false
}
]
}
]