json-schema-pvdgm 2.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.md +19 -0
  3. data/README.textile +354 -0
  4. data/lib/json-schema.rb +25 -0
  5. data/lib/json-schema/attributes/additionalitems.rb +23 -0
  6. data/lib/json-schema/attributes/additionalproperties.rb +67 -0
  7. data/lib/json-schema/attributes/allof.rb +37 -0
  8. data/lib/json-schema/attributes/anyof.rb +41 -0
  9. data/lib/json-schema/attributes/dependencies.rb +30 -0
  10. data/lib/json-schema/attributes/dependencies_v4.rb +20 -0
  11. data/lib/json-schema/attributes/disallow.rb +11 -0
  12. data/lib/json-schema/attributes/divisibleby.rb +16 -0
  13. data/lib/json-schema/attributes/enum.rb +24 -0
  14. data/lib/json-schema/attributes/extends.rb +49 -0
  15. data/lib/json-schema/attributes/format.rb +123 -0
  16. data/lib/json-schema/attributes/items.rb +25 -0
  17. data/lib/json-schema/attributes/maxdecimal.rb +15 -0
  18. data/lib/json-schema/attributes/maximum.rb +15 -0
  19. data/lib/json-schema/attributes/maximum_inclusive.rb +15 -0
  20. data/lib/json-schema/attributes/maxitems.rb +12 -0
  21. data/lib/json-schema/attributes/maxlength.rb +14 -0
  22. data/lib/json-schema/attributes/maxproperties.rb +12 -0
  23. data/lib/json-schema/attributes/minimum.rb +15 -0
  24. data/lib/json-schema/attributes/minimum_inclusive.rb +15 -0
  25. data/lib/json-schema/attributes/minitems.rb +12 -0
  26. data/lib/json-schema/attributes/minlength.rb +14 -0
  27. data/lib/json-schema/attributes/minproperties.rb +12 -0
  28. data/lib/json-schema/attributes/multipleof.rb +16 -0
  29. data/lib/json-schema/attributes/not.rb +28 -0
  30. data/lib/json-schema/attributes/oneof.rb +32 -0
  31. data/lib/json-schema/attributes/pattern.rb +15 -0
  32. data/lib/json-schema/attributes/patternproperties.rb +23 -0
  33. data/lib/json-schema/attributes/properties.rb +58 -0
  34. data/lib/json-schema/attributes/properties_optional.rb +23 -0
  35. data/lib/json-schema/attributes/properties_v4.rb +57 -0
  36. data/lib/json-schema/attributes/ref.rb +70 -0
  37. data/lib/json-schema/attributes/required.rb +23 -0
  38. data/lib/json-schema/attributes/type.rb +102 -0
  39. data/lib/json-schema/attributes/type_v4.rb +54 -0
  40. data/lib/json-schema/attributes/uniqueitems.rb +16 -0
  41. data/lib/json-schema/model_validator.rb +85 -0
  42. data/lib/json-schema/schema.rb +73 -0
  43. data/lib/json-schema/uri/file.rb +36 -0
  44. data/lib/json-schema/uri/uuid.rb +285 -0
  45. data/lib/json-schema/util/array_set.rb +14 -0
  46. data/lib/json-schema/util/hash.rb +8 -0
  47. data/lib/json-schema/validator.rb +672 -0
  48. data/lib/json-schema/validators/draft1.rb +32 -0
  49. data/lib/json-schema/validators/draft2.rb +33 -0
  50. data/lib/json-schema/validators/draft3.rb +38 -0
  51. data/lib/json-schema/validators/draft4.rb +45 -0
  52. data/resources/draft-01.json +155 -0
  53. data/resources/draft-02.json +166 -0
  54. data/resources/draft-03.json +174 -0
  55. data/resources/draft-04.json +150 -0
  56. data/test/data/all_of_ref_data.json +3 -0
  57. data/test/data/any_of_ref_data.json +7 -0
  58. data/test/data/bad_data_1.json +3 -0
  59. data/test/data/good_data_1.json +3 -0
  60. data/test/data/one_of_ref_links_data.json +5 -0
  61. data/test/schemas/all_of_ref_base_schema.json +6 -0
  62. data/test/schemas/all_of_ref_schema.json +7 -0
  63. data/test/schemas/any_of_ref_jane_schema.json +4 -0
  64. data/test/schemas/any_of_ref_jimmy_schema.json +4 -0
  65. data/test/schemas/any_of_ref_john_schema.json +4 -0
  66. data/test/schemas/any_of_ref_schema.json +15 -0
  67. data/test/schemas/extends_and_additionalProperties-1-filename.schema.json +34 -0
  68. data/test/schemas/extends_and_additionalProperties-1-ref.schema.json +34 -0
  69. data/test/schemas/extends_and_additionalProperties-2-filename.schema.json +33 -0
  70. data/test/schemas/extends_and_additionalProperties-2-ref.schema.json +33 -0
  71. data/test/schemas/good_schema_1.json +10 -0
  72. data/test/schemas/good_schema_2.json +10 -0
  73. data/test/schemas/good_schema_extends1.json +10 -0
  74. data/test/schemas/good_schema_extends2.json +13 -0
  75. data/test/schemas/inner.schema.json +21 -0
  76. data/test/schemas/one_of_ref_links_schema.json +16 -0
  77. data/test/schemas/self_link_schema.json +17 -0
  78. data/test/schemas/up_link_schema.json +17 -0
  79. data/test/test_all_of_ref_schema.rb +11 -0
  80. data/test/test_any_of_ref_schema.rb +11 -0
  81. data/test/test_bad_schema_ref.rb +33 -0
  82. data/test/test_extended_schema.rb +68 -0
  83. data/test/test_extends_and_additionalProperties.rb +50 -0
  84. data/test/test_files_v3.rb +52 -0
  85. data/test/test_fragment_resolution.rb +31 -0
  86. data/test/test_full_validation.rb +209 -0
  87. data/test/test_jsonschema_draft1.rb +701 -0
  88. data/test/test_jsonschema_draft2.rb +773 -0
  89. data/test/test_jsonschema_draft3.rb +1236 -0
  90. data/test/test_jsonschema_draft4.rb +1356 -0
  91. data/test/test_model_validator.rb +52 -0
  92. data/test/test_one_of.rb +42 -0
  93. data/test/test_ruby_schema.rb +38 -0
  94. data/test/test_schema_type_attribute.rb +21 -0
  95. data/test/test_schema_validation.rb +85 -0
  96. metadata +180 -0
