1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
2 
3 /*
4     Sonic Visualiser
5     An audio file viewer and annotation editor.
6     Centre for Digital Music, Queen Mary, University of London.
7 
8     This program is free software; you can redistribute it and/or
9     modify it under the terms of the GNU General Public License as
10     published by the Free Software Foundation; either version 2 of the
11     License, or (at your option) any later version.  See the file
12     COPYING included with this distribution for more information.
13 */
14 
15 #ifndef TEST_OUR_REALTIME_H
16 #define TEST_OUR_REALTIME_H
17 
18 #include <QObject>
19 #include <QtTest>
20 #include <QDir>
21 
22 #include <iostream>
23 
24 #include "../RealTime.h"
25 
26 using namespace std;
27 
28 #define ONE_MILLION 1000000
29 #define ONE_BILLION 1000000000
30 
31 class TestOurRealTime : public QObject
32 {
33     Q_OBJECT
34 
compareTexts(string s,const char * e)35     void compareTexts(string s, const char *e) {
36         QCOMPARE(QString(s.c_str()), QString(e));
37     }
38 
39     typedef sv_frame_t frame_type;
40 
41 private slots:
42 
zero()43     void zero()
44     {
45         QCOMPARE(RealTime(0, 0), RealTime::zeroTime);
46         QCOMPARE(RealTime(0, 0).sec, 0);
47         QCOMPARE(RealTime(0, 0).nsec, 0);
48         QCOMPARE(RealTime(0, 0).msec(), 0);
49         QCOMPARE(RealTime(0, 0).usec(), 0);
50     }
51 
ctor()52     void ctor()
53     {
54         QCOMPARE(RealTime(0, 0), RealTime(0, 0));
55 
56         // wraparounds
57         QCOMPARE(RealTime(0, ONE_BILLION/2), RealTime(1, -ONE_BILLION/2));
58         QCOMPARE(RealTime(0, -ONE_BILLION/2), RealTime(-1, ONE_BILLION/2));
59 
60         QCOMPARE(RealTime(1, ONE_BILLION), RealTime(2, 0));
61         QCOMPARE(RealTime(1, -ONE_BILLION), RealTime(0, 0));
62         QCOMPARE(RealTime(-1, ONE_BILLION), RealTime(0, 0));
63         QCOMPARE(RealTime(-1, -ONE_BILLION), RealTime(-2, 0));
64 
65         QCOMPARE(RealTime(1, -ONE_BILLION-ONE_BILLION/2), RealTime(0, -ONE_BILLION/2));
66         QCOMPARE(RealTime(-1, ONE_BILLION+ONE_BILLION/2), RealTime(0, ONE_BILLION/2));
67 
68         QCOMPARE(RealTime(2, -ONE_BILLION*2), RealTime(0, 0));
69         QCOMPARE(RealTime(2, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2));
70 
71         QCOMPARE(RealTime(-2, ONE_BILLION*2), RealTime(0, 0));
72         QCOMPARE(RealTime(-2, ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2));
73 
74         QCOMPARE(RealTime(1, -ONE_BILLION/2).sec, 0);
75         QCOMPARE(RealTime(1, -ONE_BILLION/2).nsec, ONE_BILLION/2);
76         QCOMPARE(RealTime(-1, ONE_BILLION/2).sec, 0);
77         QCOMPARE(RealTime(-1, ONE_BILLION/2).nsec, -ONE_BILLION/2);
78 
79         QCOMPARE(RealTime(0, 1).sec, 0);
80         QCOMPARE(RealTime(0, 1).nsec, 1);
81         QCOMPARE(RealTime(0, -1).sec, 0);
82         QCOMPARE(RealTime(0, -1).nsec, -1);
83         QCOMPARE(RealTime(1, -1).sec, 0);
84         QCOMPARE(RealTime(1, -1).nsec, ONE_BILLION-1);
85         QCOMPARE(RealTime(-1, 1).sec, 0);
86         QCOMPARE(RealTime(-1, 1).nsec, -ONE_BILLION+1);
87         QCOMPARE(RealTime(-1, -1).sec, -1);
88         QCOMPARE(RealTime(-1, -1).nsec, -1);
89 
90         QCOMPARE(RealTime(2, -ONE_BILLION*2).sec, 0);
91         QCOMPARE(RealTime(2, -ONE_BILLION*2).nsec, 0);
92         QCOMPARE(RealTime(2, -ONE_BILLION/2).sec, 1);
93         QCOMPARE(RealTime(2, -ONE_BILLION/2).nsec, ONE_BILLION/2);
94 
95         QCOMPARE(RealTime(-2, ONE_BILLION*2).sec, 0);
96         QCOMPARE(RealTime(-2, ONE_BILLION*2).nsec, 0);
97         QCOMPARE(RealTime(-2, ONE_BILLION/2).sec, -1);
98         QCOMPARE(RealTime(-2, ONE_BILLION/2).nsec, -ONE_BILLION/2);
99     }
100 
fromSeconds()101     void fromSeconds()
102     {
103         QCOMPARE(RealTime::fromSeconds(0), RealTime(0, 0));
104 
105         QCOMPARE(RealTime::fromSeconds(0.5).sec, 0);
106         QCOMPARE(RealTime::fromSeconds(0.5).nsec, ONE_BILLION/2);
107         QCOMPARE(RealTime::fromSeconds(0.5).usec(), ONE_MILLION/2);
108         QCOMPARE(RealTime::fromSeconds(0.5).msec(), 500);
109 
110         QCOMPARE(RealTime::fromSeconds(0.5), RealTime(0, ONE_BILLION/2));
111         QCOMPARE(RealTime::fromSeconds(1), RealTime(1, 0));
112         QCOMPARE(RealTime::fromSeconds(1.5), RealTime(1, ONE_BILLION/2));
113 
114         QCOMPARE(RealTime::fromSeconds(-0.5).sec, 0);
115         QCOMPARE(RealTime::fromSeconds(-0.5).nsec, -ONE_BILLION/2);
116         QCOMPARE(RealTime::fromSeconds(-0.5).usec(), -ONE_MILLION/2);
117         QCOMPARE(RealTime::fromSeconds(-0.5).msec(), -500);
118 
119         QCOMPARE(RealTime::fromSeconds(-1.5).sec, -1);
120         QCOMPARE(RealTime::fromSeconds(-1.5).nsec, -ONE_BILLION/2);
121         QCOMPARE(RealTime::fromSeconds(-1.5).usec(), -ONE_MILLION/2);
122         QCOMPARE(RealTime::fromSeconds(-1.5).msec(), -500);
123 
124         QCOMPARE(RealTime::fromSeconds(-0.5), RealTime(0, -ONE_BILLION/2));
125         QCOMPARE(RealTime::fromSeconds(-1), RealTime(-1, 0));
126         QCOMPARE(RealTime::fromSeconds(-1.5), RealTime(-1, -ONE_BILLION/2));
127     }
128 
fromMilliseconds()129     void fromMilliseconds()
130     {
131         QCOMPARE(RealTime::fromMilliseconds(0), RealTime(0, 0));
132         QCOMPARE(RealTime::fromMilliseconds(500), RealTime(0, ONE_BILLION/2));
133         QCOMPARE(RealTime::fromMilliseconds(1000), RealTime(1, 0));
134         QCOMPARE(RealTime::fromMilliseconds(1500), RealTime(1, ONE_BILLION/2));
135 
136         QCOMPARE(RealTime::fromMilliseconds(-0), RealTime(0, 0));
137         QCOMPARE(RealTime::fromMilliseconds(-500), RealTime(0, -ONE_BILLION/2));
138         QCOMPARE(RealTime::fromMilliseconds(-1000), RealTime(-1, 0));
139         QCOMPARE(RealTime::fromMilliseconds(-1500), RealTime(-1, -ONE_BILLION/2));
140     }
141 
fromMicroseconds()142     void fromMicroseconds()
143     {
144         QCOMPARE(RealTime::fromMicroseconds(0), RealTime(0, 0));
145         QCOMPARE(RealTime::fromMicroseconds(500000), RealTime(0, ONE_BILLION/2));
146         QCOMPARE(RealTime::fromMicroseconds(1000000), RealTime(1, 0));
147         QCOMPARE(RealTime::fromMicroseconds(1500000), RealTime(1, ONE_BILLION/2));
148 
149         QCOMPARE(RealTime::fromMicroseconds(-0), RealTime(0, 0));
150         QCOMPARE(RealTime::fromMicroseconds(-500000), RealTime(0, -ONE_BILLION/2));
151         QCOMPARE(RealTime::fromMicroseconds(-1000000), RealTime(-1, 0));
152         QCOMPARE(RealTime::fromMicroseconds(-1500000), RealTime(-1, -ONE_BILLION/2));
153         QCOMPARE(RealTime::fromMicroseconds(13500000), RealTime(13, ONE_BILLION/2));
154     }
155 
fromTimeval()156     void fromTimeval()
157     {
158         struct timeval tv;
159 
160         tv.tv_sec = 0; tv.tv_usec = 0;
161         QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, 0));
162         tv.tv_sec = 0; tv.tv_usec = ONE_MILLION/2;
163         QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, ONE_BILLION/2));
164         tv.tv_sec = 1; tv.tv_usec = 0;
165         QCOMPARE(RealTime::fromTimeval(tv), RealTime(1, 0));
166         tv.tv_sec = 1; tv.tv_usec = ONE_MILLION/2;
167         QCOMPARE(RealTime::fromTimeval(tv), RealTime(1, ONE_BILLION/2));
168 
169         tv.tv_sec = 0; tv.tv_usec = -ONE_MILLION/2;
170         QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, -ONE_BILLION/2));
171         tv.tv_sec = -1; tv.tv_usec = 0;
172         QCOMPARE(RealTime::fromTimeval(tv), RealTime(-1, 0));
173         tv.tv_sec = -1; tv.tv_usec = -ONE_MILLION/2;
174         QCOMPARE(RealTime::fromTimeval(tv), RealTime(-1, -ONE_BILLION/2));
175     }
176 
fromXsdDuration()177     void fromXsdDuration()
178     {
179         QCOMPARE(RealTime::fromXsdDuration("PT0"), RealTime::zeroTime);
180         QCOMPARE(RealTime::fromXsdDuration("PT0S"), RealTime::zeroTime);
181         QCOMPARE(RealTime::fromXsdDuration("PT10S"), RealTime(10, 0));
182         QCOMPARE(RealTime::fromXsdDuration("PT10.5S"), RealTime(10, ONE_BILLION/2));
183         QCOMPARE(RealTime::fromXsdDuration("PT1.5S").sec, 1);
184         QCOMPARE(RealTime::fromXsdDuration("PT1.5S").msec(), 500);
185         QCOMPARE(RealTime::fromXsdDuration("-PT1.5S").sec, -1);
186         QCOMPARE(RealTime::fromXsdDuration("-PT1.5S").msec(), -500);
187         QCOMPARE(RealTime::fromXsdDuration("PT1M30.5S"), RealTime(90, ONE_BILLION/2));
188         QCOMPARE(RealTime::fromXsdDuration("PT1H2M30.5S"), RealTime(3750, ONE_BILLION/2));
189     }
190 
toDouble()191     void toDouble()
192     {
193         QCOMPARE(RealTime(0, 0).toDouble(), 0.0);
194         QCOMPARE(RealTime(0, ONE_BILLION/2).toDouble(), 0.5);
195         QCOMPARE(RealTime(1, 0).toDouble(), 1.0);
196         QCOMPARE(RealTime(1, ONE_BILLION/2).toDouble(), 1.5);
197 
198         QCOMPARE(RealTime(0, -ONE_BILLION/2).toDouble(), -0.5);
199         QCOMPARE(RealTime(-1, 0).toDouble(), -1.0);
200         QCOMPARE(RealTime(-1, -ONE_BILLION/2).toDouble(), -1.5);
201     }
202 
assign()203     void assign()
204     {
205         RealTime r;
206         r = RealTime(0, 0);
207         QCOMPARE(r, RealTime::zeroTime);
208         r = RealTime(0, ONE_BILLION/2);
209         QCOMPARE(r.sec, 0);
210         QCOMPARE(r.nsec, ONE_BILLION/2);
211         r = RealTime(-1, -ONE_BILLION/2);
212         QCOMPARE(r.sec, -1);
213         QCOMPARE(r.nsec, -ONE_BILLION/2);
214     }
215 
plus()216     void plus()
217     {
218         QCOMPARE(RealTime(0, 0) + RealTime(0, 0), RealTime(0, 0));
219 
220         QCOMPARE(RealTime(0, 0) + RealTime(0, ONE_BILLION/2), RealTime(0, ONE_BILLION/2));
221         QCOMPARE(RealTime(0, ONE_BILLION/2) + RealTime(0, ONE_BILLION/2), RealTime(1, 0));
222         QCOMPARE(RealTime(1, 0) + RealTime(0, ONE_BILLION/2), RealTime(1, ONE_BILLION/2));
223 
224         QCOMPARE(RealTime(0, 0) + RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2));
225         QCOMPARE(RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(-1, 0));
226         QCOMPARE(RealTime(-1, 0) + RealTime(0, -ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2));
227 
228         QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2), RealTime(0, ONE_BILLION/2));
229         QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(0, 0));
230         QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2));
231 
232         QCOMPARE(RealTime(0, ONE_BILLION/2) + RealTime(-1, 0), RealTime(0, -ONE_BILLION/2));
233         QCOMPARE(RealTime(0, -ONE_BILLION/2) + RealTime(1, 0), RealTime(0, ONE_BILLION/2));
234     }
235 
minus()236     void minus()
237     {
238         QCOMPARE(RealTime(0, 0) - RealTime(0, 0), RealTime(0, 0));
239 
240         QCOMPARE(RealTime(0, 0) - RealTime(0, ONE_BILLION/2), RealTime(0, -ONE_BILLION/2));
241         QCOMPARE(RealTime(0, ONE_BILLION/2) - RealTime(0, ONE_BILLION/2), RealTime(0, 0));
242         QCOMPARE(RealTime(1, 0) - RealTime(0, ONE_BILLION/2), RealTime(0, ONE_BILLION/2));
243 
244         QCOMPARE(RealTime(0, 0) - RealTime(0, -ONE_BILLION/2), RealTime(0, ONE_BILLION/2));
245         QCOMPARE(RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(0, 0));
246         QCOMPARE(RealTime(-1, 0) - RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2));
247 
248         QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2));
249         QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(2, 0));
250         QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(2, ONE_BILLION/2));
251 
252         QCOMPARE(RealTime(0, ONE_BILLION/2) - RealTime(-1, 0), RealTime(1, ONE_BILLION/2));
253         QCOMPARE(RealTime(0, -ONE_BILLION/2) - RealTime(1, 0), RealTime(-1, -ONE_BILLION/2));
254     }
255 
negate()256     void negate()
257     {
258         QCOMPARE(-RealTime(0, 0), RealTime(0, 0));
259         QCOMPARE(-RealTime(1, 0), RealTime(-1, 0));
260         QCOMPARE(-RealTime(1, ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2));
261         QCOMPARE(-RealTime(-1, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2));
262     }
263 
compare()264     void compare()
265     {
266         int sec, nsec;
267         for (sec = -2; sec <= 2; sec += 2) {
268             for (nsec = -1; nsec <= 1; nsec += 1) {
269                 QCOMPARE(RealTime(sec, nsec) < RealTime(sec, nsec), false);
270                 QCOMPARE(RealTime(sec, nsec) > RealTime(sec, nsec), false);
271                 QCOMPARE(RealTime(sec, nsec) == RealTime(sec, nsec), true);
272                 QCOMPARE(RealTime(sec, nsec) != RealTime(sec, nsec), false);
273                 QCOMPARE(RealTime(sec, nsec) <= RealTime(sec, nsec), true);
274                 QCOMPARE(RealTime(sec, nsec) >= RealTime(sec, nsec), true);
275             }
276         }
277         RealTime prev(-3, 0);
278         for (sec = -2; sec <= 2; sec += 2) {
279             for (nsec = -1; nsec <= 1; nsec += 1) {
280 
281                 RealTime curr(sec, nsec);
282 
283                 QCOMPARE(prev < curr, true);
284                 QCOMPARE(prev > curr, false);
285                 QCOMPARE(prev == curr, false);
286                 QCOMPARE(prev != curr, true);
287                 QCOMPARE(prev <= curr, true);
288                 QCOMPARE(prev >= curr, false);
289 
290                 QCOMPARE(curr < prev, false);
291                 QCOMPARE(curr > prev, true);
292                 QCOMPARE(curr == prev, false);
293                 QCOMPARE(curr != prev, true);
294                 QCOMPARE(curr <= prev, false);
295                 QCOMPARE(curr >= prev, true);
296 
297                 prev = curr;
298             }
299         }
300     }
301 
frame()302     void frame()
303     {
304         int frames[] = {
305             0, 1, 2047, 2048, 6656,
306             32767, 32768, 44100, 44101,
307             999999999, 2000000000
308         };
309         int n = sizeof(frames)/sizeof(frames[0]);
310 
311         int rates[] = {
312             1, 2, 8000, 22050,
313             44100, 44101, 192000, 2000000001
314         };
315         int m = sizeof(rates)/sizeof(rates[0]);
316 
317         vector<vector<RealTime>> realTimes = {
318             { { 0, 0 }, { 1, 0 }, { 2047, 0 }, { 2048, 0 },
319               { 6656, 0 }, { 32767, 0 }, { 32768, 0 }, { 44100, 0 },
320               { 44101, 0 }, { 999999999, 0 }, { 2000000000, 0 } },
321             { { 0, 0 }, { 0, 500000000 }, { 1023, 500000000 }, { 1024, 0 },
322               { 3328, 0 }, { 16383, 500000000 }, { 16384, 0 }, { 22050, 0 },
323               { 22050, 500000000 }, { 499999999, 500000000 }, { 1000000000, 0 } },
324             { { 0, 0 }, { 0, 125000 }, { 0, 255875000 }, { 0, 256000000 },
325               { 0, 832000000 }, { 4, 95875000 }, { 4, 96000000 }, { 5, 512500000 },
326               { 5, 512625000 }, { 124999, 999875000 }, { 250000, 0 } },
327             { { 0, 0 }, { 0, 45351 }, { 0, 92834467 }, { 0, 92879819 },
328               { 0, 301859410 }, { 1, 486031746 }, { 1, 486077098 }, { 2, 0 },
329               { 2, 45351 }, { 45351, 473877551 }, { 90702, 947845805 } },
330             { { 0, 0 }, { 0, 22676 }, { 0, 46417234 }, { 0, 46439909 },
331               { 0, 150929705 }, { 0, 743015873 }, { 0, 743038549 }, { 1, 0 },
332               { 1, 22676 }, { 22675, 736938776 }, { 45351, 473922902 } },
333             { { 0, 0 }, { 0, 22675 }, { 0, 46416181 }, { 0, 46438856 },
334               { 0, 150926283 }, { 0, 742999025 }, { 0, 743021700 }, { 0, 999977325 },
335               { 1, 0 }, { 22675, 222761389 }, { 45350, 445568128 } },
336             { { 0, 0 }, { 0, 5208 }, { 0, 10661458 }, { 0, 10666667 },
337               { 0, 34666667 }, { 0, 170661458 }, { 0, 170666667 }, { 0, 229687500 },
338               { 0, 229692708 }, { 5208, 333328125 }, { 10416, 666666667 } },
339             { { 0, 0 }, { 0, 0 }, { 0, 1023 }, { 0, 1024 },
340               { 0, 3328 }, { 0, 16383 }, { 0, 16384 }, { 0, 22050 },
341               { 0, 22050 }, { 0, 499999999 }, { 1, 0 } }
342         };
343 
344         for (int i = 0; i < n; ++i) {
345             frame_type frame = frames[i];
346             for (int j = 0; j < m; ++j) {
347                 int rate = rates[j];
348 
349                 RealTime rt = RealTime::frame2RealTime(frame, rate);
350                 QCOMPARE(rt.sec, realTimes[j][i].sec);
351                 QCOMPARE(rt.nsec, realTimes[j][i].nsec);
352 
353                 frame_type conv = RealTime::realTime2Frame(rt, rate);
354 
355                 rt = RealTime::frame2RealTime(-frame, rate);
356                 frame_type negconv = RealTime::realTime2Frame(rt, rate);
357 
358                 if (rate > ONE_BILLION) {
359                     // We don't have enough precision in RealTime
360                     // for this absurd sample rate, so a round trip
361                     // conversion may round
362                     QVERIFY(abs(frame - conv) < 2);
363                     QVERIFY(abs(-frame - negconv) < 2);
364                 } else {
365                     QCOMPARE(conv, frame);
366                     QCOMPARE(negconv, -frame);
367                 }
368             }
369         }
370     }
371 
372     // Our own RealTime has toMSText, toFrameText, toSecText
373 
toText()374     void toText()
375     {
376         // we want to use QStrings, because then the Qt test library
377         // will print out any conflicts. The compareTexts function
378         // does this for us
379 
380         int halfSec = ONE_BILLION/2; // nsec
381 
382         RealTime rt = RealTime(0, 0);
383         compareTexts(rt.toMSText(false, false), "0");
384         compareTexts(rt.toMSText(true, false), "0.000");
385         compareTexts(rt.toMSText(false, true), "0");
386         compareTexts(rt.toMSText(true, true), "0.000");
387         compareTexts(rt.toFrameText(24, false), "0:00");
388         compareTexts(rt.toFrameText(24, true), "0:00");
389         compareTexts(rt.toSecText(), "0s");
390 
391         rt = RealTime(1, halfSec);
392         compareTexts(rt.toMSText(false, false), "1.5");
393         compareTexts(rt.toMSText(true, false), "1.500");
394         compareTexts(rt.toMSText(false, true), "1.5");
395         compareTexts(rt.toMSText(true, true), "1.500");
396         compareTexts(rt.toFrameText(24, false), "1:12");
397         compareTexts(rt.toFrameText(24, true), "1:12");
398         compareTexts(rt.toFrameText(25, false), "1:12");
399         compareTexts(rt.toFrameText(25, true), "1:12");
400         compareTexts(rt.toSecText(), "1s");
401 
402         rt = RealTime::fromSeconds(-1.5);
403         compareTexts(rt.toMSText(false, false), "-1.5");
404         compareTexts(rt.toMSText(true, false), "-1.500");
405         compareTexts(rt.toMSText(false, true), "-1.5");
406         compareTexts(rt.toMSText(true, true), "-1.500");
407         compareTexts(rt.toFrameText(24, false), "-1:12");
408         compareTexts(rt.toFrameText(24, true), "-1:12");
409         compareTexts(rt.toSecText(), "-1s");
410 
411         rt = RealTime(1, 1000);
412         compareTexts(rt.toMSText(false, false), "1");
413         compareTexts(rt.toFrameText(24, false), "1:00");
414         compareTexts(rt.toFrameText(ONE_MILLION, false), "1:000001");
415         compareTexts(rt.toSecText(), "1s");
416 
417         rt = RealTime(1, 100000);
418         compareTexts(rt.toFrameText(ONE_MILLION, false), "1:000100");
419         compareTexts(rt.toSecText(), "1s");
420 
421         rt = RealTime::fromSeconds(60);
422         compareTexts(rt.toMSText(false, false), "60");
423         compareTexts(rt.toMSText(true, false), "60.000");
424         compareTexts(rt.toMSText(false, true), "1:00");
425         compareTexts(rt.toMSText(true, true), "1:00.000");
426         compareTexts(rt.toFrameText(24, false), "60:00");
427         compareTexts(rt.toFrameText(24, true), "1:00:00");
428         compareTexts(rt.toSecText(), "1:00");
429 
430         rt = RealTime::fromSeconds(61.05);
431         compareTexts(rt.toMSText(false, false), "61.05");
432         compareTexts(rt.toMSText(true, false), "61.050");
433         compareTexts(rt.toMSText(false, true), "1:01.05");
434         compareTexts(rt.toMSText(true, true), "1:01.050");
435         compareTexts(rt.toFrameText(24, false), "61:01");
436         compareTexts(rt.toFrameText(24, true), "1:01:01");
437         compareTexts(rt.toSecText(), "1:01");
438 
439         rt = RealTime::fromSeconds(601.05);
440         compareTexts(rt.toMSText(false, false), "601.05");
441         compareTexts(rt.toMSText(true, false), "601.050");
442         compareTexts(rt.toMSText(false, true), "10:01.05");
443         compareTexts(rt.toMSText(true, true), "10:01.050");
444         compareTexts(rt.toFrameText(24, false), "601:01");
445         compareTexts(rt.toFrameText(24, true), "10:01:01");
446         compareTexts(rt.toSecText(), "10:01");
447 
448         rt = RealTime::fromSeconds(3600);
449         compareTexts(rt.toMSText(false, false), "3600");
450         compareTexts(rt.toMSText(true, false), "3600.000");
451         compareTexts(rt.toMSText(false, true), "1:00:00");
452         compareTexts(rt.toMSText(true, true), "1:00:00.000");
453         compareTexts(rt.toFrameText(24, false), "3600:00");
454         compareTexts(rt.toFrameText(24, true), "1:00:00:00");
455         compareTexts(rt.toSecText(), "1:00:00");
456 
457         // For practical reasons our time display always rounds down
458         rt = RealTime(3599, ONE_BILLION-1);
459         compareTexts(rt.toMSText(false, false), "3599.999");
460         compareTexts(rt.toMSText(true, false), "3599.999");
461         compareTexts(rt.toMSText(false, true), "59:59.999");
462         compareTexts(rt.toMSText(true, true), "59:59.999");
463         compareTexts(rt.toFrameText(24, false), "3599:23");
464         compareTexts(rt.toFrameText(24, true), "59:59:23");
465         compareTexts(rt.toSecText(), "59:59");
466 
467         rt = RealTime::fromSeconds(3600 * 4 + 60 * 5 + 3 + 0.01);
468         compareTexts(rt.toMSText(false, false), "14703.01");
469         compareTexts(rt.toMSText(true, false), "14703.010");
470         compareTexts(rt.toMSText(false, true), "4:05:03.01");
471         compareTexts(rt.toMSText(true, true), "4:05:03.010");
472         compareTexts(rt.toFrameText(24, false), "14703:00");
473         compareTexts(rt.toFrameText(24, true), "4:05:03:00");
474         compareTexts(rt.toSecText(), "4:05:03");
475 
476         rt = RealTime::fromSeconds(-(3600 * 4 + 60 * 5 + 3 + 0.01));
477         compareTexts(rt.toMSText(false, false), "-14703.01");
478         compareTexts(rt.toMSText(true, false), "-14703.010");
479         compareTexts(rt.toMSText(false, true), "-4:05:03.01");
480         compareTexts(rt.toMSText(true, true), "-4:05:03.010");
481         compareTexts(rt.toFrameText(24, false), "-14703:00");
482         compareTexts(rt.toFrameText(24, true), "-4:05:03:00");
483         compareTexts(rt.toSecText(), "-4:05:03");
484     }
485 };
486 
487 #endif
488 
489