annotate base/test/TestRealTime.h @ 1061:c1e43c8d2527 tonioni

Thread-local debug was causing crash on exit with Qt 5.4.x. But we introduced that because QDebug itself was crashing when used from multiple threads. Replace with simpler fstream version
author Chris Cannam
date Tue, 31 Mar 2015 10:36:52 +0100
parents a1cd5abcb38b
children b8a788c9a6f1
rev   line source
Chris@1012 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@1012 2
Chris@1012 3 /*
Chris@1012 4 Sonic Visualiser
Chris@1012 5 An audio file viewer and annotation editor.
Chris@1012 6 Centre for Digital Music, Queen Mary, University of London.
Chris@1012 7
Chris@1012 8 This program is free software; you can redistribute it and/or
Chris@1012 9 modify it under the terms of the GNU General Public License as
Chris@1012 10 published by the Free Software Foundation; either version 2 of the
Chris@1012 11 License, or (at your option) any later version. See the file
Chris@1012 12 COPYING included with this distribution for more information.
Chris@1012 13 */
Chris@1012 14
Chris@1012 15 #ifndef TEST_REALTIME_H
Chris@1012 16 #define TEST_REALTIME_H
Chris@1012 17
Chris@1012 18 #include "../RealTime.h"
Chris@1012 19
Chris@1012 20 #include <QObject>
Chris@1012 21 #include <QtTest>
Chris@1012 22 #include <QDir>
Chris@1012 23
Chris@1012 24 #include <iostream>
Chris@1012 25
Chris@1012 26 using namespace std;
Chris@1012 27
Chris@1012 28 class TestRealTime : public QObject
Chris@1012 29 {
Chris@1012 30 Q_OBJECT
Chris@1012 31
Chris@1012 32 private slots:
Chris@1012 33
Chris@1012 34 #define ONE_MILLION 1000000
Chris@1012 35 #define ONE_BILLION 1000000000
Chris@1012 36
Chris@1012 37 void zero()
Chris@1012 38 {
Chris@1012 39 QCOMPARE(RealTime(0, 0), RealTime::zeroTime);
Chris@1012 40 QCOMPARE(RealTime(0, 0).sec, 0);
Chris@1012 41 QCOMPARE(RealTime(0, 0).nsec, 0);
Chris@1012 42 QCOMPARE(RealTime(0, 0).msec(), 0);
Chris@1012 43 QCOMPARE(RealTime(0, 0).usec(), 0);
Chris@1012 44 }
Chris@1012 45
Chris@1012 46 void ctor()
Chris@1012 47 {
Chris@1012 48 QCOMPARE(RealTime(0, 0), RealTime(0, 0));
Chris@1012 49
Chris@1012 50 // wraparounds
Chris@1012 51 QCOMPARE(RealTime(0, ONE_BILLION/2), RealTime(1, -ONE_BILLION/2));
Chris@1012 52 QCOMPARE(RealTime(0, -ONE_BILLION/2), RealTime(-1, ONE_BILLION/2));
Chris@1012 53
Chris@1015 54 QCOMPARE(RealTime(1, ONE_BILLION), RealTime(2, 0));
Chris@1015 55 QCOMPARE(RealTime(1, -ONE_BILLION), RealTime(0, 0));
Chris@1015 56 QCOMPARE(RealTime(-1, ONE_BILLION), RealTime(0, 0));
Chris@1015 57 QCOMPARE(RealTime(-1, -ONE_BILLION), RealTime(-2, 0));
Chris@1015 58
Chris@1012 59 QCOMPARE(RealTime(2, -ONE_BILLION*2), RealTime(0, 0));
Chris@1012 60 QCOMPARE(RealTime(2, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2));
Chris@1012 61
Chris@1012 62 QCOMPARE(RealTime(-2, ONE_BILLION*2), RealTime(0, 0));
Chris@1012 63 QCOMPARE(RealTime(-2, ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2));
Chris@1012 64
Chris@1012 65 QCOMPARE(RealTime(0, 1).sec, 0);
Chris@1012 66 QCOMPARE(RealTime(0, 1).nsec, 1);
Chris@1012 67 QCOMPARE(RealTime(0, -1).sec, 0);
Chris@1012 68 QCOMPARE(RealTime(0, -1).nsec, -1);
Chris@1012 69 QCOMPARE(RealTime(1, -1).sec, 0);
Chris@1012 70 QCOMPARE(RealTime(1, -1).nsec, ONE_BILLION-1);
Chris@1012 71 QCOMPARE(RealTime(-1, 1).sec, 0);
Chris@1012 72 QCOMPARE(RealTime(-1, 1).nsec, -ONE_BILLION+1);
Chris@1012 73 QCOMPARE(RealTime(-1, -1).sec, -1);
Chris@1012 74 QCOMPARE(RealTime(-1, -1).nsec, -1);
Chris@1015 75
Chris@1015 76 QCOMPARE(RealTime(2, -ONE_BILLION*2).sec, 0);
Chris@1015 77 QCOMPARE(RealTime(2, -ONE_BILLION*2).nsec, 0);
Chris@1015 78 QCOMPARE(RealTime(2, -ONE_BILLION/2).sec, 1);
Chris@1015 79 QCOMPARE(RealTime(2, -ONE_BILLION/2).nsec, ONE_BILLION/2);
Chris@1015 80
Chris@1015 81 QCOMPARE(RealTime(-2, ONE_BILLION*2).sec, 0);
Chris@1015 82 QCOMPARE(RealTime(-2, ONE_BILLION*2).nsec, 0);
Chris@1015 83 QCOMPARE(RealTime(-2, ONE_BILLION/2).sec, -1);
Chris@1015 84 QCOMPARE(RealTime(-2, ONE_BILLION/2).nsec, -ONE_BILLION/2);
Chris@1012 85 }
Chris@1012 86
Chris@1012 87 void fromSeconds()
Chris@1012 88 {
Chris@1012 89 QCOMPARE(RealTime::fromSeconds(0), RealTime(0, 0));
Chris@1012 90
Chris@1012 91 QCOMPARE(RealTime::fromSeconds(0.5).sec, 0);
Chris@1012 92 QCOMPARE(RealTime::fromSeconds(0.5).nsec, ONE_BILLION/2);
Chris@1012 93 QCOMPARE(RealTime::fromSeconds(0.5).usec(), ONE_MILLION/2);
Chris@1012 94 QCOMPARE(RealTime::fromSeconds(0.5).msec(), 500);
Chris@1012 95
Chris@1012 96 QCOMPARE(RealTime::fromSeconds(0.5), RealTime(0, ONE_BILLION/2));
Chris@1012 97 QCOMPARE(RealTime::fromSeconds(1), RealTime(1, 0));
Chris@1012 98 QCOMPARE(RealTime::fromSeconds(1.5), RealTime(1, ONE_BILLION/2));
Chris@1012 99
Chris@1012 100 QCOMPARE(RealTime::fromSeconds(-0.5).sec, 0);
Chris@1012 101 QCOMPARE(RealTime::fromSeconds(-0.5).nsec, -ONE_BILLION/2);
Chris@1012 102 QCOMPARE(RealTime::fromSeconds(-0.5).usec(), -ONE_MILLION/2);
Chris@1012 103 QCOMPARE(RealTime::fromSeconds(-0.5).msec(), -500);
Chris@1012 104
Chris@1012 105 QCOMPARE(RealTime::fromSeconds(-1.5).sec, -1);
Chris@1012 106 QCOMPARE(RealTime::fromSeconds(-1.5).nsec, -ONE_BILLION/2);
Chris@1012 107 QCOMPARE(RealTime::fromSeconds(-1.5).usec(), -ONE_MILLION/2);
Chris@1012 108 QCOMPARE(RealTime::fromSeconds(-1.5).msec(), -500);
Chris@1012 109
Chris@1012 110 QCOMPARE(RealTime::fromSeconds(-0.5), RealTime(0, -ONE_BILLION/2));
Chris@1012 111 QCOMPARE(RealTime::fromSeconds(-1), RealTime(-1, 0));
Chris@1012 112 QCOMPARE(RealTime::fromSeconds(-1.5), RealTime(-1, -ONE_BILLION/2));
Chris@1012 113 }
Chris@1012 114
Chris@1012 115 void fromMilliseconds()
Chris@1012 116 {
Chris@1012 117 QCOMPARE(RealTime::fromMilliseconds(0), RealTime(0, 0));
Chris@1012 118 QCOMPARE(RealTime::fromMilliseconds(500), RealTime(0, ONE_BILLION/2));
Chris@1012 119 QCOMPARE(RealTime::fromMilliseconds(1000), RealTime(1, 0));
Chris@1012 120 QCOMPARE(RealTime::fromMilliseconds(1500), RealTime(1, ONE_BILLION/2));
Chris@1012 121
Chris@1012 122 QCOMPARE(RealTime::fromMilliseconds(-0), RealTime(0, 0));
Chris@1012 123 QCOMPARE(RealTime::fromMilliseconds(-500), RealTime(0, -ONE_BILLION/2));
Chris@1012 124 QCOMPARE(RealTime::fromMilliseconds(-1000), RealTime(-1, 0));
Chris@1012 125 QCOMPARE(RealTime::fromMilliseconds(-1500), RealTime(-1, -ONE_BILLION/2));
Chris@1012 126 }
Chris@1012 127
Chris@1012 128 void fromTimeval()
Chris@1012 129 {
Chris@1012 130 struct timeval tv;
Chris@1012 131
Chris@1012 132 tv.tv_sec = 0; tv.tv_usec = 0;
Chris@1012 133 QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, 0));
Chris@1012 134 tv.tv_sec = 0; tv.tv_usec = ONE_MILLION/2;
Chris@1012 135 QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, ONE_BILLION/2));
Chris@1012 136 tv.tv_sec = 1; tv.tv_usec = 0;
Chris@1012 137 QCOMPARE(RealTime::fromTimeval(tv), RealTime(1, 0));
Chris@1012 138 tv.tv_sec = 1; tv.tv_usec = ONE_MILLION/2;
Chris@1012 139 QCOMPARE(RealTime::fromTimeval(tv), RealTime(1, ONE_BILLION/2));
Chris@1012 140
Chris@1012 141 tv.tv_sec = 0; tv.tv_usec = -ONE_MILLION/2;
Chris@1012 142 QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, -ONE_BILLION/2));
Chris@1012 143 tv.tv_sec = -1; tv.tv_usec = 0;
Chris@1012 144 QCOMPARE(RealTime::fromTimeval(tv), RealTime(-1, 0));
Chris@1012 145 tv.tv_sec = -1; tv.tv_usec = -ONE_MILLION/2;
Chris@1012 146 QCOMPARE(RealTime::fromTimeval(tv), RealTime(-1, -ONE_BILLION/2));
Chris@1012 147 }
Chris@1012 148
Chris@1012 149 void fromXsdDuration()
Chris@1012 150 {
Chris@1012 151 QCOMPARE(RealTime::fromXsdDuration("PT0"), RealTime::zeroTime);
Chris@1012 152 QCOMPARE(RealTime::fromXsdDuration("PT0S"), RealTime::zeroTime);
Chris@1012 153 QCOMPARE(RealTime::fromXsdDuration("PT10S"), RealTime(10, 0));
Chris@1012 154 QCOMPARE(RealTime::fromXsdDuration("PT10.5S"), RealTime(10, ONE_BILLION/2));
Chris@1012 155 QCOMPARE(RealTime::fromXsdDuration("PT1.5S").sec, 1);
Chris@1012 156 QCOMPARE(RealTime::fromXsdDuration("PT1.5S").msec(), 500);
Chris@1012 157 QCOMPARE(RealTime::fromXsdDuration("-PT1.5S").sec, -1);
Chris@1012 158 QCOMPARE(RealTime::fromXsdDuration("-PT1.5S").msec(), -500);
Chris@1012 159 QCOMPARE(RealTime::fromXsdDuration("PT1M30.5S"), RealTime(90, ONE_BILLION/2));
Chris@1012 160 QCOMPARE(RealTime::fromXsdDuration("PT1H2M30.5S"), RealTime(3750, ONE_BILLION/2));
Chris@1012 161 }
Chris@1012 162
Chris@1012 163 void toDouble()
Chris@1012 164 {
Chris@1012 165 QCOMPARE(RealTime(0, 0).toDouble(), 0.0);
Chris@1012 166 QCOMPARE(RealTime(0, ONE_BILLION/2).toDouble(), 0.5);
Chris@1012 167 QCOMPARE(RealTime(1, 0).toDouble(), 1.0);
Chris@1012 168 QCOMPARE(RealTime(1, ONE_BILLION/2).toDouble(), 1.5);
Chris@1012 169
Chris@1012 170 QCOMPARE(RealTime(0, -ONE_BILLION/2).toDouble(), -0.5);
Chris@1012 171 QCOMPARE(RealTime(-1, 0).toDouble(), -1.0);
Chris@1012 172 QCOMPARE(RealTime(-1, -ONE_BILLION/2).toDouble(), -1.5);
Chris@1012 173 }
Chris@1012 174
Chris@1012 175 void assign()
Chris@1012 176 {
Chris@1012 177 RealTime r;
Chris@1012 178 r = RealTime(0, 0);
Chris@1012 179 QCOMPARE(r, RealTime::zeroTime);
Chris@1012 180 r = RealTime(0, ONE_BILLION/2);
Chris@1012 181 QCOMPARE(r.toDouble(), 0.5);
Chris@1012 182 r = RealTime(-1, -ONE_BILLION/2);
Chris@1012 183 QCOMPARE(r.toDouble(), -1.5);
Chris@1012 184 }
Chris@1012 185
Chris@1012 186 void plus()
Chris@1012 187 {
Chris@1012 188 QCOMPARE(RealTime(0, 0) + RealTime(0, 0), RealTime(0, 0));
Chris@1012 189
Chris@1012 190 QCOMPARE(RealTime(0, 0) + RealTime(0, ONE_BILLION/2), RealTime(0, ONE_BILLION/2));
Chris@1012 191 QCOMPARE(RealTime(0, ONE_BILLION/2) + RealTime(0, ONE_BILLION/2), RealTime(1, 0));
Chris@1012 192 QCOMPARE(RealTime(1, 0) + RealTime(0, ONE_BILLION/2), RealTime(1, ONE_BILLION/2));
Chris@1012 193
Chris@1012 194 QCOMPARE(RealTime(0, 0) + RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2));
Chris@1012 195 QCOMPARE(RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(-1, 0));
Chris@1012 196 QCOMPARE(RealTime(-1, 0) + RealTime(0, -ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2));
Chris@1012 197
Chris@1012 198 QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2), RealTime(0, ONE_BILLION/2));
Chris@1012 199 QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(0, 0));
Chris@1012 200 QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2));
Chris@1012 201
Chris@1012 202 QCOMPARE(RealTime(0, ONE_BILLION/2) + RealTime(-1, 0), RealTime(0, -ONE_BILLION/2));
Chris@1012 203 QCOMPARE(RealTime(0, -ONE_BILLION/2) + RealTime(1, 0), RealTime(0, ONE_BILLION/2));
Chris@1012 204 }
Chris@1014 205
Chris@1014 206 void minus()
Chris@1014 207 {
Chris@1014 208 QCOMPARE(RealTime(0, 0) - RealTime(0, 0), RealTime(0, 0));
Chris@1014 209
Chris@1014 210 QCOMPARE(RealTime(0, 0) - RealTime(0, ONE_BILLION/2), RealTime(0, -ONE_BILLION/2));
Chris@1014 211 QCOMPARE(RealTime(0, ONE_BILLION/2) - RealTime(0, ONE_BILLION/2), RealTime(0, 0));
Chris@1014 212 QCOMPARE(RealTime(1, 0) - RealTime(0, ONE_BILLION/2), RealTime(0, ONE_BILLION/2));
Chris@1014 213
Chris@1014 214 QCOMPARE(RealTime(0, 0) - RealTime(0, -ONE_BILLION/2), RealTime(0, ONE_BILLION/2));
Chris@1014 215 QCOMPARE(RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(0, 0));
Chris@1014 216 QCOMPARE(RealTime(-1, 0) - RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2));
Chris@1014 217
Chris@1014 218 QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2));
Chris@1014 219 QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(2, 0));
Chris@1014 220 QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(2, ONE_BILLION/2));
Chris@1014 221
Chris@1014 222 QCOMPARE(RealTime(0, ONE_BILLION/2) - RealTime(-1, 0), RealTime(1, ONE_BILLION/2));
Chris@1014 223 QCOMPARE(RealTime(0, -ONE_BILLION/2) - RealTime(1, 0), RealTime(-1, -ONE_BILLION/2));
Chris@1014 224 }
Chris@1015 225
Chris@1015 226 void negate()
Chris@1015 227 {
Chris@1015 228 QCOMPARE(-RealTime(0, 0), RealTime(0, 0));
Chris@1015 229 QCOMPARE(-RealTime(1, 0), RealTime(-1, 0));
Chris@1015 230 QCOMPARE(-RealTime(1, ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2));
Chris@1015 231 QCOMPARE(-RealTime(-1, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2));
Chris@1015 232 }
Chris@1015 233
Chris@1015 234 void compare()
Chris@1015 235 {
Chris@1015 236 int sec, nsec;
Chris@1015 237 for (sec = -2; sec <= 2; sec += 2) {
Chris@1015 238 for (nsec = -1; nsec <= 1; nsec += 1) {
Chris@1015 239 QCOMPARE(RealTime(sec, nsec) < RealTime(sec, nsec), false);
Chris@1015 240 QCOMPARE(RealTime(sec, nsec) > RealTime(sec, nsec), false);
Chris@1015 241 QCOMPARE(RealTime(sec, nsec) == RealTime(sec, nsec), true);
Chris@1015 242 QCOMPARE(RealTime(sec, nsec) != RealTime(sec, nsec), false);
Chris@1015 243 QCOMPARE(RealTime(sec, nsec) <= RealTime(sec, nsec), true);
Chris@1015 244 QCOMPARE(RealTime(sec, nsec) >= RealTime(sec, nsec), true);
Chris@1015 245 }
Chris@1015 246 }
Chris@1015 247 RealTime prev(-3, 0);
Chris@1015 248 for (sec = -2; sec <= 2; sec += 2) {
Chris@1015 249 for (nsec = -1; nsec <= 1; nsec += 1) {
Chris@1015 250
Chris@1015 251 RealTime curr(sec, nsec);
Chris@1015 252
Chris@1015 253 QCOMPARE(prev < curr, true);
Chris@1015 254 QCOMPARE(prev > curr, false);
Chris@1015 255 QCOMPARE(prev == curr, false);
Chris@1015 256 QCOMPARE(prev != curr, true);
Chris@1015 257 QCOMPARE(prev <= curr, true);
Chris@1015 258 QCOMPARE(prev >= curr, false);
Chris@1015 259
Chris@1015 260 QCOMPARE(curr < prev, false);
Chris@1015 261 QCOMPARE(curr > prev, true);
Chris@1015 262 QCOMPARE(curr == prev, false);
Chris@1015 263 QCOMPARE(curr != prev, true);
Chris@1015 264 QCOMPARE(curr <= prev, false);
Chris@1015 265 QCOMPARE(curr >= prev, true);
Chris@1015 266
Chris@1015 267 prev = curr;
Chris@1015 268 }
Chris@1015 269 }
Chris@1015 270 }
Chris@1015 271
Chris@1028 272 void frame()
Chris@1028 273 {
Chris@1028 274 int frames[] = {
Chris@1028 275 0, 1, 2047, 2048, 6656, 32767, 32768, 44100, 44101, 999999999
Chris@1028 276 };
Chris@1028 277 int n = sizeof(frames)/sizeof(frames[0]);
Chris@1028 278
Chris@1028 279 int rates[] = {
Chris@1028 280 1, 2, 8000, 22050, 44100, 44101, 192000
Chris@1028 281 };
Chris@1028 282 int m = sizeof(rates)/sizeof(rates[0]);
Chris@1028 283
Chris@1028 284 for (int i = 0; i < n; ++i) {
Chris@1040 285 sv_frame_t frame = frames[i];
Chris@1028 286 for (int j = 0; j < m; ++j) {
Chris@1028 287 int rate = rates[j];
Chris@1028 288
Chris@1028 289 RealTime rt = RealTime::frame2RealTime(frame, rate);
Chris@1040 290 sv_frame_t conv = RealTime::realTime2Frame(rt, rate);
Chris@1028 291 QCOMPARE(frame, conv);
Chris@1028 292
Chris@1028 293 rt = RealTime::frame2RealTime(-frame, rate);
Chris@1028 294 conv = RealTime::realTime2Frame(rt, rate);
Chris@1028 295 QCOMPARE(-frame, conv);
Chris@1028 296 }
Chris@1028 297 }
Chris@1028 298 }
Chris@1012 299 };
Chris@1012 300
Chris@1012 301 #endif