json-schema 2.2.5 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +8 -8
  2. data/README.textile +1 -1
  3. data/lib/json-schema.rb +1 -0
  4. data/lib/json-schema/attribute.rb +43 -0
  5. data/lib/json-schema/attributes/additionalitems.rb +3 -1
  6. data/lib/json-schema/attributes/additionalproperties.rb +1 -0
  7. data/lib/json-schema/attributes/allof.rb +6 -4
  8. data/lib/json-schema/attributes/anyof.rb +7 -5
  9. data/lib/json-schema/attributes/dependencies.rb +3 -1
  10. data/lib/json-schema/attributes/dependencies_v4.rb +3 -1
  11. data/lib/json-schema/attributes/disallow.rb +3 -1
  12. data/lib/json-schema/attributes/divisibleby.rb +3 -1
  13. data/lib/json-schema/attributes/enum.rb +3 -1
  14. data/lib/json-schema/attributes/extends.rb +1 -0
  15. data/lib/json-schema/attributes/format.rb +6 -112
  16. data/lib/json-schema/attributes/formats/custom.rb +22 -0
  17. data/lib/json-schema/attributes/formats/date.rb +25 -0
  18. data/lib/json-schema/attributes/formats/date_time.rb +35 -0
  19. data/lib/json-schema/attributes/formats/ip4.rb +22 -0
  20. data/lib/json-schema/attributes/formats/ip6.rb +30 -0
  21. data/lib/json-schema/attributes/formats/time.rb +22 -0
  22. data/lib/json-schema/attributes/formats/uri.rb +18 -0
  23. data/lib/json-schema/attributes/items.rb +3 -1
  24. data/lib/json-schema/attributes/maxdecimal.rb +3 -1
  25. data/lib/json-schema/attributes/maximum.rb +3 -1
  26. data/lib/json-schema/attributes/maximum_inclusive.rb +2 -0
  27. data/lib/json-schema/attributes/maxitems.rb +2 -0
  28. data/lib/json-schema/attributes/maxlength.rb +3 -1
  29. data/lib/json-schema/attributes/maxproperties.rb +3 -1
  30. data/lib/json-schema/attributes/minimum.rb +3 -1
  31. data/lib/json-schema/attributes/minimum_inclusive.rb +3 -1
  32. data/lib/json-schema/attributes/minitems.rb +4 -2
  33. data/lib/json-schema/attributes/minlength.rb +3 -1
  34. data/lib/json-schema/attributes/minproperties.rb +3 -1
  35. data/lib/json-schema/attributes/multipleof.rb +3 -1
  36. data/lib/json-schema/attributes/not.rb +3 -1
  37. data/lib/json-schema/attributes/oneof.rb +2 -0
  38. data/lib/json-schema/attributes/pattern.rb +3 -1
  39. data/lib/json-schema/attributes/patternproperties.rb +3 -1
  40. data/lib/json-schema/attributes/properties.rb +4 -2
  41. data/lib/json-schema/attributes/properties_optional.rb +3 -1
  42. data/lib/json-schema/attributes/properties_v4.rb +2 -0
  43. data/lib/json-schema/attributes/ref.rb +3 -0
  44. data/lib/json-schema/attributes/required.rb +2 -0
  45. data/lib/json-schema/attributes/type.rb +6 -20
  46. data/lib/json-schema/attributes/type_v4.rb +3 -21
  47. data/lib/json-schema/attributes/uniqueitems.rb +3 -1
  48. data/lib/json-schema/errors/custom_format_error.rb +6 -0
  49. data/lib/json-schema/errors/json_parse_error.rb +6 -0
  50. data/lib/json-schema/errors/schema_error.rb +6 -0
  51. data/lib/json-schema/errors/validation_error.rb +46 -0
  52. data/lib/json-schema/schema.rb +1 -5
  53. data/lib/json-schema/schema/validator.rb +31 -0
  54. data/lib/json-schema/validator.rb +61 -126
  55. data/lib/json-schema/validators/draft1.rb +14 -1
  56. data/lib/json-schema/validators/draft2.rb +14 -1
  57. data/lib/json-schema/validators/draft3.rb +14 -2
  58. data/lib/json-schema/validators/draft4.rb +12 -1
  59. data/test/test_all_of_ref_schema.rb +29 -2
  60. data/test/test_any_of_ref_schema.rb +26 -0
  61. data/test/test_bad_schema_ref.rb +2 -2
  62. data/test/test_common_test_suite.rb +53 -0
  63. data/test/test_custom_format.rb +117 -0
  64. data/test/test_jsonschema_draft1.rb +12 -0
  65. data/test/test_jsonschema_draft2.rb +12 -0
  66. data/test/test_jsonschema_draft3.rb +31 -0
  67. data/test/test_jsonschema_draft4.rb +14 -48
  68. data/test/test_minitems.rb +18 -0
  69. metadata +21 -4
  70. data/test/test_suite.rb +0 -71
