respect 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +20 -0
- data/README.md +289 -0
- data/RELATED_WORK.md +40 -0
- data/RELEASE_NOTES.md +23 -0
- data/Rakefile +31 -0
- data/STATUS_MATRIX.html +137 -0
- data/lib/respect.rb +231 -0
- data/lib/respect/any_schema.rb +22 -0
- data/lib/respect/array_def.rb +28 -0
- data/lib/respect/array_schema.rb +203 -0
- data/lib/respect/boolean_schema.rb +32 -0
- data/lib/respect/composite_schema.rb +86 -0
- data/lib/respect/core_statements.rb +206 -0
- data/lib/respect/datetime_schema.rb +27 -0
- data/lib/respect/def_without_name.rb +6 -0
- data/lib/respect/divisible_by_validator.rb +20 -0
- data/lib/respect/doc_helper.rb +24 -0
- data/lib/respect/doc_parser.rb +37 -0
- data/lib/respect/dsl_dumper.rb +181 -0
- data/lib/respect/equal_to_validator.rb +20 -0
- data/lib/respect/fake_name_proxy.rb +116 -0
- data/lib/respect/float_schema.rb +27 -0
- data/lib/respect/format_validator.rb +136 -0
- data/lib/respect/global_def.rb +79 -0
- data/lib/respect/greater_than_or_equal_to_validator.rb +19 -0
- data/lib/respect/greater_than_validator.rb +19 -0
- data/lib/respect/has_constraints.rb +34 -0
- data/lib/respect/hash_def.rb +40 -0
- data/lib/respect/hash_schema.rb +218 -0
- data/lib/respect/in_validator.rb +19 -0
- data/lib/respect/integer_schema.rb +27 -0
- data/lib/respect/ip_addr_schema.rb +23 -0
- data/lib/respect/ipv4_addr_schema.rb +27 -0
- data/lib/respect/ipv6_addr_schema.rb +27 -0
- data/lib/respect/items_def.rb +21 -0
- data/lib/respect/json_schema_html_formatter.rb +143 -0
- data/lib/respect/less_than_or_equal_to_validator.rb +19 -0
- data/lib/respect/less_than_validator.rb +19 -0
- data/lib/respect/match_validator.rb +19 -0
- data/lib/respect/max_length_validator.rb +20 -0
- data/lib/respect/min_length_validator.rb +20 -0
- data/lib/respect/multiple_of_validator.rb +10 -0
- data/lib/respect/null_schema.rb +26 -0
- data/lib/respect/numeric_schema.rb +33 -0
- data/lib/respect/org3_dumper.rb +213 -0
- data/lib/respect/regexp_schema.rb +19 -0
- data/lib/respect/schema.rb +285 -0
- data/lib/respect/schema_def.rb +16 -0
- data/lib/respect/string_schema.rb +21 -0
- data/lib/respect/unit_test_helper.rb +37 -0
- data/lib/respect/uri_schema.rb +23 -0
- data/lib/respect/utc_time_schema.rb +17 -0
- data/lib/respect/validator.rb +51 -0
- data/lib/respect/version.rb +3 -0
- data/test/any_schema_test.rb +79 -0
- data/test/array_def_test.rb +113 -0
- data/test/array_schema_test.rb +487 -0
- data/test/boolean_schema_test.rb +89 -0
- data/test/composite_schema_test.rb +30 -0
- data/test/datetime_schema_test.rb +83 -0
- data/test/doc_helper_test.rb +34 -0
- data/test/doc_parser_test.rb +109 -0
- data/test/dsl_dumper_test.rb +395 -0
- data/test/fake_name_proxy_test.rb +138 -0
- data/test/float_schema_test.rb +146 -0
- data/test/format_validator_test.rb +224 -0
- data/test/hash_def_test.rb +126 -0
- data/test/hash_schema_test.rb +613 -0
- data/test/integer_schema_test.rb +142 -0
- data/test/ip_addr_schema_test.rb +78 -0
- data/test/ipv4_addr_schema_test.rb +71 -0
- data/test/ipv6_addr_schema_test.rb +71 -0
- data/test/json_schema_html_formatter_test.rb +214 -0
- data/test/null_schema_test.rb +46 -0
- data/test/numeric_schema_test.rb +294 -0
- data/test/org3_dumper_test.rb +784 -0
- data/test/regexp_schema_test.rb +54 -0
- data/test/respect_test.rb +108 -0
- data/test/schema_def_test.rb +405 -0
- data/test/schema_test.rb +290 -0
- data/test/string_schema_test.rb +209 -0
- data/test/support/circle.rb +11 -0
- data/test/support/color.rb +24 -0
- data/test/support/point.rb +11 -0
- data/test/support/respect/circle_schema.rb +16 -0
- data/test/support/respect/color_def.rb +19 -0
- data/test/support/respect/color_schema.rb +33 -0
- data/test/support/respect/point_schema.rb +19 -0
- data/test/support/respect/rgba_schema.rb +20 -0
- data/test/support/respect/universal_validator.rb +25 -0
- data/test/support/respect/user_macros.rb +12 -0
- data/test/support/rgba.rb +11 -0
- data/test/test_helper.rb +90 -0
- data/test/uri_schema_test.rb +54 -0
- data/test/utc_time_schema_test.rb +63 -0
- data/test/validator_test.rb +22 -0
- metadata +288 -0
@@ -0,0 +1,89 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class BooleanSchemaTest < Test::Unit::TestCase
|
4
|
+
def test_boolean_schema_validate_type
|
5
|
+
[
|
6
|
+
[ "42", nil, "integer in string" ],
|
7
|
+
[ { "test" => 42 }, nil, "hash" ],
|
8
|
+
[ "true", true, "valid true value" ],
|
9
|
+
[ "false", false, "valid false value" ],
|
10
|
+
[ true, true, "true" ],
|
11
|
+
[ false, false, "false" ],
|
12
|
+
[ "nil", nil, "nil in string" ],
|
13
|
+
].each do |data|
|
14
|
+
s = Respect::BooleanSchema.new
|
15
|
+
# Check validate_type
|
16
|
+
if data[1].nil?
|
17
|
+
assert_raise(Respect::ValidationError) do
|
18
|
+
s.validate_type(data[0])
|
19
|
+
end
|
20
|
+
else
|
21
|
+
assert_equal data[1], s.validate_type(data[0]), data[2]
|
22
|
+
end
|
23
|
+
# Check sanitized_object
|
24
|
+
assert_nil s.sanitized_object
|
25
|
+
assert_schema_validation_is (data[1].nil? ? false : true), s, data[0], data[2]
|
26
|
+
unless data[1].nil?
|
27
|
+
assert_equal data[1], s.sanitized_object, data[2]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_boolean_schema_accept_constraint_equal_to
|
33
|
+
s_true = Respect::BooleanSchema.new equal_to: true
|
34
|
+
assert_schema_validation_is true, s_true, "true"
|
35
|
+
assert_schema_validation_is false, s_true, "false"
|
36
|
+
|
37
|
+
s_false = Respect::BooleanSchema.new equal_to: false
|
38
|
+
assert_schema_validation_is false, s_false, "true"
|
39
|
+
assert_schema_validation_is true, s_false, "false"
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_failed_validation_reset_sanitized_object
|
43
|
+
s = Respect::BooleanSchema.define equal_to: true
|
44
|
+
assert_schema_validate(s, true)
|
45
|
+
assert_equal(true, s.sanitized_object)
|
46
|
+
assert_schema_invalidate(s, false)
|
47
|
+
assert_equal(nil, s.sanitized_object)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_allow_nil
|
51
|
+
s = Respect::BooleanSchema.new(allow_nil: true)
|
52
|
+
assert_schema_validate s, nil
|
53
|
+
assert_equal(nil, s.sanitized_object)
|
54
|
+
assert_schema_validate s, true
|
55
|
+
assert_equal(true, s.sanitized_object)
|
56
|
+
assert_schema_validate s, false
|
57
|
+
assert_equal(false, s.sanitized_object)
|
58
|
+
assert_schema_validate s, "true"
|
59
|
+
assert_equal(true, s.sanitized_object)
|
60
|
+
assert_schema_validate s, "false"
|
61
|
+
assert_equal(false, s.sanitized_object)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_disallow_nil
|
65
|
+
s = Respect::BooleanSchema.new
|
66
|
+
assert !s.allow_nil?
|
67
|
+
exception = assert_exception(Respect::ValidationError) { s.validate(nil) }
|
68
|
+
assert_match exception.message, /\bBooleanSchema\b/
|
69
|
+
assert_equal(nil, s.sanitized_object)
|
70
|
+
assert_schema_validate s, true
|
71
|
+
assert_equal(true, s.sanitized_object)
|
72
|
+
assert_schema_validate s, false
|
73
|
+
assert_equal(false, s.sanitized_object)
|
74
|
+
assert_schema_validate s, "true"
|
75
|
+
assert_equal(true, s.sanitized_object)
|
76
|
+
assert_schema_validate s, "false"
|
77
|
+
assert_equal(false, s.sanitized_object)
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_allow_nil_with_constraint
|
81
|
+
s = Respect::BooleanSchema.new(allow_nil: true, equal_to: false)
|
82
|
+
assert_schema_validate s, nil
|
83
|
+
assert_equal(nil, s.sanitized_object)
|
84
|
+
assert_schema_validate s, false
|
85
|
+
assert_equal(false, s.sanitized_object)
|
86
|
+
assert_schema_invalidate s, true
|
87
|
+
assert_equal(nil, s.sanitized_object)
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class CompositeSchemaTest < Test::Unit::TestCase
|
4
|
+
def test_failed_validation_reset_sanitized_object
|
5
|
+
s = Respect::PointSchema.new
|
6
|
+
assert_schema_validate(s, { x: 42.5, y: 51.3 })
|
7
|
+
assert_equal(Point.new(42.5, 51.3), s.sanitized_object)
|
8
|
+
assert_schema_invalidate(s, { x: 42.5 })
|
9
|
+
assert_equal(nil, s.sanitized_object)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_allow_nil
|
13
|
+
s = Respect::PointSchema.new(allow_nil: true)
|
14
|
+
assert s.allow_nil?
|
15
|
+
assert_schema_validate s, nil
|
16
|
+
assert_equal(nil, s.sanitized_object)
|
17
|
+
assert_schema_validate(s, { x: 42.5, y: 51.3 })
|
18
|
+
assert_equal(Point.new(42.5, 51.3), s.sanitized_object)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_disallow_nil
|
22
|
+
s = Respect::PointSchema.new
|
23
|
+
assert !s.allow_nil?
|
24
|
+
exception = assert_exception(Respect::ValidationError) { s.validate(nil) }
|
25
|
+
assert_match exception.message, /\bPointSchema\b/
|
26
|
+
assert_equal(nil, s.sanitized_object)
|
27
|
+
assert_schema_validate(s, { x: 42.5, y: 51.3 })
|
28
|
+
assert_equal(Point.new(42.5, 51.3), s.sanitized_object)
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class DatetimeSchemaTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_datetime_schema_creates_datetime_object
|
6
|
+
s = Respect::DatetimeSchema.new
|
7
|
+
assert_nil s.sanitized_object
|
8
|
+
assert_schema_validate s, "2013-12-01T00:00:00+00:00"
|
9
|
+
assert s.sanitized_object.is_a?(DateTime)
|
10
|
+
assert_equal DateTime.rfc3339("2013-12-01T00:00:00+00:00"), s.sanitized_object
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_datetime_schema_relies_on_format_validator
|
14
|
+
doc = "2013-12-01T00:00:00+00:00"
|
15
|
+
Respect::FormatValidator.any_instance.stubs(:validate_datetime).with(doc).at_least_once
|
16
|
+
Respect::DatetimeSchema.new.validate(doc)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_datetime_schema_validate_iso8601
|
20
|
+
t = Time.now.to_datetime
|
21
|
+
s = Respect::DatetimeSchema.new
|
22
|
+
assert_schema_validate(s, t.iso8601)
|
23
|
+
assert_equal t.to_time.to_i, s.sanitized_object.to_time.to_i
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_failed_validation_reset_sanitized_object
|
27
|
+
s = Respect::DatetimeSchema.new
|
28
|
+
assert_schema_validate(s, "2013-12-01T00:00:00+00:00")
|
29
|
+
assert_not_nil(s.sanitized_object)
|
30
|
+
assert_schema_invalidate(s, "wrong")
|
31
|
+
assert_nil(s.sanitized_object)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_allow_nil
|
35
|
+
s = Respect::DatetimeSchema.new(allow_nil: true)
|
36
|
+
assert s.allow_nil?
|
37
|
+
assert_schema_validate s, nil
|
38
|
+
assert_equal(nil, s.sanitized_object)
|
39
|
+
assert_schema_validate s, "2013-12-01T00:00:00+00:00"
|
40
|
+
assert_not_nil(s.sanitized_object)
|
41
|
+
assert_schema_invalidate(s, "wrong")
|
42
|
+
assert_nil(s.sanitized_object)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_disallow_nil
|
46
|
+
s = Respect::DatetimeSchema.new
|
47
|
+
assert !s.allow_nil?
|
48
|
+
exception = assert_exception(Respect::ValidationError) { s.validate(nil) }
|
49
|
+
assert_match exception.message, /\bDatetimeSchema\b/
|
50
|
+
assert_equal(nil, s.sanitized_object)
|
51
|
+
assert_schema_validate s, "2013-12-01T00:00:00+00:00"
|
52
|
+
assert_not_nil(s.sanitized_object)
|
53
|
+
assert_schema_invalidate(s, "wrong")
|
54
|
+
assert_nil(s.sanitized_object)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_validate_datetime_object
|
58
|
+
s = Respect::DatetimeSchema.new
|
59
|
+
t = Time.now.to_datetime
|
60
|
+
assert_equal(DateTime, t.class)
|
61
|
+
assert_schema_validate s, t
|
62
|
+
assert_equal DateTime, s.sanitized_object.class
|
63
|
+
assert_equal t, s.sanitized_object
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_validate_time_object
|
67
|
+
s = Respect::DatetimeSchema.new
|
68
|
+
t = Time.now
|
69
|
+
assert_equal(Time, t.class)
|
70
|
+
assert_schema_validate s, t
|
71
|
+
assert_equal DateTime, s.sanitized_object.class
|
72
|
+
assert_equal t.to_datetime, s.sanitized_object
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_validate_date_object
|
76
|
+
s = Respect::DatetimeSchema.new
|
77
|
+
t = Time.now.to_date
|
78
|
+
assert_equal(Date, t.class)
|
79
|
+
assert_schema_validate s, t
|
80
|
+
assert_equal Date, s.sanitized_object.class
|
81
|
+
assert_equal t.to_date, s.sanitized_object
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class DocHelperTest < Test::Unit::TestCase
|
4
|
+
def test_schema_title_use_doc_parser
|
5
|
+
object = mock()
|
6
|
+
object.extend(Respect::DocHelper)
|
7
|
+
doc = "Hey!"
|
8
|
+
doc.expects(:to_s).returns(doc).once
|
9
|
+
object.stubs(:documentation).returns(doc)
|
10
|
+
Respect::DocParser.any_instance.stubs(:parse).with(doc).returns(Respect::DocParser.new).at_least_once
|
11
|
+
Respect::DocParser.any_instance.stubs(:title).returns("title").at_least_once
|
12
|
+
assert_equal "title", object.title
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_schema_description_use_doc_parser
|
16
|
+
object = mock()
|
17
|
+
object.extend(Respect::DocHelper)
|
18
|
+
doc = "Hey!"
|
19
|
+
doc.expects(:to_s).returns(doc).once
|
20
|
+
object.stubs(:documentation).returns(doc)
|
21
|
+
Respect::DocParser.any_instance.stubs(:parse).with(doc).returns(Respect::DocParser.new).at_least_once
|
22
|
+
Respect::DocParser.any_instance.stubs(:description).returns("desc").at_least_once
|
23
|
+
assert_equal "desc", object.description
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_nil_title_and_description_if_nil_doc
|
27
|
+
object = mock()
|
28
|
+
object.extend(Respect::DocHelper)
|
29
|
+
object.stubs(:documentation).returns(nil)
|
30
|
+
assert_nil object.documentation
|
31
|
+
assert_nil object.title
|
32
|
+
assert_nil object.description
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class DocParserTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@parser = Respect::DocParser.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_full_doc
|
9
|
+
doc = <<-EOS.strip_heredoc
|
10
|
+
A title.
|
11
|
+
|
12
|
+
A description.
|
13
|
+
A long description.
|
14
|
+
EOS
|
15
|
+
@parser.parse(doc)
|
16
|
+
assert_equal "A title.", @parser.title
|
17
|
+
assert_equal "A description.\nA long description.\n", @parser.description
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_no_title
|
21
|
+
doc = <<-EOS.strip_heredoc
|
22
|
+
A description.
|
23
|
+
A long description.
|
24
|
+
EOS
|
25
|
+
@parser.parse(doc)
|
26
|
+
assert_equal nil, @parser.title
|
27
|
+
assert_equal "A description.\nA long description.\n", @parser.description
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_no_desc
|
31
|
+
doc = <<-EOS.strip_heredoc
|
32
|
+
A title.
|
33
|
+
EOS
|
34
|
+
@parser.parse(doc)
|
35
|
+
assert_equal "A title.", @parser.title
|
36
|
+
assert_equal nil, @parser.description
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_no_desc_and_no_newline
|
40
|
+
doc = <<-EOS.strip_heredoc
|
41
|
+
A title.
|
42
|
+
|
43
|
+
A sparse...
|
44
|
+
|
45
|
+
... description.
|
46
|
+
EOS
|
47
|
+
@parser.parse(doc)
|
48
|
+
assert_equal "A title.", @parser.title
|
49
|
+
desc = <<-EOS.strip_heredoc
|
50
|
+
A sparse...
|
51
|
+
|
52
|
+
... description.
|
53
|
+
EOS
|
54
|
+
assert_equal desc, @parser.description
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_no_title_but_long_desc
|
58
|
+
doc = <<-EOS.strip_heredoc
|
59
|
+
A first paragraph...
|
60
|
+
...on several lines.
|
61
|
+
|
62
|
+
A second one...
|
63
|
+
... on several lines.
|
64
|
+
|
65
|
+
|
66
|
+
And a far away third one...
|
67
|
+
... on several lines.
|
68
|
+
EOS
|
69
|
+
@parser.parse(doc)
|
70
|
+
assert_equal nil, @parser.title
|
71
|
+
assert_equal doc, @parser.description
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_title_and_empty_desc
|
75
|
+
doc = <<-EOS.strip_heredoc
|
76
|
+
A title with many empty line for desc
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
EOS
|
82
|
+
@parser.parse(doc)
|
83
|
+
assert_equal "A title with many empty line for desc", @parser.title
|
84
|
+
assert_equal nil, @parser.description
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_title_separated_by_desc_with_many_lines
|
88
|
+
doc = <<-EOS.strip_heredoc
|
89
|
+
A title with many empty line for desc
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
The description finally...
|
95
|
+
come.
|
96
|
+
EOS
|
97
|
+
@parser.parse(doc)
|
98
|
+
assert_equal "A title with many empty line for desc", @parser.title
|
99
|
+
assert_equal "The description finally...\ncome.\n", @parser.description
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_title_with_no_newline
|
103
|
+
doc = "a title"
|
104
|
+
@parser.parse(doc)
|
105
|
+
assert_equal "a title", @parser.title
|
106
|
+
assert_equal nil, @parser.description
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
@@ -0,0 +1,395 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class DslDumperTest < Test::Unit::TestCase
|
4
|
+
def test_dump_nested_hashs
|
5
|
+
assert_bijective_dump do
|
6
|
+
<<-EOF.strip_heredoc
|
7
|
+
Respect::Schema.define do |s|
|
8
|
+
s.hash do |s|
|
9
|
+
s.hash "o" do |s|
|
10
|
+
s.integer "i"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
EOF
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_dump_hash_with_multiple_integer
|
19
|
+
assert_bijective_dump do
|
20
|
+
<<-EOF.strip_heredoc
|
21
|
+
Respect::Schema.define do |s|
|
22
|
+
s.hash do |s|
|
23
|
+
s.integer "i1"
|
24
|
+
s.integer "i2"
|
25
|
+
s.integer "i3"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
EOF
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_dump_nested_hash_with_multiple_integer
|
33
|
+
assert_bijective_dump do
|
34
|
+
<<-EOF.strip_heredoc
|
35
|
+
Respect::Schema.define do |s|
|
36
|
+
s.hash do |s|
|
37
|
+
s.hash "o1" do |s|
|
38
|
+
s.integer "i1"
|
39
|
+
s.integer "i2"
|
40
|
+
s.integer "i3"
|
41
|
+
end
|
42
|
+
s.hash "o2" do |s|
|
43
|
+
s.integer "i1"
|
44
|
+
s.integer "i2"
|
45
|
+
s.integer "i3"
|
46
|
+
end
|
47
|
+
s.hash "o3" do |s|
|
48
|
+
s.integer "i1"
|
49
|
+
s.integer "i2"
|
50
|
+
s.integer "i3"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
EOF
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_property_name_are_escaped
|
59
|
+
assert_bijective_dump do
|
60
|
+
<<-EOF.strip_heredoc
|
61
|
+
Respect::Schema.define do |s|
|
62
|
+
s.hash do |s|
|
63
|
+
s.string "s\\""
|
64
|
+
end
|
65
|
+
end
|
66
|
+
EOF
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_dump_terminal_statement
|
71
|
+
PRIMITIVE_STATEMENTS_LIST.each do |statement|
|
72
|
+
assert_bijective_dump("dump statement #{statement}") do
|
73
|
+
<<-EOF.strip_heredoc
|
74
|
+
Respect::Schema.define do |s|
|
75
|
+
s.hash do |s|
|
76
|
+
s.#{statement} "property_name"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
EOF
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_dump_array_item
|
85
|
+
PRIMITIVE_STATEMENTS_LIST.each do |statement|
|
86
|
+
assert_bijective_dump("dump statement #{statement}") do
|
87
|
+
<<-EOF.strip_heredoc
|
88
|
+
Respect::Schema.define do |s|
|
89
|
+
s.array do |s|
|
90
|
+
s.#{statement}
|
91
|
+
end
|
92
|
+
end
|
93
|
+
EOF
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_dump_array_items
|
99
|
+
PRIMITIVE_STATEMENTS_LIST.each do |statement|
|
100
|
+
assert_bijective_dump("dump statement #{statement}") do
|
101
|
+
<<-EOF.strip_heredoc
|
102
|
+
Respect::Schema.define do |s|
|
103
|
+
s.array do |s|
|
104
|
+
s.items do |s|
|
105
|
+
s.#{statement}
|
106
|
+
s.#{statement}
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
EOF
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_dump_array_extra_items
|
116
|
+
PRIMITIVE_STATEMENTS_LIST.each do |statement|
|
117
|
+
assert_bijective_dump("dump statement #{statement}") do
|
118
|
+
<<-EOF.strip_heredoc
|
119
|
+
Respect::Schema.define do |s|
|
120
|
+
s.array do |s|
|
121
|
+
s.extra_items do |s|
|
122
|
+
s.#{statement}
|
123
|
+
s.#{statement}
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
EOF
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_dump_array_items_and_extra_items
|
133
|
+
PRIMITIVE_STATEMENTS_LIST.each do |statement|
|
134
|
+
assert_bijective_dump("dump statement #{statement}") do
|
135
|
+
<<-EOF.strip_heredoc
|
136
|
+
Respect::Schema.define do |s|
|
137
|
+
s.array do |s|
|
138
|
+
s.items do |s|
|
139
|
+
s.#{statement}
|
140
|
+
s.#{statement}
|
141
|
+
s.#{statement}
|
142
|
+
end
|
143
|
+
s.extra_items do |s|
|
144
|
+
s.#{statement}
|
145
|
+
s.#{statement}
|
146
|
+
s.#{statement}
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
EOF
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_dump_nested_array_with_item
|
156
|
+
assert_bijective_dump do
|
157
|
+
<<-EOF.strip_heredoc
|
158
|
+
Respect::Schema.define do |s|
|
159
|
+
s.array do |s|
|
160
|
+
s.array do |s|
|
161
|
+
s.array do |s|
|
162
|
+
s.array do |s|
|
163
|
+
s.array do |s|
|
164
|
+
s.integer
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
EOF
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def test_dump_nested_array_with_items
|
176
|
+
assert_bijective_dump do
|
177
|
+
<<-EOF.strip_heredoc
|
178
|
+
Respect::Schema.define do |s|
|
179
|
+
s.array do |s|
|
180
|
+
s.items do |s|
|
181
|
+
s.integer
|
182
|
+
s.array do |s|
|
183
|
+
s.items do |s|
|
184
|
+
s.integer
|
185
|
+
s.array do |s|
|
186
|
+
s.integer
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
EOF
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_dump_nested_array_with_extra_items
|
198
|
+
assert_bijective_dump do
|
199
|
+
<<-EOF.strip_heredoc
|
200
|
+
Respect::Schema.define do |s|
|
201
|
+
s.array do |s|
|
202
|
+
s.extra_items do |s|
|
203
|
+
s.integer
|
204
|
+
s.array do |s|
|
205
|
+
s.extra_items do |s|
|
206
|
+
s.integer
|
207
|
+
s.array do |s|
|
208
|
+
s.integer
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
EOF
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def test_dump_nested_array_and_hash
|
220
|
+
assert_bijective_dump do
|
221
|
+
<<-EOF.strip_heredoc
|
222
|
+
Respect::Schema.define do |s|
|
223
|
+
s.array do |s|
|
224
|
+
s.hash do |s|
|
225
|
+
s.integer "i"
|
226
|
+
s.array "a" do |s|
|
227
|
+
s.hash do |s|
|
228
|
+
s.integer "i"
|
229
|
+
s.array "a" do |s|
|
230
|
+
s.integer
|
231
|
+
end
|
232
|
+
s.string "s"
|
233
|
+
end
|
234
|
+
end
|
235
|
+
s.string "s"
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
EOF
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_dump_terminal_schema
|
244
|
+
PRIMITIVE_STATEMENTS_LIST.each do |statement|
|
245
|
+
assert_bijective_dump("dump statement #{statement}") do
|
246
|
+
<<-EOF.strip_heredoc
|
247
|
+
Respect::Schema.define do |s|
|
248
|
+
s.#{statement}
|
249
|
+
end
|
250
|
+
EOF
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
def test_dump_format_helper_statement
|
256
|
+
FORMAT_HELPER_STATEMENTS_LIST.each do |statement|
|
257
|
+
schema = Respect::Schema.define do |s|
|
258
|
+
s.__send__(statement)
|
259
|
+
end
|
260
|
+
expected_result = <<-EOF.strip_heredoc
|
261
|
+
Respect::Schema.define do |s|
|
262
|
+
s.string :format => #{statement.inspect}
|
263
|
+
end
|
264
|
+
EOF
|
265
|
+
assert_equal(expected_result,
|
266
|
+
Respect::DslDumper.new(schema).dump,
|
267
|
+
"dump for statement #{statement}")
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
def test_dump_statement_with_no_names_and_several_options
|
272
|
+
assert_bijective_dump do
|
273
|
+
<<-EOF.strip_heredoc
|
274
|
+
Respect::Schema.define do |s|
|
275
|
+
s.integer :greater_than => 42, :equal_to => 51
|
276
|
+
end
|
277
|
+
EOF
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
def test_dump_statement_with_name_and_several_options
|
282
|
+
assert_bijective_dump do
|
283
|
+
<<-EOF.strip_heredoc
|
284
|
+
Respect::Schema.define do |s|
|
285
|
+
s.hash do |s|
|
286
|
+
s.integer "an_int", :greater_than => 42, :equal_to => 51
|
287
|
+
end
|
288
|
+
end
|
289
|
+
EOF
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
def test_dump_statement_with_name_and_no_options
|
294
|
+
assert_bijective_dump do
|
295
|
+
<<-EOF.strip_heredoc
|
296
|
+
Respect::Schema.define do |s|
|
297
|
+
s.hash do |s|
|
298
|
+
s.integer "an_int"
|
299
|
+
end
|
300
|
+
end
|
301
|
+
EOF
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
def test_dump_primitive_statement_documentation
|
306
|
+
PRIMITIVE_STATEMENTS_LIST.each do |statement|
|
307
|
+
assert_bijective_dump("dump statement #{statement}") do
|
308
|
+
<<-EOF.strip_heredoc
|
309
|
+
Respect::Schema.define do |s|
|
310
|
+
s.doc <<-EOS.strip_heredoc
|
311
|
+
a title
|
312
|
+
|
313
|
+
a description
|
314
|
+
EOS
|
315
|
+
s.#{statement}
|
316
|
+
end
|
317
|
+
EOF
|
318
|
+
end
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
def test_dump_primitive_statement_with_no_description
|
323
|
+
PRIMITIVE_STATEMENTS_LIST.each do |statement|
|
324
|
+
assert_bijective_dump("dump statement #{statement}") do
|
325
|
+
<<-EOF.strip_heredoc
|
326
|
+
Respect::Schema.define do |s|
|
327
|
+
s.doc "a title"
|
328
|
+
s.#{statement}
|
329
|
+
end
|
330
|
+
EOF
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
def test_dump_primitive_statement_with_no_title
|
336
|
+
PRIMITIVE_STATEMENTS_LIST.each do |statement|
|
337
|
+
assert_bijective_dump("dump statement #{statement}") do
|
338
|
+
<<-EOF.strip_heredoc
|
339
|
+
Respect::Schema.define do |s|
|
340
|
+
s.doc <<-EOS.strip_heredoc
|
341
|
+
a long...
|
342
|
+
... description
|
343
|
+
EOS
|
344
|
+
s.#{statement}
|
345
|
+
end
|
346
|
+
EOF
|
347
|
+
end
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
def test_dump_hash_documentation
|
352
|
+
assert_bijective_dump do
|
353
|
+
<<-EOF.strip_heredoc
|
354
|
+
Respect::Schema.define do |s|
|
355
|
+
s.doc <<-EOS.strip_heredoc
|
356
|
+
a title
|
357
|
+
|
358
|
+
a description
|
359
|
+
EOS
|
360
|
+
s.hash do |s|
|
361
|
+
s.integer "i"
|
362
|
+
s.string "s"
|
363
|
+
end
|
364
|
+
end
|
365
|
+
EOF
|
366
|
+
end
|
367
|
+
end
|
368
|
+
|
369
|
+
def test_dump_array_documentation
|
370
|
+
assert_bijective_dump do
|
371
|
+
<<-EOF.strip_heredoc
|
372
|
+
Respect::Schema.define do |s|
|
373
|
+
s.doc <<-EOS.strip_heredoc
|
374
|
+
a title
|
375
|
+
|
376
|
+
a description
|
377
|
+
EOS
|
378
|
+
s.array do |s|
|
379
|
+
s.integer
|
380
|
+
end
|
381
|
+
end
|
382
|
+
EOF
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
private
|
387
|
+
|
388
|
+
def assert_bijective_dump(message = nil, &block)
|
389
|
+
source = block.call
|
390
|
+
schema = eval(source, block.binding,
|
391
|
+
block.source_location.first, block.source_location[1] + 2)
|
392
|
+
assert schema.is_a?(Respect::Schema), "#{schema.class} should Respect::Schema"
|
393
|
+
assert_equal(source, Respect::DslDumper.new(schema).dump, message)
|
394
|
+
end
|
395
|
+
end
|