bmff 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. data/.gitignore +25 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +183 -0
  5. data/Rakefile +9 -0
  6. data/bmff.gemspec +25 -0
  7. data/lib/bmff/binary_accessor.rb +186 -0
  8. data/lib/bmff/box/audio_sample_entry.rb +16 -0
  9. data/lib/bmff/box/base.rb +66 -0
  10. data/lib/bmff/box/bit_rate.rb +14 -0
  11. data/lib/bmff/box/chunk_large_offset.rb +16 -0
  12. data/lib/bmff/box/chunk_offset.rb +16 -0
  13. data/lib/bmff/box/clean_aperture.rb +20 -0
  14. data/lib/bmff/box/colour_information.rb +27 -0
  15. data/lib/bmff/box/compact_sample_size.rb +32 -0
  16. data/lib/bmff/box/composition_offset.rb +25 -0
  17. data/lib/bmff/box/composition_to_decode.rb +17 -0
  18. data/lib/bmff/box/container.rb +70 -0
  19. data/lib/bmff/box/copyright.rb +13 -0
  20. data/lib/bmff/box/data_entry_url.rb +12 -0
  21. data/lib/bmff/box/data_entry_urn.rb +13 -0
  22. data/lib/bmff/box/data_information.rb +12 -0
  23. data/lib/bmff/box/data_reference.rb +14 -0
  24. data/lib/bmff/box/degradation_priority.rb +19 -0
  25. data/lib/bmff/box/edit.rb +12 -0
  26. data/lib/bmff/box/edit_list.rb +27 -0
  27. data/lib/bmff/box/file_type.rb +17 -0
  28. data/lib/bmff/box/free_space.rb +6 -0
  29. data/lib/bmff/box/full.rb +11 -0
  30. data/lib/bmff/box/handler.rb +15 -0
  31. data/lib/bmff/box/hint_media_header.rb +16 -0
  32. data/lib/bmff/box/hint_sample_entry.rb +14 -0
  33. data/lib/bmff/box/level_assignment.rb +35 -0
  34. data/lib/bmff/box/map.rb +15 -0
  35. data/lib/bmff/box/media.rb +12 -0
  36. data/lib/bmff/box/media_data.rb +6 -0
  37. data/lib/bmff/box/media_header.rb +25 -0
  38. data/lib/bmff/box/media_information.rb +12 -0
  39. data/lib/bmff/box/meta_data_sample_entry.rb +5 -0
  40. data/lib/bmff/box/movie.rb +12 -0
  41. data/lib/bmff/box/movie_extends.rb +12 -0
  42. data/lib/bmff/box/movie_extends_header.rb +16 -0
  43. data/lib/bmff/box/movie_fragment.rb +12 -0
  44. data/lib/bmff/box/movie_fragment_header.rb +12 -0
  45. data/lib/bmff/box/movie_fragment_random_access.rb +12 -0
  46. data/lib/bmff/box/movie_fragment_random_access_offset.rb +12 -0
  47. data/lib/bmff/box/movie_header.rb +36 -0
  48. data/lib/bmff/box/null_media_header.rb +6 -0
  49. data/lib/bmff/box/padding_bits.rb +23 -0
  50. data/lib/bmff/box/pixel_aspect_ratio.rb +13 -0
  51. data/lib/bmff/box/progressive_download_info.rb +17 -0
  52. data/lib/bmff/box/sample_auxiliary_information_offsets.rb +24 -0
  53. data/lib/bmff/box/sample_auxiliary_information_sizes.rb +23 -0
  54. data/lib/bmff/box/sample_dependency_type.rb +26 -0
  55. data/lib/bmff/box/sample_description.rb +27 -0
  56. data/lib/bmff/box/sample_entry.rb +15 -0
  57. data/lib/bmff/box/sample_size.rb +19 -0
  58. data/lib/bmff/box/sample_table.rb +12 -0
  59. data/lib/bmff/box/sample_to_chunk.rb +20 -0
  60. data/lib/bmff/box/shadow_sync_sample.rb +18 -0
  61. data/lib/bmff/box/sound_media_header.rb +13 -0
  62. data/lib/bmff/box/sub_sample_information.rb +41 -0
  63. data/lib/bmff/box/sync_sample.rb +16 -0
  64. data/lib/bmff/box/text_meta_data_sample_entry.rb +18 -0
  65. data/lib/bmff/box/time_to_sample.rb +18 -0
  66. data/lib/bmff/box/track.rb +12 -0
  67. data/lib/bmff/box/track_extends.rb +17 -0
  68. data/lib/bmff/box/track_fragment.rb +12 -0
  69. data/lib/bmff/box/track_fragment_base_media_decode_time.rb +16 -0
  70. data/lib/bmff/box/track_fragment_header.rb +18 -0
  71. data/lib/bmff/box/track_fragment_random_access.rb +54 -0
  72. data/lib/bmff/box/track_group.rb +12 -0
  73. data/lib/bmff/box/track_group_type.rb +12 -0
  74. data/lib/bmff/box/track_header.rb +36 -0
  75. data/lib/bmff/box/track_reference.rb +12 -0
  76. data/lib/bmff/box/track_reference_type.rb +15 -0
  77. data/lib/bmff/box/track_run.rb +31 -0
  78. data/lib/bmff/box/track_selection.rb +16 -0
  79. data/lib/bmff/box/unknown.rb +5 -0
  80. data/lib/bmff/box/uri.rb +12 -0
  81. data/lib/bmff/box/uri_init.rb +15 -0
  82. data/lib/bmff/box/uri_meta_sample_entry.rb +24 -0
  83. data/lib/bmff/box/user_data.rb +12 -0
  84. data/lib/bmff/box/video_media_header.rb +13 -0
  85. data/lib/bmff/box/visual_sample_entry.rb +37 -0
  86. data/lib/bmff/box/xml_meta_data_sample_entry.rb +19 -0
  87. data/lib/bmff/box.rb +115 -0
  88. data/lib/bmff/file_container.rb +20 -0
  89. data/lib/bmff/version.rb +3 -0
  90. data/lib/bmff.rb +7 -0
  91. data/test/bmff/box/test_audio_sample_entry.rb +46 -0
  92. data/test/bmff/box/test_base.rb +37 -0
  93. data/test/bmff/box/test_bit_rate.rb +30 -0
  94. data/test/bmff/box/test_chunk_large_offset.rb +35 -0
  95. data/test/bmff/box/test_chunk_offset.rb +35 -0
  96. data/test/bmff/box/test_clean_aperture.rb +40 -0
  97. data/test/bmff/box/test_colour_information.rb +73 -0
  98. data/test/bmff/box/test_compact_sample_size.rb +99 -0
  99. data/test/bmff/box/test_composition_offset.rb +64 -0
  100. data/test/bmff/box/test_composition_to_decode.rb +38 -0
  101. data/test/bmff/box/test_copyright.rb +55 -0
  102. data/test/bmff/box/test_data_entry_url.rb +30 -0
  103. data/test/bmff/box/test_data_entry_urn.rb +32 -0
  104. data/test/bmff/box/test_data_information.rb +26 -0
  105. data/test/bmff/box/test_data_reference.rb +58 -0
  106. data/test/bmff/box/test_degradation_priority.rb +62 -0
  107. data/test/bmff/box/test_edit.rb +26 -0
  108. data/test/bmff/box/test_edit_list.rb +72 -0
  109. data/test/bmff/box/test_file_type.rb +30 -0
  110. data/test/bmff/box/test_free_space.rb +42 -0
  111. data/test/bmff/box/test_handler.rb +67 -0
  112. data/test/bmff/box/test_hint_media_header.rb +38 -0
  113. data/test/bmff/box/test_hint_sample_entry.rb +38 -0
  114. data/test/bmff/box/test_level_assignment.rb +50 -0
  115. data/test/bmff/box/test_media.rb +26 -0
  116. data/test/bmff/box/test_media_data.rb +25 -0
  117. data/test/bmff/box/test_media_header.rb +72 -0
  118. data/test/bmff/box/test_media_information.rb +26 -0
  119. data/test/bmff/box/test_movie.rb +26 -0
  120. data/test/bmff/box/test_movie_extends.rb +26 -0
  121. data/test/bmff/box/test_movie_extends_header.rb +52 -0
  122. data/test/bmff/box/test_movie_fragment.rb +26 -0
  123. data/test/bmff/box/test_movie_fragment_header.rb +30 -0
  124. data/test/bmff/box/test_movie_fragment_random_access.rb +26 -0
  125. data/test/bmff/box/test_movie_fragment_random_access_offset.rb +30 -0
  126. data/test/bmff/box/test_movie_header.rb +110 -0
  127. data/test/bmff/box/test_null_media_header.rb +28 -0
  128. data/test/bmff/box/test_padding_bits.rb +38 -0
  129. data/test/bmff/box/test_pixel_aspect_ratio.rb +28 -0
  130. data/test/bmff/box/test_progressive_download_info.rb +36 -0
  131. data/test/bmff/box/test_sample_auxiliary_information_offsets.rb +94 -0
  132. data/test/bmff/box/test_sample_auxiliary_information_sizes.rb +70 -0
  133. data/test/bmff/box/test_sample_dependency_type.rb +70 -0
  134. data/test/bmff/box/test_sample_description.rb +355 -0
  135. data/test/bmff/box/test_sample_size.rb +61 -0
  136. data/test/bmff/box/test_sample_table.rb +26 -0
  137. data/test/bmff/box/test_sample_to_chunk.rb +39 -0
  138. data/test/bmff/box/test_shadow_sync_sample.rb +36 -0
  139. data/test/bmff/box/test_sound_media_header.rb +32 -0
  140. data/test/bmff/box/test_sub_sample_information.rb +90 -0
  141. data/test/bmff/box/test_sync_sample.rb +34 -0
  142. data/test/bmff/box/test_text_meta_data_sample_entry.rb +49 -0
  143. data/test/bmff/box/test_time_to_sample.rb +36 -0
  144. data/test/bmff/box/test_track.rb +26 -0
  145. data/test/bmff/box/test_track_extends.rb +38 -0
  146. data/test/bmff/box/test_track_fragment.rb +26 -0
  147. data/test/bmff/box/test_track_fragment_base_media_decode_time.rb +52 -0
  148. data/test/bmff/box/test_track_fragment_header.rb +200 -0
  149. data/test/bmff/box/test_track_fragment_random_access.rb +96 -0
  150. data/test/bmff/box/test_track_group.rb +26 -0
  151. data/test/bmff/box/test_track_group_type.rb +30 -0
  152. data/test/bmff/box/test_track_header.rb +118 -0
  153. data/test/bmff/box/test_track_reference.rb +26 -0
  154. data/test/bmff/box/test_track_reference_type.rb +100 -0
  155. data/test/bmff/box/test_track_run.rb +282 -0
  156. data/test/bmff/box/test_track_selection.rb +33 -0
  157. data/test/bmff/box/test_uri.rb +30 -0
  158. data/test/bmff/box/test_uri_init.rb +32 -0
  159. data/test/bmff/box/test_uri_meta_sample_entry.rb +74 -0
  160. data/test/bmff/box/test_user_data.rb +26 -0
  161. data/test/bmff/box/test_video_media_header.rb +34 -0
  162. data/test/bmff/box/test_visual_sample_entry.rb +95 -0
  163. data/test/bmff/box/test_xml_meta_data_sample_entry.rb +51 -0
  164. data/test/bmff/test_binary_accessor.rb +805 -0
  165. data/test/bmff/test_file_container.rb +58 -0
  166. data/test/minitest_helper.rb +7 -0
  167. metadata +323 -0
