1[ 2 { 3 "description": "root pointer ref", 4 "schema": { 5 "properties": { 6 "foo": {"$ref": "#"} 7 }, 8 "additionalProperties": false 9 }, 10 "tests": [ 11 { 12 "description": "match", 13 "data": {"foo": false}, 14 "valid": true 15 }, 16 { 17 "description": "recursive match", 18 "data": {"foo": {"foo": false}}, 19 "valid": true 20 }, 21 { 22 "description": "mismatch", 23 "data": {"bar": false}, 24 "valid": false 25 }, 26 { 27 "description": "recursive mismatch", 28 "data": {"foo": {"bar": false}}, 29 "valid": false 30 } 31 ] 32 }, 33 { 34 "description": "relative pointer ref to object", 35 "schema": { 36 "properties": { 37 "foo": {"type": "integer"}, 38 "bar": {"$ref": "#/properties/foo"} 39 } 40 }, 41 "tests": [ 42 { 43 "description": "match", 44 "data": {"bar": 3}, 45 "valid": true 46 }, 47 { 48 "description": "mismatch", 49 "data": {"bar": true}, 50 "valid": false 51 } 52 ] 53 }, 54 { 55 "description": "relative pointer ref to array", 56 "schema": { 57 "items": [ 58 {"type": "integer"}, 59 {"$ref": "#/items/0"} 60 ] 61 }, 62 "tests": [ 63 { 64 "description": "match array", 65 "data": [1, 2], 66 "valid": true 67 }, 68 { 69 "description": "mismatch array", 70 "data": [1, "foo"], 71 "valid": false 72 } 73 ] 74 }, 75 { 76 "description": "escaped pointer ref", 77 "schema": { 78 "tilda~field": {"type": "integer"}, 79 "slash/field": {"type": "integer"}, 80 "percent%field": {"type": "integer"}, 81 "properties": { 82 "tilda": {"$ref": "#/tilda~0field"}, 83 "slash": {"$ref": "#/slash~1field"}, 84 "percent": {"$ref": "#/percent%25field"} 85 } 86 }, 87 "tests": [ 88 { 89 "description": "slash invalid", 90 "data": {"slash": "aoeu"}, 91 "valid": false 92 }, 93 { 94 "description": "tilda invalid", 95 "data": {"tilda": "aoeu"}, 96 "valid": false 97 }, 98 { 99 "description": "percent invalid", 100 "data": {"percent": "aoeu"}, 101 "valid": false 102 }, 103 { 104 "description": "slash valid", 105 "data": {"slash": 123}, 106 "valid": true 107 }, 108 { 109 "description": "tilda valid", 110 "data": {"tilda": 123}, 111 "valid": true 112 }, 113 { 114 "description": "percent valid", 115 "data": {"percent": 123}, 116 "valid": true 117 } 118 ] 119 }, 120 { 121 "description": "nested refs", 122 "schema": { 123 "definitions": { 124 "a": {"type": "integer"}, 125 "b": {"$ref": "#/definitions/a"}, 126 "c": {"$ref": "#/definitions/b"} 127 }, 128 "$ref": "#/definitions/c" 129 }, 130 "tests": [ 131 { 132 "description": "nested ref valid", 133 "data": 5, 134 "valid": true 135 }, 136 { 137 "description": "nested ref invalid", 138 "data": "a", 139 "valid": false 140 } 141 ] 142 }, 143 { 144 "description": "ref overrides any sibling keywords", 145 "schema": { 146 "definitions": { 147 "reffed": { 148 "type": "array" 149 } 150 }, 151 "properties": { 152 "foo": { 153 "$ref": "#/definitions/reffed", 154 "maxItems": 2 155 } 156 } 157 }, 158 "tests": [ 159 { 160 "description": "ref valid", 161 "data": { "foo": [] }, 162 "valid": true 163 }, 164 { 165 "description": "ref valid, maxItems ignored", 166 "data": { "foo": [ 1, 2, 3] }, 167 "valid": true 168 }, 169 { 170 "description": "ref invalid", 171 "data": { "foo": "string" }, 172 "valid": false 173 } 174 ] 175 }, 176 { 177 "description": "remote ref, containing refs itself", 178 "schema": {"$ref": "http://json-schema.org/draft-04/schema#"}, 179 "tests": [ 180 { 181 "description": "remote ref valid", 182 "data": {"minLength": 1}, 183 "valid": true 184 }, 185 { 186 "description": "remote ref invalid", 187 "data": {"minLength": -1}, 188 "valid": false 189 } 190 ] 191 }, 192 { 193 "description": "property named $ref that is not a reference", 194 "schema": { 195 "properties": { 196 "$ref": {"type": "string"} 197 } 198 }, 199 "tests": [ 200 { 201 "description": "property named $ref valid", 202 "data": {"$ref": "a"}, 203 "valid": true 204 }, 205 { 206 "description": "property named $ref invalid", 207 "data": {"$ref": 2}, 208 "valid": false 209 } 210 ] 211 }, 212 { 213 "description": "Recursive references between schemas", 214 "schema": { 215 "id": "http://localhost:1234/tree", 216 "description": "tree of nodes", 217 "type": "object", 218 "properties": { 219 "meta": {"type": "string"}, 220 "nodes": { 221 "type": "array", 222 "items": {"$ref": "node"} 223 } 224 }, 225 "required": ["meta", "nodes"], 226 "definitions": { 227 "node": { 228 "id": "http://localhost:1234/node", 229 "description": "node", 230 "type": "object", 231 "properties": { 232 "value": {"type": "number"}, 233 "subtree": {"$ref": "tree"} 234 }, 235 "required": ["value"] 236 } 237 } 238 }, 239 "tests": [ 240 { 241 "description": "valid tree", 242 "data": { 243 "meta": "root", 244 "nodes": [ 245 { 246 "value": 1, 247 "subtree": { 248 "meta": "child", 249 "nodes": [ 250 {"value": 1.1}, 251 {"value": 1.2} 252 ] 253 } 254 }, 255 { 256 "value": 2, 257 "subtree": { 258 "meta": "child", 259 "nodes": [ 260 {"value": 2.1}, 261 {"value": 2.2} 262 ] 263 } 264 } 265 ] 266 }, 267 "valid": true 268 }, 269 { 270 "description": "invalid tree", 271 "data": { 272 "meta": "root", 273 "nodes": [ 274 { 275 "value": 1, 276 "subtree": { 277 "meta": "child", 278 "nodes": [ 279 {"value": "string is invalid"}, 280 {"value": 1.2} 281 ] 282 } 283 }, 284 { 285 "value": 2, 286 "subtree": { 287 "meta": "child", 288 "nodes": [ 289 {"value": 2.1}, 290 {"value": 2.2} 291 ] 292 } 293 } 294 ] 295 }, 296 "valid": false 297 } 298 ] 299 } 300] 301