@@ -1,3 +1,5 @@
1
+ require 'json-schema/schema/validator'
2
+
1
3
  module JSON
2
4
  class Schema
3
5
 
@@ -34,7 +36,16 @@ module JSON
34
36
  "extends" => JSON::Schema::ExtendsAttribute,
35
37
  "$ref" => JSON::Schema::RefAttribute
36
38
  }
39
+ @default_formats = {
40
+ 'date-time' => DateTimeFormat,
41
+ 'ipv4' => IP4Format,
42
+ 'ipv6' => IP6Format,
43
+ 'uri' => UriFormat
44
+ }
45
+ @formats = @default_formats.clone
37
46
  @uri = URI.parse("http://json-schema.org/draft-04/schema#")
47
+ @names = ["draft4", "http://json-schema.org/draft-04/schema#"]
48
+ @metaschema = File.join("resources", "draft-04.json")
38
49
  end
39
50
 
40
51
  JSON::Validator.register_validator(self.new)
@@ -42,4 +53,4 @@ module JSON
42
53
  end
43
54
 
44
55
  end
45
- end
56
+ end
@@ -1,11 +1,38 @@
1
1
  require 'test/unit'
2
2
  require File.dirname(__FILE__) + '/../lib/json-schema'
3
3
 
4
- class AnyOfRefSchemaTest < Test::Unit::TestCase
5
- def test_all_of_ref_schema
4
+ class AllOfRefSchemaTest < Test::Unit::TestCase
5
+ def test_all_of_ref_schema_fails
6
6
  schema = File.join(File.dirname(__FILE__),"schemas/all_of_ref_schema.json")
7
7
  data = File.join(File.dirname(__FILE__),"data/all_of_ref_data.json")
8
8
  errors = JSON::Validator.fully_validate(schema,data, :errors_as_objects => true)
9
9
  assert(!errors.empty?, "should have failed to validate")
10
10
  end
11
+
12
+ def test_all_of_ref_schema_succeeds
13
+ schema = File.join(File.dirname(__FILE__),"schemas/all_of_ref_schema.json")
14
+ data = %({"name": 42})
15
+ errors = JSON::Validator.fully_validate(schema,data, :errors_as_objects => true)
16
+ assert(errors.empty?, "should have validated")
17
+ end
18
+
19
+ def test_all_of_ref_subschema_errors
20
+ schema = File.join(File.dirname(__FILE__), 'schemas/all_of_ref_schema.json')
21
+ data = File.join(File.dirname(__FILE__), 'data/all_of_ref_data.json')
22
+ errors = JSON::Validator.fully_validate(schema, data, :errors_as_objects => true)
23
+ nested_errors = errors[0][:errors]
24
+ assert_equal([:allof_0], nested_errors.keys, 'should have nested errors for each allOf subschema')
25
+ assert_match(/the property '#\/name' of type String did not match the following type: integer/i, nested_errors[:allof_0][0][:message])
26
+ end
27
+
28
+ def test_all_of_ref_message
29
+ schema = File.join(File.dirname(__FILE__), 'schemas/all_of_ref_schema.json')
30
+ data = File.join(File.dirname(__FILE__), 'data/all_of_ref_data.json')
31
+ errors = JSON::Validator.fully_validate(schema, data)
32
+ expected_message = """The property '#/' of type Hash did not match all of the required schemas. The schema specific errors were:
33
+
34
+ - allOf #0:
35
+ - The property '#/name' of type String did not match the following type: integer"""
36
+ assert_equal(expected_message, errors[0])
37
+ end
11
38
  end
@@ -8,4 +8,30 @@ class AnyOfRefSchemaTest < Test::Unit::TestCase
8
8
  errors = JSON::Validator.fully_validate(schema,data, :errors_as_objects => true)
9
9
  assert(errors.empty?, errors.map{|e| e[:message] }.join("\n"))
10
10
  end