@@ -0,0 +1,209 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/json-schema'
3
+
4
+ class JSONFullValidation < Test::Unit::TestCase
5
+
6
+ def test_full_validation
7
+ data = {"b" => {"a" => 5}}
8
+ schema = {
9
+ "$schema" => "http://json-schema.org/draft-03/schema#",
10
+ "type" => "object",
11
+ "properties" => {
12
+ "b" => {
13
+ "required" => true
14
+ }
15
+ }
16
+ }
17
+
18
+ errors = JSON::Validator.fully_validate(schema,data)
19
+ assert(errors.empty?)
20
+
21
+ data = {"c" => 5}
22
+ schema = {
23
+ "$schema" => "http://json-schema.org/draft-03/schema#",
24
+ "type" => "object",
25
+ "properties" => {
26
+ "b" => {
27
+ "required" => true
28
+ },
29
+ "c" => {
30
+ "type" => "string"
31
+ }
32
+ }
33
+ }
34
+
35
+ errors = JSON::Validator.fully_validate(schema,data)
36
+ assert(errors.length == 2)
37
+ end
38
+
39
+ def test_full_validation_with_union_types
40
+ data = {"b" => 5}
41
+ schema = {
42
+ "$schema" => "http://json-schema.org/draft-03/schema#",
43
+ "type" => "object",
44
+ "properties" => {
45
+ "b" => {
46
+ "type" => ["null","integer"]
47
+ }
48
+ }
49
+ }
50
+
51
+ errors = JSON::Validator.fully_validate(schema,data)
52
+ assert(errors.empty?)
53
+
54
+ schema = {
55
+ "$schema" => "http://json-schema.org/draft-03/schema#",
56
+ "type" => "object",
57
+ "properties" => {
58
+ "b" => {
59
+ "type" => ["integer","null"]
60
+ }
61
+ }
62
+ }
63
+
64
+ errors = JSON::Validator.fully_validate(schema,data)
65
+ assert(errors.empty?)
66
+
67
+ data = {"b" => "a string"}
68
+
69
+ errors = JSON::Validator.fully_validate(schema,data)
70
+ assert(errors.length == 1)
71
+
72
+ schema = {
73
+ "$schema" => "http://json-schema.org/draft-03/schema#",
74
+ "type" => "object",
75
+ "properties" => {
76
+ "b" => {
77
+ "type" => [
78
+ {
79
+ "type" => "object",
80
+ "properties" => {
81
+ "c" => {"type" => "string"}
82
+ }
83
+ },
84
+ {
85
+ "type" => "object",
86
+ "properties" => {
87
+ "d" => {"type" => "integer"}
88
+ }
89
+ }
90
+ ]
91
+ }
92
+ }
93
+ }
94
+
95
+ data = {"b" => {"c" => "taco"}}
96
+
97
+ errors = JSON::Validator.fully_validate(schema,data)
98
+ assert(errors.empty?)
99
+
100
+ data = {"b" => {"d" => 6}}
101
+
102
+ errors = JSON::Validator.fully_validate(schema,data)
103
+ assert(errors.empty?)
104
+
105
+ data = {"b" => {"c" => 6, "d" => "OH GOD"}}
106
+
107
+ errors = JSON::Validator.fully_validate(schema,data)
108
+ assert(errors.length == 1)
109
+ end
110
+
111
+
112
+ def test_full_validation_with_object_errors
113
+ data = {"b" => {"a" => 5}}
114
+ schema = {
115
+ "$schema" => "http://json-schema.org/draft-03/schema#",
116
+ "type" => "object",
117
+ "properties" => {
118
+ "b" => {
119
+ "required" => true
120
+ }
121
+ }
122
+ }
123
+
124
+ errors = JSON::Validator.fully_validate(schema,data,:errors_as_objects => true)
125
+ assert(errors.empty?)
126
+
127
+ data = {"c" => 5}
128
+ schema = {
129
+ "$schema" => "http://json-schema.org/draft-03/schema#",
130
+ "type" => "object",
131
+ "properties" => {
132
+ "b" => {
133
+ "required" => true
134
+ },
135
+ "c" => {
136
+ "type" => "string"
137
+ }
138
+ }
139
+ }
140
+
141
+ errors = JSON::Validator.fully_validate(schema,data,:errors_as_objects => true)
142
+ assert(errors.length == 2)
143
+ assert(errors[0][:failed_attribute] == "Properties")
144
+ assert(errors[0][:fragment] == "#/")
145
+ assert(errors[1][:failed_attribute] == "Type")
146
+ assert(errors[1][:fragment] == "#/c")
147
+ end
148
+
149
+ def test_full_validation_with_nested_required_properties
150
+ schema = {
151
+ "$schema" => "http://json-schema.org/draft-03/schema#",
152
+ "type" => "object",
153
+ "properties" => {
154
+ "x" => {
155
+ "required" => true,
156
+ "type" => "object",
157
+ "properties" => {
158
+ "a" => {"type"=>"integer","required"=>true},
159
+ "b" => {"type"=>"integer","required"=>true},
160
+ "c" => {"type"=>"integer","required"=>false},
161
+ "d" => {"type"=>"integer","required"=>false},
162
+ "e" => {"type"=>"integer","required"=>false},
163
+ }
164
+ }
165
+ }
166
+ }
167
+ data = {"x" => {"a"=>5, "d"=>5, "e"=>"what?"}}
168
+
169
+ errors = JSON::Validator.fully_validate(schema,data,:errors_as_objects => true)
170
+ assert_equal 2, errors.length
171
+ assert_equal '#/x', errors[0][:fragment]
172
+ assert_equal 'Properties', errors[0][:failed_attribute]
173
+ assert_equal '#/x/e', errors[1][:fragment]
174
+ assert_equal 'Type', errors[1][:failed_attribute]
175
+ end
176
+
177
+ def test_full_validation_with_nested_required_propertiesin_array
178
+ schema = {
179
+ "$schema" => "http://json-schema.org/draft-03/schema#",
180
+ "type" => "object",
181
+ "properties" => {
182
+ "x" => {
183
+ "required" => true,
184
+ "type" => "array",
185
+ "items" => {
186
+ "type" => "object",
187
+ "properties" => {
188
+ "a" => {"type"=>"integer","required"=>true},
189
+ "b" => {"type"=>"integer","required"=>true},
190
+ "c" => {"type"=>"integer","required"=>false},
191
+ "d" => {"type"=>"integer","required"=>false},
192
+ "e" => {"type"=>"integer","required"=>false},
193
+ }
194
+ }
195
+ }
196
+ }
197
+ }
198
+ missing_b= {"a"=>5}
199
+ e_is_wrong_type= {"a"=>5,"b"=>5,"e"=>"what?"}
200
+ data = {"x" => [missing_b, e_is_wrong_type]}
201
+
202
+ errors = JSON::Validator.fully_validate(schema,data,:errors_as_objects => true)
203
+ assert_equal 2, errors.length
204
+ assert_equal '#/x/0', errors[0][:fragment]
205
+ assert_equal 'Properties', errors[0][:failed_attribute]
206
+ assert_equal '#/x/1/e', errors[1][:fragment]
207
+ assert_equal 'Type', errors[1][:failed_attribute]
208
+ end
209
+ end
@@ -0,0 +1,701 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/json-schema'
3
+
4
+ class JSONSchemaDraft1Test < Test::Unit::TestCase
5
+ def test_types
6
+ # Set up the default datatype
7
+ schema = {
8
+ "properties" => {
9
+ "a" => {}
10
+ }
11
+ }
12
+ data = {
13
+ "a" => nil
14
+ }
15
+
16
+ # Test integers
17
+ schema["properties"]["a"]["type"] = "integer"
18
+ data["a"] = 5
19
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
20
+
21
+ data["a"] = 5.2
22
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
23
+
24
+ data['a'] = 'string'
25
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
26
+
27
+ data['a'] = true
28
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
29
+
30
+
31
+ # Test numbers
32
+ schema["properties"]["a"]["type"] = "number"
33
+ data["a"] = 5
34
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
35
+
36
+ data["a"] = 5.2
37
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
38
+
39
+ data['a'] = 'string'
40
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
41
+
42
+ data['a'] = true
43
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
44
+
45
+
46
+ # Test strings
47
+ schema["properties"]["a"]["type"] = "string"
48
+ data["a"] = 5
49
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
50
+
51
+ data["a"] = 5.2
52
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
53
+
54
+ data['a'] = 'string'
55
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
56
+
57
+ data['a'] = true
58
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
59
+
60
+
61
+ # Test booleans
62
+ schema["properties"]["a"]["type"] = "boolean"
63
+ data["a"] = 5
64
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
65
+
66
+ data["a"] = 5.2
67
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
68
+
69
+ data['a'] = 'string'
70
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
71
+
72
+ data['a'] = true
73
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
74
+
75
+ data['a'] = false
76
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
77
+
78
+
79
+ # Test object
80
+ schema["properties"]["a"]["type"] = "object"
81
+ data["a"] = {}
82
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
83
+
84
+ data["a"] = 5.2
85
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
86
+
87
+ data['a'] = 'string'
88
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
89
+
90
+ data['a'] = true
91
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
92
+
93
+
94
+ # Test array
95
+ schema["properties"]["a"]["type"] = "array"
96
+ data["a"] = []
97
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
98
+
99
+ data["a"] = 5.2
100
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
101
+
102
+ data['a'] = 'string'
103
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
104
+
105
+ data['a'] = true
106
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
107
+
108
+
109
+ # Test null
110
+ schema["properties"]["a"]["type"] = "null"
111
+ data["a"] = nil
112
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
113
+
114
+ data["a"] = 5.2
115
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
116
+
117
+ data['a'] = 'string'
118
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
119
+
120
+ data['a'] = true
121
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
122
+
123
+
124
+ # Test any
125
+ schema["properties"]["a"]["type"] = "any"
126
+ data["a"] = 5
127
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
128
+
129
+ data["a"] = 5.2
130
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
131
+
132
+ data['a'] = 'string'
133
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
134
+
135
+ data['a'] = true
136
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
137
+
138
+
139
+ # Test a union type
140
+ schema["properties"]["a"]["type"] = ["integer","string"]
141
+ data["a"] = 5
142
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
143
+
144
+ data["a"] = 'boo'
145
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
146
+
147
+ data["a"] = false
148
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
149
+
150
+ # Test a union type with schemas
151
+ schema["properties"]["a"]["type"] = [{ "type" => "string" }, {"type" => "object", "properties" => {"b" => {"type" => "integer"}}}]
152
+
153
+ data["a"] = "test"
154
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
155
+
156
+ data["a"] = 5
157
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
158
+
159
+ data["a"] = {"b" => 5}
160
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
161
+
162
+ data["a"] = {"b" => "taco"}
163
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
164
+ end
165
+
166
+
167
+
168
+ def test_optional
169
+ # Set up the default datatype
170
+ schema = {
171
+ "properties" => {
172
+ "a" => {"type" => "string"}
173
+ }
174
+ }
175
+ data = {}
176
+
177
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
178
+ data['a'] = "Hello"
179
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
180
+
181
+ schema = {
182
+ "properties" => {
183
+ "a" => {"type" => "integer", "optional" => "true"}
184
+ }
185
+ }
186
+
187
+ data = {}
188
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
189
+
190
+ end
191
+
192
+
193
+
194
+ def test_minimum
195
+ # Set up the default datatype
196
+ schema = {
197
+ "properties" => {
198
+ "a" => {"minimum" => 5}
199
+ }
200
+ }
201
+
202
+ data = {
203
+ "a" => nil
204
+ }
205
+
206
+
207
+ # Test an integer
208
+ data["a"] = 5
209
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
210
+
211
+ data["a"] = 4
212
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
213
+
214
+ # Test a float
215
+ data["a"] = 5.0
216
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
217
+
218
+ data["a"] = 4.9
219
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
220
+
221
+ # Test a non-number
222
+ data["a"] = "a string"
223
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
224
+
225
+ # Test exclusiveMinimum
226
+ schema["properties"]["a"]["minimumCanEqual"] = false
227
+
228
+ data["a"] = 6
229
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
230
+
231
+ data["a"] = 5
232
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
233
+
234
+ # Test with float
235
+ data["a"] = 5.00000001
236
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
237
+
238
+ data["a"] = 5.0
239
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
240
+ end
241
+
242
+
243
+
244
+ def test_maximum
245
+ # Set up the default datatype
246
+ schema = {
247
+ "properties" => {
248
+ "a" => {"maximum" => 5}
249
+ }
250
+ }
251
+
252
+ data = {
253
+ "a" => nil
254
+ }
255
+
256
+
257
+ # Test an integer
258
+ data["a"] = 5
259
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
260
+
261
+ data["a"] = 6
262
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
263
+
264
+ # Test a float
265
+ data["a"] = 5.0
266
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
267
+
268
+ data["a"] = 5.1
269
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
270
+
271
+ # Test a non-number
272
+ data["a"] = "a string"
273
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
274
+
275
+ # Test exclusiveMinimum
276
+ schema["properties"]["a"]["maximumCanEqual"] = false
277
+
278
+ data["a"] = 4
279
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
280
+
281
+ data["a"] = 5
282
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
283
+
284
+ # Test with float
285
+ data["a"] = 4.9999999
286
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
287
+
288
+ data["a"] = 5.0
289
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
290
+ end
291
+
292
+
293
+ def test_min_items
294
+ # Set up the default datatype
295
+ schema = {
296
+ "properties" => {
297
+ "a" => {"minItems" => 1}
298
+ }
299
+ }
300
+
301
+ data = {
302
+ "a" => nil
303
+ }
304
+
305
+ # Test with an array
306
+ data["a"] = ["boo"]
307
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
308
+
309
+ data["a"] = []
310
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
311
+
312
+ # Test with a non-array
313
+ data["a"] = "boo"
314
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
315
+ end
316
+
317
+
318
+
319
+ def test_max_items
320
+ # Set up the default datatype
321
+ schema = {
322
+ "properties" => {
323
+ "a" => {"maxItems" => 1}
324
+ }
325
+ }
326
+
327
+ data = {
328
+ "a" => nil
329
+ }
330
+
331
+ # Test with an array
332
+ data["a"] = ["boo"]
333
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
334
+
335
+ data["a"] = ["boo","taco"]
336
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
337
+
338
+ # Test with a non-array
339
+ data["a"] = "boo"
340
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
341
+ end
342
+
343
+
344
+ def test_pattern
345
+ # Set up the default datatype
346
+ schema = {
347
+ "properties" => {
348
+ "a" => {"pattern" => "\\d+ taco"}
349
+ }
350
+ }
351
+
352
+ data = {
353
+ "a" => nil
354
+ }
355
+
356
+ # Test strings
357
+ data["a"] = "156 taco bell"
358
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
359
+
360
+ # Test a non-string
361
+ data["a"] = 5
362
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
363
+
364
+ data["a"] = "taco"
365
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
366
+ end
367
+
368
+
369
+ def test_min_length
370
+ # Set up the default datatype
371
+ schema = {
372
+ "properties" => {
373
+ "a" => {"minLength" => 1}
374
+ }
375
+ }
376
+
377
+ data = {
378
+ "a" => nil
379
+ }
380
+
381
+ # Try out strings
382
+ data["a"] = "t"
383
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
384
+
385
+ data["a"] = ""
386
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
387
+
388
+ # Try out non-string
389
+ data["a"] = 5
390
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
391
+ end
392
+
393
+
394
+ def test_max_length
395
+ # Set up the default datatype
396
+ schema = {
397
+ "properties" => {
398
+ "a" => {"maxLength" => 1}
399
+ }
400
+ }
401
+
402
+ data = {
403
+ "a" => nil
404
+ }
405
+
406
+ # Try out strings
407
+ data["a"] = "t"
408
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
409
+
410
+ data["a"] = "tt"
411
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
412
+
413
+ # Try out non-string
414
+ data["a"] = 5
415
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
416
+ end
417
+
418
+
419
+ def test_enum
420
+ # Set up the default datatype
421
+ schema = {
422
+ "properties" => {
423
+ "a" => {"enum" => [1,'boo',[1,2,3],{"a" => "b"}], "optional" => true}
424
+ }
425
+ }
426
+
427
+ data = {
428
+ "a" => nil
429
+ }
430
+
431
+ # Make sure all of the above are valid...
432
+ data["a"] = 1
433
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
434
+
435
+ data["a"] = 'boo'
436
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
437
+
438
+ data["a"] = [1,2,3]
439
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
440
+
441
+ data["a"] = {"a" => "b"}
442
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
443
+
444
+ # Test something that doesn't exist
445
+ data["a"] = 'taco'
446
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
447
+
448
+ # Try it without the key
449
+ data = {}
450
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
451
+ end
452
+
453
+
454
+ def test_max_decimal
455
+ # Set up the default datatype
456
+ schema = {
457
+ "properties" => {
458
+ "a" => {"maxDecimal" => 2}
459
+ }
460
+ }
461
+
462
+ data = {
463
+ "a" => nil
464
+ }
465
+
466
+ data["a"] = 3.35
467
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
468
+
469
+ data["a"] = 3.455
470
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
471
+
472
+
473
+ schema["properties"]["a"]["maxDecimal"] = 0
474
+
475
+ data["a"] = 4.0
476
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
477
+
478
+ data["a"] = 'boo'
479
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
480
+
481
+ data["a"] = 5
482
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
483
+ end
484
+
485
+
486
+
487
+ def test_disallow
488
+ # Set up the default datatype
489
+ schema = {
490
+ "properties" => {
491
+ "a" => {"disallow" => "integer"}
492
+ }
493
+ }
494
+
495
+ data = {
496
+ "a" => nil
497
+ }
498
+
499
+
500
+ data["a"] = 'string'
501
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
502
+
503
+ data["a"] = 5
504
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
505
+
506
+
507
+ schema["properties"]["a"]["disallow"] = ["integer","string"]
508
+ data["a"] = 'string'
509
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
510
+
511
+ data["a"] = 5
512
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
513
+
514
+ data["a"] = false
515
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
516
+
517
+ end
518
+
519
+
520
+
521
+ def test_additional_properties
522
+ # Test no additional properties allowed
523
+ schema = {
524
+ "properties" => {
525
+ "a" => { "type" => "integer" }
526
+ },
527
+ "additionalProperties" => false
528
+ }
529
+
530
+ data = {
531
+ "a" => 10
532
+ }
533
+
534
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
535
+ data["b"] = 5
536
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
537
+
538
+ # Test additional properties match a schema
539
+ schema["additionalProperties"] = { "type" => "string" }
540
+ data["b"] = "taco"
541
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
542
+ data["b"] = 5
543
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
544
+ end
545
+
546
+
547
+ def test_items
548
+ schema = {
549
+ "items" => { "type" => "integer" }
550
+ }
551
+
552
+ data = [1,2,4]
553
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
554
+ data = [1,2,"string"]
555
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
556
+
557
+ schema = {
558
+ "items" => [
559
+ {"type" => "integer"},
560
+ {"type" => "string"}
561
+ ]
562
+ }
563
+
564
+ data = [1,"string"]
565
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
566
+ data = [1,"string",3]
567
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
568
+ data = ["string",1]
569
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
570
+
571
+ end
572
+
573
+
574
+ def test_format_ipv4
575
+ schema = {
576
+ "type" => "object",
577
+ "properties" => { "a" => {"type" => "string", "format" => "ip-address"}}
578
+ }
579
+
580
+ data = {"a" => "1.1.1.1"}
581
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
582
+ data = {"a" => "1.1.1"}
583
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
584
+ data = {"a" => "1.1.1.300"}
585
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
586
+ data = {"a" => 5}
587
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
588
+ data = {"a" => "1.1.1"}
589
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
590
+ data = {"a" => "1.1.1.1b"}
591
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
592
+ data = {"a" => "b1.1.1.1"}
593
+ end
594
+
595
+
596
+ def test_format_ipv6
597
+ schema = {
598
+ "type" => "object",
599
+ "properties" => { "a" => {"type" => "string", "format" => "ipv6"}}
600
+ }
601
+
602
+ data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff"}
603
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
604
+ data = {"a" => "1111:0:8888:0:0:0:eeee:ffff"}
605
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
606
+ data = {"a" => "1111:2222:8888::eeee:ffff"}
607
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
608
+ data = {"a" => "1111:2222:8888:99999:aaaa:cccc:eeee:ffff"}
609
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
610
+ data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:gggg"}
611
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
612
+ data = {"a" => "1111:2222::9999::cccc:eeee:ffff"}
613
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
614
+ data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff:bbbb"}
615
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
616
+ end
617
+
618
+ def test_format_time
619
+ schema = {
620
+ "type" => "object",
621
+ "properties" => { "a" => {"type" => "string", "format" => "time"}}
622
+ }
623
+
624
+ data = {"a" => "12:00:00"}
625
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
626
+ data = {"a" => "12:00"}
627
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
628
+ data = {"a" => "12:00:60"}
629
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
630
+ data = {"a" => "12:60:00"}
631
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
632
+ data = {"a" => "24:00:00"}
633
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
634
+ data = {"a" => "0:00:00"}
635
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
636
+ data = {"a" => "-12:00:00"}
637
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
638
+ data = {"a" => "12:00:00b"}
639
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
640
+ end
641
+
642
+
643
+ def test_format_date
644
+ schema = {
645
+ "type" => "object",
646
+ "properties" => { "a" => {"type" => "string", "format" => "date"}}
647
+ }
648
+
649
+ data = {"a" => "2010-01-01"}
650
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
651
+ data = {"a" => "2010-01-32"}
652
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
653
+ data = {"a" => "n2010-01-01"}
654
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
655
+ data = {"a" => "2010-1-01"}
656
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
657
+ data = {"a" => "2010-01-1"}
658
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
659
+ data = {"a" => "2010-01-01n"}
660
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
661
+ end
662
+
663
+ def test_format_datetime
664
+ schema = {
665
+ "type" => "object",
666
+ "properties" => { "a" => {"type" => "string", "format" => "date-time"}}
667
+ }
668
+
669
+ data = {"a" => "2010-01-01T12:00:00Z"}
670
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
671
+ data = {"a" => "2010-01-32T12:00:00Z"}
672
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
673
+ data = {"a" => "2010-13-01T12:00:00Z"}
674
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
675
+ data = {"a" => "2010-01-01T24:00:00Z"}
676
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
677
+ data = {"a" => "2010-01-01T12:60:00Z"}
678
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
679
+ data = {"a" => "2010-01-01T12:00:60Z"}
680
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
681
+ data = {"a" => "2010-01-01T12:00:00z"}
682
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
683
+ data = {"a" => "2010-01-0112:00:00Z"}
684
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
685
+ end
686
+
687
+
688
+ def test_format_union
689
+ data1 = {"a" => "boo"}
690
+ data2 = {"a" => nil}
691
+
692
+ schema = {
693
+ "type" => "object",
694
+ "properties" => { "a" => {"type" => ["string","null"], "format" => "ip-address"}}
695
+ }
696
+ assert(!JSON::Validator.validate(schema,data1,:version => :draft1))
697
+ assert(JSON::Validator.validate(schema,data2,:version => :draft1))
698
+ end
699
+
700
+ end
701
+