marshal-structure 1.1.1 → 2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -1
- data/.autotest +0 -1
- data/History.txt +15 -0
- data/Manifest.txt +7 -0
- data/README.rdoc +16 -21
- data/Rakefile +1 -7
- data/lib/marshal/structure.rb +74 -542
- data/lib/marshal/structure/allocation_counter.rb +172 -0
- data/lib/marshal/structure/parser.rb +276 -0
- data/lib/marshal/structure/test_case.rb +95 -0
- data/lib/marshal/structure/tokenizer.rb +449 -0
- data/test/test_marshal_structure.rb +18 -152
- data/test/test_marshal_structure_allocation_counter.rb +163 -0
- data/test/test_marshal_structure_parser.rb +97 -0
- data/test/test_marshal_structure_tokenizer.rb +344 -0
- metadata +98 -90
- metadata.gz.sig +0 -0
@@ -0,0 +1,163 @@
|
|
1
|
+
require 'marshal/structure/test_case'
|
2
|
+
|
3
|
+
class TestMarshalStructureAllocationCounter < Marshal::Structure::TestCase
|
4
|
+
|
5
|
+
def test_count
|
6
|
+
count = count_allocations EVERYTHING
|
7
|
+
|
8
|
+
assert_equal 21, count
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_count_array
|
12
|
+
count = count_allocations "\x04\x08[\x07TF"
|
13
|
+
|
14
|
+
assert_equal 1, count
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_count_bignum
|
18
|
+
count = count_allocations "\x04\x08l-\x07\x00\x00\x00@"
|
19
|
+
|
20
|
+
assert_equal 1, count
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_count_class
|
24
|
+
count = count_allocations "\x04\x08c\x06C"
|
25
|
+
|
26
|
+
assert_equal 0, count
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_count_data
|
30
|
+
count = count_allocations "\x04\bd:\x18OpenSSL::X509::Name[\x00"
|
31
|
+
|
32
|
+
assert_equal 2, count
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_count_extended
|
36
|
+
count = count_allocations "\x04\be:\x0FEnumerableo:\vObject\x00"
|
37
|
+
|
38
|
+
assert_equal 1, count
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_count_false
|
42
|
+
count = count_allocations "\x04\x080"
|
43
|
+
|
44
|
+
assert_equal 0, count
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_count_fixnum
|
48
|
+
count = count_allocations "\x04\x08i/"
|
49
|
+
|
50
|
+
assert_equal 0, count
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_count_float
|
54
|
+
count = count_allocations "\x04\bf\b4.2"
|
55
|
+
|
56
|
+
assert_equal 1, count
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_count_hash
|
60
|
+
count = count_allocations "\x04\b{\ai\x06i\aTF"
|
61
|
+
|
62
|
+
assert_equal 1, count
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_count_hash_default
|
66
|
+
count = count_allocations "\x04\x08}\x00i\x06"
|
67
|
+
|
68
|
+
assert_equal 1, count
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_count_instance_variables
|
72
|
+
count = count_allocations "\x04\bI\"\x00\a:\x06ET:\a@xi\a"
|
73
|
+
|
74
|
+
assert_equal 3, count
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_count_link
|
78
|
+
count = count_allocations "\x04\x08[\x07I\"\x00\x06:\x06ET@\x06"
|
79
|
+
|
80
|
+
assert_equal 3, count
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_count_module
|
84
|
+
count = count_allocations "\x04\bm\x0FEnumerable"
|
85
|
+
|
86
|
+
assert_equal 0, count
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_count_module_old
|
90
|
+
count = count_allocations "\x04\bM\x0FEnumerable"
|
91
|
+
|
92
|
+
assert_equal 0, count
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_count_allocation
|
96
|
+
count = count_allocations "\x04\bo:\vObject\x00"
|
97
|
+
|
98
|
+
assert_equal 1, count
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_count_regexp
|
102
|
+
count = count_allocations "\x04\bI/\x06x\x01\x06:\x06EF"
|
103
|
+
|
104
|
+
assert_equal 2, count
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_count_string
|
108
|
+
count = count_allocations "\x04\b\"\x06x"
|
109
|
+
|
110
|
+
assert_equal 1, count
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_count_struct
|
114
|
+
count = count_allocations "\x04\x08S:\x06S\x06:\x06ai\x08"
|
115
|
+
|
116
|
+
assert_equal 2, count
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_count_symbol
|
120
|
+
count = count_allocations "\x04\x08:\x06S"
|
121
|
+
|
122
|
+
assert_equal 1, count
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_count_symbol_link
|
126
|
+
count = count_allocations "\x04\b[\a:\x06s;\x00"
|
127
|
+
|
128
|
+
assert_equal 2, count
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_count_true
|
132
|
+
count = count_allocations "\x04\x08T"
|
133
|
+
|
134
|
+
assert_equal 0, count
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_count_user_defined
|
138
|
+
count = count_allocations "\x04\bIu:\tTime\r\xE7Q\x1C\x80\xA8\xC3\x83\xE5\a" \
|
139
|
+
":\voffseti\xFE\x90\x9D:\tzoneI\"\bPDT\x06:\x06ET"
|
140
|
+
|
141
|
+
timeval = "\xE7Q\x1C\x80\xA8\xC3\x83\xE5"
|
142
|
+
timeval.force_encoding Encoding::BINARY
|
143
|
+
|
144
|
+
assert_equal 6, count
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_count_user_marshal
|
148
|
+
count =
|
149
|
+
count_allocations "\x04\bU:\tDate[\vi\x00i\x03l{%i\x00i\x00i\x00f\f2299161"
|
150
|
+
|
151
|
+
assert_equal 3, count
|
152
|
+
end
|
153
|
+
|
154
|
+
def count_allocations marshal
|
155
|
+
tokenizer = @MS::Tokenizer.new marshal
|
156
|
+
|
157
|
+
allocation_counter = @MS::AllocationCounter.new tokenizer.tokens
|
158
|
+
|
159
|
+
allocation_counter.count
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
163
|
+
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'marshal/structure/test_case'
|
2
|
+
|
3
|
+
class TestMarshalStructureParser < Marshal::Structure::TestCase
|
4
|
+
|
5
|
+
def test_parse
|
6
|
+
structure = parse EVERYTHING
|
7
|
+
|
8
|
+
float_data = "2.2999999999999998\x00ff"
|
9
|
+
float_data.force_encoding Encoding::BINARY
|
10
|
+
|
11
|
+
expected = [
|
12
|
+
:hash,
|
13
|
+
0,
|
14
|
+
1,
|
15
|
+
[:symbol, 0, "a"],
|
16
|
+
[:array,
|
17
|
+
1,
|
18
|
+
20,
|
19
|
+
[:class, 2, "B"],
|
20
|
+
[:module, 3, "C"],
|
21
|
+
[:string, 4, "d"],
|
22
|
+
[:regexp, 5, "e", 0],
|
23
|
+
[:fixnum, 1],
|
24
|
+
[:float, 6, float_data],
|
25
|
+
[:bignum, 7, 18446744073709551616],
|
26
|
+
:nil,
|
27
|
+
:true,
|
28
|
+
:false,
|
29
|
+
[:hash_default, 8, 0, [:fixnum, 0]],
|
30
|
+
[:struct, 9, [:symbol, 1, "S"], 1, [:symbol, 2, "f"], [:fixnum, 0]],
|
31
|
+
[:object, 10, [:symbol, 3, "Object"], [0]],
|
32
|
+
[:link, 10],
|
33
|
+
[:user_marshal, 11, [:symbol, 4, "M"], [:string, 12, "marshal_dump"]],
|
34
|
+
[:instance_variables,
|
35
|
+
[:user_defined, 13, [:symbol, 5, "U"], "_dump"],
|
36
|
+
1,
|
37
|
+
[:symbol, 6, "@ivar_on_dump_str"],
|
38
|
+
[:string, 14, "value on ivar on dump str"]],
|
39
|
+
[:symbol_link, 0],
|
40
|
+
[:extended, [:symbol, 7, "E"], [:object, 15, [:symbol_link, 3], [0]]],
|
41
|
+
[:instance_variables,
|
42
|
+
[:string, 16, "string with ivar"],
|
43
|
+
1,
|
44
|
+
[:symbol, 8, "@value"],
|
45
|
+
[:string, 17, "some value"]],
|
46
|
+
[:user_class, [:symbol, 9, "BenString"], [:string, 18, ""]]]]
|
47
|
+
|
48
|
+
assert_equal expected, structure
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_parse_too_short
|
52
|
+
str = "\x04\x08{"
|
53
|
+
|
54
|
+
e = assert_raises ArgumentError do
|
55
|
+
parse str
|
56
|
+
end
|
57
|
+
|
58
|
+
assert_equal 'marshal data too short', e.message
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_parse_data
|
62
|
+
name = OpenSSL::X509::Name.parse 'CN=nobody/DC=example'
|
63
|
+
str = Marshal.dump name
|
64
|
+
|
65
|
+
expected = [
|
66
|
+
:data,
|
67
|
+
0,
|
68
|
+
[:symbol, 0, "OpenSSL::X509::Name"],
|
69
|
+
[:array,
|
70
|
+
1,
|
71
|
+
2,
|
72
|
+
[:array, 2, 3,
|
73
|
+
[:string, 3, "CN"],
|
74
|
+
[:string, 4, "nobody"],
|
75
|
+
[:fixnum, 12]],
|
76
|
+
[:array, 5, 3,
|
77
|
+
[:string, 6, "DC"],
|
78
|
+
[:string, 7, "example"],
|
79
|
+
[:fixnum, 22]]]]
|
80
|
+
|
81
|
+
assert_equal expected, parse(str)
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_parse_module_old
|
85
|
+
assert_equal [:module, 0, "M"], parse("\x04\x08M\x06M")
|
86
|
+
end
|
87
|
+
|
88
|
+
def parse marshal
|
89
|
+
tokenizer = @MS::Tokenizer.new marshal
|
90
|
+
|
91
|
+
parser = @MS::Parser.new tokenizer.tokens
|
92
|
+
|
93
|
+
parser.parse
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
@@ -0,0 +1,344 @@
|
|
1
|
+
require 'marshal/structure/test_case'
|
2
|
+
|
3
|
+
class TestMarshalStructureTokenizer < Marshal::Structure::TestCase
|
4
|
+
|
5
|
+
def test_bytes
|
6
|
+
ms = @MST.new "\x04\x08\x06M"
|
7
|
+
|
8
|
+
assert_equal "\x06M", ms.bytes(2)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_byte_array
|
12
|
+
ms = @MST.new "\x04\x08\x06M"
|
13
|
+
|
14
|
+
assert_equal [6, 77], ms.byte_array(2)
|
15
|
+
|
16
|
+
e = assert_raises Marshal::Structure::EndOfMarshal do
|
17
|
+
ms.byte_array 3
|
18
|
+
end
|
19
|
+
|
20
|
+
assert_equal 4, e.consumed
|
21
|
+
assert_equal 3, e.requested
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_byte
|
25
|
+
ms = @MST.new "\x04\x08M"
|
26
|
+
|
27
|
+
assert_equal 77, ms.byte
|
28
|
+
|
29
|
+
e = assert_raises Marshal::Structure::EndOfMarshal do
|
30
|
+
ms.byte
|
31
|
+
end
|
32
|
+
|
33
|
+
assert_equal 3, e.consumed
|
34
|
+
assert_equal 1, e.requested
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_character
|
38
|
+
ms = @MST.new "\x04\x08M"
|
39
|
+
|
40
|
+
assert_equal 'M', ms.character
|
41
|
+
|
42
|
+
e = assert_raises Marshal::Structure::EndOfMarshal do
|
43
|
+
ms.character
|
44
|
+
end
|
45
|
+
|
46
|
+
assert_equal 3, e.consumed
|
47
|
+
assert_equal 1, e.requested
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_check_version
|
51
|
+
assert_raises TypeError do
|
52
|
+
@MST.new("\x03\x00").check_version
|
53
|
+
end
|
54
|
+
|
55
|
+
@MST.new("\x04\x07").check_version
|
56
|
+
@MST.new("\x04\x08").check_version
|
57
|
+
|
58
|
+
assert_raises TypeError do
|
59
|
+
@MST.new("\x04\x09").check_version
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_long
|
64
|
+
assert_equal 0, @MST.new("\x04\x08\x00").long
|
65
|
+
|
66
|
+
assert_equal 0, @MST.new("\x04\x08\x01\x00").long
|
67
|
+
assert_equal 1, @MST.new("\x04\x08\x01\x01").long
|
68
|
+
assert_equal 0, @MST.new("\x04\x08\x02\x00\x00").long
|
69
|
+
assert_equal 2<<7, @MST.new("\x04\x08\x02\x00\x01").long
|
70
|
+
assert_equal 0, @MST.new("\x04\x08\x03\x00\x00\x00").long
|
71
|
+
assert_equal 2<<15, @MST.new("\x04\x08\x03\x00\x00\x01").long
|
72
|
+
assert_equal 0, @MST.new("\x04\x08\x04\x00\x00\x00\x00").long
|
73
|
+
assert_equal 2<<23, @MST.new("\x04\x08\x04\x00\x00\x00\x01").long
|
74
|
+
assert_equal (2<<31) - 1, @MST.new("\x04\x08\x04\xff\xff\xff\xff").long
|
75
|
+
|
76
|
+
assert_equal 0, @MST.new("\x04\x08\x05").long
|
77
|
+
assert_equal 1, @MST.new("\x04\x08\x06").long
|
78
|
+
assert_equal 122, @MST.new("\x04\x08\x7f").long
|
79
|
+
assert_equal( -123, @MST.new("\x04\x08\x80").long)
|
80
|
+
assert_equal( -1, @MST.new("\x04\x08\xfa").long)
|
81
|
+
assert_equal 0, @MST.new("\x04\x08\xfb").long
|
82
|
+
|
83
|
+
assert_equal( -(1<<32), @MST.new("\x04\x08\xfc\x00\x00\x00\x00").long)
|
84
|
+
assert_equal( -1, @MST.new("\x04\x08\xfc\xff\xff\xff\xff").long)
|
85
|
+
assert_equal( -(1<<24), @MST.new("\x04\x08\xfd\x00\x00\x00").long)
|
86
|
+
assert_equal( -1, @MST.new("\x04\x08\xfd\xff\xff\xff").long)
|
87
|
+
assert_equal( -(1<<16), @MST.new("\x04\x08\xfe\x00\x00").long)
|
88
|
+
assert_equal( -1, @MST.new("\x04\x08\xfe\xff\xff").long)
|
89
|
+
assert_equal( -(1<<8), @MST.new("\x04\x08\xff\x00").long)
|
90
|
+
assert_equal( -1, @MST.new("\x04\x08\xff\xff").long)
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_byte_sequence
|
94
|
+
ms = @MST.new "\x04\x08\x06M"
|
95
|
+
|
96
|
+
assert_equal "M", ms.byte_sequence
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_tokens_array
|
100
|
+
ms = @MST.new "\x04\x08[\x07TF"
|
101
|
+
|
102
|
+
assert_equal [:array, 2, :true, :false], ms.tokens.to_a
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_tokens_bignum
|
106
|
+
ms = @MST.new "\x04\x08l-\x07\x00\x00\x00@"
|
107
|
+
|
108
|
+
assert_equal [:bignum, -1073741824], ms.tokens.to_a
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_tokens_check_version
|
112
|
+
assert_raises TypeError do
|
113
|
+
@MST.new("\x04\x09").tokens
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_tokens_class
|
118
|
+
ms = @MST.new "\x04\x08c\x06C"
|
119
|
+
|
120
|
+
assert_equal [:class, 'C'], ms.tokens.to_a
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_tokens_data
|
124
|
+
ms = @MST.new "\x04\bd:\x18OpenSSL::X509::Name[\x00"
|
125
|
+
|
126
|
+
assert_equal [:data, :symbol, 'OpenSSL::X509::Name', :array, 0],
|
127
|
+
ms.tokens.to_a
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_tokens_extended
|
131
|
+
ms = @MST.new "\x04\be:\x0FEnumerableo:\vObject\x00"
|
132
|
+
|
133
|
+
expected = [
|
134
|
+
:extended, :symbol, 'Enumerable',
|
135
|
+
:object, :symbol, 'Object', 0
|
136
|
+
]
|
137
|
+
|
138
|
+
assert_equal expected, ms.tokens.to_a
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_tokens_false
|
142
|
+
ms = @MST.new "\x04\x080"
|
143
|
+
|
144
|
+
assert_equal [:nil], ms.tokens.to_a
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_tokens_fixnum
|
148
|
+
ms = @MST.new "\x04\x08i/"
|
149
|
+
|
150
|
+
assert_equal [:fixnum, 42], ms.tokens.to_a
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_tokens_float
|
154
|
+
ms = @MST.new "\x04\bf\b4.2"
|
155
|
+
|
156
|
+
assert_equal [:float, '4.2'], ms.tokens.to_a
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_tokens_hash
|
160
|
+
ms = @MST.new "\x04\b{\ai\x06i\aTF"
|
161
|
+
|
162
|
+
assert_equal [:hash, 2, :fixnum, 1, :fixnum, 2, :true, :false],
|
163
|
+
ms.tokens.to_a
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_tokens_hash_default
|
167
|
+
ms = @MST.new "\x04\x08}\x00i\x06"
|
168
|
+
|
169
|
+
assert_equal [:hash_default, 0, :fixnum, 1], ms.tokens.to_a
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_tokens_instance_variables
|
173
|
+
ms = @MST.new "\x04\bI\"\x00\a:\x06ET:\a@xi\a"
|
174
|
+
|
175
|
+
expected = [
|
176
|
+
:instance_variables,
|
177
|
+
:string, '',
|
178
|
+
2, :symbol, 'E', :true, :symbol, '@x', :fixnum, 2,
|
179
|
+
]
|
180
|
+
|
181
|
+
assert_equal expected, ms.tokens.to_a
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_tokens_link
|
185
|
+
ms = @MST.new "\x04\x08[\x07I\"\x00\x06:\x06ET@\x06"
|
186
|
+
|
187
|
+
expected = [
|
188
|
+
:array, 2,
|
189
|
+
:instance_variables,
|
190
|
+
:string, '',
|
191
|
+
1,
|
192
|
+
:symbol, 'E', :true,
|
193
|
+
:link, 1,
|
194
|
+
]
|
195
|
+
|
196
|
+
assert_equal expected, ms.tokens.to_a
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_tokens_module
|
200
|
+
ms = @MST.new "\x04\bm\x0FEnumerable"
|
201
|
+
|
202
|
+
assert_equal [:module, 'Enumerable'], ms.tokens.to_a
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_tokens_module_old
|
206
|
+
ms = @MST.new "\x04\bM\x0FEnumerable"
|
207
|
+
|
208
|
+
assert_equal [:module_old, 'Enumerable'], ms.tokens.to_a
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_tokens_object
|
212
|
+
mst = @MST.new \
|
213
|
+
"\x04\bo:\x16DRb::DRbConnError\a" +
|
214
|
+
":\tmesgI\"\x16connection closed\x06:\x06ET" +
|
215
|
+
":\abt[\x06" +
|
216
|
+
"\"\x21whatever.rb:in `some_method'"
|
217
|
+
|
218
|
+
expected = [
|
219
|
+
:object,
|
220
|
+
:symbol,
|
221
|
+
'DRb::DRbConnError',
|
222
|
+
2,
|
223
|
+
:symbol,
|
224
|
+
'mesg',
|
225
|
+
:instance_variables,
|
226
|
+
:string,
|
227
|
+
'connection closed',
|
228
|
+
1,
|
229
|
+
:symbol,
|
230
|
+
'E',
|
231
|
+
:true,
|
232
|
+
:symbol,
|
233
|
+
'bt',
|
234
|
+
:array,
|
235
|
+
1,
|
236
|
+
:string,
|
237
|
+
'whatever.rb:in `some_method\'',
|
238
|
+
]
|
239
|
+
|
240
|
+
assert_equal expected, mst.tokens.to_a
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_tokens_regexp
|
244
|
+
ms = @MST.new "\x04\bI/\x06x\x01\x06:\x06EF"
|
245
|
+
|
246
|
+
expected = [
|
247
|
+
:instance_variables,
|
248
|
+
:regexp, 'x', 1,
|
249
|
+
1, :symbol, 'E', :false,
|
250
|
+
]
|
251
|
+
|
252
|
+
assert_equal expected, ms.tokens.to_a
|
253
|
+
end
|
254
|
+
|
255
|
+
def test_tokens_string
|
256
|
+
ms = @MST.new "\x04\b\"\x06x"
|
257
|
+
|
258
|
+
assert_equal [:string, 'x'], ms.tokens.to_a
|
259
|
+
end
|
260
|
+
|
261
|
+
def test_tokens_struct
|
262
|
+
ms = @MST.new "\x04\x08S:\x06S\x06:\x06ai\x08"
|
263
|
+
|
264
|
+
expected = [
|
265
|
+
:struct, :symbol, 'S', 1, :symbol, 'a', :fixnum, 3
|
266
|
+
]
|
267
|
+
|
268
|
+
assert_equal expected, ms.tokens.to_a
|
269
|
+
end
|
270
|
+
|
271
|
+
def test_tokens_symbol
|
272
|
+
ms = @MST.new "\x04\x08:\x06S"
|
273
|
+
|
274
|
+
expected = [
|
275
|
+
:symbol, 'S'
|
276
|
+
]
|
277
|
+
|
278
|
+
assert_equal expected, ms.tokens.to_a
|
279
|
+
end
|
280
|
+
|
281
|
+
def test_tokens_symbol_link
|
282
|
+
ms = @MST.new "\x04\b[\a:\x06s;\x00"
|
283
|
+
|
284
|
+
expected = [
|
285
|
+
:array, 2, :symbol, 's', :symbol_link, 0,
|
286
|
+
]
|
287
|
+
|
288
|
+
assert_equal expected, ms.tokens.to_a
|
289
|
+
end
|
290
|
+
|
291
|
+
def test_tokens_too_short
|
292
|
+
ms = @MST.new "\x04\x08"
|
293
|
+
|
294
|
+
assert_raises Marshal::Structure::EndOfMarshal do
|
295
|
+
ms.tokens.to_a
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
def test_tokens_true
|
300
|
+
ms = @MST.new "\x04\x08T"
|
301
|
+
|
302
|
+
assert_equal [:true], ms.tokens.to_a
|
303
|
+
end
|
304
|
+
|
305
|
+
def test_tokens_user_defined
|
306
|
+
ms = @MST.new "\x04\bIu:\tTime\r\xE7Q\x1C\x80\xA8\xC3\x83\xE5\a" \
|
307
|
+
":\voffseti\xFE\x90\x9D:\tzoneI\"\bPDT\x06:\x06ET"
|
308
|
+
|
309
|
+
timeval = "\xE7Q\x1C\x80\xA8\xC3\x83\xE5"
|
310
|
+
timeval.force_encoding Encoding::BINARY
|
311
|
+
|
312
|
+
expected = [
|
313
|
+
:instance_variables,
|
314
|
+
:user_defined, :symbol, 'Time', timeval,
|
315
|
+
2,
|
316
|
+
:symbol, 'offset', :fixnum, -25200,
|
317
|
+
:symbol, 'zone',
|
318
|
+
:instance_variables,
|
319
|
+
:string, 'PDT',
|
320
|
+
1, :symbol, 'E', :true,
|
321
|
+
]
|
322
|
+
|
323
|
+
assert_equal expected, ms.tokens.to_a
|
324
|
+
end
|
325
|
+
|
326
|
+
def test_tokens_user_marshal
|
327
|
+
ms = @MST.new "\x04\bU:\tDate[\vi\x00i\x03l{%i\x00i\x00i\x00f\f2299161"
|
328
|
+
|
329
|
+
expected = [
|
330
|
+
:user_marshal, :symbol, 'Date',
|
331
|
+
:array, 6,
|
332
|
+
:fixnum, 0,
|
333
|
+
:fixnum, 2456428,
|
334
|
+
:fixnum, 0,
|
335
|
+
:fixnum, 0,
|
336
|
+
:fixnum, 0,
|
337
|
+
:float, '2299161',
|
338
|
+
]
|
339
|
+
|
340
|
+
assert_equal expected, ms.tokens.to_a
|
341
|
+
end
|
342
|
+
|
343
|
+
end
|
344
|
+
|