11
+
12
+ def test_any_of_ref_subschema_errors
13
+ schema = File.join(File.dirname(__FILE__),'schemas/any_of_ref_schema.json')
14
+ data = %({"names": ["jack"]})
15
+ errors = JSON::Validator.fully_validate(schema, data, :errors_as_objects => true)
16
+ nested_errors = errors[0][:errors]
17
+ assert_equal([:anyof_0, :anyof_1, :anyof_2], nested_errors.keys, 'should have nested errors for each anyOf subschema')
18
+ assert_match(/the property '#\/names\/0' value "jack" did not match the regex 'john'/i, nested_errors[:anyof_0][0][:message])
19
+ assert_match(/the property '#\/names\/0' value "jack" did not match the regex 'jane'/i, nested_errors[:anyof_1][0][:message])
20
+ assert_match(/the property '#\/names\/0' value "jack" did not match the regex 'jimmy'/i, nested_errors[:anyof_2][0][:message])
21
+ end
22
+
23
+ def test_any_of_ref_message
24
+ schema = File.join(File.dirname(__FILE__),'schemas/any_of_ref_schema.json')
25
+ data = %({"names": ["jack"]})
26
+ errors = JSON::Validator.fully_validate(schema, data)
27
+ expected_message = """The property '#/names/0' of type String did not match one or more of the required schemas. The schema specific errors were:
28
+
29
+ - anyOf #0:
30
+ - The property '#/names/0' value \"jack\" did not match the regex 'john'
31
+ - anyOf #1:
32
+ - The property '#/names/0' value \"jack\" did not match the regex 'jane'
33
+ - anyOf #2:
34
+ - The property '#/names/0' value \"jack\" did not match the regex 'jimmy'"""
35
+ assert_equal(expected_message, errors[0])
36
+ end
11
37
  end
@@ -25,9 +25,9 @@ class BadSchemaRefTest < Test::Unit::TestCase
25
25
  }
26
26
 
27
27
  data = [1,2,3]
28
- assert_raise(SocketError) do
28
+ assert_raise(SocketError, OpenURI::HTTPError) do
29
29
  JSON::Validator.validate(schema,data)
30
30
  end
31
31
  end
32
32
 
