annotate base/test/TestScaleTickIntervals.h @ 1414:c57994e1edd7 scale-ticks

Add logarithmic ticks. This is getting complicated!
author Chris Cannam
date Thu, 04 May 2017 10:14:56 +0100
parents c6fa111b4553
children 12316a9bcc8f
rev   line source
Chris@1407 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@1407 2
Chris@1407 3 /*
Chris@1407 4 Sonic Visualiser
Chris@1407 5 An audio file viewer and annotation editor.
Chris@1407 6 Centre for Digital Music, Queen Mary, University of London.
Chris@1407 7
Chris@1407 8 This program is free software; you can redistribute it and/or
Chris@1407 9 modify it under the terms of the GNU General Public License as
Chris@1407 10 published by the Free Software Foundation; either version 2 of the
Chris@1407 11 License, or (at your option) any later version. See the file
Chris@1407 12 COPYING included with this distribution for more information.
Chris@1407 13 */
Chris@1407 14
Chris@1407 15 #ifndef TEST_SCALE_TICK_INTERVALS_H
Chris@1407 16 #define TEST_SCALE_TICK_INTERVALS_H
Chris@1407 17
Chris@1407 18 #include "../ScaleTickIntervals.h"
Chris@1407 19
Chris@1407 20 #include <QObject>
Chris@1407 21 #include <QtTest>
Chris@1407 22 #include <QDir>
Chris@1407 23
Chris@1407 24 #include <iostream>
Chris@1407 25
Chris@1407 26 using namespace std;
Chris@1407 27
Chris@1407 28 class TestScaleTickIntervals : public QObject
Chris@1407 29 {
Chris@1407 30 Q_OBJECT
Chris@1407 31
Chris@1407 32 void printDiff(vector<ScaleTickIntervals::Tick> ticks,
Chris@1407 33 vector<ScaleTickIntervals::Tick> expected) {
Chris@1407 34
Chris@1407 35 cerr << "Have " << ticks.size() << " ticks, expected "
Chris@1407 36 << expected.size() << endl;
Chris@1411 37 for (int i = 0; i < int(ticks.size()); ++i) {
Chris@1411 38 cerr << i << ": have " << ticks[i].value << " \""
Chris@1411 39 << ticks[i].label << "\", expected ";
Chris@1411 40 if (i < int(expected.size())) {
Chris@1411 41 cerr << expected[i].value << " \"" << expected[i].label
Chris@1407 42 << "\"" << endl;
Chris@1411 43 } else {
Chris@1411 44 cerr << "(n/a)" << endl;
Chris@1407 45 }
Chris@1407 46 }
Chris@1407 47 }
Chris@1407 48
Chris@1407 49 void compareTicks(vector<ScaleTickIntervals::Tick> ticks,
Chris@1407 50 vector<ScaleTickIntervals::Tick> expected)
Chris@1407 51 {
Chris@1408 52 double eps = 1e-7;
Chris@1407 53 for (int i = 0; i < int(expected.size()); ++i) {
Chris@1407 54 if (i < int(ticks.size())) {
Chris@1407 55 if (ticks[i].label != expected[i].label ||
Chris@1408 56 fabs(ticks[i].value - expected[i].value) > eps) {
Chris@1407 57 printDiff(ticks, expected);
Chris@1407 58 }
Chris@1407 59 QCOMPARE(ticks[i].label, expected[i].label);
Chris@1407 60 QCOMPARE(ticks[i].value, expected[i].value);
Chris@1407 61 }
Chris@1407 62 }
Chris@1408 63 if (ticks.size() != expected.size()) {
Chris@1408 64 printDiff(ticks, expected);
Chris@1408 65 }
Chris@1407 66 QCOMPARE(ticks.size(), expected.size());
Chris@1407 67 }
Chris@1407 68
Chris@1407 69 private slots:
Chris@1407 70 void linear_0_1_10()
Chris@1407 71 {
Chris@1407 72 auto ticks = ScaleTickIntervals::linear({ 0, 1, 10 });
Chris@1407 73 vector<ScaleTickIntervals::Tick> expected {
Chris@1409 74 { 0.0, "0.0" },
Chris@1409 75 { 0.1, "0.1" },
Chris@1409 76 { 0.2, "0.2" },
Chris@1409 77 { 0.3, "0.3" },
Chris@1409 78 { 0.4, "0.4" },
Chris@1409 79 { 0.5, "0.5" },
Chris@1409 80 { 0.6, "0.6" },
Chris@1409 81 { 0.7, "0.7" },
Chris@1409 82 { 0.8, "0.8" },
Chris@1409 83 { 0.9, "0.9" },
Chris@1409 84 { 1.0, "1.0" }
Chris@1409 85 };
Chris@1409 86 compareTicks(ticks.ticks, expected);
Chris@1409 87 }
Chris@1409 88
Chris@1409 89 void linear_0_5_5()
Chris@1409 90 {
Chris@1409 91 auto ticks = ScaleTickIntervals::linear({ 0, 5, 5 });
Chris@1410 92 // generally if we have some activity in the units column, we
Chris@1410 93 // should add .0 to satisfy the human worry that we aren't
Chris@1410 94 // being told the whole story...
Chris@1409 95 vector<ScaleTickIntervals::Tick> expected {
Chris@1410 96 { 0, "0.0" },
Chris@1410 97 { 1, "1.0" },
Chris@1410 98 { 2, "2.0" },
Chris@1410 99 { 3, "3.0" },
Chris@1410 100 { 4, "4.0" },
Chris@1410 101 { 5, "5.0" },
Chris@1409 102 };
Chris@1409 103 compareTicks(ticks.ticks, expected);
Chris@1409 104 }
Chris@1409 105
Chris@1409 106 void linear_0_10_5()
Chris@1409 107 {
Chris@1409 108 auto ticks = ScaleTickIntervals::linear({ 0, 10, 5 });
Chris@1409 109 vector<ScaleTickIntervals::Tick> expected {
Chris@1410 110 { 0, "0.0" },
Chris@1410 111 { 2, "2.0" },
Chris@1410 112 { 4, "4.0" },
Chris@1410 113 { 6, "6.0" },
Chris@1410 114 { 8, "8.0" },
Chris@1410 115 { 10, "10.0" }
Chris@1407 116 };
Chris@1407 117 compareTicks(ticks.ticks, expected);
Chris@1407 118 }
Chris@1407 119
Chris@1411 120 void linear_10_0_5()
Chris@1411 121 {
Chris@1411 122 auto ticks = ScaleTickIntervals::linear({ 10, 0, 5 });
Chris@1411 123 vector<ScaleTickIntervals::Tick> expected {
Chris@1411 124 { 0, "0.0" },
Chris@1411 125 { 2, "2.0" },
Chris@1411 126 { 4, "4.0" },
Chris@1411 127 { 6, "6.0" },
Chris@1411 128 { 8, "8.0" },
Chris@1411 129 { 10, "10.0" }
Chris@1411 130 };
Chris@1411 131 compareTicks(ticks.ticks, expected);
Chris@1411 132 }
Chris@1411 133
Chris@1411 134 void linear_m10_0_5()
Chris@1411 135 {
Chris@1411 136 auto ticks = ScaleTickIntervals::linear({ -10, 0, 5 });
Chris@1411 137 vector<ScaleTickIntervals::Tick> expected {
Chris@1411 138 { -10, "-10.0" },
Chris@1411 139 { -8, "-8.0" },
Chris@1411 140 { -6, "-6.0" },
Chris@1411 141 { -4, "-4.0" },
Chris@1411 142 { -2, "-2.0" },
Chris@1411 143 { 0, "0.0" }
Chris@1411 144 };
Chris@1411 145 compareTicks(ticks.ticks, expected);
Chris@1411 146 }
Chris@1411 147
Chris@1411 148 void linear_0_m10_5()
Chris@1411 149 {
Chris@1411 150 auto ticks = ScaleTickIntervals::linear({ 0, -10, 5 });
Chris@1411 151 vector<ScaleTickIntervals::Tick> expected {
Chris@1411 152 { -10, "-10.0" },
Chris@1411 153 { -8, "-8.0" },
Chris@1411 154 { -6, "-6.0" },
Chris@1411 155 { -4, "-4.0" },
Chris@1411 156 { -2, "-2.0" },
Chris@1411 157 { 0, "0.0" }
Chris@1411 158 };
Chris@1411 159 compareTicks(ticks.ticks, expected);
Chris@1411 160 }
Chris@1411 161
Chris@1407 162 void linear_0_0p1_5()
Chris@1407 163 {
Chris@1407 164 auto ticks = ScaleTickIntervals::linear({ 0, 0.1, 5 });
Chris@1407 165 vector<ScaleTickIntervals::Tick> expected {
Chris@1409 166 { 0.00, "0.00" },
Chris@1407 167 { 0.02, "0.02" },
Chris@1407 168 { 0.04, "0.04" },
Chris@1407 169 { 0.06, "0.06" },
Chris@1407 170 { 0.08, "0.08" },
Chris@1409 171 { 0.10, "0.10" }
Chris@1407 172 };
Chris@1407 173 compareTicks(ticks.ticks, expected);
Chris@1407 174 }
Chris@1407 175
Chris@1407 176 void linear_0_0p01_5()
Chris@1407 177 {
Chris@1407 178 auto ticks = ScaleTickIntervals::linear({ 0, 0.01, 5 });
Chris@1407 179 vector<ScaleTickIntervals::Tick> expected {
Chris@1409 180 { 0.000, "0.000" },
Chris@1407 181 { 0.002, "0.002" },
Chris@1407 182 { 0.004, "0.004" },
Chris@1407 183 { 0.006, "0.006" },
Chris@1407 184 { 0.008, "0.008" },
Chris@1409 185 { 0.010, "0.010" }
Chris@1409 186 };
Chris@1409 187 compareTicks(ticks.ticks, expected);
Chris@1409 188 }
Chris@1409 189
Chris@1409 190 void linear_0_0p005_5()
Chris@1409 191 {
Chris@1409 192 auto ticks = ScaleTickIntervals::linear({ 0, 0.005, 5 });
Chris@1409 193 vector<ScaleTickIntervals::Tick> expected {
Chris@1409 194 { 0.000, "0.000" },
Chris@1409 195 { 0.001, "0.001" },
Chris@1409 196 { 0.002, "0.002" },
Chris@1409 197 { 0.003, "0.003" },
Chris@1409 198 { 0.004, "0.004" },
Chris@1409 199 { 0.005, "0.005" }
Chris@1407 200 };
Chris@1407 201 compareTicks(ticks.ticks, expected);
Chris@1407 202 }
Chris@1407 203
Chris@1407 204 void linear_0_0p001_5()
Chris@1407 205 {
Chris@1407 206 auto ticks = ScaleTickIntervals::linear({ 0, 0.001, 5 });
Chris@1407 207 vector<ScaleTickIntervals::Tick> expected {
Chris@1409 208 { 0.0000, "0.0e+00" },
Chris@1407 209 { 0.0002, "2.0e-04" },
Chris@1407 210 { 0.0004, "4.0e-04" },
Chris@1407 211 { 0.0006, "6.0e-04" },
Chris@1407 212 { 0.0008, "8.0e-04" },
Chris@1409 213 { 0.0010, "1.0e-03" }
Chris@1407 214 };
Chris@1407 215 compareTicks(ticks.ticks, expected);
Chris@1407 216 }
Chris@1407 217
Chris@1407 218 void linear_1_1p001_5()
Chris@1407 219 {
Chris@1407 220 auto ticks = ScaleTickIntervals::linear({ 1, 1.001, 5 });
Chris@1407 221 vector<ScaleTickIntervals::Tick> expected {
Chris@1409 222 { 1.0000, "1.0000" },
Chris@1407 223 { 1.0002, "1.0002" },
Chris@1407 224 { 1.0004, "1.0004" },
Chris@1407 225 { 1.0006, "1.0006" },
Chris@1407 226 { 1.0008, "1.0008" },
Chris@1409 227 { 1.0010, "1.0010" }
Chris@1409 228 };
Chris@1409 229 compareTicks(ticks.ticks, expected);
Chris@1409 230 }
Chris@1409 231
Chris@1413 232 void linear_0p001_1_5()
Chris@1413 233 {
Chris@1413 234 auto ticks = ScaleTickIntervals::linear({ 0.001, 1, 5 });
Chris@1413 235 vector<ScaleTickIntervals::Tick> expected {
Chris@1413 236 { 0.1, "0.1" },
Chris@1413 237 { 0.3, "0.3" },
Chris@1413 238 { 0.5, "0.5" },
Chris@1413 239 { 0.7, "0.7" },
Chris@1413 240 { 0.9, "0.9" },
Chris@1413 241 };
Chris@1413 242 compareTicks(ticks.ticks, expected);
Chris@1413 243 }
Chris@1413 244
Chris@1409 245 void linear_10000_10010_5()
Chris@1409 246 {
Chris@1409 247 auto ticks = ScaleTickIntervals::linear({ 10000, 10010, 5 });
Chris@1409 248 vector<ScaleTickIntervals::Tick> expected {
Chris@1410 249 { 10000, "10000.0" },
Chris@1410 250 { 10002, "10002.0" },
Chris@1410 251 { 10004, "10004.0" },
Chris@1410 252 { 10006, "10006.0" },
Chris@1410 253 { 10008, "10008.0" },
Chris@1410 254 { 10010, "10010.0" },
Chris@1409 255 };
Chris@1409 256 compareTicks(ticks.ticks, expected);
Chris@1409 257 }
Chris@1409 258
Chris@1409 259 void linear_10000_20000_5()
Chris@1409 260 {
Chris@1409 261 auto ticks = ScaleTickIntervals::linear({ 10000, 20000, 5 });
Chris@1409 262 vector<ScaleTickIntervals::Tick> expected {
Chris@1409 263 { 10000, "10000" },
Chris@1409 264 { 12000, "12000" },
Chris@1409 265 { 14000, "14000" },
Chris@1409 266 { 16000, "16000" },
Chris@1409 267 { 18000, "18000" },
Chris@1409 268 { 20000, "20000" },
Chris@1409 269 };
Chris@1409 270 compareTicks(ticks.ticks, expected);
Chris@1409 271 }
Chris@1409 272
Chris@1409 273 void linear_m1_1_10()
Chris@1409 274 {
Chris@1409 275 auto ticks = ScaleTickIntervals::linear({ -1, 1, 10 });
Chris@1409 276 vector<ScaleTickIntervals::Tick> expected {
Chris@1409 277 { -1.0, "-1.0" },
Chris@1409 278 { -0.8, "-0.8" },
Chris@1409 279 { -0.6, "-0.6" },
Chris@1409 280 { -0.4, "-0.4" },
Chris@1409 281 { -0.2, "-0.2" },
Chris@1409 282 { 0.0, "0.0" },
Chris@1409 283 { 0.2, "0.2" },
Chris@1409 284 { 0.4, "0.4" },
Chris@1409 285 { 0.6, "0.6" },
Chris@1409 286 { 0.8, "0.8" },
Chris@1409 287 { 1.0, "1.0" }
Chris@1407 288 };
Chris@1407 289 compareTicks(ticks.ticks, expected);
Chris@1407 290 }
Chris@1411 291
Chris@1411 292 void linear_221p23_623p7_57p4()
Chris@1411 293 {
Chris@1411 294 auto ticks = ScaleTickIntervals::linear({ 221.23, 623.7, 4 });
Chris@1411 295 // only 4 ticks, not 5, because none of the rounded tick
Chris@1411 296 // values lies on an end value
Chris@1411 297 vector<ScaleTickIntervals::Tick> expected {
Chris@1411 298 { 230, "230" },
Chris@1411 299 { 330, "330" },
Chris@1411 300 { 430, "430" },
Chris@1411 301 { 530, "530" },
Chris@1411 302 };
Chris@1411 303 compareTicks(ticks.ticks, expected);
Chris@1411 304 }
Chris@1411 305
Chris@1412 306 void linear_sqrt2_pi_7()
Chris@1412 307 {
Chris@1412 308 auto ticks = ScaleTickIntervals::linear({ sqrt(2.0), M_PI, 7 });
Chris@1412 309 // This would be better in steps of 0.25, but we only round to
Chris@1412 310 // integral powers of ten
Chris@1412 311 vector<ScaleTickIntervals::Tick> expected {
Chris@1412 312 { 1.5, "1.5" },
Chris@1412 313 { 1.7, "1.7" },
Chris@1412 314 { 1.9, "1.9" },
Chris@1412 315 { 2.1, "2.1" },
Chris@1412 316 { 2.3, "2.3" },
Chris@1412 317 { 2.5, "2.5" },
Chris@1412 318 { 2.7, "2.7" },
Chris@1412 319 { 2.9, "2.9" },
Chris@1412 320 { 3.1, "3.1" },
Chris@1412 321 };
Chris@1412 322 compareTicks(ticks.ticks, expected);
Chris@1412 323 }
Chris@1412 324
Chris@1412 325 void linear_pi_avogadro_7()
Chris@1412 326 {
Chris@1412 327 auto ticks = ScaleTickIntervals::linear({ M_PI, 6.022140857e23, 7 });
Chris@1412 328 vector<ScaleTickIntervals::Tick> expected {
Chris@1413 329 { 1e+21, "1.000e+21" },
Chris@1413 330 { 8.7e+22, "8.700e+22" },
Chris@1413 331 { 1.73e+23, "1.730e+23" },
Chris@1413 332 { 2.59e+23, "2.590e+23" },
Chris@1413 333 { 3.45e+23, "3.450e+23" },
Chris@1413 334 { 4.31e+23, "4.310e+23" },
Chris@1413 335 { 5.17e+23, "5.170e+23" },
Chris@1412 336 };
Chris@1412 337 compareTicks(ticks.ticks, expected);
Chris@1412 338 }
Chris@1412 339
Chris@1412 340 void linear_2_3_1()
Chris@1412 341 {
Chris@1412 342 auto ticks = ScaleTickIntervals::linear({ 2, 3, 1 });
Chris@1412 343 vector<ScaleTickIntervals::Tick> expected {
Chris@1412 344 { 2.0, "2.0" },
Chris@1412 345 { 3.0, "3.0" }
Chris@1412 346 };
Chris@1412 347 compareTicks(ticks.ticks, expected);
Chris@1412 348 }
Chris@1412 349
Chris@1412 350 void linear_2_3_2()
Chris@1412 351 {
Chris@1412 352 auto ticks = ScaleTickIntervals::linear({ 2, 3, 2 });
Chris@1412 353 vector<ScaleTickIntervals::Tick> expected {
Chris@1412 354 { 2.0, "2.0" },
Chris@1412 355 { 2.5, "2.5" },
Chris@1412 356 { 3.0, "3.0" }
Chris@1412 357 };
Chris@1412 358 compareTicks(ticks.ticks, expected);
Chris@1412 359 }
Chris@1412 360
Chris@1412 361 void linear_2_3_3()
Chris@1412 362 {
Chris@1412 363 auto ticks = ScaleTickIntervals::linear({ 2, 3, 3 });
Chris@1412 364 vector<ScaleTickIntervals::Tick> expected {
Chris@1412 365 { 2.0, "2.0" },
Chris@1412 366 { 2.3, "2.3" },
Chris@1412 367 { 2.6, "2.6" },
Chris@1412 368 { 2.9, "2.9" }
Chris@1412 369 };
Chris@1412 370 compareTicks(ticks.ticks, expected);
Chris@1412 371 }
Chris@1412 372
Chris@1412 373 void linear_2_3_4()
Chris@1412 374 {
Chris@1412 375 auto ticks = ScaleTickIntervals::linear({ 2, 3, 4 });
Chris@1412 376 // This would be better in steps of 0.25, but we only round to
Chris@1412 377 // integral powers of ten
Chris@1412 378 vector<ScaleTickIntervals::Tick> expected {
Chris@1412 379 { 2.0, "2.0" },
Chris@1412 380 { 2.3, "2.3" },
Chris@1412 381 { 2.6, "2.6" },
Chris@1412 382 { 2.9, "2.9" }
Chris@1412 383 };
Chris@1412 384 compareTicks(ticks.ticks, expected);
Chris@1412 385 }
Chris@1412 386
Chris@1412 387 void linear_2_3_5()
Chris@1412 388 {
Chris@1412 389 auto ticks = ScaleTickIntervals::linear({ 2, 3, 5 });
Chris@1412 390 vector<ScaleTickIntervals::Tick> expected {
Chris@1412 391 { 2.0, "2.0" },
Chris@1412 392 { 2.2, "2.2" },
Chris@1412 393 { 2.4, "2.4" },
Chris@1412 394 { 2.6, "2.6" },
Chris@1412 395 { 2.8, "2.8" },
Chris@1412 396 { 3.0, "3.0" }
Chris@1412 397 };
Chris@1412 398 compareTicks(ticks.ticks, expected);
Chris@1412 399 }
Chris@1412 400
Chris@1412 401 void linear_2_3_6()
Chris@1412 402 {
Chris@1412 403 auto ticks = ScaleTickIntervals::linear({ 2, 3, 6 });
Chris@1412 404 vector<ScaleTickIntervals::Tick> expected {
Chris@1412 405 { 2.0, "2.0" },
Chris@1412 406 { 2.2, "2.2" },
Chris@1412 407 { 2.4, "2.4" },
Chris@1412 408 { 2.6, "2.6" },
Chris@1412 409 { 2.8, "2.8" },
Chris@1412 410 { 3.0, "3.0" }
Chris@1412 411 };
Chris@1412 412 compareTicks(ticks.ticks, expected);
Chris@1412 413 }
Chris@1412 414
Chris@1411 415 void linear_1_1_10()
Chris@1411 416 {
Chris@1411 417 auto ticks = ScaleTickIntervals::linear({ 1, 1, 10 });
Chris@1411 418 vector<ScaleTickIntervals::Tick> expected {
Chris@1411 419 { 1.0, "1.0" }
Chris@1411 420 };
Chris@1411 421 compareTicks(ticks.ticks, expected);
Chris@1411 422 }
Chris@1411 423
Chris@1411 424 void linear_0_0_10()
Chris@1411 425 {
Chris@1411 426 auto ticks = ScaleTickIntervals::linear({ 0, 0, 10 });
Chris@1411 427 vector<ScaleTickIntervals::Tick> expected {
Chris@1411 428 { 0.0, "0.0" }
Chris@1411 429 };
Chris@1411 430 compareTicks(ticks.ticks, expected);
Chris@1411 431 }
Chris@1411 432
Chris@1411 433 void linear_0_1_1()
Chris@1411 434 {
Chris@1411 435 auto ticks = ScaleTickIntervals::linear({ 0, 1, 1 });
Chris@1411 436 vector<ScaleTickIntervals::Tick> expected {
Chris@1411 437 { 0.0, "0.0" },
Chris@1411 438 { 1.0, "1.0" }
Chris@1411 439 };
Chris@1411 440 compareTicks(ticks.ticks, expected);
Chris@1411 441 }
Chris@1411 442
Chris@1411 443 void linear_0_1_0()
Chris@1411 444 {
Chris@1411 445 auto ticks = ScaleTickIntervals::linear({ 0, 1, 0 });
Chris@1411 446 vector<ScaleTickIntervals::Tick> expected {
Chris@1411 447 };
Chris@1411 448 compareTicks(ticks.ticks, expected);
Chris@1411 449 }
Chris@1411 450
Chris@1411 451 void linear_0_1_m1()
Chris@1411 452 {
Chris@1411 453 auto ticks = ScaleTickIntervals::linear({ 0, 1, -1 });
Chris@1411 454 vector<ScaleTickIntervals::Tick> expected {
Chris@1411 455 };
Chris@1411 456 compareTicks(ticks.ticks, expected);
Chris@1411 457 }
Chris@1414 458
Chris@1414 459 void log_1_10_2()
Chris@1414 460 {
Chris@1414 461 auto ticks = ScaleTickIntervals::logarithmic({ 1, 10, 2 });
Chris@1414 462 vector<ScaleTickIntervals::Tick> expected {
Chris@1414 463 { 1.0, "1.0" },
Chris@1414 464 { pow(10.0, 0.5), "3.2" },
Chris@1414 465 { 10.0, "10.0" },
Chris@1414 466 };
Chris@1414 467 compareTicks(ticks.ticks, expected);
Chris@1414 468 }
Chris@1414 469
Chris@1414 470 void log_0_10_2()
Chris@1414 471 {
Chris@1414 472 auto ticks = ScaleTickIntervals::logarithmic({ 0, 10, 2 });
Chris@1414 473 vector<ScaleTickIntervals::Tick> expected {
Chris@1414 474 { 1e-10, "1.0e-10" },
Chris@1414 475 { pow(10.0, -4.5), "3.2e-05" },
Chris@1414 476 { 10.0, "1.0e+01" },
Chris@1414 477 };
Chris@1414 478 compareTicks(ticks.ticks, expected);
Chris@1414 479 }
Chris@1407 480 };
Chris@1407 481
Chris@1407 482 #endif
Chris@1407 483
Chris@1407 484