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