wavefile 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +21 -23
  3. data/README.markdown +27 -43
  4. data/lib/wavefile.rb +4 -1
  5. data/lib/wavefile/buffer.rb +7 -5
  6. data/lib/wavefile/chunk_readers.rb +1 -2
  7. data/lib/wavefile/chunk_readers/base_chunk_reader.rb +13 -0
  8. data/lib/wavefile/chunk_readers/data_chunk_reader.rb +12 -3
  9. data/lib/wavefile/chunk_readers/format_chunk_reader.rb +2 -10
  10. data/lib/wavefile/chunk_readers/riff_reader.rb +73 -26
  11. data/lib/wavefile/chunk_readers/sample_chunk_reader.rb +74 -0
  12. data/lib/wavefile/format.rb +13 -9
  13. data/lib/wavefile/reader.rb +15 -7
  14. data/lib/wavefile/sampler_info.rb +162 -0
  15. data/lib/wavefile/sampler_loop.rb +142 -0
  16. data/lib/wavefile/smpte_timecode.rb +61 -0
  17. data/lib/wavefile/writer.rb +7 -1
  18. data/test/fixtures/wave/invalid/data_chunk_ends_after_chunk_id.wav +0 -0
  19. data/test/fixtures/wave/invalid/data_chunk_has_incomplete_chunk_size.wav +0 -0
  20. data/test/fixtures/wave/invalid/data_chunk_truncated.wav +0 -0
  21. data/test/fixtures/wave/invalid/format_chunk_after_data_chunk.wav +0 -0
  22. data/test/fixtures/wave/invalid/incomplete_riff_format.wav +0 -0
  23. data/test/fixtures/wave/invalid/incomplete_riff_header.wav +1 -1
  24. data/test/fixtures/wave/invalid/no_format_chunk_size.wav +0 -0
  25. data/test/fixtures/wave/invalid/no_riff_format.wav +0 -0
  26. data/test/fixtures/wave/invalid/riff_chunk_has_incomplete_chunk_size.wav +1 -0
  27. data/test/fixtures/wave/invalid/smpl_chunk_empty.wav +0 -0
  28. data/test/fixtures/wave/invalid/smpl_chunk_fields_out_of_range.wav +0 -0
  29. data/test/fixtures/wave/invalid/smpl_chunk_loop_count_too_high.wav +0 -0
  30. data/test/fixtures/wave/invalid/smpl_chunk_truncated_sampler_specific_data.wav +0 -0
  31. data/test/fixtures/wave/invalid/truncated_smpl_chunk.wav +0 -0
  32. data/test/fixtures/wave/unsupported/bad_audio_format.wav +0 -0
  33. data/test/fixtures/wave/unsupported/bad_sample_rate.wav +0 -0
  34. data/test/fixtures/wave/unsupported/extensible_unsupported_subformat_guid.wav +0 -0
  35. data/test/fixtures/wave/unsupported/unsupported_audio_format.wav +0 -0
  36. data/test/fixtures/wave/unsupported/unsupported_bits_per_sample.wav +0 -0
  37. data/test/fixtures/wave/valid/valid_mono_pcm_16_44100_junk_chunk_final_chunk_missing_padding_byte.wav +0 -0
  38. data/test/fixtures/wave/valid/valid_mono_pcm_16_44100_junk_chunk_with_padding_byte.wav +0 -0
  39. data/test/fixtures/wave/valid/valid_mono_pcm_8_44100_with_padding_byte.wav +0 -0
  40. data/test/fixtures/wave/valid/valid_with_sample_chunk_after_data_chunk.wav +0 -0
  41. data/test/fixtures/wave/valid/valid_with_sample_chunk_after_data_chunk_and_data_chunk_has_padding_byte.wav +0 -0
  42. data/test/fixtures/wave/valid/valid_with_sample_chunk_before_data_chunk.wav +0 -0
  43. data/test/fixtures/wave/valid/valid_with_sample_chunk_no_loops.wav +0 -0
  44. data/test/fixtures/wave/valid/valid_with_sample_chunk_with_extra_unused_bytes.wav +0 -0
  45. data/test/fixtures/wave/valid/valid_with_sample_chunk_with_sampler_specific_data.wav +0 -0
  46. data/test/format_test.rb +4 -4
  47. data/test/reader_test.rb +266 -8
  48. data/test/sampler_info_test.rb +314 -0
  49. data/test/sampler_loop_test.rb +215 -0
  50. data/test/smpte_timecode_test.rb +103 -0
  51. data/test/writer_test.rb +1 -1
  52. metadata +30 -6
  53. data/lib/wavefile/chunk_readers/generic_chunk_reader.rb +0 -15
  54. data/lib/wavefile/chunk_readers/riff_chunk_reader.rb +0 -19