33
- end
33
+ end
@@ -0,0 +1,53 @@
1
+ require 'test/unit'
2
+ require File.expand_path('../../lib/json-schema', __FILE__)
3
+
4
+ class CommonTestSuiteTest < Test::Unit::TestCase
5
+ TEST_DIR = File.expand_path('../test-suite/tests', __FILE__)
6
+
7
+ # These are test files which we know fail spectacularly, either because
8
+ # we don't support that functionality or because they require external
9
+ # dependencies
10
+ IGNORED_TESTS = [
11
+ "draft3/disallow.json",
12
+ "draft3/optional/format.json",
13
+ "draft3/optional/jsregex.json",
14
+ "draft3/ref.json",
15
+ "draft3/refRemote.json",
16
+ "draft4/dependencies.json",
17
+ "draft4/optional/format.json",
18
+ "draft4/ref.json",
19
+ "draft4/refRemote.json",
20
+ ]
21
+
22
+ Dir["#{TEST_DIR}/*"].each do |suite|
23
+ version = File.basename(suite).to_sym
24
+ Dir["#{suite}/**/*.json"].each do |tfile|
25
+ test_list = JSON::Validator.parse(File.read(tfile))
26
+ rel_file = tfile[TEST_DIR.length+1..-1]
27
+
28
+ test_list.each do |test|
29
+ schema = test["schema"]
30
+ base_description = test["description"]
31
+ v = nil
32
+
33
+ test["tests"].each do |t|
34
+ err_id = "#{rel_file}, '#{base_description}'/'#{t['description']}'"
35
+
36
+ define_method("test_#{err_id}") do
37
+ skip "Known incompatibility with common test suite" if IGNORED_TESTS.include?(rel_file)
38
+
39
+ assert_nothing_raised("Exception raised running #{err_id}") do
40
+ v = JSON::Validator.fully_validate(schema,
41
+ t["data"],
42
+ :validate_schema => true,
43
+ :version => version
44
+ )
45
+ end
46
+
47
+ assert v.empty? == t["valid"], "Common test suite case failed: #{err_id}\n#{v}"
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,117 @@
1
+ # encoding: utf-8
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/../lib/json-schema'
4
+
5
+ class JSONSchemaCustomFormatTest < Test::Unit::TestCase
6
+ def setup
7
+ @all_versions = ['draft1', 'draft2', 'draft3', 'draft4']
8
+ @format_proc = -> value { raise JSON::Schema::CustomFormatError.new("must be 42") unless value == "42" }
9
+ @schema_4 = {
10
+ "$schema" => "http://json-schema.org/draft-04/schema#",
11
+ "properties" => {
12
+ "a" => {
13
+ "type" => "string",
14
+ "format" => "custom",
15
+ },
16
+ }
17
+ }
18
+ @schema_3 = @schema_4.clone
19
+ @schema_3["$schema"] = "http://json-schema.org/draft-03/schema#"
20
+ @schema_2 = @schema_4.clone
21
+ @schema_2["$schema"] = "http://json-schema.org/draft-02/schema#"
22
+ @schema_1 = @schema_4.clone
23
+ @schema_1["$schema"] = "http://json-schema.org/draft-01/schema#"
24
+ @schemas = {
25
+ "draft1" => @schema_1,
26
+ "draft2" => @schema_2,
27
+ "draft3" => @schema_3,
28
+ "draft4" => @schema_4
29
+ }
30
+ JSON::Validator.restore_default_formats
31
+ end
32
+
33
+ def test_single_registration
34
+ @all_versions.each do |version|
35
+ assert(JSON::Validator.validator_for_name(version).formats['custom'].nil?, "Format 'custom' for #{version} should be nil")
36
+ JSON::Validator.register_format_validator("custom", @format_proc, [version])
37
+ assert(JSON::Validator.validator_for_name(version).formats['custom'].is_a?(JSON::Schema::CustomFormat), "Format 'custom' should be registered for #{version}")
38
+ (@all_versions - [version]).each do |other_version|
39
+ assert(JSON::Validator.validator_for_name(other_version).formats['custom'].nil?, "Format 'custom' should still be nil for #{other_version}")
40
+ end
41
+ JSON::Validator.deregister_format_validator("custom", [version])
42
+ assert(JSON::Validator.validator_for_name(version).formats['custom'].nil?, "Format 'custom' should be deregistered for #{version}")
43
+ end
44
+ end
45
+
46
+ def test_register_for_all_by_default
47
+ JSON::Validator.register_format_validator("custom", @format_proc)
48
+ @all_versions.each do |version|
49
+ assert(JSON::Validator.validator_for_name(version).formats['custom'].is_a?(JSON::Schema::CustomFormat), "Format 'custom' should be registered for #{version}")
50
+ end
51
+ JSON::Validator.restore_default_formats
52
+ @all_versions.each do |version|
53
+ assert(JSON::Validator.validator_for_name(version).formats['custom'].nil?, "Format 'custom' should still be nil for #{version}")
54
+ end
55
+ end
56
+
57
+ def test_multi_registration
58
+ unregistered_version = @all_versions.delete("draft1")
59
+ JSON::Validator.register_format_validator("custom", @format_proc, @all_versions)
60
+ @all_versions.each do |version|
61
+ assert(JSON::Validator.validator_for_name(version).formats['custom'].is_a?(JSON::Schema::CustomFormat), "Format 'custom' should be registered for #{version}")
62
+ end
63
+ assert(JSON::Validator.validator_for_name(unregistered_version).formats['custom'].nil?, "Format 'custom' should still be nil for #{unregistered_version}")
64
+ end
65
+
66
+ def test_format_validation
67
+ @all_versions.each do |version|
68
+ data = {
69
+ "a" => "23"
70
+ }
71
+ schema = @schemas[version]
72
+ prefix = "Validation for '#{version}'"
73
+
74
+ assert(JSON::Validator.validate(schema, data), "#{prefix} succeeds with no 'custom' format validator registered")
75
+
76
+ JSON::Validator.register_format_validator("custom", @format_proc, [version])
77
+ data["a"] = "42"
78
+ assert(JSON::Validator.validate(schema, data), "#{prefix} succeeds with 'custom' format validator and correct data")
79
+
80
+ data["a"] = "23"
81
+ assert(!JSON::Validator.validate(schema, data), "#{prefix} fails with 'custom' format validator and wrong data")
82
+
83
+ errors = JSON::Validator.fully_validate(schema, data)
84
+ assert(errors.count == 1 && errors.first.match(/The property '#\/a' must be 42 in schema/), "#{prefix} records fromat error")
85
+
86
+ data["a"] = 23
87
+ errors = JSON::Validator.fully_validate(schema, data)
88
+ assert(errors.count == 1 && errors.first.match(/The property '#\/a' of type (?:integer|Fixnum) did not match the following type: string/), "#{prefix} records no fromat error on type mismatch")
89
+ end
90
+ end
91
+
92
+ def test_override_default_format
93
+ @all_versions.each do |version|
94
+ data = {
95
+ "a" => "2001:db8:85a3:0:0:8a2e:370:7334"
96
+ }
97
+ schema = @schemas[version]
98
+ schema["properties"]["a"]["format"] = "ipv6"
99
+ prefix = "Validation for '#{version}'"
100
+
101
+ assert(JSON::Validator.validate(schema, data), "#{prefix} succeeds for default format with correct data")
102
+
103
+ data["a"] = "no_ip6_address"
104
+ assert(!JSON::Validator.validate(schema, data), "#{prefix} fails for default format and wrong data")
105
+
106
+ data["a"] = "42"
107
+ JSON::Validator.register_format_validator("ipv6", @format_proc, [version])
108
+ assert(JSON::Validator.validate(schema, data), "#{prefix} succeeds with overriden default format and correct data")
109
+
110
+ JSON::Validator.deregister_format_validator("ipv6", [version])
111
+ data["a"] = "2001:db8:85a3:0:0:8a2e:370:7334"
112
+ assert(JSON::Validator.validate(schema, data), "#{prefix} restores the default format on deregistration")
113
+ end
114
+ end
115
+ end
116
+
117
+
@@ -684,6 +684,18 @@ class JSONSchemaDraft1Test < Test::Unit::TestCase
684
684
  assert(!JSON::Validator.validate(schema,data,:version => :draft1))
