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