3 #include "BeatsTest.hpp"
4 #include "evoral/Beats.hpp"
6 CPPUNIT_TEST_SUITE_REGISTRATION(BeatsTest);
8 using namespace Evoral;
10 static const double delta = 1.5 / (double)Beats::PPQN;
13 BeatsTest::createTest()
16 CPPUNIT_ASSERT_EQUAL(1, a.get_beats());
17 CPPUNIT_ASSERT_EQUAL(2, a.get_ticks());
18 CPPUNIT_ASSERT_DOUBLES_EQUAL(1 + 2 / (double)Beats::PPQN, a.to_double(), delta);
21 CPPUNIT_ASSERT_EQUAL(1, b.get_beats());
22 CPPUNIT_ASSERT_EQUAL(Beats::PPQN / 2, b.get_ticks());
23 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5, b.to_double(), delta);
25 const Beats c = Beats::beats(6);
26 CPPUNIT_ASSERT_EQUAL(6, c.get_beats());
27 CPPUNIT_ASSERT_EQUAL(0, c.get_ticks());
29 const Beats d = Beats::ticks(7);
30 CPPUNIT_ASSERT_EQUAL(0, d.get_beats());
31 CPPUNIT_ASSERT_EQUAL(7, d.get_ticks());
35 CPPUNIT_ASSERT_EQUAL(d, e);
38 // const Beats diff = n2 - n1;
39 // CPPUNIT_ASSERT_EQUAL(-44, diff.get_beats());
40 // CPPUNIT_ASSERT_EQUAL(44 / Beats::PPQN, diff.get_ticks());
41 // CPPUNIT_ASSERT_DOUBLES_EQUAL(diff.to_double(), -44.44, delta);
50 // Positive + positive
51 const Beats c = a + b;
52 CPPUNIT_ASSERT_EQUAL(4, c.get_beats());
53 CPPUNIT_ASSERT_EQUAL(6, c.get_ticks());
55 const Beats n1(-12.34);
56 CPPUNIT_ASSERT_DOUBLES_EQUAL(-12.34, n1.to_double(), delta);
58 const Beats n2(-56.78);
59 CPPUNIT_ASSERT_DOUBLES_EQUAL(-56.78, n2.to_double(), delta);
61 // Positive + negative
63 const Beats p_n = p1 + n1;
64 CPPUNIT_ASSERT_EQUAL(-11, p_n.get_beats());
65 CPPUNIT_ASSERT_EQUAL((int32_t)(Beats::PPQN * -0.34), p_n.get_ticks());
66 CPPUNIT_ASSERT_DOUBLES_EQUAL(-11.34, p_n.to_double(), delta);
68 // Negative + positive
69 const Beats n_p = n1 + p1;
70 CPPUNIT_ASSERT_EQUAL(-11, n_p.get_beats());
71 CPPUNIT_ASSERT_EQUAL((int32_t)(Beats::PPQN * -0.34), n_p.get_ticks());
72 CPPUNIT_ASSERT_DOUBLES_EQUAL(-11.34, n_p.to_double(), delta);
74 // Negative + negative
75 const Beats sum = n1 + n2;
76 CPPUNIT_ASSERT_EQUAL(-69, sum.get_beats());
77 //CPPUNIT_ASSERT_EQUAL((int32_t)(Beats::PPQN * -0.12), n_p.get_ticks());
78 CPPUNIT_ASSERT_DOUBLES_EQUAL(-69.12, sum.to_double(), delta);
82 BeatsTest::subtractTest()
87 // Positive - positive
88 const Beats c = b - a;
89 CPPUNIT_ASSERT_EQUAL(2, c.get_beats());
90 CPPUNIT_ASSERT_EQUAL(2, c.get_ticks());
92 const Beats n1(-12.34);
93 CPPUNIT_ASSERT_DOUBLES_EQUAL(-12.34, n1.to_double(), delta);
95 const Beats n2(-56.78);
96 CPPUNIT_ASSERT_DOUBLES_EQUAL(-56.78, n2.to_double(), delta);
98 // Positive - negative
100 const Beats p_n = p1 - n1;
101 CPPUNIT_ASSERT_EQUAL(13, p_n.get_beats());
102 CPPUNIT_ASSERT_EQUAL((int32_t)(Beats::PPQN * 0.34), p_n.get_ticks());
103 CPPUNIT_ASSERT_DOUBLES_EQUAL(13.34, p_n.to_double(), delta);
105 // Negative - positive
106 const Beats n_p = n1 - p1;
107 CPPUNIT_ASSERT_EQUAL(-13, n_p.get_beats());
108 CPPUNIT_ASSERT_EQUAL((int32_t)(Beats::PPQN * -0.34), n_p.get_ticks());
109 CPPUNIT_ASSERT_DOUBLES_EQUAL(-13.34, n_p.to_double(), delta);
111 // Negative - negative
112 const Beats diff = n1 - n2;
113 CPPUNIT_ASSERT_EQUAL(44, diff.get_beats());
114 CPPUNIT_ASSERT_EQUAL((int32_t)lrint(Beats::PPQN * 0.44), diff.get_ticks());
115 CPPUNIT_ASSERT_DOUBLES_EQUAL(44.44, diff.to_double(), delta);
119 BeatsTest::multiplyTest()
121 CPPUNIT_ASSERT_DOUBLES_EQUAL(3.0, (Beats(1.5) * 2.0).to_double(), delta);
122 CPPUNIT_ASSERT_DOUBLES_EQUAL(-10.0, (Beats(5.0) * -2.0).to_double(), delta);
123 CPPUNIT_ASSERT_DOUBLES_EQUAL(-10.0, (Beats(-5.0) * 2.0).to_double(), delta);
127 BeatsTest::roundTest()
132 const Beats au = a.round_up_to_beat();
133 CPPUNIT_ASSERT_EQUAL(au.get_beats(), 2);
134 CPPUNIT_ASSERT_EQUAL(au.get_ticks(), 0);
137 const Beats ad = a.round_down_to_beat();
138 CPPUNIT_ASSERT_EQUAL(ad.get_beats(), 1);
139 CPPUNIT_ASSERT_EQUAL(ad.get_ticks(), 0);
141 // Round result down again
142 const Beats add = ad.round_down_to_beat();
143 CPPUNIT_ASSERT_EQUAL(ad, add);
146 const Beats adu = ad.round_up_to_beat();
147 CPPUNIT_ASSERT_EQUAL(ad, adu);
150 const Beats snapped = a.snap_to(Beats(1.5));
151 CPPUNIT_ASSERT_EQUAL(snapped.get_beats(), 1);
152 CPPUNIT_ASSERT_EQUAL(snapped.get_ticks(), Beats::PPQN / 2);
156 BeatsTest::convertTest()
158 const Beats a = Beats::ticks_at_rate(72000, 48000);
159 CPPUNIT_ASSERT_DOUBLES_EQUAL(1, a.get_beats(), delta);
160 CPPUNIT_ASSERT_DOUBLES_EQUAL(Beats::PPQN / 2, a.get_ticks(), delta);
161 CPPUNIT_ASSERT_DOUBLES_EQUAL(1.5, a.to_double(), delta);
163 const Beats b = Beats::ticks_at_rate(8, 48000);
164 CPPUNIT_ASSERT_DOUBLES_EQUAL(0, b.get_beats(), delta);
165 CPPUNIT_ASSERT_DOUBLES_EQUAL(Beats::PPQN * 8 / 48000, b.get_ticks(), delta);
166 CPPUNIT_ASSERT_DOUBLES_EQUAL((8 / 48000.0), b.to_double(), delta);
168 CPPUNIT_ASSERT_EQUAL(int64_t(1.5 * Beats::PPQN), a.to_ticks());
169 CPPUNIT_ASSERT_EQUAL(int64_t(1.5 * 192), a.to_ticks(192));