1 #include <cxxtest/TestSuite.h> 2 3 #include "audio/timestamp.h" 4 5 #include <limits.h> 6 7 class TimestampTestSuite : public CxxTest::TestSuite 8 { 9 public: test_diff_add_frames()10 void test_diff_add_frames() { 11 const Audio::Timestamp a(10000, 1000); 12 const Audio::Timestamp b(10001, 1000); 13 const Audio::Timestamp c(10002, 1000); 14 15 TS_ASSERT_EQUALS(a.frameDiff(b), -1); 16 TS_ASSERT_EQUALS(b.frameDiff(a), 1); 17 TS_ASSERT_EQUALS(c.frameDiff(a), 2); 18 TS_ASSERT_EQUALS(b.addFrames(2000).frameDiff(a), 2001); 19 TS_ASSERT_EQUALS(a.frameDiff(b), -1); 20 TS_ASSERT_EQUALS(b.frameDiff(a), 1); 21 TS_ASSERT_EQUALS(c.frameDiff(a), 2); 22 TS_ASSERT_EQUALS(b.addFrames(2000).frameDiff(a.addFrames(-1000)), 3001); 23 TS_ASSERT_EQUALS(a.frameDiff(b), -1); 24 TS_ASSERT_EQUALS(b.frameDiff(a), 1); 25 TS_ASSERT_EQUALS(c.frameDiff(a), 2); 26 } 27 test_diff_add_msecs()28 void test_diff_add_msecs() { 29 Audio::Timestamp ts0(3, 22050); 30 Audio::Timestamp ts1(0, 22050); 31 Audio::Timestamp ts2(0, 22050); 32 33 TS_ASSERT_EQUALS(ts0.msecs(), 3); 34 TS_ASSERT_EQUALS(ts0.totalNumberOfFrames(), 3 * 22050 / 1000); 35 TS_ASSERT_EQUALS(ts0.numberOfFrames(), 3 * 22050 / 1000); 36 37 ts1 = ts1.addFrames(53248); 38 TS_ASSERT_EQUALS(ts1.secs(), 2); 39 TS_ASSERT_EQUALS(ts1.msecs(), 53248 * 1000 / 22050); 40 TS_ASSERT_EQUALS(ts1.totalNumberOfFrames(), 53248); 41 TS_ASSERT_EQUALS(ts1.numberOfFrames(), 53248 - 2 * 22050); 42 ts1 = ts1.addMsecs(47); 43 TS_ASSERT_EQUALS(ts1.secs(), 2); 44 TS_ASSERT_EQUALS(ts1.msecs(), 2414+47); 45 TS_ASSERT_EQUALS(ts1.totalNumberOfFrames(), 47*22050 / 1000 + 53248); 46 TS_ASSERT_EQUALS(ts1.numberOfFrames(), 47*22050 / 1000 + 53248 - 2 * 22050); 47 48 ts2 = ts2.addMsecs(47); 49 TS_ASSERT_EQUALS(ts2.secs(), 0); 50 TS_ASSERT_EQUALS(ts2.msecs(), 47); 51 TS_ASSERT_EQUALS(ts2.totalNumberOfFrames(), 47*22050 / 1000); 52 TS_ASSERT_EQUALS(ts2.numberOfFrames(), 47*22050 / 1000); 53 ts2 = ts2.addFrames(53248); 54 TS_ASSERT_EQUALS(ts2.secs(), 2); 55 TS_ASSERT_EQUALS(ts2.msecs(), 2414+47); 56 TS_ASSERT_EQUALS(ts2.totalNumberOfFrames(), 47*22050 / 1000 + 53248); 57 TS_ASSERT_EQUALS(ts2.numberOfFrames(), 47*22050 / 1000 + 53248 - 2 * 22050); 58 } 59 test_ticks()60 void test_ticks() { 61 const Audio::Timestamp a(1234, 60); 62 const Audio::Timestamp b(5678, 60); 63 64 TS_ASSERT_EQUALS(a.msecs(), 1234); 65 TS_ASSERT_EQUALS(b.msecs(), 5678); 66 67 TS_ASSERT_EQUALS(a.secs(), 1); 68 TS_ASSERT_EQUALS(b.secs(), 5); 69 70 TS_ASSERT_EQUALS(a.msecsDiff(b), 1234 - 5678); 71 TS_ASSERT_EQUALS(b.msecsDiff(a), 5678 - 1234); 72 73 TS_ASSERT_EQUALS(a.frameDiff(b), (1234 - 5678) * 60 / 1000); 74 TS_ASSERT_EQUALS(b.frameDiff(a), (5678 - 1234) * 60 / 1000); 75 76 TS_ASSERT_EQUALS(a.addFrames(1).msecs(), (1234 + 1000 * 1/60)); 77 TS_ASSERT_EQUALS(a.addFrames(59).msecs(), (1234 + 1000 * 59/60)); 78 TS_ASSERT_EQUALS(a.addFrames(60).msecs(), (1234 + 1000 * 60/60)); 79 80 // As soon as we go back even by only one frame, the msec value 81 // has to drop by at least one. 82 TS_ASSERT_EQUALS(a.addFrames(-1).msecs(), (1234 - 1000 * 1/60 - 1)); 83 TS_ASSERT_EQUALS(a.addFrames(-59).msecs(), (1234 - 1000 * 59/60 - 1)); 84 TS_ASSERT_EQUALS(a.addFrames(-60).msecs(), (1234 - 1000 * 60/60)); 85 } 86 test_more_add_diff()87 void test_more_add_diff() { 88 const Audio::Timestamp c(10002, 1000); 89 90 for (int i = -10000; i < 10000; i++) { 91 int v = c.addFrames(i).frameDiff(c); 92 TS_ASSERT_EQUALS(v, i); 93 } 94 } 95 test_negate()96 void test_negate() { 97 const Audio::Timestamp a = Audio::Timestamp(0, 60).addFrames(13); 98 const Audio::Timestamp b = -a; 99 100 TS_ASSERT_EQUALS(a.msecs() + 1, -b.msecs()); 101 TS_ASSERT_EQUALS(a.totalNumberOfFrames(), -b.totalNumberOfFrames()); 102 TS_ASSERT_EQUALS(a.numberOfFrames(), 60 - b.numberOfFrames()); 103 } 104 test_add_sub()105 void test_add_sub() { 106 const Audio::Timestamp a = Audio::Timestamp(0, 60).addFrames(13); 107 const Audio::Timestamp b = -a; 108 const Audio::Timestamp c = Audio::Timestamp(0, 60).addFrames(20); 109 110 TS_ASSERT_EQUALS((a+a).secs(), 0); 111 TS_ASSERT_EQUALS((a+a).numberOfFrames(), 2*13); 112 113 TS_ASSERT_EQUALS((a+b).secs(), 0); 114 TS_ASSERT_EQUALS((a+b).numberOfFrames(), 0); 115 116 TS_ASSERT_EQUALS((a+c).secs(), 0); 117 TS_ASSERT_EQUALS((a+c).numberOfFrames(), 13+20); 118 119 TS_ASSERT_EQUALS((a-a).secs(), 0); 120 TS_ASSERT_EQUALS((a-a).numberOfFrames(), 0); 121 122 TS_ASSERT_EQUALS((a-b).secs(), 0); 123 TS_ASSERT_EQUALS((a-b).numberOfFrames(), 2*13); 124 125 TS_ASSERT_EQUALS((a-c).secs(), -1); 126 TS_ASSERT_EQUALS((a-c).numberOfFrames(), 60 + (13 - 20)); 127 } 128 test_diff_with_conversion()129 void test_diff_with_conversion() { 130 const Audio::Timestamp a = Audio::Timestamp(10, 1000).addFrames(20); 131 const Audio::Timestamp b = Audio::Timestamp(10, 1000/5).addFrames(20/5); 132 const Audio::Timestamp c = Audio::Timestamp(10, 1000*2).addFrames(20*2); 133 134 TS_ASSERT_EQUALS(a.frameDiff(a), 0); 135 TS_ASSERT_EQUALS(a.frameDiff(b), 0); 136 TS_ASSERT_EQUALS(a.frameDiff(c), 0); 137 138 TS_ASSERT_EQUALS(b.frameDiff(a), 0); 139 TS_ASSERT_EQUALS(b.frameDiff(b), 0); 140 TS_ASSERT_EQUALS(b.frameDiff(c), 0); 141 142 TS_ASSERT_EQUALS(c.frameDiff(a), 0); 143 TS_ASSERT_EQUALS(c.frameDiff(b), 0); 144 TS_ASSERT_EQUALS(c.frameDiff(c), 0); 145 } 146 147 test_convert()148 void test_convert() { 149 const Audio::Timestamp a = Audio::Timestamp(10, 1000).addFrames(20); 150 const Audio::Timestamp b = Audio::Timestamp(10, 1000/5).addFrames(20/5); 151 const Audio::Timestamp c = Audio::Timestamp(10, 1000*2).addFrames(20*2); 152 153 TS_ASSERT_EQUALS(a.convertToFramerate(1000/5), b); 154 TS_ASSERT_EQUALS(a.convertToFramerate(1000*2), c); 155 } 156 test_equals()157 void test_equals() { 158 const Audio::Timestamp a = Audio::Timestamp(500, 1000); 159 Audio::Timestamp b = Audio::Timestamp(0, 1000); 160 Audio::Timestamp c = Audio::Timestamp(0, 100); 161 162 TS_ASSERT_EQUALS(a, Audio::Timestamp(0, 500, 1000)); 163 164 TS_ASSERT(a != b); 165 TS_ASSERT(a != c); 166 TS_ASSERT(b == c); 167 168 b = b.addFrames(500); 169 c = c.addFrames(50); 170 171 TS_ASSERT(a == b); 172 TS_ASSERT(a == c); 173 TS_ASSERT(b == c); 174 } 175 176 test_compare()177 void test_compare() { 178 const Audio::Timestamp a = Audio::Timestamp(60, 1000); 179 Audio::Timestamp b = Audio::Timestamp(60, 60); 180 Audio::Timestamp c = Audio::Timestamp(60, 44100); 181 182 TS_ASSERT(a <= b); 183 TS_ASSERT(b <= c); 184 TS_ASSERT(a <= c); 185 186 TS_ASSERT(b >= a); 187 TS_ASSERT(c >= b); 188 TS_ASSERT(c >= a); 189 190 b = b.addFrames(60 / 12); 191 c = c.addFrames(44100 / 10); 192 193 TS_ASSERT(a < b); 194 TS_ASSERT(b < c); 195 TS_ASSERT(a < c); 196 197 TS_ASSERT(b > a); 198 TS_ASSERT(c > b); 199 TS_ASSERT(c > a); 200 201 TS_ASSERT(a <= b); 202 TS_ASSERT(b <= c); 203 TS_ASSERT(a <= c); 204 205 TS_ASSERT(b >= a); 206 TS_ASSERT(c >= b); 207 TS_ASSERT(c >= a); 208 } 209 210 test_framerate()211 void test_framerate() { 212 const Audio::Timestamp a = Audio::Timestamp(500, 1000); 213 const Audio::Timestamp b = Audio::Timestamp(500, 67); 214 const Audio::Timestamp c = Audio::Timestamp(500, 100); 215 const Audio::Timestamp d = Audio::Timestamp(500, 44100); 216 217 TS_ASSERT_EQUALS(a.framerate(), (uint)1000); 218 TS_ASSERT_EQUALS(b.framerate(), (uint)67); 219 TS_ASSERT_EQUALS(c.framerate(), (uint)100); 220 TS_ASSERT_EQUALS(d.framerate(), (uint)44100); 221 } 222 test_direct_query()223 void test_direct_query() { 224 const Audio::Timestamp a = Audio::Timestamp(0, 22050); 225 const Audio::Timestamp b = a.addFrames(11025); 226 const Audio::Timestamp c = Audio::Timestamp(1500, 22050); 227 228 TS_ASSERT_EQUALS(a.secs(), 0); 229 TS_ASSERT_EQUALS(a.msecs(), 0); 230 TS_ASSERT_EQUALS(a.numberOfFrames(), 0); 231 TS_ASSERT_EQUALS(a.totalNumberOfFrames(), 0); 232 233 TS_ASSERT_EQUALS(b.secs(), 0); 234 TS_ASSERT_EQUALS(b.msecs(), 500); 235 TS_ASSERT_EQUALS(b.numberOfFrames(), 11025); 236 TS_ASSERT_EQUALS(b.totalNumberOfFrames(), 11025); 237 238 TS_ASSERT_EQUALS(c.secs(), 1); 239 TS_ASSERT_EQUALS(c.msecs(), 1500); 240 TS_ASSERT_EQUALS(c.numberOfFrames(), 11025); 241 TS_ASSERT_EQUALS(c.totalNumberOfFrames(), 33075); 242 } 243 test_no_overflow()244 void test_no_overflow() { 245 // The constructor should not overflow and give incoherent values 246 const Audio::Timestamp a = Audio::Timestamp(0, UINT_MAX, 1000); 247 248 int secs = UINT_MAX / 1000; 249 int frames = UINT_MAX % 1000; 250 251 TS_ASSERT_EQUALS(a.secs(), secs); 252 TS_ASSERT_EQUALS(a.numberOfFrames(), frames); 253 } 254 }; 255