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,773 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/json-schema'
3
+
4
+ class JSONSchemaDraft2Test < 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 => :draft2))
20
+
21
+ data["a"] = 5.2
22
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
23
+
24
+ data['a'] = 'string'
25
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
26
+
27
+ data['a'] = true
28
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
29
+
30
+
31
+ # Test numbers
32
+ schema["properties"]["a"]["type"] = "number"
33
+ data["a"] = 5
34
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
35
+
36
+ data["a"] = 5.2
37
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
38
+
39
+ data['a'] = 'string'
40
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
41
+
42
+ data['a'] = true
43
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
44
+
45
+
46
+ # Test strings
47
+ schema["properties"]["a"]["type"] = "string"
48
+ data["a"] = 5
49
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
50
+
51
+ data["a"] = 5.2
52
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
53
+
54
+ data['a'] = 'string'
55
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
56
+
57
+ data['a'] = true
58
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
59
+
60
+
61
+ # Test booleans
62
+ schema["properties"]["a"]["type"] = "boolean"
63
+ data["a"] = 5
64
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
65
+
66
+ data["a"] = 5.2
67
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
68
+
69
+ data['a'] = 'string'
70
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
71
+
72
+ data['a'] = true
73
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
74
+
75
+ data['a'] = false
76
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
77
+
78
+
79
+ # Test object
80
+ schema["properties"]["a"]["type"] = "object"
81
+ data["a"] = {}
82
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
83
+
84
+ data["a"] = 5.2
85
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
86
+
87
+ data['a'] = 'string'
88
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
89
+
90
+ data['a'] = true
91
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
92
+
93
+
94
+ # Test array
95
+ schema["properties"]["a"]["type"] = "array"
96
+ data["a"] = []
97
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
98
+
99
+ data["a"] = 5.2
100
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
101
+
102
+ data['a'] = 'string'
103
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
104
+
105
+ data['a'] = true
106
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
107
+
108
+
109
+ # Test null
110
+ schema["properties"]["a"]["type"] = "null"
111
+ data["a"] = nil
112
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
113
+
114
+ data["a"] = 5.2
115
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
116
+
117
+ data['a'] = 'string'
118
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
119
+
120
+ data['a'] = true
121
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
122
+
123
+
124
+ # Test any
125
+ schema["properties"]["a"]["type"] = "any"
126
+ data["a"] = 5
127
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
128
+
129
+ data["a"] = 5.2
130
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
131
+
132
+ data['a'] = 'string'
133
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
134
+
135
+ data['a'] = true
136
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
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 => :draft2))
143
+
144
+ data["a"] = 'boo'
145
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
146
+
147
+ data["a"] = false
148
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
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 => :draft2))
155
+
156
+ data["a"] = 5
157
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
158
+
159
+ data["a"] = {"b" => 5}
160
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
161
+
162
+ data["a"] = {"b" => "taco"}
163
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
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 => :draft2))
178
+ data['a'] = "Hello"
179
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
180
+
181
+ schema = {
182
+ "properties" => {
183
+ "a" => {"type" => "integer", "optional" => "true"}
184
+ }
185
+ }
186
+
187
+ data = {}
188
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
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 => :draft2))
210
+
211
+ data["a"] = 4
212
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
213
+
214
+ # Test a float
215
+ data["a"] = 5.0
216
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
217
+
218
+ data["a"] = 4.9
219
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
220
+
221
+ # Test a non-number
222
+ data["a"] = "a string"
223
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
224
+
225
+ # Test exclusiveMinimum
226
+ schema["properties"]["a"]["minimumCanEqual"] = false
227
+
228
+ data["a"] = 6
229
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
230
+
231
+ data["a"] = 5
232
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
233
+
234
+ # Test with float
235
+ data["a"] = 5.00000001
236
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
237
+
238
+ data["a"] = 5.0
239
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
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 => :draft2))
260
+
261
+ data["a"] = 6
262
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
263
+
264
+ # Test a float
265
+ data["a"] = 5.0
266
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
267
+
268
+ data["a"] = 5.1
269
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
270
+
271
+ # Test a non-number
272
+ data["a"] = "a string"
273
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
274
+
275
+ # Test exclusiveMinimum
276
+ schema["properties"]["a"]["maximumCanEqual"] = false
277
+
278
+ data["a"] = 4
279
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
280
+
281
+ data["a"] = 5
282
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
283
+
284
+ # Test with float
285
+ data["a"] = 4.9999999
286
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
287
+
288
+ data["a"] = 5.0
289
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
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 => :draft2))
308
+
309
+ data["a"] = []
310
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
311
+
312
+ # Test with a non-array
313
+ data["a"] = "boo"
314
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
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 => :draft2))
334
+
335
+ data["a"] = ["boo","taco"]
336
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
337
+
338
+ # Test with a non-array
339
+ data["a"] = "boo"
340
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
341
+ end
342
+
343
+
344
+
345
+ def test_unique_items
346
+ # Set up the default datatype
347
+ schema = {
348
+ "properties" => {
349
+ "a" => {"uniqueItems" => true}
350
+ }
351
+ }
352
+
353
+ data = {
354
+ "a" => nil
355
+ }
356
+
357
+ # Test with nulls
358
+ data["a"] = [nil,5]
359
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
360
+
361
+ data["a"] = [nil,nil]
362
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
363
+
364
+ # Test with booleans
365
+ data["a"] = [true,4]
366
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
367
+
368
+ data["a"] = [true,false]
369
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
370
+
371
+ data["a"] = [true,true]
372
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
373
+
374
+ # Test with numbers
375
+ data["a"] = [4,true]
376
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
377
+
378
+ data["a"] = [4,4.1]
379
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
380
+
381
+ data["a"] = [4,4]
382
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
383
+
384
+ # Test with strings
385
+ data["a"] = ['a',true]
386
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
387
+
388
+ data["a"] = ['a','ab']
389
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
390
+
391
+ data["a"] = ['a','a']
392
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
393
+
394
+ # Test with arrays
395
+ data["a"] = [[1],true]
396
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
397
+
398
+ data["a"] = [[1,2],[1,3]]
399
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
400
+
401
+ data["a"] = [[1,2,3],[1,2,3]]
402
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
403
+
404
+ # Test with objects
405
+ data["a"] = [{"a" => 1},true]
406
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
407
+
408
+ data["a"] = [{"a" => 1},{"a" => 2}]
409
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
410
+
411
+ data["a"] = [{"a" => 1, "b" => 2}, {"a" => 1, "b" => 2}]
412
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
413
+ end
414
+
415
+
416
+ def test_pattern
417
+ # Set up the default datatype
418
+ schema = {
419
+ "properties" => {
420
+ "a" => {"pattern" => "\\d+ taco"}
421
+ }
422
+ }
423
+
424
+ data = {
425
+ "a" => nil
426
+ }
427
+
428
+ # Test strings
429
+ data["a"] = "156 taco bell"
430
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
431
+
432
+ # Test a non-string
433
+ data["a"] = 5
434
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
435
+
436
+ data["a"] = "taco"
437
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
438
+ end
439
+
440
+
441
+ def test_min_length
442
+ # Set up the default datatype
443
+ schema = {
444
+ "properties" => {
445
+ "a" => {"minLength" => 1}
446
+ }
447
+ }
448
+
449
+ data = {
450
+ "a" => nil
451
+ }
452
+
453
+ # Try out strings
454
+ data["a"] = "t"
455
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
456
+
457
+ data["a"] = ""
458
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
459
+
460
+ # Try out non-string
461
+ data["a"] = 5
462
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
463
+ end
464
+
465
+
466
+ def test_max_length
467
+ # Set up the default datatype
468
+ schema = {
469
+ "properties" => {
470
+ "a" => {"maxLength" => 1}
471
+ }
472
+ }
473
+
474
+ data = {
475
+ "a" => nil
476
+ }
477
+
478
+ # Try out strings
479
+ data["a"] = "t"
480
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
481
+
482
+ data["a"] = "tt"
483
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
484
+
485
+ # Try out non-string
486
+ data["a"] = 5
487
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
488
+ end
489
+
490
+
491
+ def test_enum
492
+ # Set up the default datatype
493
+ schema = {
494
+ "properties" => {
495
+ "a" => {"enum" => [1,'boo',[1,2,3],{"a" => "b"}], "optional" => true}
496
+ }
497
+ }
498
+
499
+ data = {
500
+ "a" => nil
501
+ }
502
+
503
+ # Make sure all of the above are valid...
504
+ data["a"] = 1
505
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
506
+
507
+ data["a"] = 'boo'
508
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
509
+
510
+ data["a"] = [1,2,3]
511
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
512
+
513
+ data["a"] = {"a" => "b"}
514
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
515
+
516
+ # Test something that doesn't exist
517
+ data["a"] = 'taco'
518
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
519
+
520
+ # Try it without the key
521
+ data = {}
522
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
523
+ end
524
+
525
+
526
+ def test_divisible_by
527
+ # Set up the default datatype
528
+ schema = {
529
+ "properties" => {
530
+ "a" => {"divisibleBy" => 1.1}
531
+ }
532
+ }
533
+
534
+ data = {
535
+ "a" => nil
536
+ }
537
+
538
+ data["a"] = 3.3
539
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
540
+
541
+ data["a"] = 3.4
542
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
543
+
544
+ schema["properties"]["a"]["divisibleBy"] = 2.0
545
+
546
+ data["a"] = 4.0
547
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
548
+
549
+ data["a"] = 'boo'
550
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
551
+
552
+ data["a"] = 5
553
+ schema["properties"]["a"]["divisibleBy"] = 0
554
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
555
+ end
556
+
557
+
558
+
559
+ def test_disallow
560
+ # Set up the default datatype
561
+ schema = {
562
+ "properties" => {
563
+ "a" => {"disallow" => "integer"}
564
+ }
565
+ }
566
+
567
+ data = {
568
+ "a" => nil
569
+ }
570
+
571
+
572
+ data["a"] = 'string'
573
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
574
+
575
+ data["a"] = 5
576
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
577
+
578
+
579
+ schema["properties"]["a"]["disallow"] = ["integer","string"]
580
+ data["a"] = 'string'
581
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
582
+
583
+ data["a"] = 5
584
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
585
+
586
+ data["a"] = false
587
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
588
+
589
+ end
590
+
591
+
592
+
593
+ def test_additional_properties
594
+ # Test no additional properties allowed
595
+ schema = {
596
+ "properties" => {
597
+ "a" => { "type" => "integer" }
598
+ },
599
+ "additionalProperties" => false
600
+ }
601
+
602
+ data = {
603
+ "a" => 10
604
+ }
605
+
606
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
607
+ data["b"] = 5
608
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
609
+
610
+ # Test additional properties match a schema
611
+ schema["additionalProperties"] = { "type" => "string" }
612
+ data["b"] = "taco"
613
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
614
+ data["b"] = 5
615
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
616
+ end
617
+
618
+
619
+ def test_items
620
+ schema = {
621
+ "items" => { "type" => "integer" }
622
+ }
623
+
624
+ data = [1,2,4]
625
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
626
+ data = [1,2,"string"]
627
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
628
+
629
+ schema = {
630
+ "items" => [
631
+ {"type" => "integer"},
632
+ {"type" => "string"}
633
+ ]
634
+ }
635
+
636
+ data = [1,"string"]
637
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
638
+ data = [1,"string",3]
639
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
640
+ data = ["string",1]
641
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
642
+
643
+ end
644
+
645
+
646
+ def test_format_ipv4
647
+ schema = {
648
+ "type" => "object",
649
+ "properties" => { "a" => {"type" => "string", "format" => "ip-address"}}
650
+ }
651
+
652
+ data = {"a" => "1.1.1.1"}
653
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
654
+ data = {"a" => "1.1.1"}
655
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
656
+ data = {"a" => "1.1.1.300"}
657
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
658
+ data = {"a" => 5}
659
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
660
+ data = {"a" => "1.1.1"}
661
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
662
+ data = {"a" => "1.1.1.1b"}
663
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
664
+ data = {"a" => "b1.1.1.1"}
665
+ end
666
+
667
+
668
+ def test_format_ipv6
669
+ schema = {
670
+ "type" => "object",
671
+ "properties" => { "a" => {"type" => "string", "format" => "ipv6"}}
672
+ }
673
+
674
+ data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff"}
675
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
676
+ data = {"a" => "1111:0:8888:0:0:0:eeee:ffff"}
677
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
678
+ data = {"a" => "1111:2222:8888::eeee:ffff"}
679
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
680
+ data = {"a" => "1111:2222:8888:99999:aaaa:cccc:eeee:ffff"}
681
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
682
+ data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:gggg"}
683
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
684
+ data = {"a" => "1111:2222::9999::cccc:eeee:ffff"}
685
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
686
+ data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff:bbbb"}
687
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
688
+ end
689
+
690
+ def test_format_time
691
+ schema = {
692
+ "type" => "object",
693
+ "properties" => { "a" => {"type" => "string", "format" => "time"}}
694
+ }
695
+
696
+ data = {"a" => "12:00:00"}
697
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
698
+ data = {"a" => "12:00"}
699
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
700
+ data = {"a" => "12:00:60"}
701
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
702
+ data = {"a" => "12:60:00"}
703
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
704
+ data = {"a" => "24:00:00"}
705
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
706
+ data = {"a" => "0:00:00"}
707
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
708
+ data = {"a" => "-12:00:00"}
709
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
710
+ data = {"a" => "12:00:00b"}
711
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
712
+ end
713
+
714
+
715
+ def test_format_date
716
+ schema = {
717
+ "type" => "object",
718
+ "properties" => { "a" => {"type" => "string", "format" => "date"}}
719
+ }
720
+
721
+ data = {"a" => "2010-01-01"}
722
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
723
+ data = {"a" => "2010-01-32"}
724
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
725
+ data = {"a" => "n2010-01-01"}
726
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
727
+ data = {"a" => "2010-1-01"}
728
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
729
+ data = {"a" => "2010-01-1"}
730
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
731
+ data = {"a" => "2010-01-01n"}
732
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
733
+ end
734
+
735
+ def test_format_datetime
736
+ schema = {
737
+ "type" => "object",
738
+ "properties" => { "a" => {"type" => "string", "format" => "date-time"}}
739
+ }
740
+
741
+ data = {"a" => "2010-01-01T12:00:00Z"}
742
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
743
+ data = {"a" => "2010-01-32T12:00:00Z"}
744
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
745
+ data = {"a" => "2010-13-01T12:00:00Z"}
746
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
747
+ data = {"a" => "2010-01-01T24:00:00Z"}
748
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
749
+ data = {"a" => "2010-01-01T12:60:00Z"}
750
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
751
+ data = {"a" => "2010-01-01T12:00:60Z"}
752
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
753
+ data = {"a" => "2010-01-01T12:00:00z"}
754
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
755
+ data = {"a" => "2010-01-0112:00:00Z"}
756
+ assert(!JSON::Validator.validate(schema,data,:version => :draft2))
757
+ end
758
+
759
+
760
+ def test_format_union
761
+ data1 = {"a" => "boo"}
762
+ data2 = {"a" => nil}
763
+
764
+ schema = {
765
+ "type" => "object",
766
+ "properties" => { "a" => {"type" => ["string","null"], "format" => "ip-address"}}
767
+ }
768
+ assert(!JSON::Validator.validate(schema,data1,:version => :draft2))
769
+ assert(JSON::Validator.validate(schema,data2,:version => :draft2))
770
+ end
771
+
772
+ end
773
+