@@ -0,0 +1,805 @@
1
+ # coding: utf-8
2
+ # vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 autoindent:
3
+
4
+ require_relative '../minitest_helper'
5
+ require 'bmff/binary_accessor'
6
+ require 'stringio'
7
+
8
+ class TestBMFFBinaryAccessor < MiniTest::Unit::TestCase
9
+ def test_get_int8
10
+ io = StringIO.new("\x00\xFF\x80", "r:ascii-8bit")
11
+ io.extend(BMFF::BinaryAccessor)
12
+ assert_equal(0, io.get_int8)
13
+ assert_equal(-1, io.get_int8)
14
+ assert_equal(-128, io.get_int8)
15
+ assert(io.eof?)
16
+ end
17
+
18
+ def test_get_int8_insufficient_data
19
+ io = StringIO.new("", "r:ascii-8bit")
20
+ io.extend(BMFF::BinaryAccessor)
21
+ assert_raises(EOFError) do
22
+ io.get_int8
23
+ end
24
+ end
25
+
26
+ def test_write_int8
27
+ io = StringIO.new("", "r+:ascii-8bit")
28
+ io.extend(BMFF::BinaryAccessor)
29
+ io.write_int8(0)
30
+ io.write_int8(127)
31
+ io.write_int8(-1)
32
+ io.write_int8(-128)
33
+ io.pos = 0
34
+ assert_equal("\x00\x7F\xFF\x80", io.read)
35
+ end
36
+
37
+ def test_write_int8_out_of_range
38
+ io = StringIO.new("", "r+:ascii-8bit")
39
+ io.extend(BMFF::BinaryAccessor)
40
+ assert_raises(RangeError) do
41
+ io.write_int8(128)
42
+ end
43
+ assert_raises(RangeError) do
44
+ io.write_int8(-129)
45
+ end
46
+ end
47
+
48
+ def test_write_int8_invalid_value
49
+ io = StringIO.new("", "r+:ascii-8bit")
50
+ io.extend(BMFF::BinaryAccessor)
51
+ assert_raises(TypeError) do
52
+ io.write_int8(0.1)
53
+ end
54
+ assert_raises(TypeError) do
55
+ io.write_int8(nil)
56
+ end
57
+ assert_raises(TypeError) do
58
+ io.write_int8("0")
59
+ end
60
+ assert_raises(TypeError) do
61
+ io.write_int8(true)
62
+ end
63
+ assert_raises(TypeError) do
64
+ io.write_int8(false)
65
+ end
66
+ end
67
+
68
+ def test_get_uint8
69
+ io = StringIO.new("\x00\xFF\xF0", "r:ascii-8bit")
70
+ io.extend(BMFF::BinaryAccessor)
71
+ assert_equal(0, io.get_uint8)
72
+ assert_equal(255, io.get_uint8)
73
+ assert_equal(240, io.get_uint8)
74
+ assert(io.eof?)
75
+ end
76
+
77
+ def test_get_uint8_insufficient_data
78
+ io = StringIO.new("", "r:ascii-8bit")
79
+ io.extend(BMFF::BinaryAccessor)
80
+ assert_raises(EOFError) do
81
+ io.get_uint8
82
+ end
83
+ end
84
+
85
+ def test_write_uint8
86
+ io = StringIO.new("", "r+:ascii-8bit")
87
+ io.extend(BMFF::BinaryAccessor)
88
+ io.write_uint8(0)
89
+ io.write_uint8(255)
90
+ io.pos = 0
91
+ assert_equal("\x00\xFF", io.read)
92
+ end
93
+
94
+ def test_write_uint8_out_of_range
95
+ io = StringIO.new("", "r+:ascii-8bit")
96
+ io.extend(BMFF::BinaryAccessor)
97
+ assert_raises(RangeError) do
98
+ io.write_uint8(256)
99
+ end
100
+ assert_raises(RangeError) do
101
+ io.write_uint8(-1)
102
+ end
103
+ end
104
+
105
+ def test_write_uint8_invalid_value
106
+ io = StringIO.new("", "r+:ascii-8bit")
107
+ io.extend(BMFF::BinaryAccessor)
108
+ assert_raises(TypeError) do
109
+ io.write_uint8(0.1)
110
+ end
111
+ assert_raises(TypeError) do
112
+ io.write_uint8(nil)
113
+ end
114
+ assert_raises(TypeError) do
115
+ io.write_uint8("0")
116
+ end
117
+ assert_raises(TypeError) do
118
+ io.write_uint8(true)
119
+ end
120
+ assert_raises(TypeError) do
121
+ io.write_uint8(false)
122
+ end
123
+ end
124
+
125
+ def test_get_int16
126
+ io = StringIO.new("\x00\xFF\xFF\xFF\x80\x00", "r:ascii-8bit")
127
+ io.extend(BMFF::BinaryAccessor)
128
+ assert_equal(255, io.get_int16)
129
+ assert_equal(-1, io.get_int16)
130
+ assert_equal(-32768, io.get_int16)
131
+ assert(io.eof?)
132
+ end
133
+
134
+ def test_get_int16_insufficient_data
135
+ io = StringIO.new("\x00", "r:ascii-8bit")
136
+ io.extend(BMFF::BinaryAccessor)
137
+ assert_raises(EOFError) do
138
+ io.get_int16
139
+ end
140
+ end
141
+
142
+ def test_write_int16
143
+ io = StringIO.new("", "r+:ascii-8bit")
144
+ io.extend(BMFF::BinaryAccessor)
145
+ io.write_int16(32767)
146
+ io.write_int16(255)
147
+ io.write_int16(-1)
148
+ io.write_int16(-32768)
149
+ io.pos = 0
150
+ assert_equal("\x7F\xFF\x00\xFF\xFF\xFF\x80\x00", io.read)
151
+ end
152
+
153
+ def test_write_int16_out_of_range
154
+ io = StringIO.new("", "r+:ascii-8bit")
155
+ io.extend(BMFF::BinaryAccessor)
156
+ assert_raises(RangeError) do
157
+ io.write_int16(32768)
158
+ end
159
+ assert_raises(RangeError) do
160
+ io.write_int16(-32769)
161
+ end
162
+ end
163
+
164
+ def test_write_int16_invalid_value
165
+ io = StringIO.new("", "r+:ascii-8bit")
166
+ io.extend(BMFF::BinaryAccessor)
167
+ assert_raises(TypeError) do
168
+ io.write_int16(0.1)
169
+ end
170
+ assert_raises(TypeError) do
171
+ io.write_int16(nil)
172
+ end
173
+ assert_raises(TypeError) do
174
+ io.write_int16("0")
175
+ end
176
+ assert_raises(TypeError) do
177
+ io.write_int16(true)
178
+ end
179
+ assert_raises(TypeError) do
180
+ io.write_int16(false)
181
+ end
182
+ end
183
+
184
+ def test_get_uint16
185
+ io = StringIO.new("\x00\xFF\xFF\xFF", "r:ascii-8bit")
186
+ io.extend(BMFF::BinaryAccessor)
187
+ assert_equal(255, io.get_uint16)
188
+ assert_equal(65535, io.get_uint16)
189
+ assert(io.eof?)
190
+ end
191
+
192
+ def test_get_uint16_insufficient_data
193
+ io = StringIO.new("\x00", "r:ascii-8bit")
194
+ io.extend(BMFF::BinaryAccessor)
195
+ assert_raises(EOFError) do
196
+ io.get_uint16
197
+ end
198
+ end
199
+
200
+ def test_write_uint16
201
+ io = StringIO.new("", "r+:ascii-8bit")
202
+ io.extend(BMFF::BinaryAccessor)
203
+ io.write_uint16(0)
204
+ io.write_uint16(255)
205
+ io.write_uint16(65535)
206
+ io.pos = 0
207
+ assert_equal("\x00\x00\x00\xFF\xFF\xFF", io.read)
208
+ end
209
+
210
+ def test_write_uint16_out_of_range
211
+ io = StringIO.new("", "r+:ascii-8bit")
212
+ io.extend(BMFF::BinaryAccessor)
213
+ assert_raises(RangeError) do
214
+ io.write_uint16(65536)
215
+ end
216
+ assert_raises(RangeError) do
217
+ io.write_uint16(-1)
218
+ end
219
+ end
220
+
221
+ def test_write_uint16_invalid_value
222
+ io = StringIO.new("", "r+:ascii-8bit")
223
+ io.extend(BMFF::BinaryAccessor)
224
+ assert_raises(TypeError) do
225
+ io.write_uint16(0.1)
226
+ end
227
+ assert_raises(TypeError) do
228
+ io.write_uint16(nil)
229
+ end
230
+ assert_raises(TypeError) do
231
+ io.write_uint16("0")
232
+ end
233
+ assert_raises(TypeError) do
234
+ io.write_uint16(true)
235
+ end
236
+ assert_raises(TypeError) do
237
+ io.write_uint16(false)
238
+ end
239
+ end
240
+
241
+ def test_get_uint24
242
+ io = StringIO.new("\x00\x00\x00\xFF\xFF\xFF", "r:ascii-8bit")
243
+ io.extend(BMFF::BinaryAccessor)
244
+ assert_equal(0, io.get_uint24)
245
+ assert_equal(16777215, io.get_uint24)
246
+ assert(io.eof?)
247
+ end
248
+
249
+ def test_write_uint24
250
+ io = StringIO.new("", "r+:ascii-8bit")
251
+ io.extend(BMFF::BinaryAccessor)
252
+ io.write_uint24(0)
253
+ io.write_uint24(16777215)
254
+ io.pos = 0
255
+ assert_equal("\x00\x00\x00\xFF\xFF\xFF", io.read)
256
+ end
257
+
258
+ def test_write_uint24_out_of_range
259
+ io = StringIO.new("", "r+:ascii-8bit")
260
+ io.extend(BMFF::BinaryAccessor)
261
+ assert_raises(RangeError) do
262
+ io.write_uint24(16777216)
263
+ end
264
+ assert_raises(RangeError) do
265
+ io.write_uint24(-1)
266
+ end
267
+ end
268
+
269
+ def test_write_uint24_invalid_value
270
+ io = StringIO.new("", "r+:ascii-8bit")
271
+ io.extend(BMFF::BinaryAccessor)
272
+ assert_raises(TypeError) do
273
+ io.write_uint24(0.1)
274
+ end
275
+ assert_raises(TypeError) do
276
+ io.write_uint24(nil)
277
+ end
278
+ assert_raises(TypeError) do
279
+ io.write_uint24("0")
280
+ end
281
+ assert_raises(TypeError) do
282
+ io.write_uint24(true)
283
+ end
284
+ assert_raises(TypeError) do
285
+ io.write_uint24(false)
286
+ end
287
+ end
288
+
289
+ def test_get_int32
290
+ io = StringIO.new("\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x80\x00\x00\x00", "r:ascii-8bit")
291
+ io.extend(BMFF::BinaryAccessor)
292
+ assert_equal(0, io.get_int32)
293
+ assert_equal(-1, io.get_int32)
294
+ assert_equal(-2147483648, io.get_int32)
295
+ assert(io.eof?)
296
+ end
297
+
298
+ def test_get_int32_insufficient_data
299
+ io = StringIO.new("\x00\x00\x00", "r:ascii-8bit")
300
+ io.extend(BMFF::BinaryAccessor)
301
+ assert_raises(EOFError) do
302
+ io.get_int32
303
+ end
304
+ end
305
+
306
+ def test_write_int32
307
+ io = StringIO.new("", "r+:ascii-8bit")
308
+ io.extend(BMFF::BinaryAccessor)
309
+ io.write_int32(0)
310
+ io.write_int32(-1)
311
+ io.write_int32(-2147483648)
312
+ io.pos = 0
313
+ assert_equal("\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x80\x00\x00\x00", io.read)
314
+ end
315
+
316
+ def test_write_int32_out_of_range
317
+ io = StringIO.new("", "r+:ascii-8bit")
318
+ io.extend(BMFF::BinaryAccessor)
319
+ assert_raises(RangeError) do
320
+ io.write_int32(2147483648)
321
+ end
322
+ assert_raises(RangeError) do
323
+ io.write_int32(-2147483649)
324
+ end
325
+ end
326
+
327
+ def test_write_int32_invalid_value
328
+ io = StringIO.new("", "r+:ascii-8bit")
329
+ io.extend(BMFF::BinaryAccessor)
330
+ assert_raises(TypeError) do
331
+ io.write_int32(0.1)
332
+ end
333
+ assert_raises(TypeError) do
334
+ io.write_int32(nil)
335
+ end
336
+ assert_raises(TypeError) do
337
+ io.write_int32("0")
338
+ end
339
+ assert_raises(TypeError) do
340
+ io.write_int32(true)
341
+ end
342
+ assert_raises(TypeError) do
343
+ io.write_int32(false)
344
+ end
345
+ end
346
+
347
+ def test_get_uint32
348
+ io = StringIO.new("\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x80\x00\x00\x00", "r:ascii-8bit")
349
+ io.extend(BMFF::BinaryAccessor)
350
+ assert_equal(0, io.get_uint32)
351
+ assert_equal(4294967295, io.get_uint32)
352
+ assert_equal(2147483648, io.get_uint32)
353
+ assert(io.eof?)
354
+ end
355
+
356
+ def test_get_uint32_insufficient_data
357
+ io = StringIO.new("\x00\x00\x00", "r:ascii-8bit")
358
+ io.extend(BMFF::BinaryAccessor)
359
+ assert_raises(EOFError) do
360
+ io.get_uint32
361
+ end
362
+ end
363
+
364
+ def test_write_uint32
365
+ io = StringIO.new("", "r+:ascii-8bit")
366
+ io.extend(BMFF::BinaryAccessor)
367
+ io.write_uint32(0)
368
+ io.write_uint32(4294967295)
369
+ io.write_uint32(2147483648)
370
+ io.pos = 0
371
+ assert_equal("\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x80\x00\x00\x00", io.read)
372
+ end
373
+
374
+ def test_write_uint32_out_of_range
375
+ io = StringIO.new("", "r+:ascii-8bit")
376
+ io.extend(BMFF::BinaryAccessor)
377
+ assert_raises(RangeError) do
378
+ io.write_uint32(4294967296)
379
+ end
380
+ assert_raises(RangeError) do
381
+ io.write_uint32(-1)
382
+ end
383
+ end
384
+
385
+ def test_write_uint32_invalid_value
386
+ io = StringIO.new("", "r+:ascii-8bit")
387
+ io.extend(BMFF::BinaryAccessor)
388
+ assert_raises(TypeError) do
389
+ io.write_uint32(0.1)
390
+ end
391
+ assert_raises(TypeError) do
392
+ io.write_uint32(nil)
393
+ end
394
+ assert_raises(TypeError) do
395
+ io.write_uint32("0")
396
+ end
397
+ assert_raises(TypeError) do
398
+ io.write_uint32(true)
399
+ end
400
+ assert_raises(TypeError) do
401
+ io.write_uint32(false)
402
+ end
403
+ end
404
+
405
+ def test_get_int64
406
+ io = StringIO.new("\x00\x00\x00\x00\x00\x00\x00\x00" + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" +
407
+ "\x80\x00\x00\x00\x00\x00\x00\x00", "r:ascii-8bit")
408
+ io.extend(BMFF::BinaryAccessor)
409
+ assert_equal(0, io.get_int64)
410
+ assert_equal(-1, io.get_int64)
411
+ assert_equal(-9223372036854775808, io.get_int64)
412
+ assert(io.eof?)
413
+ end
414
+
415
+ def test_get_int64_insufficient_data
416
+ io = StringIO.new("\x00\x00\x00\x00\x00\x00\x00", "r:ascii-8bit")
417
+ io.extend(BMFF::BinaryAccessor)
418
+ assert_raises(EOFError) do
419
+ io.get_int64
420
+ end
421
+ end
422
+
423
+ def test_write_int64
424
+ io = StringIO.new("", "r+:ascii-8bit")
425
+ io.extend(BMFF::BinaryAccessor)
426
+ io.write_int64(0)
427
+ io.write_int64(-1)
428
+ io.write_int64(-9223372036854775808)
429
+ io.pos = 0
430
+ assert_equal("\x00\x00\x00\x00\x00\x00\x00\x00" + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" +
431
+ "\x80\x00\x00\x00\x00\x00\x00\x00", io.read)
432
+ end
433
+
434
+ def test_write_int64_out_of_range
435
+ io = StringIO.new("", "r+:ascii-8bit")
436
+ io.extend(BMFF::BinaryAccessor)
437
+ assert_raises(RangeError) do
438
+ io.write_int64(9223372036854775808)
439
+ end
440
+ assert_raises(RangeError) do
441
+ io.write_int64(-9223372036854775809)
442
+ end
443
+ end
444
+
445
+ def test_write_int64_invalid_value
446
+ io = StringIO.new("", "r+:ascii-8bit")
447
+ io.extend(BMFF::BinaryAccessor)
448
+ assert_raises(TypeError) do
449
+ io.write_int64(0.1)
450
+ end
451
+ assert_raises(TypeError) do
452
+ io.write_int64(nil)
453
+ end
454
+ assert_raises(TypeError) do
455
+ io.write_int64("0")
456
+ end
457
+ assert_raises(TypeError) do
458
+ io.write_int64(true)
459
+ end
460
+ assert_raises(TypeError) do
461
+ io.write_int64(false)
462
+ end
463
+ end
464
+
465
+ def test_get_uint64
466
+ io = StringIO.new("\x00\x00\x00\x00\x00\x00\x00\x00" + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" +
467
+ "\x80\x00\x00\x00\x00\x00\x00\x00", "r:ascii-8bit")
468
+ io.extend(BMFF::BinaryAccessor)
469
+ assert_equal(0, io.get_uint64)
470
+ assert_equal(18446744073709551615, io.get_uint64)
471
+ assert_equal(9223372036854775808, io.get_uint64)
472
+ assert(io.eof?)
473
+ end
474
+
475
+ def test_get_uint64_insufficient_data
476
+ io = StringIO.new("\x00\x00\x00\x00\x00\x00\x00", "r:ascii-8bit")
477
+ io.extend(BMFF::BinaryAccessor)
478
+ assert_raises(EOFError) do
479
+ io.get_uint64
480
+ end
481
+ end
482
+
483
+ def test_write_uint64
484
+ io = StringIO.new("", "r+:ascii-8bit")
485
+ io.extend(BMFF::BinaryAccessor)
486
+ io.write_uint64(0)
487
+ io.write_uint64(18446744073709551615)
488
+ io.write_uint64(9223372036854775808)
489
+ io.pos = 0
490
+ assert_equal("\x00\x00\x00\x00\x00\x00\x00\x00" + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" +
491
+ "\x80\x00\x00\x00\x00\x00\x00\x00", io.read)
492
+ end
493
+
494
+ def test_write_uint64_out_of_range
495
+ io = StringIO.new("", "r+:ascii-8bit")
496
+ io.extend(BMFF::BinaryAccessor)
497
+ assert_raises(RangeError) do
498
+ io.write_uint64(18446744073709551616)
499
+ end
500
+ assert_raises(RangeError) do
501
+ io.write_uint64(-1)
502
+ end
503
+ end
504
+
505
+ def test_write_uint64_invalid_value
506
+ io = StringIO.new("", "r+:ascii-8bit")
507
+ io.extend(BMFF::BinaryAccessor)
508
+ assert_raises(TypeError) do
509
+ io.write_uint64(0.1)
510
+ end
511
+ assert_raises(TypeError) do
512
+ io.write_uint64(nil)
513
+ end
514
+ assert_raises(TypeError) do
515
+ io.write_uint64("0")
516
+ end
517
+ assert_raises(TypeError) do
518
+ io.write_uint64(true)
519
+ end
520
+ assert_raises(TypeError) do
521
+ io.write_uint64(false)
522
+ end
523
+ end
524
+
525
+ def test_get_ascii
526
+ io = StringIO.new("abcdefgh", "r:ascii-8bit")
527
+ io.extend(BMFF::BinaryAccessor)
528
+ assert_equal("abcd", io.get_ascii(4))
529
+ assert_equal("efgh", io.get_ascii(4))
530
+ assert(io.eof?)
531
+ end
532
+
533
+ def test_get_ascii_null_terminated
534
+ io = StringIO.new("ab\x00\x00", "r:ascii-8bit")
535
+ io.extend(BMFF::BinaryAccessor)
536
+ assert_equal("ab\x00\x00", io.get_ascii(4))
537
+ assert(io.eof?)
538
+ end
539
+
540
+ def test_get_ascii_insufficient_data
541
+ io = StringIO.new("abc", "r:ascii-8bit")
542
+ io.extend(BMFF::BinaryAccessor)
543
+ assert_raises(EOFError) do
544
+ io.get_ascii(4)
545
+ end
546
+ end
547
+
548
+ def test_get_ascii_out_of_range
549
+ io = StringIO.new("abc", "r:ascii-8bit")
550
+ io.extend(BMFF::BinaryAccessor)
551
+ assert_raises(RangeError) do
552
+ io.get_ascii(0)
553
+ end
554
+ assert_raises(RangeError) do
555
+ io.get_ascii(-1)
556
+ end
557
+ end
558
+
559
+ def test_get_ascii_invalid_size
560
+ io = StringIO.new("abc", "r:ascii-8bit")
561
+ io.extend(BMFF::BinaryAccessor)
562
+ assert_raises(TypeError) do
563
+ io.get_ascii(1.0)
564
+ end
565
+ assert_raises(TypeError) do
566
+ io.get_ascii(nil)
567
+ end
568
+ assert_raises(TypeError) do
569
+ io.get_ascii("1")
570
+ end
571
+ assert_raises(TypeError) do
572
+ io.get_ascii(true)
573
+ end
574
+ assert_raises(TypeError) do
575
+ io.get_ascii(false)
576
+ end
577
+ end
578
+
579
+ def test_write_ascii
580
+ io = StringIO.new("", "r+:ascii-8bit")
581
+ io.extend(BMFF::BinaryAccessor)
582
+ io.write_ascii("")
583
+ io.write_ascii("a")
584
+ io.write_ascii("n\x00")
585
+ io.write_ascii("xyz")
586
+ io.pos = 0
587
+ assert_equal("an\x00xyz", io.read)
588
+ end
589
+
590
+ def test_write_ascii_invalid_value
591
+ io = StringIO.new("", "r+:ascii-8bit")
592
+ io.extend(BMFF::BinaryAccessor)
593
+ assert_raises(TypeError) do
594
+ io.write_ascii(0.1)
595
+ end
596
+ assert_raises(TypeError) do
597
+ io.write_ascii(nil)
598
+ end
599
+ assert_raises(TypeError) do
600
+ io.write_ascii(0)
601
+ end
602
+ assert_raises(TypeError) do
603
+ io.write_ascii(true)
604
+ end
605
+ assert_raises(TypeError) do
606
+ io.write_ascii(false)
607
+ end
608
+ end
609
+
610
+ def test_get_byte
611
+ io = StringIO.new("\x00\x01\x02\x03\x04\x05\x06\x07\xFF\xFE\xFD\xFC\xFB\xFA\xF9\xF8", "r:ascii-8bit")
612
+ io.extend(BMFF::BinaryAccessor)
613
+ assert_equal("\x00".force_encoding("ascii-8bit"), io.get_byte)
614
+ assert_equal("\x01\x02".force_encoding("ascii-8bit"), io.get_byte(2))
615
+ assert_equal("\x03\x04\x05".force_encoding("ascii-8bit"), io.get_byte(3))
616
+ assert_equal("\x06\x07\xFF\xFE".force_encoding("ascii-8bit"), io.get_byte(4))
617
+ assert_equal("\xFD\xFC\xFB\xFA\xF9".force_encoding("ascii-8bit"), io.get_byte(5))
618
+ assert_equal("\xF8".force_encoding("ascii-8bit"), io.get_byte)
619
+ assert(io.eof?)
620
+ end
621
+
622
+ def test_get_byte_insufficient_data
623
+ io = StringIO.new("\x00\x00", "r:ascii-8bit")
624
+ io.extend(BMFF::BinaryAccessor)
625
+ assert_raises(EOFError) do
626
+ io.get_byte(3)
627
+ end
628
+ end
629
+
630
+ def test_get_byte_out_of_range
631
+ io = StringIO.new("\x00\x00", "r:ascii-8bit")
632
+ io.extend(BMFF::BinaryAccessor)
633
+ assert_raises(RangeError) do
634
+ io.get_byte(0)
635
+ end
636
+ assert_raises(RangeError) do
637
+ io.get_byte(-1)
638
+ end
639
+ end
640
+
641
+ def test_get_byte_invalid_size
642
+ io = StringIO.new("\x00\x00", "r:ascii-8bit")
643
+ io.extend(BMFF::BinaryAccessor)
644
+ assert_raises(TypeError) do
645
+ io.get_byte(1.0)
646
+ end
647
+ assert_raises(TypeError) do
648
+ io.get_byte(nil)
649
+ end
650
+ assert_raises(TypeError) do
651
+ io.get_byte("1")
652
+ end
653
+ assert_raises(TypeError) do
654
+ io.get_byte(true)
655
+ end
656
+ assert_raises(TypeError) do
657
+ io.get_byte(false)
658
+ end
659
+ end
660
+
661
+ def test_write_byte
662
+ io = StringIO.new("", "r+:ascii-8bit")
663
+ io.extend(BMFF::BinaryAccessor)
664
+ io.write_byte("")
665
+ io.write_byte("\xFF\xFE\xFD")
666
+ io.write_byte("\x00\x01\x02\x03")
667
+ io.pos = 0
668
+ assert_equal("\xFF\xFE\xFD\x00\x01\x02\x03", io.read)
669
+ end
670
+
671
+ def test_write_byte_invalid_value
672
+ io = StringIO.new("", "r+:ascii-8bit")
673
+ io.extend(BMFF::BinaryAccessor)
674
+ assert_raises(TypeError) do
675
+ io.write_byte(0.1)
676
+ end
677
+ assert_raises(TypeError) do
678
+ io.write_byte(nil)
679
+ end
680
+ assert_raises(TypeError) do
681
+ io.write_byte(0)
682
+ end
683
+ assert_raises(TypeError) do
684
+ io.write_byte(true)
685
+ end
686
+ assert_raises(TypeError) do
687
+ io.write_byte(false)
688
+ end
689
+ end
690
+
691
+ def test_null_terminated_string_utf8
692
+ io = StringIO.new("ABCDEFG \xC3\x80\xC3\x81 \xE3\xBF\xB0\xE3\xBF\xB1\x00", "r:ascii-8bit")
693
+ io.extend(BMFF::BinaryAccessor)
694
+ actual = io.get_null_terminated_string
695
+ assert_equal(Encoding::UTF_8, actual.encoding)
696
+ assert_equal("ABCDEFG ÀÁ 㿰㿱", actual)
697
+ assert(io.eof?)
698
+ end
699
+
700
+ def test_null_terminated_string_shift_jis
701
+ io = StringIO.new("\x41\x42\x43\x44\x45\x46\x47\x20\x82\x60\x82\x61\x20\x82\xF0\x82\xF1\x00", "r:ascii-8bit")
702
+ io.extend(BMFF::BinaryAccessor)
703
+ actual = io.get_null_terminated_string
704
+ assert_equal(Encoding::Shift_JIS, actual.encoding)
705
+ assert_equal("ABCDEFG AB をん", actual.encode("UTF-8"))
706
+ assert(io.eof?)
707
+ end
708
+
709
+ def test_null_terminated_string_unknown_encoding
710
+ io = StringIO.new("\x41\x42\x43\x44\x45\x46\x47\x20\xA3\xC1\xA3\xC2\x20\xA4\xF2\xA4\xF3\x00", "r:ascii-8bit")
711
+ io.extend(BMFF::BinaryAccessor)
712
+ actual = io.get_null_terminated_string
713
+ assert_equal(Encoding::ASCII_8BIT, actual.encoding)
714
+ assert_equal("\x41\x42\x43\x44\x45\x46\x47\x20\xA3\xC1\xA3\xC2\x20\xA4\xF2\xA4\xF3".force_encoding("ASCII-8BIT"), actual.encode)
715
+ assert(io.eof?)
716
+ end
717
+
718
+ def test_null_terminated_string_with_max_byte
719
+ io = StringIO.new("ABCDEFGHIJKLMNOPQRSTUVWXYZ\x00", "r:ascii-8bit")
720
+ io.extend(BMFF::BinaryAccessor)
721
+ actual = io.get_null_terminated_string(27)
722
+ assert_equal(Encoding::UTF_8, actual.encoding)
723
+ assert_equal("ABCDEFGHIJKLMNOPQRSTUVWXYZ", actual)
724
+ assert(io.eof?)
725
+ end
726
+
727
+ def test_null_terminated_string_with_max_byte_long
728
+ io = StringIO.new("ABCDEFGHIJKLMNOPQRSTUVWXYZ\x00", "r:ascii-8bit")
729
+ io.extend(BMFF::BinaryAccessor)
730
+ actual = io.get_null_terminated_string(30)
731
+ assert_equal(Encoding::UTF_8, actual.encoding)
732
+ assert_equal("ABCDEFGHIJKLMNOPQRSTUVWXYZ", actual)
733
+ assert(io.eof?)
734
+ end
735
+
736
+ def test_null_terminated_string_with_max_byte_short
737
+ io = StringIO.new("ABCDEFGHIJKLMNOPQRSTUVWXYZ\x00", "r:ascii-8bit")
738
+ io.extend(BMFF::BinaryAccessor)
739
+ actual = io.get_null_terminated_string(16)
740
+ assert_equal(Encoding::UTF_8, actual.encoding)
741
+ assert_equal("ABCDEFGHIJKLMNOP", actual)
742
+ assert(!io.eof?)
743
+ end
744
+
745
+ def test_null_terminated_string_is_not_terminated
746
+ io = StringIO.new("ABCDEFGHIJKLMNOPQRSTUVWXYZ", "r:ascii-8bit")
747
+ io.extend(BMFF::BinaryAccessor)
748
+ actual = io.get_null_terminated_string
749
+ assert_equal(Encoding::UTF_8, actual.encoding)
750
+ assert_equal("ABCDEFGHIJKLMNOPQRSTUVWXYZ", actual)
751
+ assert(io.eof?)
752
+ end
753
+
754
+ def test_write_null_terminated_string
755
+ io = StringIO.new("", "r+:ascii-8bit")
756
+ io.extend(BMFF::BinaryAccessor)
757
+ io.write_null_terminated_string("ABCDEFG ÀÁ 㿰㿱")
758
+ io.write_null_terminated_string("À\x00")
759
+ io.pos = 0
760
+ assert_equal("ABCDEFG \xC3\x80\xC3\x81 \xE3\xBF\xB0\xE3\xBF\xB1\x00\xC3\x80\x00", io.read)
761
+ end
762
+
763
+ def test_write_null_terminated_string_invalid_value
764
+ io = StringIO.new("", "r+:ascii-8bit")
765
+ io.extend(BMFF::BinaryAccessor)
766
+ assert_raises(TypeError) do
767
+ io.write_null_terminated_string(0.1)
768
+ end
769
+ assert_raises(TypeError) do
770
+ io.write_null_terminated_string(nil)
771
+ end
772
+ assert_raises(TypeError) do
773
+ io.write_null_terminated_string(0)
774
+ end
775
+ assert_raises(TypeError) do
776
+ io.write_null_terminated_string(true)
777
+ end
778
+ assert_raises(TypeError) do
779
+ io.write_null_terminated_string(false)
780
+ end
781
+ end
782
+
783
+ def test_get_iso639_2_language
784
+ io = StringIO.new("\x15\xC7", "r:ascii-8bit")
785
+ io.extend(BMFF::BinaryAccessor)
786
+ assert_equal("eng", io.get_iso639_2_language)
787
+ assert(io.eof?)
788
+ end
789
+
790
+ def test_iso639_2_language_insufficient_data
791
+ io = StringIO.new("\x00", "r:ascii-8bit")
792
+ io.extend(BMFF::BinaryAccessor)
793
+ assert_raises(EOFError) do
794
+ io.get_iso639_2_language
795
+ end
796
+ end
797
+
798
+ def test_get_uuid
799
+ io = StringIO.new("\x00\x01\x02\x03\x04\x05\x06\x07\x80\x90\xA0\xB0\xC0\xD0\xE0\xF0", "r:ascii-8bit")
800
+ io.extend(BMFF::BinaryAccessor)
801
+ assert_equal("\x00\x01\x02\x03\x04\x05\x06\x07\x80\x90\xA0\xB0\xC0\xD0\xE0\xF0".force_encoding("ascii-8bit"), io.get_uuid)
802
+ assert(io.eof?)
803
+ end
804
+
805
+ end