root/branches/transport_redesign_2/test/t_TransportPosition.cpp @ 1153

Revision 1153, 23.5 KB (checked in by gabriel@…, 4 years ago)

Refactor some of the macros for tests and collect them into test_utils.h.

Line 
1/*
2 * Hydrogen
3 * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net]
4 *
5 * http://www.hydrogen-music.org
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY, without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 *
21 */
22
23#include <hydrogen/TransportPosition.h>
24#include <cmath>
25
26#define THIS_NAMESPACE t_TransportPosition
27#include "test_macros.h"
28#include "test_utils.h"
29
30using namespace H2Core;
31
32namespace THIS_NAMESPACE
33{
34    struct Fixture
35    {
36        TransportPosition p;  // This is the "normal" one.
37        TransportPosition x;  // This one has an odd setup.
38
39        Fixture() : p() {
40            p.frame_rate = 48000;
41            p.beats_per_bar = 4;
42            p.beat_type = 4;
43            p.ticks_per_beat = 192;
44            p.beats_per_minute = 120.0;
45            // MEMO: p.frames_per_tick() == 125.0
46
47            // x init.
48            x.state = TransportPosition::ROLLING;
49            x.new_position = true;
50            x.frame = 8273901;
51            x.frame_rate = 196123;
52            x.bar = 349;
53            x.beat = 5;
54            x.tick = 18;
55            x.bbt_offset = 115;
56            x.bar_start_tick = 349;
57            x.beats_per_bar = 7;
58            x.beat_type = 8;
59            x.ticks_per_beat = 99;
60            x.beats_per_minute = 543.2;
61            // MEMO: x.frames_per_tick() == 218.81889588075154
62        }
63
64        ~Fixture() {}
65    };
66
67} // namespace THIS_NAMESPACE
68
69using namespace THIS_NAMESPACE;
70
71TEST_BEGIN( Fixture );
72
73TEST_CASE( 000_defaults )
74{
75    // Test the defaults
76    CK( p.state == TransportPosition::STOPPED );
77    CK( p.new_position == true );
78    CK( p.frame == 0 );
79    CK( p.bar == 1 );
80    CK( p.beat == 1 );
81    CK( p.tick == 0 );
82    CK( p.bbt_offset == 0 );
83    CK( p.bar_start_tick == 0 );
84}
85
86TEST_CASE( 010_copy_constructor )
87{
88    TransportPosition y, z;
89
90    CK( y.state == TransportPosition::STOPPED );
91    CK( y.new_position == true );
92    CK( y.frame == 0 );
93    CK( y.bar == 1 );
94    CK( y.beat == 1 );
95    CK( y.tick == 0 );
96    CK( y.bbt_offset == 0 );
97    CK( y.bar_start_tick == 0 );
98
99    CK( z.state == TransportPosition::STOPPED );
100    CK( z.new_position == true );
101    CK( z.frame == 0 );
102    CK( z.bar == 1 );
103    CK( z.beat == 1 );
104    CK( z.tick == 0 );
105    CK( z.bbt_offset == 0 );
106    CK( z.bar_start_tick == 0 );
107
108    p.frame = 12345;
109    p.bar = 21;
110    p.beat = 39;
111    p.tick = -1;
112    y = p;
113    CK( 12345 == y.frame );
114    CK( 21 == y.bar );
115    CK( -1 == y.tick );
116    p.tick = 5;
117    y.tick = 123;
118    CK( 5 == p.tick );
119    CK( 123 == y.tick );
120
121    z = x;
122    CK( TransportPosition::ROLLING == z.state );
123    CK( true == z.new_position );
124    CK( 8273901 == z.frame );
125    CK( 196123 == z.frame_rate );
126    CK( 349 == z.bar );
127    CK( 5 == z.beat );
128    CK( 18 == z.tick );
129    CK( 115 == z.bbt_offset );
130    CK( 349 == z.bar_start_tick );
131    CK( 7 == z.beats_per_bar );
132    CK( 8 == z.beat_type );
133    CK( 99 == z.ticks_per_beat );
134    CK( 543.2 == z.beats_per_minute );
135}
136
137TEST_CASE( 020_frames_per_tick )
138{
139    CK( p.frames_per_tick() == 125.0 );
140
141    p.frame_rate = 123456;
142    p.ticks_per_beat = 48;
143    p.beats_per_minute = 33.12;
144    CK( round(p.frames_per_tick()) == 4659.0 );
145
146    CK( round(x.frames_per_tick()*100.0) == 21882.0 );
147}
148
149TEST_CASE( 030_tick_in_bar )
150{
151    CK(p.tick_in_bar() == 0);
152    p.tick = 191;
153    CK(p.tick_in_bar() == 191);
154    p.beat = 2;
155    CK(p.tick_in_bar() == 383);
156    p.bar = 9;
157    CK(p.tick_in_bar() == 383);
158
159    CK(x.tick_in_bar() == 414);
160}
161
162TEST_CASE( 040_normalize )
163{
164    TransportPosition a;
165    double frame;
166
167    // NOTE: normalize() only changes the frame position if it adjusts
168    // bbt_offset.
169
170    a = p;
171    a.tick += 192 * 6 + 101;
172    a.normalize();
173    CK( 2 == a.bar );
174    CK( 3 == a.beat );
175    CK( 101 == a.tick );
176    CK( 192 * 4 == a.bar_start_tick );
177    CK( H2TEST_DRIFT(0, a.frame, 1) );
178
179    a.beat -= 4;
180    a.normalize();
181    CK( 1 == a.bar );
182    CK( 3 == a.beat );
183    CK( 101 == a.tick );
184    CK( 0 == a.bar_start_tick );
185    CK( H2TEST_DRIFT(0, a.frame, 2) );
186
187    a.bar += 5;
188    a.normalize();
189    CK( 6 == a.bar );
190    CK( 3 == a.beat );
191    CK( 101 == a.tick );
192    CK( 0 == a.bar_start_tick ); // If you manually change bar, you also have
193                                 // to manually adjust bar_start_tick
194    CK( H2TEST_DRIFT(0, a.frame, 3) );
195
196    a = p;
197    frame = a.frame;
198    a.bbt_offset = 6 * 192 * 125 + 50;
199    //frame += a.bbt_offset - 50;
200    a.normalize();
201    CK( 2 == a.bar );
202    CK( 3 == a.beat );
203    CK( 0 == a.tick );
204    CK( H2TEST_DRIFT(50.0, a.bbt_offset, 1) );
205    CK( 192 * 4 == a.bar_start_tick );
206    CK( H2TEST_DRIFT(frame, a.frame, 1) );
207
208    a = x;
209    frame = a.frame;
210    a.tick -= 99 * 12 + 65;
211    a.normalize();
212    CK( 347 == a.bar );
213    CK( 6 == a.beat );
214    CK( 52 == a.tick );
215    CK( 115 == a.bbt_offset );
216    CK( 0 == a.bar_start_tick );
217    CK( H2TEST_DRIFT(frame, a.frame, 1) );
218
219    a = x;
220    frame = a.frame;
221    a.beat += 13;
222    a.normalize();
223    CK( 351 == a.bar );
224    CK( 4 == a.beat );
225    CK( 18 == a.tick );
226    CK( 115 == a.bbt_offset );
227    CK( 349 + 2 * 7 * 99 == a.bar_start_tick );
228    CK( H2TEST_DRIFT(frame, a.frame, 1) );
229
230    a = x;
231    a.bar_start_tick = 70000;
232    a.bar -= 11;
233    a.normalize();  // Does not change bar start tick
234    CK( 338 == a.bar );
235    CK( 5 == a.beat );
236    CK( 18 == a.tick );
237    CK( 115 == a.bbt_offset );
238    CK( 70000 == a.bar_start_tick );
239
240    a = x;                // 349:5.18.115 (70000)  349.59816096502567
241    a.bar_start_tick = 70000;
242    frame = a.frame;
243    a.bar += 3;           // 352:5.18.115 (70000)  352.59816096502567
244    a.beat -= 29;         // 348:4.18.115 (67228)  348.45530382216856
245    a.tick += 999;        // 349:7.27.115 (67921)  349.89686226372697
246    a.bbt_offset += 3114; // 349:7.41.165 (67921)  349.91739754005869
247    // frame += 3114.0 - 165.0 + 115.0;
248    a.normalize();
249    CK( 349 == a.bar );
250    CK( 7 == a.beat );
251    CK( 41 == a.tick );
252    CK( 165 == a.bbt_offset );
253    CK( 67921 == a.bar_start_tick );
254    CK( H2TEST_DRIFT(frame, a.frame, 1) );   
255}
256
257TEST_CASE( 050_increment )
258{
259    double frames_per_tick = double(p.frame_rate) * (60.0/p.beats_per_minute) / p.ticks_per_beat;
260    int k;
261
262    CK( p.frame == 0 );
263    double frame = 0.0;
264    for( k=1 ; (unsigned)k<p.ticks_per_beat ; ++k ) {
265        ++p;
266        frame += frames_per_tick;
267        CK( 1 == p.bar );
268        CK( 1 == p.beat );         
269        CK( k == p.tick );
270        CK( H2TEST_DRIFT(frame, p.frame, 1) );
271    }
272
273    CK( p.tick == 191 );
274    ++p;
275    frame += frames_per_tick;
276    CK( 1 == p.bar );
277    CK( 2 == p.beat );
278    CK( 0 == p.tick );
279    CK( H2TEST_DRIFT(frame, p.frame, 2) );
280    ++p;
281    frame += frames_per_tick;
282    CK( 1 == p.bar );
283    CK( 2 == p.beat );
284    CK( 1 == p.tick );
285    CK( H2TEST_DRIFT(frame, p.frame, 3) );
286    p.bar = 99;
287    p.beat = 3;
288    ++p;
289    frame += frames_per_tick;
290    CK( 99 == p.bar );
291    CK( 3 == p.beat );
292    CK( 2 == p.tick );
293    CK( H2TEST_DRIFT(frame, p.frame, 4) );
294
295    // Tests with 'x'
296    frame = x.frame;
297    frames_per_tick = x.frames_per_tick();
298    for( k=x.tick+1 ; (unsigned)k < x.ticks_per_beat ; ++k ) {
299        ++x;
300        frame += frames_per_tick;
301        CK( 349 == x.bar );
302        CK( 5 == x.beat );
303        CK( k == x.tick );
304        CK( 115 == x.bbt_offset );
305        CK( H2TEST_DRIFT( frame, x.frame, k ) );
306    }
307    CK( x.tick == 98 );
308    ++x;
309    frame += frames_per_tick;
310    CK( 349 == x.bar );
311    CK( 6 == x.beat );
312    CK( 0 == x.tick );
313    CK( 115 == x.bbt_offset );
314    CK( H2TEST_DRIFT( frame, x.frame, k+1 ) );
315
316    x.beat = 7;
317    x.tick = 98;
318    ++x;
319    frame += frames_per_tick;
320    CK( 350 == x.bar );
321    CK( 1 == x.beat );
322    CK( 0 == x.tick );
323    CK( 115 == x.bbt_offset );
324    CK( H2TEST_DRIFT( frame, x.frame, k+2 ) );
325    BOOST_MESSAGE( "++ drift = " << (frame - x.frame) );
326}
327
328TEST_CASE( 060_decrement )
329{
330    --p;
331    CK( 0 == p.frame );
332    CK( 1 == p.bar );
333    CK( 1 == p.beat );
334    CK( 0 == p.tick );
335    CK( 0 == p.bbt_offset );
336    CK( 0 == p.bar_start_tick );
337    ++p;
338    --p;
339    CK( 0 == p.frame );
340    CK( 1 == p.bar );
341    CK( 1 == p.beat );
342    CK( 0 == p.tick );
343    CK( 0 == p.bbt_offset );
344    CK( 0 == p.bar_start_tick );
345
346    p.bar = 5;
347    p.beat = 2;
348    p.tick = 1;
349    --p; --p;
350    CK( 0 == p.frame );
351    CK( 5 == p.bar );
352    CK( 1 == p.beat );
353    CK( 191 == p.tick );
354
355    double frame = 0.0;
356    double fpt = p.frames_per_tick();
357    p.frame = 1000.0;
358    p.bar = 5;
359    p.beat = 2;
360    p.tick = 1;
361    frame = p.frame;
362    --p; --p;
363    frame -= 2.0 * fpt;
364    CK( frame >= 0.0 );
365    CK( H2TEST_DRIFT(frame, p.frame, 2) );
366    CK( 5 == p.bar );
367    CK( 1 == p.beat );
368    CK( 191 == p.tick );
369
370    frame = 100000.0;
371    p.frame = frame;
372    p.bar = 100;
373    p.beat = 1;
374    p.tick = 0;
375    int k = p.ticks_per_beat * p.beats_per_bar;
376    frame -= fpt * k;
377    while( k > 0 ) {
378        --k; --p;
379    }
380    double drift = fabs( frame - double(p.frame) );
381    BOOST_MESSAGE( "-- drift @ 768 = " << drift );
382    CK( fabs(drift) < 10.0 );
383    CK( p.bar == 99 );
384    CK( p.beat == 1 );
385    CK( p.tick == 0 );
386
387    // Using the 'x' object
388    fpt = x.frames_per_tick();
389    frame = x.frame;
390    --x;
391    frame -= fpt;
392    CK( fabs(frame - x.frame) <= 1.0 );
393
394    for( k=2374 ; k > 0 ; --k ) --x;
395    frame -= fpt * 2374.0;
396    drift = frame - double(x.frame);
397    BOOST_MESSAGE( "-- drift @ 2375 = " << drift );
398    CK( fabs(drift) < 50.0 );
399    CK( 346 == x.bar );
400    CK( 2 == x.beat );
401    CK( 19 == x.tick );
402       
403}
404
405TEST_CASE( 070_floor )
406{
407    p.floor(TransportPosition::TICK);
408    CK( 1 == p.bar );
409    CK( 1 == p.beat );
410    CK( 0 == p.tick );
411    CK( 0 == p.frame );
412    p.floor(TransportPosition::BEAT);
413    CK( 1 == p.bar );
414    CK( 1 == p.beat );
415    CK( 0 == p.tick );
416    CK( 0 == p.frame );
417    p.floor(TransportPosition::BAR);
418    CK( 1 == p.bar );
419    CK( 1 == p.beat );
420    CK( 0 == p.tick );
421    CK( 0 == p.frame );
422
423    double fpt = p.frames_per_tick();
424    p.tick = 1;
425    p.bbt_offset = 921;
426    p.frame = round(fpt);
427    p.floor(TransportPosition::TICK);
428    CK( 1 == p.bar );
429    CK( 1 == p.beat );
430    CK( 8 == p.tick );
431    CK( H2TEST_DRIFT(79.0, p.frame, 1) );
432    CK( 0 == p.bbt_offset );
433    p.tick = 1;
434    p.bbt_offset = 921;
435    p.frame = round(fpt);
436    p.floor(TransportPosition::BEAT);
437    CK( 1 == p.bar );
438    CK( 1 == p.beat );
439    CK( 0 == p.tick );
440    CK( 0 == p.frame );
441    CK( 0 == p.bbt_offset );
442    p.tick = 1;
443    p.bbt_offset = 921;
444    p.frame = round(fpt);
445    p.floor(TransportPosition::BAR);
446    CK( 1 == p.bar );
447    CK( 1 == p.beat );
448    CK( 0 == p.tick );
449    CK( 0 == p.frame );
450    CK( 0 == p.bbt_offset );
451
452    p.tick = 1;
453    p.bbt_offset = 921;
454    p.frame = round(fpt/2.0);
455    p.floor(TransportPosition::BAR);
456    CK( 1 == p.bar );
457    CK( 1 == p.beat );
458    CK( 0 == p.tick );
459    CK( 0 == p.frame );
460    CK( 0 == p.bbt_offset );
461
462    TransportPosition tmp = x;
463    double lastframe = tmp.frame;
464    tmp.floor(TransportPosition::TICK);
465    CK( tmp.bar == 349 );
466    CK( tmp.beat == 5 );
467    CK( tmp.tick == 18 );
468    CK( tmp.bbt_offset == 0 );
469    lastframe -= 115.0;
470    CK( H2TEST_DRIFT(lastframe, tmp.frame, 1) );
471    // Repeating when already floored should
472    // give the same result.
473    tmp.floor(TransportPosition::TICK);
474    CK( tmp.bar == 349 );
475    CK( tmp.beat == 5 );
476    CK( tmp.tick == 18 );
477    CK( tmp.bbt_offset == 0 );
478    CK( H2TEST_DRIFT(lastframe, tmp.frame, 1) );
479
480    tmp = x;
481    tmp.floor(TransportPosition::BEAT);
482    CK( tmp.bar == 349 );
483    CK( tmp.beat == 5 );
484    CK( tmp.tick == 0 );
485    CK( tmp.bbt_offset == 0 );
486    lastframe -= 18.0 * tmp.frames_per_tick();
487    CK( H2TEST_DRIFT(lastframe, tmp.frame, 1) );
488    // Repeating when already floored should
489    // give the same result.
490    tmp.floor(TransportPosition::BEAT);
491    CK( tmp.bar == 349 );
492    CK( tmp.beat == 5 );
493    CK( tmp.tick == 0 );
494    CK( tmp.bbt_offset == 0 );
495    CK( H2TEST_DRIFT(lastframe, tmp.frame, 1) );
496
497    tmp = x;
498    tmp.floor(TransportPosition::BAR);
499    CK( tmp.bar == 349 );
500    CK( tmp.beat == 1 );
501    CK( tmp.tick == 0 );
502    CK( tmp.bbt_offset == 0 );
503    lastframe = x.frame - 4.0 * 99.0 * tmp.frames_per_tick()
504        - x.tick * tmp.frames_per_tick() - x.bbt_offset;
505    CK( H2TEST_DRIFT(lastframe, tmp.frame, 1) );
506    // Repeating when already floored should
507    // give the same result.
508    tmp.floor(TransportPosition::BAR);
509    CK( tmp.bar == 349 );
510    CK( tmp.beat == 1 );
511    CK( tmp.tick == 0 );
512    CK( tmp.bbt_offset == 0 );
513    CK( H2TEST_DRIFT(lastframe, tmp.frame, 1) );
514
515}
516
517TEST_CASE( 080_ceil )
518{
519    p.ceil(TransportPosition::TICK);
520    CK( 1 == p.bar );
521    CK( 1 == p.beat );
522    CK( 0 == p.tick );
523    CK( 0 == p.frame );
524    p.ceil(TransportPosition::BEAT);
525    CK( 1 == p.bar );
526    CK( 1 == p.beat );
527    CK( 0 == p.tick );
528    CK( 0 == p.frame );
529    p.ceil(TransportPosition::BAR);
530    CK( 1 == p.bar );
531    CK( 1 == p.beat );
532    CK( 0 == p.tick );
533    CK( 0 == p.frame );
534
535    double fpt = p.frames_per_tick();
536    double frame;
537    p.tick = 1;
538    p.bbt_offset = 75;
539    p.frame = round(fpt);
540    frame = p.frame + fpt - p.bbt_offset;
541    p.ceil(TransportPosition::TICK);
542    CK( 1 == p.bar );
543    CK( 1 == p.beat );
544    CK( 2 == p.tick );
545    CK( H2TEST_DRIFT(frame, p.frame, 1) );
546    CK( 0 == p.bbt_offset );
547    p.tick = 1;
548    p.bbt_offset = 921;
549    p.frame = round(fpt);
550    p.ceil(TransportPosition::BEAT);
551    CK( 1 == p.bar );
552    CK( 2 == p.beat );
553    CK( 0 == p.tick );
554    // frame = [1:1.8.0] + fpt * (192-8)
555    //       = 79 + 125.0 * 184 = 23079
556    CK( H2TEST_DRIFT(23079.0, p.frame, 2) ); // 2 internal ops.
557    CK( 0 == p.bbt_offset );
558    p.tick = 1;
559    p.bbt_offset = 921;
560    p.frame = round(fpt);
561    p.ceil(TransportPosition::BAR);
562    CK( 2 == p.bar );
563    CK( 1 == p.beat );
564    CK( 0 == p.tick );
565    // frame = 125 + [2:1.0.0] - [1:2.1.921]
566    //       = 125 + [2:1.0.0] - [1:2.8.46]
567    //       = 125 + [1:5.0.0] - [1:2.8.46]
568    //       = 125 + fpt* ((2 * 192) + (192-9)) + (125-46)
569    //       = 71079.0
570    CK( H2TEST_DRIFT(71079.0, p.frame, 2) ); // 2 internal ops
571    CK( 0 == p.bbt_offset );
572    CK( 192 * 4 == p.bar_start_tick );
573
574    p.tick = 1;
575    p.bbt_offset = 921;
576    p.frame = round(fpt/2.0);
577    p.ceil(TransportPosition::BAR);
578    CK( 3 == p.bar );
579    CK( 1 == p.beat );
580    CK( 0 == p.tick );
581    // frame = 63 + [3:1.0.0] - [2:1.1.921]
582    //       = 63 + [3:1.0.0] - [2:1.8.46]
583    //       = 63 + [2:5.0.0] - [2:1.8.46]
584    //       = 63 + fpt* ((3 * 192) + (192-9)) + (125-46)
585    //       = 95017
586    CK( H2TEST_DRIFT(95017.0, p.frame, 2) );
587    CK( 0 == p.bbt_offset );
588    CK( 192 * 4 * 2 == p.bar_start_tick );
589
590    // TODO:  ADD MORE TESTS FOR BAR START TICK
591
592    TransportPosition tmp = x;
593    double lastframe = tmp.frame;
594    tmp.ceil(TransportPosition::TICK);
595    CK( tmp.bar == 349 );
596    CK( tmp.beat == 5 );
597    CK( tmp.tick == 19 );
598    CK( tmp.bbt_offset == 0 );
599    lastframe += (x.frames_per_tick() - 115.0);
600    CK( H2TEST_DRIFT(lastframe, tmp.frame, 1) );
601    // Repeating when already ceiled should
602    // give the same result.
603    tmp.ceil(TransportPosition::TICK);
604    CK( tmp.bar == 349 );
605    CK( tmp.beat == 5 );
606    CK( tmp.tick == 19 );
607    CK( tmp.bbt_offset == 0 );
608    CK( H2TEST_DRIFT(lastframe, tmp.frame, 1) );
609
610    tmp = x;
611    lastframe = tmp.frame;
612    tmp.ceil(TransportPosition::BEAT);
613    CK( tmp.bar == 349 );
614    CK( tmp.beat == 6 );
615    CK( tmp.tick == 0 );
616    CK( tmp.bbt_offset == 0 );
617    lastframe += (99.0 - 18.0) * tmp.frames_per_tick() - 115.0;
618    CK( H2TEST_DRIFT(lastframe, tmp.frame, 1) );
619    // Repeating when already ceiled should
620    // give the same result.
621    tmp.ceil(TransportPosition::BEAT);
622    CK( tmp.bar == 349 );
623    CK( tmp.beat == 6 );
624    CK( tmp.tick == 0 );
625    CK( tmp.bbt_offset == 0 );
626    CK( H2TEST_DRIFT(lastframe, tmp.frame, 1) );
627
628    tmp = x;
629    lastframe = tmp.frame;
630    lastframe += ((2.0 * 99.0) + (99.0 - 18.0)) * tmp.frames_per_tick()
631        - tmp.bbt_offset;
632    tmp.ceil(TransportPosition::BAR);
633    CK( tmp.bar == 350 );
634    CK( tmp.beat == 1 );
635    CK( tmp.tick == 0 );
636    CK( tmp.bbt_offset == 0 );
637    CK( H2TEST_DRIFT(lastframe, tmp.frame, 1) );
638    // Repeating when already ceiled should
639    // give the same result.
640    tmp.ceil(TransportPosition::BAR);
641    CK( tmp.bar == 350 );
642    CK( tmp.beat == 1 );
643    CK( tmp.tick == 0 );
644    CK( tmp.bbt_offset == 0 );
645    CK( H2TEST_DRIFT(lastframe, tmp.frame, 1) );
646}
647
648TEST_CASE( 090_round )
649{
650    TransportPosition a;
651    double frame;
652
653    a = p;
654    a.round(TransportPosition::TICK);
655    CK( 0 == a.frame );
656    CK( 1 == a.bar );
657    CK( 1 == a.beat );
658    CK( 0 == a.tick );
659    CK( 0 == a.bbt_offset );
660    a.round(TransportPosition::BEAT);
661    CK( 0 == a.frame );
662    CK( 1 == a.bar );
663    CK( 1 == a.beat );
664    CK( 0 == a.tick );
665    CK( 0 == a.bbt_offset );
666    a.round(TransportPosition::BAR);
667    CK( 0 == a.frame );
668    CK( 1 == a.bar );
669    CK( 1 == a.beat );
670    CK( 0 == a.tick );
671    CK( 0 == a.bbt_offset );
672
673    a = p;
674    a.bbt_offset = a.frames_per_tick() / 4.0;
675    a.round(TransportPosition::TICK);
676    CK( 0 == a.frame );
677    CK( 1 == a.bar );
678    CK( 1 == a.beat );
679    CK( 0 == a.tick );
680    CK( 0 == a.bbt_offset );
681    a.bbt_offset = a.frames_per_tick() * 3.0 / 4.0;
682    frame = a.frame + round(a.frames_per_tick() / 4.0);
683    a.round(TransportPosition::TICK);
684    CK( H2TEST_DRIFT( frame, a.frame, 1 ) );
685    CK( 1 == a.bar );
686    CK( 1 == a.beat );
687    CK( 1 == a.tick );
688    CK( 0 == a.bbt_offset );
689    // Re-rounding should not change anything
690    a.round(TransportPosition::TICK);
691    CK( H2TEST_DRIFT( frame, a.frame, 1 ) );
692    CK( 1 == a.bar );
693    CK( 1 == a.beat );
694    CK( 1 == a.tick );
695    CK( 0 == a.bbt_offset );
696
697    // Could use more checks near the zero-point,
698    // but we'll move on.
699
700    a = x;
701    frame = a.frame;
702    frame += a.frames_per_tick() - a.bbt_offset;
703    a.round(TransportPosition::TICK);
704    CK( 349 == a.bar );
705    CK( 5 == a.beat );
706    CK( 19 == a.tick );
707    CK( 0 == a.bbt_offset );
708    CK( H2TEST_DRIFT( frame, a.frame, 1 ) );
709
710    frame -= a.frames_per_tick() * double(a.tick);
711    a.round(TransportPosition::BEAT);
712    CK( 349 == a.bar );
713    CK( 5 == a.beat );
714    CK( 0 == a.tick );
715    CK( 0 == a.bbt_offset );
716    CK( H2TEST_DRIFT( frame, a.frame, 2 ) );
717
718    frame += a.frames_per_tick() * 99.0 * 3.0;
719    a.round(TransportPosition::BAR);
720    CK( 350 == a.bar );
721    CK( 1 == a.beat );
722    CK( 0 == a.tick );
723    CK( 0 == a.bbt_offset );
724    CK( H2TEST_DRIFT( frame, a.frame, 3 ) );
725
726    // Could use more checks... but we'll move on.
727
728}
729
730TEST_CASE( 100_operator_plus )
731{
732    unsigned k;
733    TransportPosition a;
734    double fpt;
735    double frame;
736
737    a = p + (-51);
738    CK( 1 == a.bar );
739    CK( 1 == a.beat );
740    CK( 0 == a.tick );
741    CK( 0 == a.bbt_offset );
742    CK( 0 == a.frame );
743
744    a = p;
745    fpt = a.frames_per_tick();
746    for( k=0 ; k<191 ; ++k ) {
747        a = a + 1;
748        CK( 1 == a.bar );
749        CK( 1 == a.beat );
750        CK( (k+1) == unsigned(a.tick) );
751        CK( H2TEST_DRIFT( double(k+1) * fpt, a.frame, k ) );
752    }
753    CK( 191 == a.tick );
754    ++k;
755    a = a + 1;
756    CK( 1 == a.bar );
757    CK( 2 == a.beat );
758    CK( 0 == a.tick );
759    CK( H2TEST_DRIFT( double(k) * fpt, a.frame, k ) );
760
761    k = 192 * 2 + 30;
762    a = p + k;
763    CK( 1 == a.bar );
764    CK( 3 == a.beat );
765    CK( 30 == a.tick );
766    CK( H2TEST_DRIFT( double(k) * fpt, a.frame, 1 ) );
767
768
769    k = 99 * 5 + 64;
770    a = x + k;
771    frame = x.frame + (99*5 + 64) * x.frames_per_tick();
772    CK( 350 == a.bar );
773    CK( 3 == a.beat );
774    CK( 82 == a.tick );
775    CK( 115 == a.bbt_offset );
776    CK( H2TEST_DRIFT( frame, a.frame, 1 ) );
777
778    a = a + (-k);
779    frame = x.frame;
780    CK( 349 == a.bar );
781    CK( 5 == a.beat );
782    CK( 18 == a.tick );
783    CK( 115 == a.bbt_offset );
784    CK( H2TEST_DRIFT( frame, a.frame, 2 ) );
785}
786
787TEST_CASE( 110_operator_minus )
788{
789    unsigned k;
790    TransportPosition a;
791    double fpt;
792
793    a = p - 51;
794    CK( 1 == a.bar );
795    CK( 1 == a.beat );
796    CK( 0 == a.tick );
797    CK( 0 == a.bbt_offset );
798    CK( 0 == a.frame );
799
800    a = p;
801    a.bar = 2;
802    a.beat = 1;
803    a.tick = 0;
804    a.frame = 2000000;
805    fpt = a.frames_per_tick();
806    for( k=192 ; k>0 ; --k ) {
807        a = a - 1;
808        CK( 1 == a.bar );
809        CK( 4 == a.beat );
810        CK( (k-1) == unsigned(a.tick) );
811        CK( H2TEST_DRIFT( 2000000.0 - (double(192-k+1) * fpt), a.frame, (193-k) ) );
812    }
813    CK( 0 == a.tick );
814    a = a - 1;
815    k = 193;
816    CK( 1 == a.bar );
817    CK( 3 == a.beat );
818    CK( 191 == a.tick );
819    CK( H2TEST_DRIFT( 2000000.0 - (double(k) * fpt), a.frame, k ) );
820
821    k = 99 * 2 + 30;
822    a = x - k;
823    fpt = x.frames_per_tick();
824    CK( 349 == a.bar );
825    CK( 2 == a.beat );
826    CK( 87 == a.tick );
827    CK( 115 == a.bbt_offset );
828    CK( H2TEST_DRIFT( double(x.frame) - (double(k) * fpt), a.frame, 1 ) );
829
830    k = 99 * 5 + 64;
831    a = x - k;
832    CK( 348 == a.bar );
833    CK( 6 == a.beat );
834    CK( 53 == a.tick );
835    CK( 115 == a.bbt_offset );
836    CK( H2TEST_DRIFT( double(x.frame) - double(k) * fpt, a.frame, 1 ) );
837
838    a = a - (-k);
839    CK( 349 == a.bar );
840    CK( 5 == a.beat );
841    CK( 18 == a.tick );
842    CK( 115 == a.bbt_offset );
843    CK( H2TEST_DRIFT( double(x.frame), a.frame, 2 ) );
844}
845
846TEST_CASE( 120_operator_plus_equals )
847{
848    unsigned k;
849    TransportPosition a;
850    double fpt;
851
852    a = p;
853    fpt = a.frames_per_tick();
854    for( k=0 ; k<191 ; ++k ) {
855        a += 1;
856        CK( 1 == a.bar );
857        CK( 1 == a.beat );
858        CK( k+1 == unsigned(a.tick) );
859        CK( H2TEST_DRIFT( double(k+1) * fpt, a.frame, k ) );
860    }
861    CK( 191 == a.tick );
862    ++k;
863    a += 1;
864    CK( 1 == a.bar );
865    CK( 2 == a.beat );
866    CK( 0 == a.tick );
867    CK( H2TEST_DRIFT( double(k) * fpt, a.frame, k ) );
868
869    k = 192 * 2 + 30;
870    a = p;
871    a += k;
872    CK( 1 == a.bar );
873    CK( 3 == a.beat );
874    CK( 30 == a.tick );
875    CK( H2TEST_DRIFT( double(k) * fpt, a.frame, 1 ) );
876
877    k = 99 * 5 + 64;
878    a = x;
879    a += k;
880    fpt = a.frames_per_tick();
881    CK( 350 == a.bar );
882    CK( 3 == a.beat );
883    CK( 82 == a.tick );
884    CK( 115 == a.bbt_offset );
885    CK( H2TEST_DRIFT( double(x.frame) + double(k) * fpt, a.frame, 1 ) );
886
887    a += (-k);
888    CK( 349 == a.bar );
889    CK( 5 == a.beat );
890    CK( 18 == a.tick );
891    CK( 115 == a.bbt_offset );
892    CK( H2TEST_DRIFT( double(x.frame), a.frame, 2 ) );
893}
894
895TEST_CASE( 130_operator_minus_equals )
896{
897    unsigned k;
898    TransportPosition a;
899    double fpt;
900
901    a = p;
902    a -= 51;
903    CK( 1 == a.bar );
904    CK( 1 == a.beat );
905    CK( 0 == a.tick );
906    CK( 0 == a.bbt_offset );
907    CK( 0 == a.frame );
908
909    a = p;
910    a.bar = 2;
911    a.beat = 1;
912    a.tick = 0;
913    a.frame = 2000000;
914    fpt = a.frames_per_tick();
915    for( k=192 ; k>0 ; --k ) {
916        a -= 1;
917        CK( 1 == a.bar );
918        CK( 4 == a.beat );
919        CK( (k-1) == unsigned(a.tick) );
920        CK( H2TEST_DRIFT( 2000000.0 - (double(192-k+1) * fpt), a.frame, (193-k) ) );
921    }
922    CK( 0 == a.tick );
923    a -= 1;
924    k = 193;
925    CK( 1 == a.bar );
926    CK( 3 == a.beat );
927    CK( 191 == a.tick );
928    CK( H2TEST_DRIFT( 2000000.0 - (double(k) * fpt), a.frame, k ) );
929
930    k = 99 * 2 + 30;
931    a = x;
932    a -= k;
933    fpt = x.frames_per_tick();
934    CK( 349 == a.bar );
935    CK( 2 == a.beat );
936    CK( 87 == a.tick );
937    CK( 115 == a.bbt_offset );
938    CK( H2TEST_DRIFT( double(x.frame) - (double(k) * fpt), a.frame, 1 ) );
939
940    k = 99 * 5 + 64;
941    a = x;
942    a -= k;
943    CK( 348 == a.bar );
944    CK( 6 == a.beat );
945    CK( 53 == a.tick );
946    CK( 115 == a.bbt_offset );
947    CK( H2TEST_DRIFT( double(x.frame) - double(k) * fpt, a.frame, 1 ) );
948
949    a -= (-k);
950    CK( 349 == a.bar );
951    CK( 5 == a.beat );
952    CK( 18 == a.tick );
953    CK( 115 == a.bbt_offset );
954    CK( H2TEST_DRIFT( double(x.frame), a.frame, 2 ) );
955}
956
957TEST_END()
Note: See TracBrowser for help on using the browser.