bmff 0.0.1

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.
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