82 inline Time _t(
int secs) {
return Time(FSecs(secs)); }
83 inline Time _t(
int s,
int div) {
return Time(FSecs(s,div)); }
107 CHECK (_t(10) ==
Time{FSecs(10)});
108 CHECK (_t(10,3) ==
Time{FSecs(10,3)});
109 CHECK (FSecs(10,3) == FSecs(10)/3);
110 CHECK (FSecs(10)/3 == 10_r/3);
111 CHECK (Rat(10,3) == 10_r/3);
112 CHECK (Rat(10,3) == boost::rational<int64_t>(10,3));
113 CHECK (rational_cast<float> (10_r/3) == 3.3333333f);
141 CHECK (zoomWin.overallSpan() ==
TimeSpan(_t(0), FSecs(23)));
142 CHECK (zoomWin.visible() ==
TimeSpan(_t(0), FSecs(23)));
143 CHECK (zoomWin.px_per_sec() == 25);
146 CHECK (zoomWin.px_per_sec() == 50);
147 CHECK (zoomWin.visible() ==
TimeSpan(_t(23,4), FSecs(23,2)));
148 CHECK (zoomWin.overallSpan() ==
TimeSpan(_t(0), FSecs(23)));
151 CHECK (zoomWin.px_per_sec() == 50);
152 CHECK (zoomWin.visible() ==
TimeSpan(_t(0), FSecs(23,2)));
153 CHECK (zoomWin.overallSpan() ==
TimeSpan(_t(0), FSecs(23)));
168 CHECK (win1.overallSpan() ==
TimeSpan(_t(0), FSecs(23)));
169 CHECK (win1.visible() == win1.overallSpan());
170 CHECK (win1.pxWidth() == 25*23);
171 CHECK (win1.px_per_sec() == 25);
174 CHECK (win2.overallSpan() ==
TimeSpan(_t(-1), FSecs(2)));
175 CHECK (win2.visible() == win2.overallSpan());
176 CHECK (win2.pxWidth() == 25*2);
177 CHECK (win2.px_per_sec() == 25);
180 CHECK (win3.overallSpan() ==
TimeSpan(_t(0), FSecs(23)));
181 CHECK (win3.visible() == win3.overallSpan());
182 CHECK (win3.pxWidth() == 555);
183 CHECK (win3.px_per_sec() == 555_r/23);
186 CHECK (win4.overallSpan() ==
TimeSpan(-
Time(0,10), FSecs(5)));
187 CHECK (win4.visible() == win4.overallSpan());
188 CHECK (win4.pxWidth() == 555);
189 CHECK (win4.px_per_sec() == 111);
205 CHECK (win.overallSpan() ==
TimeSpan(_t(0), FSecs(23)));
206 CHECK (win.visible() ==
TimeSpan(_t(0), FSecs(23)));
207 CHECK (win.pxWidth() == 23*25);
210 CHECK (win.overallSpan() ==
TimeSpan(_t(0), FSecs(23)));
211 CHECK (win.visible() ==
TimeSpan(_t(0), FSecs(1)));
212 CHECK (win.px_per_sec() == 25);
213 CHECK (win.pxWidth() == 25);
216 CHECK (win.overallSpan() ==
TimeSpan(_t(-50), FSecs(100)));
217 CHECK (win.visible() ==
TimeSpan(_t(0), FSecs(1)));
218 CHECK (win.px_per_sec() == 25);
219 CHECK (win.pxWidth() == 25);
222 CHECK (win.overallSpan() ==
TimeSpan(_t(-50), FSecs(100)));
223 CHECK (win.visible() ==
TimeSpan(_t(0), FSecs(4)));
224 CHECK (win.px_per_sec() == 25);
225 CHECK (win.pxWidth() == 100);
228 CHECK (win.overallSpan() ==
TimeSpan(_t(-50), FSecs(60)));
229 CHECK (win.visible() ==
TimeSpan(_t(-10), _t(0)));
230 CHECK (win.px_per_sec() == 10);
231 CHECK (win.pxWidth() == 100);
234 CHECK (win.overallSpan() ==
TimeSpan(_t(-50), FSecs(60)));
235 CHECK (win.visible() ==
TimeSpan(_t(-40), FSecs(50)));
236 CHECK (win.px_per_sec() == 10);
237 CHECK (win.pxWidth() == 500);
239 win.setOverallDuration (
Duration{FSecs(30)});
240 CHECK (win.overallSpan() ==
TimeSpan(_t(-50), _t(-20)));
241 CHECK (win.visible() ==
TimeSpan(_t(-50), FSecs(30)));
242 CHECK (win.px_per_sec() == 500_r/30);
243 CHECK (win.pxWidth() == 500);
246 CHECK (win.overallSpan() ==
TimeSpan(_t(-50), _t(-20)));
247 CHECK (win.visible() ==
TimeSpan(_t(-50), FSecs(30)*3/5));
248 CHECK (win.px_per_sec() == 500_r/30);
249 CHECK (win.pxWidth() == 300);
263 CHECK (win.px_per_sec() == 20);
266 CHECK (win.overallSpan() ==
TimeSpan(_t(0), _t(64)));
267 CHECK (win.visible() ==
TimeSpan(_t(32,2), FSecs(32)));
268 CHECK (win.px_per_sec() == 40);
269 CHECK (win.pxWidth() == 1280);
271 win.setVisiblePos(0.0);
272 CHECK (win.visible() ==
TimeSpan(_t(0), FSecs(32)));
274 win.nudgeMetric(+15);
275 CHECK (win.overallSpan() ==
TimeSpan(_t(0), _t(64)));
276 CHECK (win.visible() ==
TimeSpan(_t(0), FSecs(32,32768) +MICRO_TICK));
277 CHECK (win.visible().start() == _t(0));
278 CHECK (win.visible().end() ==
TimeValue(977));
282 CHECK (win.px_per_sec() == 1280_r/977 *
Time::SCALE);
283 CHECK (win.pxWidth() == 1280);
286 CHECK (rational_cast<double> (32_r/32768 *
Time::SCALE) == 976.5625);
289 CHECK (win.overallSpan() ==
TimeSpan(_t(0), _t(64)));
292 CHECK (win.pxWidth() == 1280);
300 CHECK (win.visible().duration() ==
TimeValue(640));
304 win.calibrateExtension(2);
305 CHECK (win.overallSpan() ==
TimeSpan(_t(0), _t(64)));
306 CHECK (win.visible().duration() ==
TimeValue(1));
308 CHECK (win.pxWidth() == 2);
310 win.calibrateExtension(1);
311 CHECK (win.visible().duration() ==
TimeValue(1));
313 CHECK (win.pxWidth() == 1);
315 win.calibrateExtension(1280);
316 CHECK (win.visible().duration() ==
TimeValue(1280));
317 CHECK (win.visible().duration() ==
Duration{1280*MICRO_TICK});
319 CHECK (win.pxWidth() == 1280);
320 CHECK (win.overallSpan() ==
TimeSpan(_t(0), _t(64)));
323 CHECK (win.visible().duration() ==
Duration{32 * 1280*MICRO_TICK});
325 CHECK (win.pxWidth() == 1280);
326 CHECK (win.overallSpan() ==
TimeSpan(_t(0), _t(64)));
328 win.nudgeMetric(-12);
329 CHECK (win.visible() == win.overallSpan());
330 CHECK (win.overallSpan() ==
TimeSpan(_t(0), _t(64)));
331 CHECK (win.px_per_sec() == 20);
332 CHECK (win.pxWidth() == 1280);
335 win.expandVisibleRange (
TimeSpan{_t(60), _t(62)});
336 CHECK (win.px_per_sec() == 20_r/64*2);
337 CHECK (win.visible().duration() == _t(64 * 32));
338 CHECK (win.visible() == win.overallSpan());
339 CHECK (win.overallSpan() ==
TimeSpan(_t(-1920), _t(128)));
340 CHECK (win.overallSpan().duration() == _t(2048));
343 win.setMetric (5 / (1_r/44100));
344 CHECK (win.pxWidth() == 1280);
345 CHECK (win.px_per_sec() <= 5*44100);
346 CHECK (win.px_per_sec() >= 5*44100 - 1);
347 CHECK (win.visible().duration() ==
Duration{1280_r/(5*44100) +MICRO_TICK});
348 CHECK (win.visible().duration() ==
Duration{1280_r/win.px_per_sec()});
349 CHECK (win.overallSpan().duration() == _t(2048));
358 CHECK (win.visible() == win.overallSpan());
359 CHECK (win.px_per_sec() == 20);
361 win.setVisibleDuration (
Duration{FSecs(23,30)});
362 CHECK (win.visible().duration() == _t(23,30));
363 CHECK (win.visible().start() == _t(64,2) - _t(23,30*2));
364 CHECK (win.px_per_sec() == 1280_r/
_FSecs(_t(23,30)));
365 CHECK (win.pxWidth() == 1280);
367 win.setVisibleRange (
TimeSpan{_t(12), FSecs(16)});
368 CHECK (win.visible() ==
TimeSpan(_t(12), _t(12+16)));
369 CHECK (win.overallSpan() ==
TimeSpan(_t(0), _t(64)));
370 CHECK (win.px_per_sec() == 1280_r/16);
371 CHECK (win.pxWidth() == 1280);
373 win.setVisiblePos(_t(12));
374 CHECK (win.visible().start() < _t(12));
375 CHECK (win.visible().duration() == _t(16));
376 CHECK (win.overallSpan() ==
TimeSpan(_t(0), _t(64)));
377 CHECK (win.px_per_sec() == 1280_r/16);
378 CHECK (win.pxWidth() == 1280);
380 win.setVisiblePos(0.80);
381 CHECK (win.visible().start() <
Time{FSecs(64)*8/10});
382 CHECK (win.visible().end() >
Time{FSecs(64)*8/10});
383 CHECK (win.px_per_sec() == 1280_r/16);
384 CHECK (win.pxWidth() == 1280);
387 win.setOverallDuration (
Duration{FSecs(3600)});
388 CHECK (win.overallSpan() ==
TimeSpan(_t(0), _t(3600)));
389 CHECK (win.px_per_sec() == 1280_r/16);
390 CHECK (win.pxWidth() == 1280);
391 CHECK (win.visible().duration() == _t(16));
392 CHECK (win.visible().start() <
Time{FSecs(64)*8/10});
393 CHECK (win.visible().end() >
Time{FSecs(64)*8/10});
396 win.setOverallRange (
TimeSpan{_t(-64), _t(-32)});
397 CHECK (win.overallSpan() ==
TimeSpan(_t(-64), FSecs(32)));
398 CHECK (win.px_per_sec() == 1280_r/16);
399 CHECK (win.pxWidth() == 1280);
400 CHECK (win.visible() ==
TimeSpan(_t(-32-16), FSecs(16)));
402 win.setOverallStart (_t(100));
403 CHECK (win.overallSpan() ==
TimeSpan(_t(100), FSecs(32)));
404 CHECK (win.visible() ==
TimeSpan(_t(100), FSecs(16)));
405 CHECK (win.px_per_sec() == 1280_r/16);
407 win.setOverallRange (
TimeSpan{_t(50), _t(52)});
408 CHECK (win.overallSpan() ==
TimeSpan(_t(50), FSecs(2)));
409 CHECK (win.visible() ==
TimeSpan(_t(50), FSecs(2)));
410 CHECK (win.px_per_sec() == 1280_r/2);
411 CHECK (win.pxWidth() == 1280);
420 CHECK (win.visible() == win.overallSpan());
421 CHECK (win.visible() ==
TimeSpan(_t(0), FSecs(16)));
422 CHECK (win.px_per_sec() == 80);
424 win.nudgeVisiblePos(+1);
425 CHECK (win.visible() ==
TimeSpan(_t(8), FSecs(16)));
426 CHECK (win.overallSpan() ==
TimeSpan(_t(0), FSecs(16+8)));
427 CHECK (win.px_per_sec() == 80);
428 CHECK (win.pxWidth() == 1280);
430 win.nudgeVisiblePos(-3);
431 CHECK (win.visible() ==
TimeSpan(_t(-16), FSecs(16)));
432 CHECK (win.overallSpan() ==
TimeSpan(_t(-16), FSecs(16+8+16)));
433 CHECK (win.px_per_sec() == 80);
434 CHECK (win.pxWidth() == 1280);
436 win.setVisiblePos(0.50);
437 CHECK (win.visible() ==
TimeSpan(_t((40/2-16) -8), FSecs(16)));
438 CHECK (win.visible().start() == _t(-4));
440 win.setVisiblePos(-0.50);
441 CHECK (win.visible() ==
TimeSpan(_t(-16-40/2), FSecs(16)));
442 CHECK (win.visible().start() == _t(-36));
443 win.setVisiblePos(_t(200));
444 CHECK (win.visible() ==
TimeSpan(_t(200-16), FSecs(16)));
445 CHECK (win.px_per_sec() == 80);
446 CHECK (win.pxWidth() == 1280);
448 win.setVisibleRange(
TimeSpan{_t(-200), FSecs(32)});
449 CHECK (win.overallSpan() ==
TimeSpan(_t(-200), _t(200)));
450 CHECK (win.visible() ==
TimeSpan(_t(-200), FSecs(32)));
451 CHECK (win.px_per_sec() == 40);
452 CHECK (win.pxWidth() == 1280);
461 CHECK (win.overallSpan() ==
TimeSpan(_t(0), _t(4)));
462 CHECK (win.visible() ==
TimeSpan(_t(0), _t(4)));
463 CHECK (win.px_per_sec() == 25);
464 CHECK (win.pxWidth() == 100);
466 bool notified{
false};
468 CHECK (not notified);
469 CHECK (win.px_per_sec() == 50);
470 CHECK (win.visible().duration() == _t(2));
472 win.attachChangeNotification([&](){ notified =
true; });
473 CHECK (not notified);
474 CHECK (win.px_per_sec() == 50);
476 CHECK (win.px_per_sec() == 100);
480 CHECK (win.visible().start() == _t(3,2));
481 win.nudgeVisiblePos(+1);
482 CHECK (win.visible().start() == _t(2));
486 CHECK (win.overallSpan() ==
TimeSpan(_t(0), _t(4)));
487 win.setOverallRange(
TimeSpan(_t(-4), _t(4)));
488 CHECK (win.overallSpan() ==
TimeSpan(_t(-4), _t(4)));
492 CHECK (win.pxWidth() == 100);
493 win.calibrateExtension(200);
494 CHECK (win.pxWidth() == 200);
495 CHECK (win.px_per_sec() == 100);
499 bool otherTriger{
false};
501 wuz.attachChangeNotification([&](){ otherTriger =
true; });
502 CHECK (wuz.visible().start() == _t(0));
503 CHECK (not notified);
504 CHECK (not otherTriger);
505 wuz.nudgeVisiblePos(-1);
506 CHECK (not notified);
508 CHECK (wuz.visible().start() == _t(-1,2));
511 CHECK (not notified);
513 CHECK (not otherTriger);
515 CHECK (win.px_per_sec() == 200);
516 CHECK (wuz.px_per_sec() == 10);
520 win.detachChangeNotification();
522 CHECK (not notified);
523 CHECK (win.px_per_sec() == 400);
526 CHECK (not notified);
528 CHECK (win.px_per_sec() == 400);
529 CHECK (wuz.px_per_sec() == 20);
538 CHECK (win.visible() ==
TimeSpan(_t(0), _t(23)));
539 CHECK (win.px_per_sec() == 25);
540 CHECK (win.pxWidth() == 575);
542 win.setOverallDuration(
Duration{FSecs(50)});
543 win.setVisibleDuration(
Duration{FSecs(0)});
544 CHECK (win.overallSpan() ==
TimeSpan(_t(0), _t(50)));
545 CHECK (win.visible() ==
TimeSpan(_t(0), _t(23)));
546 CHECK (win.pxWidth() == 575);
548 win.calibrateExtension(0);
549 CHECK (win.px_per_sec() == 25);
550 CHECK (win.pxWidth() == 1);
551 CHECK (win.visible().duration() == _t(1,25));
561 win.setOverallRange(
TimeSpan(_t(10), _t(0)));
562 CHECK (win.overallSpan() ==
TimeSpan(_t(0), _t(10)));
563 CHECK (win.visible().duration() ==
Time(40,0));
564 CHECK (win.px_per_sec() == 25);
565 CHECK (win.pxWidth() == 1);
585 CHECK (poison == 206435633551724850_r/307445734561825883);
586 CHECK (2_r/3 < poison and poison < 1);
589 CHECK (-6 == rational_cast<gavl_time_t>(poison *
Time::SCALE));
590 CHECK (671453 == _raw(
Time(FSecs(poison))));
591 CHECK (671453.812f == rational_cast<float>(poison)*Time::SCALE);
595 CHECK (57 == ilog2 (poison.numerator()));
596 CHECK (58 == ilog2 (poison.denominator()));
599 int toxicity = toxicDegree (poison);
600 CHECK (toxicity == 18);
601 int64_t quant = poison.denominator() >> toxicity;
602 CHECK (quant == 1172812402961);
604 Rat detoxed = util::reQuant(poison, quant);
605 CHECK (detoxed == 787489446837_r/1172812402961);
606 CHECK (0.671453834f == rational_cast<float> (poison));
607 CHECK (0.671453834f == rational_cast<float> (detoxed));
609 CHECK (detoxed+Time::SCALE == 1172813190450446837_r/1172812402961);
610 CHECK (
Time(FSecs(detoxed)) > Time::ZERO);
611 CHECK (671453 == _raw(
Time(FSecs(detoxed))));
613 CHECK (1906 == _raw(
TimeValue(1280 / rational_cast<long double>(poison))));
614 CHECK (1906 == _raw(
TimeValue(1280 / rational_cast<long double>(detoxed))));
628 CHECK (win.visible() == win.overallSpan());
629 CHECK (win.visible().duration() == _t(23));
630 CHECK (win.px_per_sec() == 25);
631 CHECK (win.pxWidth() == 575);
634 CHECK (0 < poison and poison < 1);
637 win.setMetric (poison);
638 CHECK (win.visible() == win.overallSpan());
639 CHECK (win.visible().duration() == _t(23));
640 CHECK (win.visible() ==
TimeSpan(_t(0), _t(23)));
641 CHECK (win.px_per_sec() == 25);
642 CHECK (win.pxWidth() == 575);
645 CHECK (win.overallSpan().duration() ==
TimeValue{307445734561825860});
646 CHECK (win.overallSpan().duration() ==
Time::MAX);
647 CHECK (win.visible().duration() == _t(23));
650 win.setMetric (poison);
651 CHECK (win.overallSpan().duration() ==
Time::MAX);
652 CHECK (win.visible().duration() ==
TimeValue{856350691});
653 CHECK (win.px_per_sec() == Rat{win.pxWidth()} /
_FSecs(win.visible().duration()));
654 float approxPoison = rational_cast<
float> (poison);
655 CHECK (approxPoison == 0.671453834f);
656 float approxNewMetric = rational_cast<
float> (win.px_per_sec());
657 CHECK (approxNewMetric == 0.671453893f);
658 CHECK (win.px_per_sec() != poison);
659 CHECK (win.px_per_sec() < poison);
661 Rat poisonousDuration = win.pxWidth() / poison;
662 CHECK (poisonousDuration == 7071251894921995309_r/8257425342068994);
664 CHECK(856.350708f == rational_cast<float> (poisonousDuration));
665 CHECK(856.350708f == rational_cast<float> (
_FSecs(win.visible().duration())));
666 CHECK (win.px_per_sec() == 575000000_r/856350691);
667 CHECK (win.pxWidth() == 575);
669 CHECK (win.overallSpan().start() == Time::ZERO);
670 CHECK (win.overallSpan().duration() ==
TimeValue{307445734561825860});
671 CHECK (win.visible().duration() ==
TimeValue{856350691});
674 win.setVisiblePos (poison);
675 CHECK (win.overallSpan().start() == Time::ZERO);
676 CHECK (win.overallSpan().duration() ==
TimeValue{307445734561825860});
677 CHECK (win.visible().duration() ==
TimeValue{856350691});
679 TimeValue targetPos{gavl_time_t(_raw(win.overallSpan().duration())
680 * rational_cast<double> (poison))};
682 CHECK (targetPos ==
TimeValue{206435633551724864});
683 CHECK (win.visible().start() ==
TimeValue{206435633106265625});
684 CHECK (win.visible().end() ==
TimeValue{206435633962616316});
685 CHECK (win.visible().start() < targetPos);
686 CHECK (win.visible().end() > targetPos);
688 CHECK (win.px_per_sec() == 575000000_r/856350691);
689 CHECK (win.pxWidth() == 575);
693 CHECK (win.overallSpan() == win.visible());
694 CHECK (win.overallSpan().start() ==
TimeValue{307445734561825572});
695 CHECK (win.overallSpan().end() ==
TimeValue{307445734561825860});
696 CHECK (win.overallSpan().duration() ==
TimeValue{288});
697 CHECK (win.px_per_sec() == 17968750_r/9);
698 CHECK (win.pxWidth() == 575);
702 CHECK (win.visible().start() == Time::MIN +
TimeValue(13));
703 CHECK (win.visible().end() == win.visible().start() +
TimeValue{288});
704 CHECK (win.visible().duration() ==
TimeValue{288});
706 CHECK (win.overallSpan().start() == win.visible().start());
707 CHECK (win.overallSpan().end() ==
TimeValue{307445734561825860});
708 CHECK (_raw(win.overallSpan().duration()) == 614891469123651707);
709 CHECK (win.px_per_sec() == 17968750_r/9);
710 CHECK (win.pxWidth() == 575);
722 CHECK (win.overallSpan().duration() == _t(1));
723 CHECK (win.px_per_sec() == 3_r/1);
724 CHECK (win.pxWidth() == 3);
726 CHECK (_raw(win.overallSpan().duration()) == 614891469123651720);
727 CHECK (_raw(win.visible().duration()) == 1000000);
728 CHECK (win.px_per_sec() == 3_r/1);
729 CHECK (win.pxWidth() == 3);
732 Rat bruteZoom{3_r/(int64_t{1}<<60)};
733 win.setMetric (bruteZoom);
735 CHECK (_raw(win.overallSpan().duration()) == 614891469123651720);
736 CHECK (_raw(win.visible().duration()) == 3298534883328000);
737 CHECK (_raw(win.visible().duration()) < int64_t{1}<<60 );
738 CHECK (_raw(win.visible().duration()) == 3*
LIM_HAZARD*1000);
740 CHECK (win.visible().start() == - win.visible().end());
741 CHECK (win.px_per_sec() > bruteZoom);
742 CHECK (win.px_per_sec() == 125_r/137438953472);
743 CHECK (win.px_per_sec() == 1000_r/
LIM_HAZARD);
744 CHECK (win.px_per_sec() == 3 /
_FSecs(win.visible().duration()));
745 CHECK (win.pxWidth() == 3);
748 win.setMetric (5_r/std::numeric_limits<int64_t>::max());
749 CHECK (_raw(win.visible().duration()) == 3298534883328000);
750 CHECK (win.px_per_sec() == 125_r/137438953472);
751 CHECK (win.pxWidth() == 3);
755 CHECK (_raw(win.visible().duration()) == 3295239643684316);
756 CHECK (_raw(win.visible().duration()) < 3 *
LIM_HAZARD*1000);
758 CHECK (win.px_per_sec() == 1001_r/
LIM_HAZARD);
759 CHECK (win.px_per_sec() == 1001_r/1099511627776);
760 CHECK (win.pxWidth() == 3);
763 win.setMetric (1000_r/
LIM_HAZARD * 1024_r/1023);
764 CHECK (_raw(win.visible().duration()) == 3295313657856000);
765 CHECK (_raw(win.visible().duration()) < 3 *
LIM_HAZARD*1000);
768 CHECK (win.px_per_sec() == 1000_r/
LIM_HAZARD * 1024_r/1023);
769 CHECK (win.px_per_sec() == 125_r/137304735744);
770 CHECK (win.pxWidth() == 3);
776 CHECK (1001_r/(
LIM_HAZARD-3) == 77_r/84577817521);
778 CHECK (3_r/3295239643675325 *
Time::SCALE == 120000_r/131809585747013);
779 CHECK (win.px_per_sec() == 2003_r/2199023255552);
780 CHECK (win.pxWidth() == 3);
782 CHECK (_raw(
Duration{3_r/(77_r/84577817521)}) == 3295239643675324);
783 CHECK (_raw(win.visible().duration()) == 3295239643675325);
784 CHECK (_raw(
Duration{3_r/win.px_per_sec()}) == 3293594491590614);
786 CHECK (2003.0f/2002 - 1 == 0.000499486923f);
790 win.calibrateExtension (1
'000'000
'000); // implicit drastic zoom-out by increasing the number of pixels 791 CHECK (win.pxWidth() < 1'000
'000'000);
792 CHECK (win.pxWidth() == MAX_PX_WIDTH);
793 CHECK (win.px_per_sec() == 89407_r/549755813888);
794 CHECK (win.px_per_sec() > Rat{MAX_PX_WIDTH} /MAX_TIMESPAN);
795 CHECK (win.px_per_sec() < Rat{MAX_PX_WIDTH+1}/MAX_TIMESPAN);
797 CHECK (_raw(win.overallSpan().duration()) == 614891469123651720);
798 CHECK (_raw(win.visible().duration()) == 614891469123651720);
799 CHECK (win.overallSpan().end() ==
TimeValue{ 307445734561825860});
800 CHECK (win.visible().end() ==
TimeValue{ 307445734561825860});
801 CHECK (win.visible().start() ==
TimeValue{-307445734561825860});
804 CHECK (MAX_PX_WIDTH /
_FSecs(win.visible().duration()) == 2500000000_r/15372286728091293);
805 CHECK (MAX_PX_WIDTH * 1000000_r/614891469123651720 == 2500000000_r/15372286728091293);
806 CHECK (win.px_per_sec() *
_FSecs(win.visible().duration()) < 0);
807 CHECK (rational_cast<float>(win.px_per_sec())
808 * rational_cast<float>(
_FSecs(win.visible().duration())) == 100000.031f);
809 CHECK (rational_cast<float>(MAX_PX_WIDTH*1000000_r/614891469123651720) == 1.62630329e-07f);
810 CHECK (rational_cast<float>(win.px_per_sec()) == 1.62630386e-07f);
811 CHECK (win.px_per_sec() == 89407_r/549755813888);
814 win.setMetric (bruteZoom);
815 CHECK (_raw(win.overallSpan().duration()) == 614891469123651720);
816 CHECK (_raw(win.visible().duration()) == 614891469123651720);
817 CHECK (win.px_per_sec() == 89407_r/549755813888);
818 CHECK (MAX_PX_WIDTH /(614891469123651720_r/
Time::SCALE) == 2500000000_r/15372286728091293);
819 CHECK (2500000000_r/15372286728091293 < 89407_r/549755813888);
820 CHECK (win.pxWidth() == MAX_PX_WIDTH);
832 CHECK (win.visible().duration() ==
TimeValue(280));
833 CHECK (win.visible().start() ==
TimeValue(307445734561825580));
834 CHECK (win.visible().end() ==
TimeValue(307445734561825860));
835 CHECK (win.visible().end() ==
Time::MAX);
836 CHECK (win.visible() == win.overallSpan());
838 CHECK (win.px_per_sec() == 13975000_r/7);
839 CHECK (win.pxWidth() == 559);
843 win.setVisiblePos (anchorPos);
844 CHECK (win.visible().duration() ==
TimeValue(280));
845 CHECK (win.px_per_sec() == 13975000_r/7);
846 CHECK (win.pxWidth() == 559);
847 CHECK (win.visible().start() > Time::MIN);
848 CHECK (win.visible().start() == anchorPos);
849 CHECK (win.visible().end() > anchorPos);
850 CHECK (win.visible().start() ==
TimeValue(-288230376151711744));
851 CHECK (win.visible().end() ==
TimeValue(-288230376151711464));
852 CHECK (win.overallSpan().start() == win.visible().start());
853 CHECK (win.overallSpan().end() ==
Time::MAX);
856 win.calibrateExtension (560);
857 CHECK (win.visible().duration() ==
TimeValue(280));
858 CHECK (win.px_per_sec() == 2000000_r/1);
862 win.setVisibleDuration(targetDur);
864 CHECK (win.visible().duration() == targetDur);
866 CHECK (win.visible().start() == Time::MIN);
867 CHECK (win.visible().start() <
Time::MAX);
868 CHECK (win.visible().end() ==
TimeValue(307445734538825860));
870 CHECK (win.px_per_sec() == 2003_r/2199023255552);
871 CHECK (win.pxWidth() == 560);
874 win.setVisiblePos (Rat{std::numeric_limits<int64_t>::max()-23});
875 CHECK (win.visible().duration() == targetDur);
876 CHECK (win.px_per_sec() == 2003_r/2199023255552);
877 CHECK (win.pxWidth() == 560);
878 CHECK (win.visible().end() ==
Time::MAX);
879 CHECK (win.visible().start() > Time::MIN);
880 CHECK (win.visible().start() ==
TimeValue(-307445734538825860));
883 win.calibrateExtension (561);
884 CHECK (win.visible().duration() > targetDur);
886 CHECK (win.visible().end() ==
Time::MAX);
887 CHECK (win.visible().start() == Time::MIN);
888 CHECK (win.px_per_sec() == 2007_r/2199023255552);
889 CHECK (win.pxWidth() == 561);
893 CHECK (win.visible().end() ==
Time::MAX);
894 CHECK (win.visible().start() == Time::MIN +
TimeValue(1));
895 CHECK (win.px_per_sec() == 2007_r/2199023255552);
896 CHECK (win.pxWidth() == 561);
899 CHECK (win.visible().duration() ==
TimeValue(281));
901 CHECK (win.px_per_sec() == 561000000_r/281);
902 CHECK (win.visible().end() ==
Time::MAX);
903 CHECK (win.pxWidth() == 561);
914 CHECK (win.visible().duration() ==
TimeValue(1));
916 win.nudgeVisiblePos (-2);
920 CHECK (win.visible().end() ==
Time::MAX);
922 CHECK (win.visible().duration() ==
TimeValue(1));
923 CHECK (win.overallSpan().duration() ==
TimeValue(2));
924 CHECK (win.px_per_sec() == 1000000);
925 CHECK (win.pxWidth() == 1);
927 win.nudgeVisiblePos (std::numeric_limits<int64_t>::min());
929 CHECK (win.visible().duration() ==
TimeValue(1));
930 CHECK (win.visible().start() == Time::MIN);
931 CHECK (win.visible().end() == Time::MIN +
TimeValue(1));
932 CHECK (win.px_per_sec() == 1000000);
933 CHECK (win.pxWidth() == 1);
935 win.calibrateExtension (460);
938 CHECK (win.visible().start() == Time::MIN);
939 CHECK (win.visible().end() ==
TimeValue(-1));
941 win.nudgeVisiblePos (+2);
943 CHECK (win.visible().start() ==
TimeValue(-1));
944 win.nudgeVisiblePos (-1);
945 CHECK (win.visible().start() ==
TimeValue(-153722867280912930));
946 CHECK (win.visible().end() ==
TimeValue(+153722867280912929));
948 win.nudgeVisiblePos (+1000);
949 CHECK (ilogb(500.0 * _raw(
Time::MAX)) == 67);
950 CHECK (win.visible().start() ==
TimeValue(+1));
951 CHECK (win.visible().end() ==
Time::MAX);
952 CHECK (win.pxWidth() == 460);
963 CHECK (win.overallSpan().end() ==
Time::MAX);
964 CHECK (win.visible().duration() ==
LIM_HAZARD * 1000);
965 CHECK (win.visible().start()+win.visible().end() == Time::ZERO);
967 CHECK (win.px_per_sec() == 125_r/137438953472);
968 CHECK (win.pxWidth() == 1);
970 win.nudgeVisiblePos (+1);
971 CHECK (win.visible().start() == Time::ZERO);
972 CHECK (win.visible().end() ==
LIM_HAZARD*1000);
973 CHECK (win.px_per_sec() == 125_r/137438953472);
974 CHECK (win.pxWidth() == 1);
976 win.nudgeMetric (-1);
977 CHECK (win.px_per_sec() == 125_r/137438953472);
978 win.nudgeMetric (+1);
979 CHECK (win.px_per_sec() == 125_r/68719476736);
980 CHECK (win.visible().start() ==
TimeValue(274877908523000));
981 CHECK (win.visible().end() ==
TimeValue(824633722411000));
982 CHECK (win.visible().duration() ==
LIM_HAZARD * 1000 / 2);
983 CHECK (win.pxWidth() == 1);
986 CHECK (win.visible().end() ==
Time::MAX);
987 CHECK (win.visible().duration() ==
LIM_HAZARD * 1000 / 2);
989 CHECK (win.pxWidth() == 1);
993 CHECK (win.visible().end() ==
Time::MAX);
995 CHECK (win.visible().duration() ==
TimeValue(1098413214561438));
997 CHECK (win.px_per_sec() == 2003_r/2199023255552);
998 CHECK (win.pxWidth() == 1);
1010 CHECK (win.overallSpan().duration() == win.visible().duration());
1011 CHECK (win.visible().duration() ==
TimeValue(1));
1012 CHECK (win.visible().start() == Time::MIN);
1013 CHECK (win.visible().end() == Time::MIN +
TimeValue(1));
1015 CHECK (win.px_per_sec() == 1000000);
1016 CHECK (win.pxWidth() == 1);
1018 win.setOverallDuration (
Duration{FSecs(1)});
1019 win.calibrateExtension (2);
1020 CHECK (win.visible().duration() ==
TimeValue(2));
1021 CHECK (win.px_per_sec() == 1000000);
1025 CHECK (win.px_per_sec() == 2000000);
1026 CHECK (win.visible().start() == Time::MIN);
1027 CHECK (win.visible().end() == Time::MIN +
TimeValue(1));
1028 CHECK (win.pxWidth() == 2);
1030 win.nudgeVisiblePos (+1);
1031 CHECK (win.visible().start() == Time::MIN +
TimeValue(1));
1032 CHECK (win.visible().end() == Time::MIN +
TimeValue(2));
1033 CHECK (win.visible().duration() ==
TimeValue(1));
1036 win.calibrateExtension (3);
1037 CHECK (win.visible().duration() ==
TimeValue(2));
1039 CHECK (win.visible().start() == Time::MIN +
TimeValue(1));
1040 CHECK (win.visible().end() == Time::MIN +
TimeValue(3));
1041 CHECK (win.pxWidth() == 3);
1044 CHECK (win.px_per_sec() == 3000000_r/17);
1046 CHECK (win.px_per_sec() == 187500);
1048 CHECK (win.px_per_sec() == 200000);
1049 CHECK (win.visible().start() == Time::MIN +
TimeValue(1));
1050 CHECK (win.visible().end() == Time::MIN +
TimeValue(16));
1052 win.nudgeMetric (-1);
1053 CHECK (win.px_per_sec() == 100000);
1054 CHECK (win.visible().duration() ==
TimeValue(30));
1055 win.nudgeMetric (+2);
1056 CHECK (win.px_per_sec() == 375000);
1057 CHECK (win.visible().duration() ==
TimeValue(8));
1058 win.nudgeMetric (+1);
1059 CHECK (win.px_per_sec() == 750000);
1060 CHECK (win.visible().duration() ==
TimeValue(4));
1064 CHECK (win.px_per_sec() == 1000000);
1065 CHECK (win.visible().duration() ==
TimeValue(3));
1066 CHECK (win.visible().start() == Time::MIN +
TimeValue(1));
1067 CHECK (win.visible().end() == Time::MIN +
TimeValue(4));
1069 win.nudgeVisiblePos (-5);
1070 CHECK (win.visible().start() == Time::MIN +
TimeValue(0));
1071 CHECK (win.visible().end() == Time::MIN +
TimeValue(3));
1072 CHECK (win.visible().duration() ==
TimeValue(3));
1074 win.calibrateExtension (MAX_PX_WIDTH);
1075 CHECK (win.pxWidth() == 100000);
1076 CHECK (win.visible().duration() ==
TimeValue(100000));
1078 CHECK (win.visible().start() == Time::MIN +
TimeValue(0));
1079 CHECK (win.visible().end() == Time::MIN +
TimeValue(100000));
1083 CHECK (win.visible().duration() ==
TimeValue(50000));
1084 CHECK (win.visible().end() == Time::MIN +
TimeValue(50000));
1085 CHECK (win.pxWidth() == 100000);
void safeguard_extremeOffset()
static const Duration MAX
maximum possible temporal extension
void setVisibleDuration(Duration duration)
explicitly set the duration of the visible window range, working around the relative anchor point; po...
void verify_calibration()
void setRanges(TimeSpan overall, TimeSpan visible)
Set both the overall canvas, as well as the visible part within that canvas.
const int64_t LIM_HAZARD
Maximum quantiser to be handled in fractional arithmetics without hazard.
static const gavl_time_t SCALE
Number of micro ticks (µs) per second as basic time scale.
void verify_changeNotification()
void safeguard_veryDeep()
void safeguard_verySmall()
Lumiera's internal time value datatype.
void safeguard_extremeTimePos()
A component to ensure uniform handling of zoom scale and visible interval on the timeline.
Simple test class runner.
void nudgeVisiblePos(int64_t steps)
scroll by increments of half window size, possibly expanding.
Lumiera GTK UI implementation root.
void nudgeMetric(int steps)
scale up or down on a 2-logarithmic scale.
A collection of frequently used helper functions to support unit testing.
FSecs _FSecs(TimeValue const &timeVal)
void safeguard_toxic_zoomFactor()
void safeguard_reversed_intervals()
void safeguard_poisonousMetric()
const Rat ZOOM_MAX_RESOLUTION
the deepest zoom is to use 2px per micro-tick
void setOverallRange(TimeSpan range)
redefine the overall canvas range.
Offset measures a distance in time.
Duration is the internal Lumiera time metric.
void verify_simpleUsage()
Abstraction: the current zoom- and navigation state of a view, possibly in multiple dimensions...
A time interval anchored at a specific point in time.
void calibrateExtension(uint pxWidth)
Define the extension of the window in pixels.
void safeguard_extremeZoomOut()
void safeguard_zero_init()
basic constant internal time value.