bindata 1.5.1 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bindata might be problematic. Click here for more details.
- data/ChangeLog.rdoc +7 -0
- data/NEWS.rdoc +11 -0
- data/Rakefile +6 -1
- data/bindata.gemspec +2 -1
- data/doc/manual.md +17 -9
- data/examples/gzip.rb +2 -2
- data/examples/list.rb +2 -2
- data/lib/bindata/alignment.rb +4 -9
- data/lib/bindata/array.rb +57 -51
- data/lib/bindata/base.rb +13 -110
- data/lib/bindata/base_primitive.rb +130 -75
- data/lib/bindata/bits.rb +5 -7
- data/lib/bindata/choice.rb +24 -32
- data/lib/bindata/dsl.rb +1 -6
- data/lib/bindata/framework.rb +81 -0
- data/lib/bindata/int.rb +5 -7
- data/lib/bindata/name.rb +28 -0
- data/lib/bindata/offset.rb +42 -53
- data/lib/bindata/params.rb +33 -38
- data/lib/bindata/struct.rb +2 -6
- data/lib/bindata/trace.rb +16 -16
- data/lib/bindata/version.rb +1 -1
- data/lib/bindata/virtual.rb +3 -3
- data/{spec/alignment_spec.rb → test/alignment_test.rb} +17 -16
- data/test/array_test.rb +371 -0
- data/test/base_primitive_test.rb +312 -0
- data/test/base_test.rb +183 -0
- data/{spec/bits_spec.rb → test/bits_test.rb} +59 -59
- data/test/choice_test.rb +260 -0
- data/{spec/spec_common.rb → test/common.rb} +33 -18
- data/test/count_bytes_remaining_test.rb +41 -0
- data/{spec/deprecated_spec.rb → test/deprecated_test.rb} +5 -7
- data/test/float_test.rb +72 -0
- data/{spec/int_spec.rb → test/int_test.rb} +34 -43
- data/{spec/io_spec.rb → test/io_test.rb} +70 -71
- data/{spec/lazy_spec.rb → test/lazy_test.rb} +38 -39
- data/test/offset_test.rb +93 -0
- data/test/params_test.rb +144 -0
- data/{spec/primitive_spec.rb → test/primitive_test.rb} +42 -54
- data/{spec/record_spec.rb → test/record_test.rb} +133 -154
- data/test/registry_test.rb +104 -0
- data/test/rest_test.rb +29 -0
- data/test/skip_test.rb +28 -0
- data/{spec/string_spec.rb → test/string_test.rb} +96 -97
- data/test/stringz_test.rb +127 -0
- data/{spec/struct_spec.rb → test/struct_test.rb} +119 -120
- data/{spec/system_spec.rb → test/system_test.rb} +66 -106
- metadata +39 -38
- data/lib/a.rb +0 -24
- data/spec/array_spec.rb +0 -331
- data/spec/base_primitive_spec.rb +0 -238
- data/spec/base_spec.rb +0 -376
- data/spec/choice_spec.rb +0 -263
- data/spec/count_bytes_remaining_spec.rb +0 -38
- data/spec/example.rb +0 -21
- data/spec/float_spec.rb +0 -37
- data/spec/registry_spec.rb +0 -108
- data/spec/rest_spec.rb +0 -26
- data/spec/skip_spec.rb +0 -27
- data/spec/stringz_spec.rb +0 -118
- data/tasks/rspec.rake +0 -17
@@ -1,7 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "
|
4
|
-
require 'bindata/lazy'
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "common"))
|
5
4
|
|
6
5
|
# A mock data object with customizable fields.
|
7
6
|
class MockBinDataObject
|
@@ -42,33 +41,33 @@ describe BinData::LazyEvaluator, "with no parents" do
|
|
42
41
|
}
|
43
42
|
|
44
43
|
it "evaluates raw value when instantiated" do
|
45
|
-
lazy_eval(5).
|
44
|
+
lazy_eval(5).must_equal 5
|
46
45
|
end
|
47
46
|
|
48
47
|
it "evaluates raw value" do
|
49
|
-
lazy_eval(5).
|
48
|
+
lazy_eval(5).must_equal 5
|
50
49
|
end
|
51
50
|
|
52
51
|
it "evaluates value" do
|
53
|
-
lazy_eval(lambda { 5 }).
|
52
|
+
lazy_eval(lambda { 5 }).must_equal 5
|
54
53
|
end
|
55
54
|
|
56
55
|
it "evaluates overrides" do
|
57
|
-
lazy_eval(lambda { o1 }, :o1 => 'o1').
|
56
|
+
lazy_eval(lambda { o1 }, :o1 => 'o1').must_equal 'o1'
|
58
57
|
end
|
59
58
|
|
60
59
|
it "does not resolve any unknown methods" do
|
61
|
-
|
62
|
-
|
63
|
-
|
60
|
+
lambda { lazy_eval(lambda { unknown }) }.must_raise NameError
|
61
|
+
lambda { lazy_eval(lambda { m1 }) }.must_raise NameError
|
62
|
+
lambda { lazy_eval(lambda { p1 }) }.must_raise NameError
|
64
63
|
end
|
65
64
|
|
66
65
|
it "does not have a parent" do
|
67
|
-
lazy_eval(lambda { parent }).
|
66
|
+
lazy_eval(lambda { parent }).must_be_nil
|
68
67
|
end
|
69
68
|
|
70
69
|
it "does not resolve #index" do
|
71
|
-
|
70
|
+
lambda { lazy_eval(lambda { index }) }.must_raise NoMethodError
|
72
71
|
end
|
73
72
|
end
|
74
73
|
|
@@ -88,47 +87,47 @@ describe BinData::LazyEvaluator, "with one parent" do
|
|
88
87
|
}
|
89
88
|
|
90
89
|
it "evaluates raw value" do
|
91
|
-
lazy_eval(5).
|
90
|
+
lazy_eval(5).must_equal 5
|
92
91
|
end
|
93
92
|
|
94
93
|
it "evaluates value" do
|
95
|
-
lazy_eval(lambda { 5 }).
|
94
|
+
lazy_eval(lambda { 5 }).must_equal 5
|
96
95
|
end
|
97
96
|
|
98
97
|
it "evaluates overrides before params" do
|
99
|
-
lazy_eval(lambda { p1 }, :p1 => 'o1').
|
98
|
+
lazy_eval(lambda { p1 }, :p1 => 'o1').must_equal 'o1'
|
100
99
|
end
|
101
100
|
|
102
101
|
it "evaluates overrides before methods" do
|
103
|
-
lazy_eval(lambda { m1 }, :m1 => 'o1').
|
102
|
+
lazy_eval(lambda { m1 }, :m1 => 'o1').must_equal 'o1'
|
104
103
|
end
|
105
104
|
|
106
105
|
it "does not resolve any unknown methods" do
|
107
|
-
|
106
|
+
lambda { lazy_eval(lambda { unknown }) }.must_raise NoMethodError
|
108
107
|
end
|
109
108
|
|
110
109
|
it "resolves parameters in the parent" do
|
111
|
-
lazy_eval(lambda { p1 }).
|
110
|
+
lazy_eval(lambda { p1 }).must_equal 'Pp1'
|
112
111
|
end
|
113
112
|
|
114
113
|
it "resolves methods in the parent" do
|
115
|
-
lazy_eval(lambda { m1 }).
|
114
|
+
lazy_eval(lambda { m1 }).must_equal 'Pm1'
|
116
115
|
end
|
117
116
|
|
118
117
|
it "invokes methods in the parent" do
|
119
|
-
lazy_eval(lambda { echo(p1, m1) }).
|
118
|
+
lazy_eval(lambda { echo(p1, m1) }).must_equal ['Pp1', 'Pm1']
|
120
119
|
end
|
121
120
|
|
122
121
|
it "resolves parameters in preference to methods in the parent" do
|
123
|
-
lazy_eval(lambda { com }).
|
122
|
+
lazy_eval(lambda { com }).must_equal 'PpC'
|
124
123
|
end
|
125
124
|
|
126
125
|
it "has a parent" do
|
127
|
-
lazy_eval(lambda { parent }).
|
126
|
+
lazy_eval(lambda { parent }).wont_be_nil
|
128
127
|
end
|
129
128
|
|
130
129
|
it "does not resolve #index" do
|
131
|
-
|
130
|
+
lambda { lazy_eval(lambda { index }) }.must_raise NoMethodError
|
132
131
|
end
|
133
132
|
end
|
134
133
|
|
@@ -160,58 +159,58 @@ describe BinData::LazyEvaluator, "with nested parents" do
|
|
160
159
|
}
|
161
160
|
|
162
161
|
it "accepts symbols as a shortcut to lambdas" do
|
163
|
-
lazy_eval(:p1).
|
164
|
-
lazy_eval(:p2).
|
165
|
-
lazy_eval(:m1).
|
166
|
-
lazy_eval(:m2).
|
162
|
+
lazy_eval(:p1).must_equal 'Pp1'
|
163
|
+
lazy_eval(:p2).must_equal 'PPp2'
|
164
|
+
lazy_eval(:m1).must_equal 'Pm1'
|
165
|
+
lazy_eval(:m2).must_equal 'PPm2'
|
167
166
|
end
|
168
167
|
|
169
168
|
it "does not resolve any unknown methods" do
|
170
|
-
|
169
|
+
lambda { lazy_eval(lambda { unknown }) }.must_raise NoMethodError
|
171
170
|
end
|
172
171
|
|
173
172
|
it "resolves parameters in the parent" do
|
174
|
-
lazy_eval(lambda { p1 }).
|
173
|
+
lazy_eval(lambda { p1 }).must_equal 'Pp1'
|
175
174
|
end
|
176
175
|
|
177
176
|
it "resolves methods in the parent" do
|
178
|
-
lazy_eval(lambda { m1 }).
|
177
|
+
lazy_eval(lambda { m1 }).must_equal 'Pm1'
|
179
178
|
end
|
180
179
|
|
181
180
|
it "resolves parameters in the parent's parent" do
|
182
|
-
lazy_eval(lambda { p2 }).
|
181
|
+
lazy_eval(lambda { p2 }).must_equal 'PPp2'
|
183
182
|
end
|
184
183
|
|
185
184
|
it "resolves methods in the parent's parent" do
|
186
|
-
lazy_eval(lambda { m2 }).
|
185
|
+
lazy_eval(lambda { m2 }).must_equal 'PPm2'
|
187
186
|
end
|
188
187
|
|
189
188
|
it "invokes methods in the parent" do
|
190
|
-
lazy_eval(lambda { echo(m1) }).
|
189
|
+
lazy_eval(lambda { echo(m1) }).must_equal ['P', 'Pm1']
|
191
190
|
end
|
192
191
|
|
193
192
|
it "invokes methods in the parent's parent" do
|
194
|
-
lazy_eval(lambda { parent.echo(m1) }, { :m1 => 'o1'}).
|
193
|
+
lazy_eval(lambda { parent.echo(m1) }, { :m1 => 'o1'}).must_equal ['PP', 'o1']
|
195
194
|
end
|
196
195
|
|
197
196
|
it "invokes methods in the parent's parent" do
|
198
|
-
lazy_eval(lambda { echo2(m1) }).
|
197
|
+
lazy_eval(lambda { echo2(m1) }).must_equal ['PP2', 'Pm1']
|
199
198
|
end
|
200
199
|
|
201
200
|
it "resolves parameters in preference to methods in the parent" do
|
202
|
-
lazy_eval(lambda { com }).
|
201
|
+
lazy_eval(lambda { com }).must_equal 'PpC'
|
203
202
|
end
|
204
203
|
|
205
204
|
it "resolves methods in the parent explicitly" do
|
206
|
-
lazy_eval(lambda { parent.m1 }).
|
205
|
+
lazy_eval(lambda { parent.m1 }).must_equal 'PPm1'
|
207
206
|
end
|
208
207
|
|
209
208
|
it "cascades lambdas " do
|
210
|
-
lazy_eval(lambda { sym1 }).
|
211
|
-
lazy_eval(lambda { sym2 }).
|
209
|
+
lazy_eval(lambda { sym1 }).must_equal 'PPm2'
|
210
|
+
lazy_eval(lambda { sym2 }).must_equal 'PPm2'
|
212
211
|
end
|
213
212
|
|
214
213
|
it "does not resolve #index" do
|
215
|
-
|
214
|
+
lambda { lazy_eval(lambda { index }) }.must_raise NoMethodError
|
216
215
|
end
|
217
216
|
end
|
data/test/offset_test.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "common"))
|
4
|
+
|
5
|
+
describe BinData::Base, "offsets" do
|
6
|
+
class ThreeByteReader < BinData::Base
|
7
|
+
def do_read(io)
|
8
|
+
@val = io.readbytes(3)
|
9
|
+
end
|
10
|
+
|
11
|
+
def snapshot
|
12
|
+
@val
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class TenByteOffsetBase < BinData::Base
|
17
|
+
def self.create(params)
|
18
|
+
obj = self.new
|
19
|
+
obj.initialize_child(params)
|
20
|
+
obj
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize_child(params)
|
24
|
+
@child = ThreeByteReader.new(params, self)
|
25
|
+
end
|
26
|
+
|
27
|
+
def snapshot
|
28
|
+
@child.snapshot
|
29
|
+
end
|
30
|
+
|
31
|
+
def do_read(io)
|
32
|
+
io.seekbytes(10)
|
33
|
+
@child.do_read(io)
|
34
|
+
end
|
35
|
+
|
36
|
+
def clear
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
let(:data) { "0123456789abcdefghijk" }
|
41
|
+
let(:io) { StringIO.new(data) }
|
42
|
+
|
43
|
+
describe "with :check_offset" do
|
44
|
+
it "fails when offset is incorrect" do
|
45
|
+
io.seek(2)
|
46
|
+
obj = TenByteOffsetBase.create(:check_offset => 10 - 4)
|
47
|
+
lambda { obj.read(io) }.must_raise BinData::ValidityError
|
48
|
+
end
|
49
|
+
|
50
|
+
it "succeeds when offset is correct" do
|
51
|
+
io.seek(3)
|
52
|
+
obj = TenByteOffsetBase.create(:check_offset => 10)
|
53
|
+
obj.read(io).snapshot.must_equal data[3 + 10, 3]
|
54
|
+
end
|
55
|
+
|
56
|
+
it "fails when :check_offset fails" do
|
57
|
+
io.seek(4)
|
58
|
+
obj = TenByteOffsetBase.create(:check_offset => lambda { offset == 10 + 1 } )
|
59
|
+
lambda { obj.read(io) }.must_raise BinData::ValidityError
|
60
|
+
end
|
61
|
+
|
62
|
+
it "succeeds when :check_offset succeeds" do
|
63
|
+
io.seek(5)
|
64
|
+
obj = TenByteOffsetBase.create(:check_offset => lambda { offset == 10 } )
|
65
|
+
obj.read(io).snapshot.must_equal data[5 + 10, 3]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "with :adjust_offset" do
|
70
|
+
it "is mutually exclusive with :check_offset" do
|
71
|
+
params = { :check_offset => 8, :adjust_offset => 8 }
|
72
|
+
lambda { TenByteOffsetBase.create(params) }.must_raise ArgumentError
|
73
|
+
end
|
74
|
+
|
75
|
+
it "adjust offset when incorrect" do
|
76
|
+
io.seek(2)
|
77
|
+
obj = TenByteOffsetBase.create(:adjust_offset => 13)
|
78
|
+
obj.read(io).snapshot.must_equal data[2 + 13, 3]
|
79
|
+
end
|
80
|
+
|
81
|
+
it "succeeds when offset is correct" do
|
82
|
+
io.seek(3)
|
83
|
+
obj = TenByteOffsetBase.create(:adjust_offset => 10)
|
84
|
+
obj.read(io).snapshot.must_equal data[3 + 10, 3]
|
85
|
+
end
|
86
|
+
|
87
|
+
it "fails if cannot adjust offset" do
|
88
|
+
io.seek(4)
|
89
|
+
obj = TenByteOffsetBase.create(:adjust_offset => -5)
|
90
|
+
lambda { obj.read(io) }.must_raise BinData::ValidityError
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/test/params_test.rb
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "common"))
|
4
|
+
|
5
|
+
|
6
|
+
describe BinData::Base, "parameters" do
|
7
|
+
it "fails when parameter name is invalid" do
|
8
|
+
lambda {
|
9
|
+
class InvalidParameterNameBase < BinData::Base
|
10
|
+
optional_parameter :eval # i.e. Kernel#eval
|
11
|
+
end
|
12
|
+
}.must_raise NameError
|
13
|
+
end
|
14
|
+
|
15
|
+
it "fails when parameter has nil value" do
|
16
|
+
lambda { BinData::Base.new(:a => nil) }.must_raise ArgumentError
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe BinData::Base, "#has_parameter?" do
|
21
|
+
it "true for existing parameters" do
|
22
|
+
obj = BinData::Base.new(:a => 3)
|
23
|
+
assert obj.has_parameter?(:a)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "false for non-existing parameters" do
|
27
|
+
obj = BinData::Base.new
|
28
|
+
refute obj.has_parameter?(:a)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe BinData::Base, "#get_parameter" do
|
33
|
+
it "retrieves parameter values" do
|
34
|
+
obj = BinData::Base.new(:a => 3)
|
35
|
+
obj.get_parameter(:a).must_equal 3
|
36
|
+
end
|
37
|
+
|
38
|
+
it "retrieves parameter values with string keys" do
|
39
|
+
obj = BinData::Base.new('a' => 3)
|
40
|
+
obj.get_parameter(:a).must_equal 3
|
41
|
+
end
|
42
|
+
|
43
|
+
it "returns nil for non existing parameters" do
|
44
|
+
obj = BinData::Base.new
|
45
|
+
obj.get_parameter(:a).must_be_nil
|
46
|
+
end
|
47
|
+
|
48
|
+
it "wont eval parameters" do
|
49
|
+
obj = BinData::Base.new(:a => lambda { 3 })
|
50
|
+
assert_kind_of Proc, obj.get_parameter(:a)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe BinData::Base, "#eval_parameter" do
|
55
|
+
it "evals the parameter" do
|
56
|
+
obj = BinData::Base.new(:a => lambda { 3 })
|
57
|
+
obj.eval_parameter(:a).must_equal 3
|
58
|
+
end
|
59
|
+
|
60
|
+
it "returns nil for a non existing parameter" do
|
61
|
+
obj = BinData::Base.new
|
62
|
+
obj.eval_parameter(:a).must_be_nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe BinData::Base, ".mandatory_parameters" do
|
67
|
+
class MandatoryBase < BinData::Base
|
68
|
+
mandatory_parameter :p1
|
69
|
+
mandatory_parameter :p2
|
70
|
+
end
|
71
|
+
|
72
|
+
it "fails when not all mandatory parameters are present" do
|
73
|
+
params = {:p1 => "a", :xx => "b" }
|
74
|
+
lambda { MandatoryBase.new(params) }.must_raise ArgumentError
|
75
|
+
end
|
76
|
+
|
77
|
+
it "fails when no mandatory parameters are present" do
|
78
|
+
lambda { MandatoryBase.new() }.must_raise ArgumentError
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe BinData::Base, ".default_parameters" do
|
83
|
+
class DefaultBase < BinData::Base
|
84
|
+
default_parameter :p1 => "a"
|
85
|
+
end
|
86
|
+
|
87
|
+
it "uses default parameters when not specified" do
|
88
|
+
obj = DefaultBase.new
|
89
|
+
obj.eval_parameter(:p1).must_equal "a"
|
90
|
+
end
|
91
|
+
|
92
|
+
it "can override default parameters" do
|
93
|
+
obj = DefaultBase.new(:p1 => "b")
|
94
|
+
obj.eval_parameter(:p1).must_equal "b"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe BinData::Base, ".mutually_exclusive_parameters" do
|
99
|
+
class MutexParamBase < BinData::Base
|
100
|
+
optional_parameters :p1, :p2, :p3
|
101
|
+
mutually_exclusive_parameters :p1, :p2, :p3
|
102
|
+
end
|
103
|
+
|
104
|
+
it "fails when any two of those parameters are present" do
|
105
|
+
lambda { MutexParamBase.new(:p1 => "a", :p2 => "b") }.must_raise ArgumentError
|
106
|
+
lambda { MutexParamBase.new(:p1 => "a", :p3 => "c") }.must_raise ArgumentError
|
107
|
+
lambda { MutexParamBase.new(:p2 => "b", :p3 => "c") }.must_raise ArgumentError
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe BinData::Base, "subclassing" do
|
112
|
+
class ParamLevel1Base < BinData::Base
|
113
|
+
optional_parameter :p1
|
114
|
+
end
|
115
|
+
|
116
|
+
class ParamLevel2Base < ParamLevel1Base
|
117
|
+
optional_parameter :p2
|
118
|
+
end
|
119
|
+
|
120
|
+
it "inherits parameters" do
|
121
|
+
accepted = ParamLevel2Base.accepted_parameters.all
|
122
|
+
accepted.must_include :p1
|
123
|
+
accepted.must_include :p2
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
describe BinData::Base, "subclassing when skipping a level" do
|
128
|
+
class ParamLevel1Base < BinData::Base
|
129
|
+
optional_parameter :p1
|
130
|
+
end
|
131
|
+
|
132
|
+
class ParamLevel2Base < ParamLevel1Base
|
133
|
+
end
|
134
|
+
|
135
|
+
class ParamLevel3Base < ParamLevel2Base
|
136
|
+
optional_parameter :p2
|
137
|
+
end
|
138
|
+
|
139
|
+
it "inherits parameters" do
|
140
|
+
accepted = ParamLevel3Base.accepted_parameters.all
|
141
|
+
accepted.must_include :p1
|
142
|
+
accepted.must_include :p2
|
143
|
+
end
|
144
|
+
end
|
@@ -1,13 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "
|
4
|
-
require 'bindata'
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "common"))
|
5
4
|
|
6
5
|
describe BinData::Primitive do
|
7
6
|
it "is not registered" do
|
8
|
-
|
7
|
+
lambda {
|
9
8
|
BinData::RegisteredClasses.lookup("Primitive")
|
10
|
-
}.
|
9
|
+
}.must_raise BinData::UnRegisteredTypeError
|
11
10
|
end
|
12
11
|
end
|
13
12
|
|
@@ -16,11 +15,11 @@ describe BinData::Primitive, "all subclasses" do
|
|
16
15
|
expose_methods_for_testing
|
17
16
|
end
|
18
17
|
|
19
|
-
|
18
|
+
let(:obj) { SubClassOfPrimitive.new }
|
20
19
|
|
21
20
|
it "raise errors on unimplemented methods" do
|
22
|
-
|
23
|
-
|
21
|
+
lambda { obj.set(nil) }.must_raise NotImplementedError
|
22
|
+
lambda { obj.get }.must_raise NotImplementedError
|
24
23
|
end
|
25
24
|
end
|
26
25
|
|
@@ -30,9 +29,7 @@ describe BinData::Primitive, "when defining with errors" do
|
|
30
29
|
class BadTypePrimitive < BinData::Primitive
|
31
30
|
non_registered_type :a
|
32
31
|
end
|
33
|
-
}.
|
34
|
-
err.message.should == "unknown type 'non_registered_type' in #{BadTypePrimitive}"
|
35
|
-
}
|
32
|
+
}.must_raise_on_line TypeError, 2, "unknown type 'non_registered_type' in BadTypePrimitive"
|
36
33
|
end
|
37
34
|
|
38
35
|
it "fails on duplicate names" do
|
@@ -42,9 +39,7 @@ describe BinData::Primitive, "when defining with errors" do
|
|
42
39
|
int8 :b
|
43
40
|
int8 :a
|
44
41
|
end
|
45
|
-
}.
|
46
|
-
err.message.should == "duplicate field 'a' in #{DuplicateNamePrimitive}"
|
47
|
-
}
|
42
|
+
}.must_raise_on_line SyntaxError, 4, "duplicate field 'a' in DuplicateNamePrimitive"
|
48
43
|
end
|
49
44
|
|
50
45
|
it "fails when field name shadows an existing method" do
|
@@ -52,9 +47,7 @@ describe BinData::Primitive, "when defining with errors" do
|
|
52
47
|
class ExistingNamePrimitive < BinData::Primitive
|
53
48
|
int8 :object_id
|
54
49
|
end
|
55
|
-
}.
|
56
|
-
err.message.should == "field 'object_id' shadows an existing method in #{ExistingNamePrimitive}"
|
57
|
-
}
|
50
|
+
}.must_raise_on_line NameError, 2, "field 'object_id' shadows an existing method in ExistingNamePrimitive"
|
58
51
|
end
|
59
52
|
|
60
53
|
it "fails on unknown endian" do
|
@@ -62,9 +55,7 @@ describe BinData::Primitive, "when defining with errors" do
|
|
62
55
|
class BadEndianPrimitive < BinData::Primitive
|
63
56
|
endian 'a bad value'
|
64
57
|
end
|
65
|
-
}.
|
66
|
-
err.message.should == "unknown value for endian 'a bad value' in #{BadEndianPrimitive}"
|
67
|
-
}
|
58
|
+
}.must_raise_on_line ArgumentError, 2, "unknown value for endian 'a bad value' in BadEndianPrimitive"
|
68
59
|
end
|
69
60
|
end
|
70
61
|
|
@@ -76,50 +67,51 @@ describe BinData::Primitive do
|
|
76
67
|
def set(v); self.a = v; end
|
77
68
|
end
|
78
69
|
|
79
|
-
|
70
|
+
let(:obj) { PrimitiveWithEndian.new }
|
80
71
|
|
81
72
|
it "assigns value" do
|
82
|
-
|
83
|
-
|
73
|
+
obj.value = 5
|
74
|
+
obj.value.must_equal 5
|
84
75
|
end
|
85
76
|
|
86
77
|
it "produces binary string" do
|
87
|
-
|
88
|
-
|
78
|
+
obj.assign(5)
|
79
|
+
obj.to_binary_s.must_equal "\x05\x00"
|
89
80
|
end
|
90
81
|
|
91
82
|
it "reads value" do
|
92
|
-
|
93
|
-
|
83
|
+
obj.read("\x00\x01")
|
84
|
+
obj.must_equal 0x100
|
94
85
|
end
|
95
86
|
|
96
87
|
it "accepts standard parameters" do
|
97
|
-
|
98
|
-
|
88
|
+
obj = PrimitiveWithEndian.new(:initial_value => 2)
|
89
|
+
obj.to_binary_s.must_equal "\x02\x00"
|
99
90
|
end
|
100
91
|
|
101
92
|
it "returns num_bytes" do
|
102
|
-
|
93
|
+
obj.num_bytes.must_equal 2
|
103
94
|
end
|
104
95
|
|
105
96
|
it "raises error on missing methods" do
|
106
|
-
|
107
|
-
|
108
|
-
}.
|
97
|
+
lambda {
|
98
|
+
obj.does_not_exist
|
99
|
+
}.must_raise NoMethodError
|
109
100
|
end
|
110
101
|
|
111
102
|
it "uses read value whilst reading" do
|
112
|
-
|
113
|
-
|
114
|
-
|
103
|
+
obj = PrimitiveWithEndian.new(:value => 2)
|
104
|
+
obj.read "\x05\x00"
|
105
|
+
obj.must_equal 2
|
115
106
|
|
116
|
-
|
117
|
-
|
107
|
+
obj.stub :reading?, true do
|
108
|
+
obj.must_equal 5
|
109
|
+
end
|
118
110
|
end
|
119
111
|
|
120
112
|
it "behaves as primitive" do
|
121
|
-
|
122
|
-
(2 +
|
113
|
+
obj.assign(5)
|
114
|
+
(2 + obj).must_equal 7
|
123
115
|
end
|
124
116
|
end
|
125
117
|
|
@@ -131,8 +123,8 @@ describe BinData::Primitive, "requiring custom parameters" do
|
|
131
123
|
end
|
132
124
|
|
133
125
|
it "passes parameters correctly" do
|
134
|
-
|
135
|
-
|
126
|
+
obj = PrimitiveWithCustom.new(:iv => 5)
|
127
|
+
obj.must_equal 5
|
136
128
|
end
|
137
129
|
end
|
138
130
|
|
@@ -146,12 +138,12 @@ describe BinData::Primitive, "with custom mandatory parameters" do
|
|
146
138
|
end
|
147
139
|
|
148
140
|
it "raises error if mandatory parameter is not supplied" do
|
149
|
-
|
141
|
+
lambda { MandatoryPrimitive.new }.must_raise ArgumentError
|
150
142
|
end
|
151
143
|
|
152
144
|
it "uses mandatory parameter" do
|
153
|
-
|
154
|
-
|
145
|
+
obj = MandatoryPrimitive.new(:arg1 => 5)
|
146
|
+
obj.must_equal 5
|
155
147
|
end
|
156
148
|
end
|
157
149
|
|
@@ -164,18 +156,14 @@ describe BinData::Primitive, "with custom default parameters" do
|
|
164
156
|
def set(v); self.a = v; end
|
165
157
|
end
|
166
158
|
|
167
|
-
it "does not raise error if default parameter is not supplied" do
|
168
|
-
expect { DefaultPrimitive.new }.not_to raise_error(ArgumentError)
|
169
|
-
end
|
170
|
-
|
171
159
|
it "uses default parameter" do
|
172
|
-
|
173
|
-
|
160
|
+
obj = DefaultPrimitive.new
|
161
|
+
obj.must_equal 5
|
174
162
|
end
|
175
163
|
|
176
164
|
it "overrides default parameter" do
|
177
|
-
|
178
|
-
|
165
|
+
obj = DefaultPrimitive.new(:arg1 => 7)
|
166
|
+
obj.must_equal 7
|
179
167
|
end
|
180
168
|
end
|
181
169
|
|
@@ -192,11 +180,11 @@ describe BinData::Primitive, "subclassed with default parameter" do
|
|
192
180
|
|
193
181
|
it "overrides initial_value" do
|
194
182
|
a = ChildDerivedPrimitive.new(:initial_value => 7)
|
195
|
-
a.to_binary_s.
|
183
|
+
a.to_binary_s.must_equal "\000\007"
|
196
184
|
end
|
197
185
|
|
198
186
|
it "uses default parameter" do
|
199
187
|
a = ChildDerivedPrimitive.new
|
200
|
-
a.to_binary_s.
|
188
|
+
a.to_binary_s.must_equal "\000\005"
|
201
189
|
end
|
202
190
|
end
|