@@ -0,0 +1,314 @@
1
+ require 'minitest/autorun'
2
+ require 'wavefile.rb'
3
+
4
+ include WaveFile
5
+
6
+ class SamplerInfoTest < Minitest::Test
7
+ VALID_32_BIT_INTEGER_TEST_VALUES = [0, 10, 4_294_967_295]
8
+ INVALID_32_BIT_INTEGER_TEST_VALUES = ["dsfsfsdf", :foo, -1, 4_294_967_296, 2.5, 2.0, [10], nil]
9
+
10
+ def test_missing_keywords
11
+ assert_raises(ArgumentError) { SamplerInfo.new }
12
+ end
13
+
14
+ def test_valid_manufacturer_id
15
+ VALID_32_BIT_INTEGER_TEST_VALUES.each do |valid_value|
16
+ sampler_info = SamplerInfo.new(manufacturer_id: valid_value,
17
+ product_id: 0,
18
+ sample_nanoseconds: 22675,
19
+ midi_note: 60,
20
+ fine_tuning_cents: 0.0,
21
+ smpte_format: 0,
22
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
23
+ loops: [],
24
+ sampler_specific_data: "")
25
+
26
+ assert_equal(valid_value, sampler_info.manufacturer_id)
27
+ end
28
+ end
29
+
30
+ def test_invalid_manufacturer_id
31
+ INVALID_32_BIT_INTEGER_TEST_VALUES.each do |invalid_value|
32
+ assert_raises(InvalidSamplerInfoError) do
33
+ SamplerInfo.new(manufacturer_id: invalid_value,
34
+ product_id: 0,
35
+ sample_nanoseconds: 22675,
36
+ midi_note: 60,
37
+ fine_tuning_cents: 0.0,
38
+ smpte_format: 0,
39
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
40
+ loops: [],
41
+ sampler_specific_data: "")
42
+ end
43
+ end
44
+ end
45
+
46
+ def test_valid_product_id
47
+ VALID_32_BIT_INTEGER_TEST_VALUES.each do |valid_value|
48
+ sampler_info = SamplerInfo.new(manufacturer_id: 0,
49
+ product_id: valid_value,
50
+ sample_nanoseconds: 22675,
51
+ midi_note: 60,
52
+ fine_tuning_cents: 0.0,
53
+ smpte_format: 0,
54
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
55
+ loops: [],
56
+ sampler_specific_data: "")
57
+
58
+ assert_equal(valid_value, sampler_info.product_id)
59
+ end
60
+ end
61
+
62
+ def test_invalid_product_id
63
+ INVALID_32_BIT_INTEGER_TEST_VALUES.each do |invalid_value|
64
+ assert_raises(InvalidSamplerInfoError) do
65
+ SamplerInfo.new(manufacturer_id: 0,
66
+ product_id: invalid_value,
67
+ sample_nanoseconds: 22675,
68
+ midi_note: 60,
69
+ fine_tuning_cents: 0.0,
70
+ smpte_format: 0,
71
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
72
+ loops: [],
73
+ sampler_specific_data: "")
74
+ end
75
+ end
76
+ end
77
+
78
+ def test_valid_sample_nanoseconds
79
+ VALID_32_BIT_INTEGER_TEST_VALUES.each do |valid_value|
80
+ sampler_info = SamplerInfo.new(manufacturer_id: 0,
81
+ product_id: 0,
82
+ sample_nanoseconds: valid_value,
83
+ midi_note: 60,
84
+ fine_tuning_cents: 0.0,
85
+ smpte_format: 0,
86
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
87
+ loops: [],
88
+ sampler_specific_data: "")
89
+
90
+ assert_equal(valid_value, sampler_info.sample_nanoseconds)
91
+ end
92
+ end
93
+
94
+ def test_invalid_sample_nanoseconds
95
+ INVALID_32_BIT_INTEGER_TEST_VALUES.each do |invalid_value|
96
+ assert_raises(InvalidSamplerInfoError) do
97
+ SamplerInfo.new(manufacturer_id: 0,
98
+ product_id: 0,
99
+ sample_nanoseconds: invalid_value,
100
+ midi_note: 60,
101
+ fine_tuning_cents: 0.0,
102
+ smpte_format: 0,
103
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
104
+ loops: [],
105
+ sampler_specific_data: "")
106
+ end
107
+ end
108
+ end
109
+
110
+ def test_valid_midi_note
111
+ VALID_32_BIT_INTEGER_TEST_VALUES.each do |valid_value|
112
+ sampler_info = SamplerInfo.new(manufacturer_id: 0,
113
+ product_id: 0,
114
+ sample_nanoseconds: 22675,
115
+ midi_note: valid_value,
116
+ fine_tuning_cents: 0.0,
117
+ smpte_format: 0,
118
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
119
+ loops: [],
120
+ sampler_specific_data: "")
121
+
122
+ assert_equal(valid_value, sampler_info.midi_note)
123
+ end
124
+ end
125
+
126
+ def test_invalid_midi_note
127
+ INVALID_32_BIT_INTEGER_TEST_VALUES.each do |invalid_value|
128
+ assert_raises(InvalidSamplerInfoError) do
129
+ SamplerInfo.new(manufacturer_id: 0,
130
+ product_id: 0,
131
+ sample_nanoseconds: 0,
132
+ midi_note: invalid_value,
133
+ fine_tuning_cents: 0.0,
134
+ smpte_format: 0,
135
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
136
+ loops: [],
137
+ sampler_specific_data: "")
138
+ end
139
+ end
140
+ end
141
+
142
+ def test_valid_fine_tuning_cents
143
+ [0, 0.0, 0.5, 50, 50.0, 50.5, 99.99999999999999, 0.0000000000000001].each do |valid_value|
144
+ sampler_info = SamplerInfo.new(manufacturer_id: 0,
145
+ product_id: 0,
146
+ sample_nanoseconds: 0,
147
+ midi_note: 60,
148
+ fine_tuning_cents: valid_value,
149
+ smpte_format: 0,
150
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
151
+ loops: [],
152
+ sampler_specific_data: "")
153
+
154
+ assert_equal(valid_value, sampler_info.fine_tuning_cents)
155
+ end
156
+ end
157
+
158
+ def test_invalid_fine_tuning_cents
159
+ ["dsfsfsdf", :foo, -1, 4_294_967_296, nil, [50], 100, 100.0, 100.00000000001, -0.0000000000001].each do |invalid_value|
160
+ assert_raises(InvalidSamplerInfoError) do
161
+ SamplerInfo.new(manufacturer_id: 0,
162
+ product_id: 0,
163
+ sample_nanoseconds: 0,
164
+ midi_note: 60,
165
+ fine_tuning_cents: invalid_value,
166
+ smpte_format: 0,
167
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
168
+ loops: [],
169
+ sampler_specific_data: "")
170
+ end
171
+ end
172
+ end
173
+
174
+ def test_valid_smpte_format
175
+ VALID_32_BIT_INTEGER_TEST_VALUES.each do |valid_value|
176
+ sampler_info = SamplerInfo.new(manufacturer_id: 0,
177
+ product_id: 0,
178
+ sample_nanoseconds: 22675,
179
+ midi_note: 60,
180
+ fine_tuning_cents: 0.0,
181
+ smpte_format: valid_value,
182
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
183
+ loops: [],
184
+ sampler_specific_data: "")
185
+
186
+ assert_equal(valid_value, sampler_info.smpte_format)
187
+ end
188
+ end
189
+
190
+ def test_invalid_smpte_format
191
+ INVALID_32_BIT_INTEGER_TEST_VALUES.each do |invalid_value|
192
+ assert_raises(InvalidSamplerInfoError) do
193
+ SamplerInfo.new(manufacturer_id: 0,
194
+ product_id: 0,
195
+ sample_nanoseconds: 22675,
196
+ midi_note: 60,
197
+ fine_tuning_cents: 0.0,
198
+ smpte_format: invalid_value,
199
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
200
+ loops: [],
201
+ sampler_specific_data: "")
202
+ end
203
+ end
204
+ end
205
+
206
+ def test_valid_smpte_offset
207
+ smpte_timecode = SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0)
208
+
209
+ [smpte_timecode].each do |valid_value|
210
+ sampler_info = SamplerInfo.new(manufacturer_id: 0,
211
+ product_id: 0,
212
+ sample_nanoseconds: 22675,
213
+ midi_note: 60,
214
+ fine_tuning_cents: 0.0,
215
+ smpte_format: 0,
216
+ smpte_offset: smpte_timecode,
217
+ loops: [],
218
+ sampler_specific_data: "")
219
+
220
+ assert_equal(valid_value, sampler_info.smpte_offset)
221
+ end
222
+ end
223
+
224
+ def test_invalid_smpte_offset
225
+ smpte_timecode = SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0)
226
+
227
+ [1, 1.5, false, ["string"], { key: :value}, [smpte_timecode = SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0), "string"]].each do |invalid_value|
228
+ assert_raises(InvalidSamplerInfoError) do
229
+ SamplerInfo.new(manufacturer_id: 0,
230
+ product_id: 0,
231
+ sample_nanoseconds: 22675,
232
+ midi_note: 60,
233
+ fine_tuning_cents: 0.0,
234
+ smpte_format: 0,
235
+ smpte_offset: invalid_value,
236
+ loops: [],
237
+ sampler_specific_data: "")
238
+ end
239
+ end
240
+ end
241
+
242
+ def test_valid_loops
243
+ loop1 = SamplerLoop.new(id: 0, type: :forward, start_sample_frame: 0, end_sample_frame: 0, fraction: 0.0, play_count: 1)
244
+ loop2 = SamplerLoop.new(id: 0, type: :forward, start_sample_frame: 0, end_sample_frame: 0, fraction: 0.0, play_count: 1)
245
+
246
+ [[], [loop1], [loop1, loop2]].each do |valid_value|
247
+ sampler_info = SamplerInfo.new(manufacturer_id: 0,
248
+ product_id: 0,
249
+ sample_nanoseconds: 22675,
250
+ midi_note: 60,
251
+ fine_tuning_cents: 0.0,
252
+ smpte_format: 0,
253
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
254
+ loops: valid_value,
255
+ sampler_specific_data: "")
256
+
257
+ assert_equal(valid_value, sampler_info.loops)
258
+ end
259
+ end
260
+
261
+ def test_invalid_loops
262
+ loop1 = SamplerLoop.new(id: 0, type: :forward, start_sample_frame: 0, end_sample_frame: 0, fraction: 0.0, play_count: 1)
263
+
264
+ [1, 1.5, false, ["string"], { key: :value}, [loop1, "string"]].each do |invalid_value|
265
+ assert_raises(InvalidSamplerInfoError) do
266
+ SamplerInfo.new(manufacturer_id: 0,
267
+ product_id: 0,
268
+ sample_nanoseconds: 22675,
269
+ midi_note: 60,
270
+ fine_tuning_cents: 0.0,
271
+ smpte_format: 0,
272
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
273
+ loops: invalid_value,
274
+ sampler_specific_data: "")
275
+ end
276
+ end
277
+ end
278
+
279
+ def test_valid_sampler_specific_data
280
+ ["", "1234"].each do |valid_value|
281
+ sampler_info = SamplerInfo.new(manufacturer_id: 0,
282
+ product_id: 0,
283
+ sample_nanoseconds: 22675,
284
+ midi_note: 60,
285
+ fine_tuning_cents: 0.0,
286
+ smpte_format: 0,
287
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
288
+ loops: [],
289
+ sampler_specific_data: valid_value)
290
+
291
+ if valid_value.nil?
292
+ assert_nil(sampler_info.sampler_specific_data)
293
+ else
294
+ assert_equal(valid_value, sampler_info.sampler_specific_data)
295
+ end
296
+ end
297
+ end
298
+
299
+ def test_invalid_sampler_specific_data
300
+ [1, 1.5, false, ["string"], { key: :value}].each do |invalid_value|
301
+ assert_raises(InvalidSamplerInfoError) do
302
+ SamplerInfo.new(manufacturer_id: 0,
303
+ product_id: 0,
304
+ sample_nanoseconds: 22675,
305
+ midi_note: 60,
306
+ fine_tuning_cents: 0.0,
307
+ smpte_format: 0,
308
+ smpte_offset: SMPTETimecode.new(hours: 0, minutes: 0, seconds: 0, frames: 0),
309
+ loops: [],
310
+ sampler_specific_data: invalid_value)
311
+ end
312
+ end
313
+ end
314
+ end
@@ -0,0 +1,215 @@
1
+ require 'minitest/autorun'
2
+ require 'wavefile.rb'
3
+
4
+ include WaveFile
5
+
6
+ class SamplerLoopTest < Minitest::Test
7
+ def test_missing_keywords
8
+ assert_raises(ArgumentError) { SamplerLoop.new }
9
+ end
10
+
11
+ def test_valid_id
12
+ [0, 10, 4_294_967_295].each do |valid_value|
13
+ sampler_loop = SamplerLoop.new(id: valid_value,
14
+ type: :forward,
15
+ start_sample_frame: 0,
16
+ end_sample_frame: 0,
17
+ fraction: 0.0,
18
+ play_count: 0)
19
+
20
+ assert_equal(valid_value, sampler_loop.id)
21
+ end
22
+ end
23
+
24
+ def test_invalid_id
25
+ ["dsfsfsdf", :foo, -1, 4_294_967_296, 2.5, 2.0, [10], nil].each do |invalid_value|
26
+ assert_raises(InvalidSamplerLoopError) do
27
+ SamplerLoop.new(id: invalid_value,
28
+ type: :forward,
29
+ start_sample_frame: 0,
30
+ end_sample_frame: 0,
31
+ fraction: 0.0,
32
+ play_count: 0)
33
+ end
34
+ end
35
+ end
36
+
37
+ def test_valid_type
38
+ [:forward, :alternating, :backward].each do |valid_value|
39
+ sampler_loop = SamplerLoop.new(id: 0,
40
+ type: valid_value,
41
+ start_sample_frame: 0,
42
+ end_sample_frame: 0,
43
+ fraction: 0.0,
44
+ play_count: 0)
45
+
46
+ assert_equal(valid_value, sampler_loop.type)
47
+ end
48
+
49
+ sampler_loop = SamplerLoop.new(id: 0,
50
+ type: 0,
51
+ start_sample_frame: 0,
52
+ end_sample_frame: 0,
53
+ fraction: 0.0,
54
+ play_count: 0)
55
+ assert_equal(:forward, sampler_loop.type)
56
+
57
+ sampler_loop = SamplerLoop.new(id: 0,
58
+ type: 1,
59
+ start_sample_frame: 0,
60
+ end_sample_frame: 0,
61
+ fraction: 0.0,
62
+ play_count: 0)
63
+ assert_equal(:alternating, sampler_loop.type)
64
+
65
+ sampler_loop = SamplerLoop.new(id: 0,
66
+ type: 2,
67
+ start_sample_frame: 0,
68
+ end_sample_frame: 0,
69
+ fraction: 0.0,
70
+ play_count: 0)
71
+ assert_equal(:backward, sampler_loop.type)
72
+
73
+ sampler_loop = SamplerLoop.new(id: 0,
74
+ type: 3,
75
+ start_sample_frame: 0,
76
+ end_sample_frame: 0,
77
+ fraction: 0.0,
78
+ play_count: 0)
79
+ assert_equal(3, sampler_loop.type)
80
+
81
+ sampler_loop = SamplerLoop.new(id: 0,
82
+ type: 4_294_967_295,
83
+ start_sample_frame: 0,
84
+ end_sample_frame: 0,
85
+ fraction: 0.0,
86
+ play_count: 0)
87
+ assert_equal(4_294_967_295, sampler_loop.type)
88
+ end
89
+
90
+ def test_invalid_type
91
+ ["dsfsfsdf", :foo, -1, :alternatin, 4_294_967_296, 2.5, 2.0, [:forward], nil].each do |invalid_value|
92
+ assert_raises(InvalidSamplerLoopError) do
93
+ SamplerLoop.new(id: 0,
94
+ type: invalid_value,
95
+ start_sample_frame: 0,
96
+ end_sample_frame: 0,
97
+ fraction: 0.0,
98
+ play_count: 0)
99
+ end
100
+ end
101
+ end
102
+
103
+ def test_valid_start_sample_frame
104
+ [0, 10, 4_294_967_295].each do |valid_value|
105
+ sampler_loop = SamplerLoop.new(id: 0,
106
+ type: :forward,
107
+ start_sample_frame: valid_value,
108
+ end_sample_frame: 0,
109
+ fraction: 0.0,
110
+ play_count: 0)
111
+
112
+ assert_equal(valid_value, sampler_loop.start_sample_frame)
113
+ end
114
+ end
115
+
116
+ def test_invalid_start_sample_frame
117
+ ["dsfsfsdf", :foo, -1, 4_294_967_296, 2.5, 2.0, [10], nil].each do |invalid_value|
118
+ assert_raises(InvalidSamplerLoopError) do
119
+ SamplerLoop.new(id: 0,
120
+ type: :forward,
121
+ start_sample_frame: invalid_value,
122
+ end_sample_frame: 0,
123
+ fraction: 0.0,
124
+ play_count: 0)
125
+ end
126
+ end
127
+ end
128
+
129
+ def test_valid_end_sample_frame
130
+ [0, 10, 4_294_967_295].each do |valid_value|
131
+ sampler_loop = SamplerLoop.new(id: 0,
132
+ type: :forward,
133
+ start_sample_frame: 0,
134
+ end_sample_frame: valid_value,
135
+ fraction: 0.0,
136
+ play_count: 0)
137
+
138
+ assert_equal(valid_value, sampler_loop.end_sample_frame)
139
+ end
140
+ end
141
+
142
+ def test_invalid_end_sample_frame
143
+ ["dsfsfsdf", :foo, -1, 4_294_967_296, 2.5, 2.0, [10], nil].each do |invalid_value|
144
+ assert_raises(InvalidSamplerLoopError) do
145
+ SamplerLoop.new(id: 0,
146
+ type: :forward,
147
+ start_sample_frame: 0,
148
+ end_sample_frame: invalid_value,
149
+ fraction: 0.0,
150
+ play_count: 0)
151
+ end
152
+ end
153
+ end
154
+
155
+ def test_valid_fraction
156
+ [0, 0.0, 0.5, 0.99999999999999, 0.0000000000000001].each do |valid_value|
157
+ sampler_loop = SamplerLoop.new(id: 0,
158
+ type: :forward,
159
+ start_sample_frame: 0,
160
+ end_sample_frame: 0,
161
+ fraction: valid_value,
162
+ play_count: 0)
163
+
164
+ assert_equal(valid_value, sampler_loop.fraction)
165
+ end
166
+ end
167
+
168
+ def test_invalid_fraction
169
+ ["dsfsfsdf", :foo, -1, 4_294_967_296, 2.5, 2.0, nil, [0.5], 1, 1.0, 1.00000000001, -0.0000000000001].each do |invalid_value|
170
+ assert_raises(InvalidSamplerLoopError) do
171
+ SamplerLoop.new(id: 0,
172
+ type: :forward,
173
+ start_sample_frame: 0,
174
+ end_sample_frame: 0,
175
+ fraction: invalid_value,
176
+ play_count: 0)
177
+ end
178
+ end
179
+ end
180
+
181
+ def test_valid_play_count
182
+ [10, 4_294_967_295, Float::INFINITY].each do |valid_value|
183
+ sampler_loop = SamplerLoop.new(id: 0,
184
+ type: :forward,
185
+ start_sample_frame: 0,
186
+ end_sample_frame: 0,
187
+ fraction: 0.0,
188
+ play_count: valid_value)
189
+
190
+ assert_equal(valid_value, sampler_loop.play_count)
191
+ end
192
+
193
+ sampler_loop = SamplerLoop.new(id: 0,
194
+ type: :forward,
195
+ start_sample_frame: 0,
196
+ end_sample_frame: 0,
197
+ fraction: 0.0,
198
+ play_count: 0)
199
+
200
+ assert_equal(Float::INFINITY, sampler_loop.play_count)
201
+ end
202
+
203
+ def test_invalid_play_count
204
+ ["dsfsfsdf", :foo, -1, 4_294_967_296, 2.5, 2.0, [10], nil].each do |invalid_value|
205
+ assert_raises(InvalidSamplerLoopError) do
206
+ SamplerLoop.new(id: 0,
207
+ type: :forward,
208
+ start_sample_frame: 0,
209
+ end_sample_frame: 0,
210
+ fraction: 0.0,
211
+ play_count: invalid_value)
212
+ end
213
+ end
214
+ end
215
+ end