685
685
  end
686
686
 
687
+ def test_format_unknown
688
+ schema = {
689
+ "type" => "object",
690
+ "properties" => { "a" => {"type" => "string", "format" => "unknown"}}
691
+ }
692
+
693
+ data = {"a" => "I can write what I want here"}
694
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
695
+ data = {"a" => ""}
696
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
697
+ end
698
+
687
699
 
688
700
  def test_format_union
689
701
  data1 = {"a" => "boo"}
@@ -756,6 +756,18 @@ class JSONSchemaDraft2Test < Test::Unit::TestCase
756
756
  assert(!JSON::Validator.validate(schema,data,:version => :draft2))
757
757
  end
758
758
 
759
+ def test_format_unknown
760
+ schema = {
761
+ "type" => "object",
762
+ "properties" => { "a" => {"type" => "string", "format" => "unknown"}}
763
+ }
764
+
765
+ data = {"a" => "I can write what I want here"}
766
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
767
+ data = {"a" => ""}
768
+ assert(JSON::Validator.validate(schema,data,:version => :draft2))
769
+ end
770
+
759
771
 
760
772
  def test_format_union
761
773
  data1 = {"a" => "boo"}
@@ -503,6 +503,25 @@ class JSONSchemaDraft3Test < Test::Unit::TestCase
503
503
  assert(!JSON::Validator.validate(schema,data,:strict => true))
504
504
  end
505
505
 
506
+ def test_strict_properties_required_props
507
+ schema = {
508
+ "$schema" => "http://json-schema.org/draft-03/schema#",
509
+ "properties" => {
510
+ "a" => {"type" => "string", "required" => true},
511
+ "b" => {"type" => "string", "required" => false}
512
+ }
513
+ }
514
+
515
+ data = {"a" => "a"}
516
+ assert(JSON::Validator.validate(schema,data,:strict => true))
517
+
518
+ data = {"b" => "b"}
519
+ assert(!JSON::Validator.validate(schema,data,:strict => true))
520
+
521
+ data = {"a" => "a", "b" => "b"}
522
+ assert(JSON::Validator.validate(schema,data,:strict => true))
523
+ end
524
+
506
525
  def test_strict_properties_additional_props
