seomoz-json-schema 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/README.textile +216 -0
  2. data/lib/json-schema.rb +13 -0
  3. data/lib/json-schema/attributes/additionalitems.rb +23 -0
  4. data/lib/json-schema/attributes/additionalproperties.rb +39 -0
  5. data/lib/json-schema/attributes/dependencies.rb +30 -0
  6. data/lib/json-schema/attributes/disallow.rb +11 -0
  7. data/lib/json-schema/attributes/divisibleby.rb +16 -0
  8. data/lib/json-schema/attributes/enum.rb +24 -0
  9. data/lib/json-schema/attributes/extends.rb +14 -0
  10. data/lib/json-schema/attributes/format.rb +113 -0
  11. data/lib/json-schema/attributes/items.rb +25 -0
  12. data/lib/json-schema/attributes/maxdecimal.rb +15 -0
  13. data/lib/json-schema/attributes/maximum.rb +15 -0
  14. data/lib/json-schema/attributes/maximum_inclusive.rb +15 -0
  15. data/lib/json-schema/attributes/maxitems.rb +12 -0
  16. data/lib/json-schema/attributes/maxlength.rb +14 -0
  17. data/lib/json-schema/attributes/minimum.rb +15 -0
  18. data/lib/json-schema/attributes/minimum_inclusive.rb +15 -0
  19. data/lib/json-schema/attributes/minitems.rb +12 -0
  20. data/lib/json-schema/attributes/minlength.rb +14 -0
  21. data/lib/json-schema/attributes/pattern.rb +15 -0
  22. data/lib/json-schema/attributes/patternproperties.rb +23 -0
  23. data/lib/json-schema/attributes/properties.rb +23 -0
  24. data/lib/json-schema/attributes/properties_optional.rb +23 -0
  25. data/lib/json-schema/attributes/ref.rb +55 -0
  26. data/lib/json-schema/attributes/type.rb +71 -0
  27. data/lib/json-schema/attributes/uniqueitems.rb +16 -0
  28. data/lib/json-schema/schema.rb +50 -0
  29. data/lib/json-schema/uri/file.rb +32 -0
  30. data/lib/json-schema/uri/uuid.rb +285 -0
  31. data/lib/json-schema/validator.rb +425 -0
  32. data/lib/json-schema/validators/draft1.rb +32 -0
  33. data/lib/json-schema/validators/draft2.rb +33 -0
  34. data/lib/json-schema/validators/draft3.rb +38 -0
  35. data/resources/draft-01.json +155 -0
  36. data/resources/draft-02.json +166 -0
  37. data/resources/draft-03.json +174 -0
  38. data/test/data/bad_data_1.json +3 -0
  39. data/test/data/good_data_1.json +3 -0
  40. data/test/schemas/good_schema_1.json +10 -0
  41. data/test/schemas/good_schema_2.json +10 -0
  42. data/test/test_extended_schema.rb +68 -0
  43. data/test/test_files.rb +35 -0
  44. data/test/test_full_validation.rb +38 -0
  45. data/test/test_jsonschema_draft1.rb +703 -0
  46. data/test/test_jsonschema_draft2.rb +775 -0
  47. data/test/test_jsonschema_draft3.rb +972 -0
  48. data/test/test_schema_validation.rb +43 -0
  49. metadata +137 -0
@@ -0,0 +1,972 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/json-schema'
3
+
4
+ class JSONSchemaDraft3Test < Test::Unit::TestCase
5
+ def test_types
6
+ # Set up the default datatype
7
+ schema = {
8
+ "$schema" => "http://json-schema.org/draft-03/schema#",
9
+ "properties" => {
10
+ "a" => {}
11
+ }
12
+ }
13
+ data = {
14
+ "a" => nil
15
+ }
16
+
17
+ # Test integers
18
+ schema["properties"]["a"]["type"] = "integer"
19
+ data["a"] = 5
20
+ assert(JSON::Validator.validate(schema,data))
21
+
22
+ data["a"] = 5.2
23
+ assert(!JSON::Validator.validate(schema,data))
24
+
25
+ data['a'] = 'string'
26
+ assert(!JSON::Validator.validate(schema,data))
27
+
28
+ data['a'] = true
29
+ assert(!JSON::Validator.validate(schema,data))
30
+
31
+
32
+ # Test numbers
33
+ schema["properties"]["a"]["type"] = "number"
34
+ data["a"] = 5
35
+ assert(JSON::Validator.validate(schema,data))
36
+
37
+ data["a"] = 5.2
38
+ assert(JSON::Validator.validate(schema,data))
39
+
40
+ data['a'] = 'string'
41
+ assert(!JSON::Validator.validate(schema,data))
42
+
43
+ data['a'] = true
44
+ assert(!JSON::Validator.validate(schema,data))
45
+
46
+
47
+ # Test strings
48
+ schema["properties"]["a"]["type"] = "string"
49
+ data["a"] = 5
50
+ assert(!JSON::Validator.validate(schema,data))
51
+
52
+ data["a"] = 5.2
53
+ assert(!JSON::Validator.validate(schema,data))
54
+
55
+ data['a'] = 'string'
56
+ assert(JSON::Validator.validate(schema,data))
57
+
58
+ data['a'] = true
59
+ assert(!JSON::Validator.validate(schema,data))
60
+
61
+
62
+ # Test booleans
63
+ schema["properties"]["a"]["type"] = "boolean"
64
+ data["a"] = 5
65
+ assert(!JSON::Validator.validate(schema,data))
66
+
67
+ data["a"] = 5.2
68
+ assert(!JSON::Validator.validate(schema,data))
69
+
70
+ data['a'] = 'string'
71
+ assert(!JSON::Validator.validate(schema,data))
72
+
73
+ data['a'] = true
74
+ assert(JSON::Validator.validate(schema,data))
75
+
76
+ data['a'] = false
77
+ assert(JSON::Validator.validate(schema,data))
78
+
79
+
80
+ # Test object
81
+ schema["properties"]["a"]["type"] = "object"
82
+ data["a"] = {}
83
+ assert(JSON::Validator.validate(schema,data))
84
+
85
+ data["a"] = 5.2
86
+ assert(!JSON::Validator.validate(schema,data))
87
+
88
+ data['a'] = 'string'
89
+ assert(!JSON::Validator.validate(schema,data))
90
+
91
+ data['a'] = true
92
+ assert(!JSON::Validator.validate(schema,data))
93
+
94
+
95
+ # Test array
96
+ schema["properties"]["a"]["type"] = "array"
97
+ data["a"] = []
98
+ assert(JSON::Validator.validate(schema,data))
99
+
100
+ data["a"] = 5.2
101
+ assert(!JSON::Validator.validate(schema,data))
102
+
103
+ data['a'] = 'string'
104
+ assert(!JSON::Validator.validate(schema,data))
105
+
106
+ data['a'] = true
107
+ assert(!JSON::Validator.validate(schema,data))
108
+
109
+
110
+ # Test null
111
+ schema["properties"]["a"]["type"] = "null"
112
+ data["a"] = nil
113
+ assert(JSON::Validator.validate(schema,data))
114
+
115
+ data["a"] = 5.2
116
+ assert(!JSON::Validator.validate(schema,data))
117
+
118
+ data['a'] = 'string'
119
+ assert(!JSON::Validator.validate(schema,data))
120
+
121
+ data['a'] = true
122
+ assert(!JSON::Validator.validate(schema,data))
123
+
124
+
125
+ # Test any
126
+ schema["properties"]["a"]["type"] = "any"
127
+ data["a"] = 5
128
+ assert(JSON::Validator.validate(schema,data))
129
+
130
+ data["a"] = 5.2
131
+ assert(JSON::Validator.validate(schema,data))
132
+
133
+ data['a'] = 'string'
134
+ assert(JSON::Validator.validate(schema,data))
135
+
136
+ data['a'] = true
137
+ assert(JSON::Validator.validate(schema,data))
138
+
139
+
140
+ # Test a union type
141
+ schema["properties"]["a"]["type"] = ["integer","string"]
142
+ data["a"] = 5
143
+ assert(JSON::Validator.validate(schema,data))
144
+
145
+ data["a"] = 'boo'
146
+ assert(JSON::Validator.validate(schema,data))
147
+
148
+ data["a"] = false
149
+ assert(!JSON::Validator.validate(schema,data))
150
+
151
+ # Test a union type with schemas
152
+ schema["properties"]["a"]["type"] = [{ "type" => "string" }, {"type" => "object", "properties" => {"b" => {"type" => "integer"}}}]
153
+
154
+ data["a"] = "test"
155
+ assert(JSON::Validator.validate(schema,data))
156
+
157
+ data["a"] = 5
158
+ assert(!JSON::Validator.validate(schema,data))
159
+
160
+ data["a"] = {"b" => 5}
161
+ assert(JSON::Validator.validate(schema,data))
162
+
163
+ data["a"] = {"b" => "taco"}
164
+ assert(!JSON::Validator.validate(schema,data))
165
+ end
166
+
167
+
168
+
169
+ def test_required
170
+ # Set up the default datatype
171
+ schema = {
172
+ "$schema" => "http://json-schema.org/draft-03/schema#",
173
+ "properties" => {
174
+ "a" => {"required" => true}
175
+ }
176
+ }
177
+ data = {}
178
+
179
+ assert(!JSON::Validator.validate(schema,data))
180
+ data['a'] = "Hello"
181
+ assert(JSON::Validator.validate(schema,data))
182
+
183
+ schema = {
184
+ "$schema" => "http://json-schema.org/draft-03/schema#",
185
+ "properties" => {
186
+ "a" => {"type" => "integer"}
187
+ }
188
+ }
189
+
190
+ data = {}
191
+ assert(JSON::Validator.validate(schema,data))
192
+
193
+ end
194
+
195
+
196
+
197
+ def test_minimum
198
+ # Set up the default datatype
199
+ schema = {
200
+ "$schema" => "http://json-schema.org/draft-03/schema#",
201
+ "properties" => {
202
+ "a" => {"minimum" => 5}
203
+ }
204
+ }
205
+
206
+ data = {
207
+ "a" => nil
208
+ }
209
+
210
+
211
+ # Test an integer
212
+ data["a"] = 5
213
+ assert(JSON::Validator.validate(schema,data))
214
+
215
+ data["a"] = 4
216
+ assert(!JSON::Validator.validate(schema,data))
217
+
218
+ # Test a float
219
+ data["a"] = 5.0
220
+ assert(JSON::Validator.validate(schema,data))
221
+
222
+ data["a"] = 4.9
223
+ assert(!JSON::Validator.validate(schema,data))
224
+
225
+ # Test a non-number
226
+ data["a"] = "a string"
227
+ assert(JSON::Validator.validate(schema,data))
228
+
229
+ # Test exclusiveMinimum
230
+ schema["properties"]["a"]["exclusiveMinimum"] = true
231
+
232
+ data["a"] = 6
233
+ assert(JSON::Validator.validate(schema,data))
234
+
235
+ data["a"] = 5
236
+ assert(!JSON::Validator.validate(schema,data))
237
+
238
+ # Test with float
239
+ data["a"] = 5.00000001
240
+ assert(JSON::Validator.validate(schema,data))
241
+
242
+ data["a"] = 5.0
243
+ assert(!JSON::Validator.validate(schema,data))
244
+ end
245
+
246
+
247
+
248
+ def test_maximum
249
+ # Set up the default datatype
250
+ schema = {
251
+ "$schema" => "http://json-schema.org/draft-03/schema#",
252
+ "properties" => {
253
+ "a" => {"maximum" => 5}
254
+ }
255
+ }
256
+
257
+ data = {
258
+ "a" => nil
259
+ }
260
+
261
+
262
+ # Test an integer
263
+ data["a"] = 5
264
+ assert(JSON::Validator.validate(schema,data))
265
+
266
+ data["a"] = 6
267
+ assert(!JSON::Validator.validate(schema,data))
268
+
269
+ # Test a float
270
+ data["a"] = 5.0
271
+ assert(JSON::Validator.validate(schema,data))
272
+
273
+ data["a"] = 5.1
274
+ assert(!JSON::Validator.validate(schema,data))
275
+
276
+ # Test a non-number
277
+ data["a"] = "a string"
278
+ assert(JSON::Validator.validate(schema,data))
279
+
280
+ # Test exclusiveMinimum
281
+ schema["properties"]["a"]["exclusiveMaximum"] = true
282
+
283
+ data["a"] = 4
284
+ assert(JSON::Validator.validate(schema,data))
285
+
286
+ data["a"] = 5
287
+ assert(!JSON::Validator.validate(schema,data))
288
+
289
+ # Test with float
290
+ data["a"] = 4.9999999
291
+ assert(JSON::Validator.validate(schema,data))
292
+
293
+ data["a"] = 5.0
294
+ assert(!JSON::Validator.validate(schema,data))
295
+ end
296
+
297
+
298
+ def test_min_items
299
+ # Set up the default datatype
300
+ schema = {
301
+ "$schema" => "http://json-schema.org/draft-03/schema#",
302
+ "properties" => {
303
+ "a" => {"minItems" => 1}
304
+ }
305
+ }
306
+
307
+ data = {
308
+ "a" => nil
309
+ }
310
+
311
+ # Test with an array
312
+ data["a"] = ["boo"]
313
+ assert(JSON::Validator.validate(schema,data))
314
+
315
+ data["a"] = []
316
+ assert(!JSON::Validator.validate(schema,data))
317
+
318
+ # Test with a non-array
319
+ data["a"] = "boo"
320
+ assert(JSON::Validator.validate(schema,data))
321
+ end
322
+
323
+
324
+
325
+ def test_max_items
326
+ # Set up the default datatype
327
+ schema = {
328
+ "$schema" => "http://json-schema.org/draft-03/schema#",
329
+ "properties" => {
330
+ "a" => {"maxItems" => 1}
331
+ }
332
+ }
333
+
334
+ data = {
335
+ "a" => nil
336
+ }
337
+
338
+ # Test with an array
339
+ data["a"] = ["boo"]
340
+ assert(JSON::Validator.validate(schema,data))
341
+
342
+ data["a"] = ["boo","taco"]
343
+ assert(!JSON::Validator.validate(schema,data))
344
+
345
+ # Test with a non-array
346
+ data["a"] = "boo"
347
+ assert(JSON::Validator.validate(schema,data))
348
+ end
349
+
350
+
351
+
352
+ def test_unique_items
353
+ # Set up the default datatype
354
+ schema = {
355
+ "$schema" => "http://json-schema.org/draft-03/schema#",
356
+ "properties" => {
357
+ "a" => {"uniqueItems" => true}
358
+ }
359
+ }
360
+
361
+ data = {
362
+ "a" => nil
363
+ }
364
+
365
+ # Test with nulls
366
+ data["a"] = [nil,5]
367
+ assert(JSON::Validator.validate(schema,data))
368
+
369
+ data["a"] = [nil,nil]
370
+ assert(!JSON::Validator.validate(schema,data))
371
+
372
+ # Test with booleans
373
+ data["a"] = [true,4]
374
+ assert(JSON::Validator.validate(schema,data))
375
+
376
+ data["a"] = [true,false]
377
+ assert(JSON::Validator.validate(schema,data))
378
+
379
+ data["a"] = [true,true]
380
+ assert(!JSON::Validator.validate(schema,data))
381
+
382
+ # Test with numbers
383
+ data["a"] = [4,true]
384
+ assert(JSON::Validator.validate(schema,data))
385
+
386
+ data["a"] = [4,4.1]
387
+ assert(JSON::Validator.validate(schema,data))
388
+
389
+ data["a"] = [4,4]
390
+ assert(!JSON::Validator.validate(schema,data))
391
+
392
+ # Test with strings
393
+ data["a"] = ['a',true]
394
+ assert(JSON::Validator.validate(schema,data))
395
+
396
+ data["a"] = ['a','ab']
397
+ assert(JSON::Validator.validate(schema,data))
398
+
399
+ data["a"] = ['a','a']
400
+ assert(!JSON::Validator.validate(schema,data))
401
+
402
+ # Test with arrays
403
+ data["a"] = [[1],true]
404
+ assert(JSON::Validator.validate(schema,data))
405
+
406
+ data["a"] = [[1,2],[1,3]]
407
+ assert(JSON::Validator.validate(schema,data))
408
+
409
+ data["a"] = [[1,2,3],[1,2,3]]
410
+ assert(!JSON::Validator.validate(schema,data))
411
+
412
+ # Test with objects
413
+ data["a"] = [{"a" => 1},true]
414
+ assert(JSON::Validator.validate(schema,data))
415
+
416
+ data["a"] = [{"a" => 1},{"a" => 2}]
417
+ assert(JSON::Validator.validate(schema,data))
418
+
419
+ data["a"] = [{"a" => 1, "b" => 2}, {"a" => 1, "b" => 2}]
420
+ assert(!JSON::Validator.validate(schema,data))
421
+ end
422
+
423
+
424
+ def test_pattern
425
+ # Set up the default datatype
426
+ schema = {
427
+ "$schema" => "http://json-schema.org/draft-03/schema#",
428
+ "properties" => {
429
+ "a" => {"pattern" => "\\d+ taco"}
430
+ }
431
+ }
432
+
433
+ data = {
434
+ "a" => nil
435
+ }
436
+
437
+ # Test strings
438
+ data["a"] = "156 taco bell"
439
+ assert(JSON::Validator.validate(schema,data))
440
+
441
+ # Test a non-string
442
+ data["a"] = 5
443
+ assert(JSON::Validator.validate(schema,data))
444
+
445
+ data["a"] = "taco"
446
+ assert(!JSON::Validator.validate(schema,data))
447
+ end
448
+
449
+
450
+ def test_min_length
451
+ # Set up the default datatype
452
+ schema = {
453
+ "$schema" => "http://json-schema.org/draft-03/schema#",
454
+ "properties" => {
455
+ "a" => {"minLength" => 1}
456
+ }
457
+ }
458
+
459
+ data = {
460
+ "a" => nil
461
+ }
462
+
463
+ # Try out strings
464
+ data["a"] = "t"
465
+ assert(JSON::Validator.validate(schema,data))
466
+
467
+ data["a"] = ""
468
+ assert(!JSON::Validator.validate(schema,data))
469
+
470
+ # Try out non-string
471
+ data["a"] = 5
472
+ assert(JSON::Validator.validate(schema,data))
473
+ end
474
+
475
+
476
+ def test_max_length
477
+ # Set up the default datatype
478
+ schema = {
479
+ "$schema" => "http://json-schema.org/draft-03/schema#",
480
+ "properties" => {
481
+ "a" => {"maxLength" => 1}
482
+ }
483
+ }
484
+
485
+ data = {
486
+ "a" => nil
487
+ }
488
+
489
+ # Try out strings
490
+ data["a"] = "t"
491
+ assert(JSON::Validator.validate(schema,data))
492
+
493
+ data["a"] = "tt"
494
+ assert(!JSON::Validator.validate(schema,data))
495
+
496
+ # Try out non-string
497
+ data["a"] = 5
498
+ assert(JSON::Validator.validate(schema,data))
499
+ end
500
+
501
+
502
+ def test_enum
503
+ # Set up the default datatype
504
+ schema = {
505
+ "$schema" => "http://json-schema.org/draft-03/schema#",
506
+ "properties" => {
507
+ "a" => {"enum" => [1,'boo',[1,2,3],{"a" => "b"}]}
508
+ }
509
+ }
510
+
511
+ data = {
512
+ "a" => nil
513
+ }
514
+
515
+ # Make sure all of the above are valid...
516
+ data["a"] = 1
517
+ assert(JSON::Validator.validate(schema,data))
518
+
519
+ data["a"] = 'boo'
520
+ assert(JSON::Validator.validate(schema,data))
521
+
522
+ data["a"] = [1,2,3]
523
+ assert(JSON::Validator.validate(schema,data))
524
+
525
+ data["a"] = {"a" => "b"}
526
+ assert(JSON::Validator.validate(schema,data))
527
+
528
+ # Test something that doesn't exist
529
+ data["a"] = 'taco'
530
+ assert(!JSON::Validator.validate(schema,data))
531
+
532
+ # Try it without the key
533
+ data = {}
534
+ assert(JSON::Validator.validate(schema,data))
535
+ end
536
+
537
+
538
+ def test_divisible_by
539
+ # Set up the default datatype
540
+ schema = {
541
+ "$schema" => "http://json-schema.org/draft-03/schema#",
542
+ "properties" => {
543
+ "a" => {"divisibleBy" => 1.1}
544
+ }
545
+ }
546
+
547
+ data = {
548
+ "a" => nil
549
+ }
550
+
551
+ data["a"] = 3.3
552
+ assert(JSON::Validator.validate(schema,data))
553
+
554
+ data["a"] = 3.4
555
+ assert(!JSON::Validator.validate(schema,data))
556
+
557
+ schema["properties"]["a"]["divisibleBy"] = 2.0
558
+
559
+ data["a"] = 4.0
560
+ assert(JSON::Validator.validate(schema,data))
561
+
562
+ data["a"] = 'boo'
563
+ assert(JSON::Validator.validate(schema,data))
564
+
565
+ data["a"] = 5
566
+ schema["properties"]["a"]["divisibleBy"] = 0
567
+ assert(!JSON::Validator.validate(schema,data))
568
+ end
569
+
570
+
571
+
572
+ def test_disallow
573
+ # Set up the default datatype
574
+ schema = {
575
+ "$schema" => "http://json-schema.org/draft-03/schema#",
576
+ "properties" => {
577
+ "a" => {"disallow" => "integer"}
578
+ }
579
+ }
580
+
581
+ data = {
582
+ "a" => nil
583
+ }
584
+
585
+
586
+ data["a"] = 'string'
587
+ assert(JSON::Validator.validate(schema,data))
588
+
589
+ data["a"] = 5
590
+ assert(!JSON::Validator.validate(schema,data))
591
+
592
+
593
+ schema["properties"]["a"]["disallow"] = ["integer","string"]
594
+ data["a"] = 'string'
595
+ assert(!JSON::Validator.validate(schema,data))
596
+
597
+ data["a"] = 5
598
+ assert(!JSON::Validator.validate(schema,data))
599
+
600
+ data["a"] = false
601
+ assert(JSON::Validator.validate(schema,data))
602
+
603
+ end
604
+
605
+
606
+
607
+ def test_extends
608
+ schema = {
609
+ "$schema" => "http://json-schema.org/draft-03/schema#",
610
+ "properties" => {
611
+ "a" => { "type" => "integer"}
612
+ }
613
+ }
614
+
615
+ schema2 = {
616
+ "$schema" => "http://json-schema.org/draft-03/schema#",
617
+ "properties" => {
618
+ "a" => { "maximum" => 5 }
619
+ }
620
+ }
621
+
622
+ data = {
623
+ "a" => 10
624
+ }
625
+
626
+ assert(JSON::Validator.validate(schema,data))
627
+ assert(!JSON::Validator.validate(schema2,data))
628
+
629
+ schema["extends"] = schema2
630
+
631
+ assert(!JSON::Validator.validate(schema,data))
632
+ end
633
+
634
+ def test_pattern_properties
635
+ # Set up the default datatype
636
+ schema = {
637
+ "$schema" => "http://json-schema.org/draft-03/schema#",
638
+ "patternProperties" => {
639
+ "\\d+ taco" => {"type" => "integer"}
640
+ }
641
+ }
642
+
643
+ data = {
644
+ "a" => true,
645
+ "1 taco" => 1,
646
+ "20 tacos" => 20
647
+ }
648
+
649
+ assert(JSON::Validator.validate(schema,data))
650
+ data["20 tacos"] = "string!"
651
+ assert(!JSON::Validator.validate(schema,data))
652
+ end
653
+
654
+
655
+ def test_additional_properties
656
+ # Test no additional properties allowed
657
+ schema = {
658
+ "$schema" => "http://json-schema.org/draft-03/schema#",
659
+ "properties" => {
660
+ "a" => { "type" => "integer" }
661
+ },
662
+ "additionalProperties" => false
663
+ }
664
+
665
+ data = {
666
+ "a" => 10
667
+ }
668
+
669
+ assert(JSON::Validator.validate(schema,data))
670
+ data["b"] = 5
671
+ assert(!JSON::Validator.validate(schema,data))
672
+
673
+ # Test additional properties match a schema
674
+ schema["additionalProperties"] = { "type" => "string" }
675
+ data["b"] = "taco"
676
+ assert(JSON::Validator.validate(schema,data))
677
+ data["b"] = 5
678
+ assert(!JSON::Validator.validate(schema,data))
679
+
680
+ # Make sure this works with pattern properties set, too
681
+ schema = {
682
+ "$schema" => "http://json-schema.org/draft-03/schema#",
683
+ "patternProperties" => {
684
+ "\\d+ taco" => {"type" => "integer"}
685
+ },
686
+ "additionalProperties" => false
687
+ }
688
+
689
+ data = {
690
+ "5 tacos" => 5,
691
+ "20 tacos" => 20
692
+ }
693
+
694
+ assert(JSON::Validator.validate(schema,data))
695
+ data["b"] = 5
696
+ assert(!JSON::Validator.validate(schema,data))
697
+ end
698
+
699
+
700
+ def test_items
701
+ schema = {
702
+ "$schema" => "http://json-schema.org/draft-03/schema#",
703
+ "items" => { "type" => "integer" }
704
+ }
705
+
706
+ data = [1,2,4]
707
+ assert(JSON::Validator.validate(schema,data))
708
+ data = [1,2,"string"]
709
+ assert(!JSON::Validator.validate(schema,data))
710
+
711
+ schema = {
712
+ "$schema" => "http://json-schema.org/draft-03/schema#",
713
+ "items" => [
714
+ {"type" => "integer"},
715
+ {"type" => "string"}
716
+ ]
717
+ }
718
+
719
+ data = [1,"string"]
720
+ assert(JSON::Validator.validate(schema,data))
721
+ data = [1,"string",3]
722
+ assert(JSON::Validator.validate(schema,data))
723
+ data = ["string",1]
724
+ assert(!JSON::Validator.validate(schema,data))
725
+
726
+ schema = {
727
+ "$schema" => "http://json-schema.org/draft-03/schema#",
728
+ "items" => [
729
+ {"type" => "integer"},
730
+ {"type" => "string"}
731
+ ],
732
+ "additionalItems" => false
733
+ }
734
+
735
+ data = [1,"string"]
736
+ assert(JSON::Validator.validate(schema,data))
737
+ data = [1,"string",3]
738
+ assert(!JSON::Validator.validate(schema,data))
739
+
740
+ schema = {"$schema" => "http://json-schema.org/draft-03/schema#","items" => [{"type" => "integer"},{"type" => "string"}],"additionalItems" => {"type" => "integer"}}
741
+
742
+ data = [1,"string"]
743
+ assert(JSON::Validator.validate(schema,data))
744
+ data = [1,"string",3]
745
+ assert(JSON::Validator.validate(schema,data))
746
+ data = [1,"string","string"]
747
+ assert(!JSON::Validator.validate(schema,data))
748
+ end
749
+
750
+
751
+ def test_list_option
752
+ schema = {
753
+ "$schema" => "http://json-schema.org/draft-03/schema#",
754
+ "type" => "object",
755
+ "properties" => { "a" => {"type" => "integer", "required" => true} }
756
+ }
757
+
758
+ data = [{"a" => 1},{"a" => 2},{"a" => 3}]
759
+ assert(JSON::Validator.validate(schema,data,:list => true))
760
+ assert(!JSON::Validator.validate(schema,data))
761
+
762
+ data = {"a" => 1}
763
+ assert(!JSON::Validator.validate(schema,data,:list => true))
764
+
765
+ data = [{"a" => 1},{"b" => 2},{"a" => 3}]
766
+ assert(!JSON::Validator.validate(schema,data,:list => true))
767
+ end
768
+
769
+
770
+ def test_self_reference
771
+ schema = {
772
+ "$schema" => "http://json-schema.org/draft-03/schema#",
773
+ "type" => "object",
774
+ "properties" => { "a" => {"type" => "integer"}, "b" => {"$ref" => "#"}}
775
+ }
776
+
777
+ data = {"a" => 5, "b" => {"b" => {"a" => 1}}}
778
+ assert(JSON::Validator.validate(schema,data))
779
+ data = {"a" => 5, "b" => {"b" => {"a" => 'taco'}}}
780
+ assert(!JSON::Validator.validate(schema,data))
781
+ end
782
+
783
+
784
+ def test_format_ipv4
785
+ schema = {
786
+ "$schema" => "http://json-schema.org/draft-03/schema#",
787
+ "type" => "object",
788
+ "properties" => { "a" => {"type" => "string", "format" => "ip-address"}}
789
+ }
790
+
791
+ data = {"a" => "1.1.1.1"}
792
+ assert(JSON::Validator.validate(schema,data))
793
+ data = {"a" => "1.1.1"}
794
+ assert(!JSON::Validator.validate(schema,data))
795
+ data = {"a" => "1.1.1.300"}
796
+ assert(!JSON::Validator.validate(schema,data))
797
+ data = {"a" => 5}
798
+ assert(!JSON::Validator.validate(schema,data))
799
+ data = {"a" => "1.1.1"}
800
+ assert(!JSON::Validator.validate(schema,data))
801
+ data = {"a" => "1.1.1.1b"}
802
+ assert(!JSON::Validator.validate(schema,data))
803
+ data = {"a" => "b1.1.1.1"}
804
+ end
805
+
806
+
807
+ def test_format_ipv6
808
+ schema = {
809
+ "$schema" => "http://json-schema.org/draft-03/schema#",
810
+ "type" => "object",
811
+ "properties" => { "a" => {"type" => "string", "format" => "ipv6"}}
812
+ }
813
+
814
+ data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff"}
815
+ assert(JSON::Validator.validate(schema,data))
816
+ data = {"a" => "1111:0:8888:0:0:0:eeee:ffff"}
817
+ assert(JSON::Validator.validate(schema,data))
818
+ data = {"a" => "1111:2222:8888::eeee:ffff"}
819
+ assert(JSON::Validator.validate(schema,data))
820
+ data = {"a" => "1111:2222:8888:99999:aaaa:cccc:eeee:ffff"}
821
+ assert(!JSON::Validator.validate(schema,data))
822
+ data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:gggg"}
823
+ assert(!JSON::Validator.validate(schema,data))
824
+ data = {"a" => "1111:2222::9999::cccc:eeee:ffff"}
825
+ assert(!JSON::Validator.validate(schema,data))
826
+ data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff:bbbb"}
827
+ assert(!JSON::Validator.validate(schema,data))
828
+ end
829
+
830
+ def test_format_time
831
+ schema = {
832
+ "$schema" => "http://json-schema.org/draft-03/schema#",
833
+ "type" => "object",
834
+ "properties" => { "a" => {"type" => "string", "format" => "time"}}
835
+ }
836
+
837
+ data = {"a" => "12:00:00"}
838
+ assert(JSON::Validator.validate(schema,data))
839
+ data = {"a" => "12:00"}
840
+ assert(!JSON::Validator.validate(schema,data))
841
+ data = {"a" => "12:00:60"}
842
+ assert(!JSON::Validator.validate(schema,data))
843
+ data = {"a" => "12:60:00"}
844
+ assert(!JSON::Validator.validate(schema,data))
845
+ data = {"a" => "24:00:00"}
846
+ assert(!JSON::Validator.validate(schema,data))
847
+ data = {"a" => "0:00:00"}
848
+ assert(!JSON::Validator.validate(schema,data))
849
+ data = {"a" => "-12:00:00"}
850
+ assert(!JSON::Validator.validate(schema,data))
851
+ data = {"a" => "12:00:00b"}
852
+ assert(!JSON::Validator.validate(schema,data))
853
+ end
854
+
855
+
856
+ def test_format_date
857
+ schema = {
858
+ "$schema" => "http://json-schema.org/draft-03/schema#",
859
+ "type" => "object",
860
+ "properties" => { "a" => {"type" => "string", "format" => "date"}}
861
+ }
862
+
863
+ data = {"a" => "2010-01-01"}
864
+ assert(JSON::Validator.validate(schema,data))
865
+ data = {"a" => "2010-01-32"}
866
+ assert(!JSON::Validator.validate(schema,data))
867
+ data = {"a" => "n2010-01-01"}
868
+ assert(!JSON::Validator.validate(schema,data))
869
+ data = {"a" => "2010-1-01"}
870
+ assert(!JSON::Validator.validate(schema,data))
871
+ data = {"a" => "2010-01-1"}
872
+ assert(!JSON::Validator.validate(schema,data))
873
+ data = {"a" => "2010-01-01n"}
874
+ assert(!JSON::Validator.validate(schema,data))
875
+ end
876
+
877
+ def test_format_datetime
878
+ schema = {
879
+ "$schema" => "http://json-schema.org/draft-03/schema#",
880
+ "type" => "object",
881
+ "properties" => { "a" => {"type" => "string", "format" => "date-time"}}
882
+ }
883
+
884
+ data = {"a" => "2010-01-01T12:00:00Z"}
885
+ assert(JSON::Validator.validate(schema,data))
886
+ data = {"a" => "2010-01-32T12:00:00Z"}
887
+ assert(!JSON::Validator.validate(schema,data))
888
+ data = {"a" => "2010-13-01T12:00:00Z"}
889
+ assert(!JSON::Validator.validate(schema,data))
890
+ data = {"a" => "2010-01-01T24:00:00Z"}
891
+ assert(!JSON::Validator.validate(schema,data))
892
+ data = {"a" => "2010-01-01T12:60:00Z"}
893
+ assert(!JSON::Validator.validate(schema,data))
894
+ data = {"a" => "2010-01-01T12:00:60Z"}
895
+ assert(!JSON::Validator.validate(schema,data))
896
+ data = {"a" => "2010-01-01T12:00:00"}
897
+ assert(!JSON::Validator.validate(schema,data))
898
+ data = {"a" => "2010-01-01T12:00:00z"}
899
+ assert(!JSON::Validator.validate(schema,data))
900
+ data = {"a" => "2010-01-0112:00:00Z"}
901
+ assert(!JSON::Validator.validate(schema,data))
902
+ end
903
+
904
+
905
+ def test_format_union
906
+ data1 = {"a" => "boo"}
907
+ data2 = {"a" => nil}
908
+
909
+ schema = {
910
+ "type" => "object",
911
+ "properties" => { "a" => {"type" => ["string","null"], "format" => "ip-address"}}
912
+ }
913
+ assert(!JSON::Validator.validate(schema,data1,:version => :draft3))
914
+ assert(JSON::Validator.validate(schema,data2,:version => :draft3))
915
+ end
916
+
917
+
918
+
919
+ def test_schema
920
+ schema = {
921
+ "$schema" => "http://json-schema.org/THIS-IS-NOT-A-SCHEMA",
922
+ "type" => "object"
923
+ }
924
+
925
+ data = {"a" => "taco"}
926
+ assert(!JSON::Validator.validate(schema,data))
927
+
928
+ schema = {
929
+ "$schema" => "http://json-schema.org/draft-03/schema#",
930
+ "type" => "object"
931
+ }
932
+ assert(JSON::Validator.validate(schema,data))
933
+ end
934
+
935
+ def test_dependency
936
+ schema = {
937
+ "type" => "object",
938
+ "properties" => {
939
+ "a" => {"type" => "integer"},
940
+ "b" => {"type" => "integer"}
941
+ },
942
+ "dependencies" => {
943
+ "a" => "b"
944
+ }
945
+ }
946
+
947
+ data = {"a" => 1, "b" => 2}
948
+ assert(JSON::Validator.validate(schema,data))
949
+ data = {"a" => 1}
950
+ assert(!JSON::Validator.validate(schema,data))
951
+
952
+ schema = {
953
+ "type" => "object",
954
+ "properties" => {
955
+ "a" => {"type" => "integer"},
956
+ "b" => {"type" => "integer"},
957
+ "c" => {"type" => "integer"}
958
+ },
959
+ "dependencies" => {
960
+ "a" => ["b","c"]
961
+ }
962
+ }
963
+
964
+ data = {"a" => 1, "c" => 2}
965
+ assert(!JSON::Validator.validate(schema,data))
966
+ data = {"a" => 1, "b" => 2, "c" => 3}
967
+ assert(JSON::Validator.validate(schema,data))
968
+ end
969
+
970
+
971
+ end
972
+