507
526
  schema = {
508
527
  "$schema" => "http://json-schema.org/draft-03/schema#",
@@ -1076,6 +1095,18 @@ class JSONSchemaDraft3Test < Test::Unit::TestCase
1076
1095
  assert(JSON::Validator.validate(schema,data))
1077
1096
  end
1078
1097
 
1098
+ def test_format_unknown
1099
+ schema = {
1100
+ "type" => "object",
1101
+ "properties" => { "a" => {"type" => "string", "format" => "unknown"}}
1102
+ }
1103
+
1104
+ data = {"a" => "I can write what I want here"}
1105
+ assert(JSON::Validator.validate(schema,data,:version => :draft3))
1106
+ data = {"a" => ""}
1107
+ assert(JSON::Validator.validate(schema,data,:version => :draft3))
1108
+ end
1109
+
1079
1110
 
1080
1111
  def test_format_union
1081
1112
  data1 = {"a" => "boo"}
@@ -887,7 +887,7 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
887
887
  schema = {
888
888
  "$schema" => "http://json-schema.org/draft-04/schema#",
889
889
  "type" => "object",
890
- "properties" => { "a" => {"type" => "string", "format" => "ip-address"}}
890
+ "properties" => { "a" => {"type" => "string", "format" => "ipv4"}}
891
891
  }
892
892
 
893
893
  data = {"a" => "1.1.1.1"}
@@ -929,52 +929,6 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
929
929
  assert(!JSON::Validator.validate(schema,data))
930
930
  end
931
931
 
932
- def test_format_time
933
- schema = {
934
- "$schema" => "http://json-schema.org/draft-04/schema#",
935
- "type" => "object",
936
- "properties" => { "a" => {"type" => "string", "format" => "time"}}
937
- }
938
-
939
- data = {"a" => "12:00:00"}
940
- assert(JSON::Validator.validate(schema,data))
941
- data = {"a" => "12:00"}
942
- assert(!JSON::Validator.validate(schema,data))
943
- data = {"a" => "12:00:60"}
944
- assert(!JSON::Validator.validate(schema,data))
945
- data = {"a" => "12:60:00"}
946
- assert(!JSON::Validator.validate(schema,data))
947
- data = {"a" => "24:00:00"}
948
- assert(!JSON::Validator.validate(schema,data))
949
- data = {"a" => "0:00:00"}
950
- assert(!JSON::Validator.validate(schema,data))
951
- data = {"a" => "-12:00:00"}
952
- assert(!JSON::Validator.validate(schema,data))
953
- data = {"a" => "12:00:00b"}
954
- assert(!JSON::Validator.validate(schema,data))
955
- end
956
-
957
-
958
- def test_format_date
959
- schema = {
960
- "$schema" => "http://json-schema.org/draft-04/schema#",
961
- "type" => "object",
962
- "properties" => { "a" => {"type" => "string", "format" => "date"}}
963
- }
964
-
965
- data = {"a" => "2010-01-01"}
966
- assert(JSON::Validator.validate(schema,data))
967
- data = {"a" => "2010-01-32"}
968
- assert(!JSON::Validator.validate(schema,data))
969
- data = {"a" => "n2010-01-01"}
970
- assert(!JSON::Validator.validate(schema,data))
971
- data = {"a" => "2010-1-01"}
972
- assert(!JSON::Validator.validate(schema,data))
973
- data = {"a" => "2010-01-1"}
974
- assert(!JSON::Validator.validate(schema,data))
975
- data = {"a" => "2010-01-01n"}
976
- assert(!JSON::Validator.validate(schema,data))
977
- end
978
932
 
979
933
  def test_format_datetime
980
934
  schema = {
@@ -1025,6 +979,18 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
1025
979
  assert(JSON::Validator.validate(schema,data3))
1026
980
  end
1027
981
 
982
+ def test_format_unknown
983
+ schema = {
984
+ "type" => "object",
985
+ "properties" => { "a" => {"type" => "string", "format" => "unknown"}}
986
+ }
987
+
988
+ data = {"a" => "I can write what I want here"}
989
+ assert(JSON::Validator.validate(schema,data,:version => :draft4))
990
+ data = {"a" => ""}
991
+ assert(JSON::Validator.validate(schema,data,:version => :draft4))
992
+ end
993
+
1028
994
 
1029
995
  def test_format_union
1030
996
  data1 = {"a" => "boo"}
@@ -1033,7 +999,7 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
1033
999
  schema = {
1034
1000
  "$schema" => "http://json-schema.org/draft-04/schema#",
1035
1001
  "type" => "object",
1036
- "properties" => { "a" => {"type" => ["string","null"], "format" => "ip-address"}}
1002
+ "properties" => { "a" => {"type" => ["string","null"], "format" => "ipv4"}}
1037
1003
  }
1038
1004
  assert(!JSON::Validator.validate(schema,data1))
1039
1005
  assert(JSON::Validator.validate(schema,data2))