@@ -6,6 +6,7 @@ import { literal } from '../../lib'
6
6
import { protectString } from '../../protectedString'
7
7
import {
8
8
createPartCurrentTimes ,
9
+ PartCurrentTimes ,
9
10
PieceInstanceWithTimings ,
10
11
processAndPrunePieceInstanceTimings ,
11
12
resolvePrunedPieceInstance ,
@@ -45,7 +46,11 @@ describe('processAndPrunePieceInstanceTimings', () => {
45
46
} )
46
47
}
47
48
48
- function runAndTidyResult ( pieceInstances : PieceInstance [ ] , nowInPart : number , includeVirtual ?: boolean ) {
49
+ function runAndTidyResult (
50
+ pieceInstances : PieceInstance [ ] ,
51
+ nowInPart : number | PartCurrentTimes ,
52
+ includeVirtual ?: boolean
53
+ ) {
49
54
const resolvedInstances = processAndPrunePieceInstanceTimings (
50
55
{
51
56
one : {
@@ -62,7 +67,7 @@ describe('processAndPrunePieceInstanceTimings', () => {
62
67
} ,
63
68
} ,
64
69
pieceInstances ,
65
- createPartCurrentTimes ( nowInPart , 0 ) , // nocommit - this is a hack to avoid changing tests
70
+ typeof nowInPart === 'number' ? createPartCurrentTimes ( nowInPart , 0 ) : nowInPart , // nocommit - this is a hack to avoid changing tests
66
71
undefined ,
67
72
includeVirtual
68
73
)
@@ -469,6 +474,100 @@ describe('processAndPrunePieceInstanceTimings', () => {
469
474
} ,
470
475
] )
471
476
} )
477
+
478
+ describe ( 'absolute timed (rundown owned) pieces' , ( ) => {
479
+ test ( 'simple collision' , ( ) => {
480
+ const now = 9000
481
+ const partStart = 8000
482
+
483
+ const pieceInstances = [
484
+ createPieceInstance ( 'one' , { start : 0 } , 'one' , PieceLifespan . OutOnRundownChange ) ,
485
+ createPieceInstance (
486
+ 'two' ,
487
+ { start : now + 2000 , isAbsolute : true } ,
488
+ 'one' ,
489
+ PieceLifespan . OutOnRundownChange
490
+ ) ,
491
+ createPieceInstance ( 'three' , { start : 6000 } , 'one' , PieceLifespan . OutOnRundownChange ) ,
492
+ ]
493
+
494
+ const resolvedInstances = runAndTidyResult ( pieceInstances , createPartCurrentTimes ( now , partStart ) )
495
+ expect ( resolvedInstances ) . toEqual ( [
496
+ {
497
+ _id : 'one' ,
498
+ priority : 5 ,
499
+ start : 0 ,
500
+ end : 3000 ,
501
+ } ,
502
+ {
503
+ _id : 'two' ,
504
+ priority : 5 ,
505
+ start : partStart + 3000 ,
506
+ end : partStart + 6000 ,
507
+ } ,
508
+ {
509
+ _id : 'three' ,
510
+ priority : 5 ,
511
+ start : 6000 ,
512
+ end : undefined ,
513
+ } ,
514
+ ] )
515
+ } )
516
+
517
+ test ( 'collision with same start time' , ( ) => {
518
+ const now = 9000
519
+ const partStart = 8000
520
+
521
+ const pieceInstances = [
522
+ createPieceInstance ( 'one' , { start : 0 } , 'one' , PieceLifespan . OutOnRundownChange ) ,
523
+ createPieceInstance (
524
+ 'two' ,
525
+ { start : partStart + 2000 , isAbsolute : true } ,
526
+ 'one' ,
527
+ PieceLifespan . OutOnRundownChange
528
+ ) ,
529
+ createPieceInstance ( 'three' , { start : 2000 } , 'one' , PieceLifespan . OutOnRundownChange ) ,
530
+ ]
531
+
532
+ const resolvedInstances = runAndTidyResult ( pieceInstances , createPartCurrentTimes ( now , partStart ) )
533
+ expect ( resolvedInstances ) . toEqual ( [
534
+ {
535
+ _id : 'one' ,
536
+ priority : 5 ,
537
+ start : 0 ,
538
+ end : 2000 ,
539
+ } ,
540
+ {
541
+ _id : 'two' ,
542
+ priority : 5 ,
543
+ start : partStart + 2000 ,
544
+ end : undefined ,
545
+ } ,
546
+ ] )
547
+
548
+ {
549
+ // check stability
550
+ pieceInstances [ 1 ] . piece . enable = { start : 2000 }
551
+ pieceInstances [ 2 ] . piece . enable = { start : partStart + 2000 , isAbsolute : true }
552
+
553
+ const resolvedInstances = runAndTidyResult ( pieceInstances , createPartCurrentTimes ( now , partStart ) )
554
+ expect ( resolvedInstances ) . toEqual ( [
555
+ {
556
+ _id : 'one' ,
557
+ priority : 5 ,
558
+ start : 0 ,
559
+ end : 2000 ,
560
+ } ,
561
+ {
562
+ _id : 'three' ,
563
+ priority : 5 ,
564
+ start : partStart + 2000 ,
565
+ end : undefined ,
566
+ } ,
567
+ ] )
568
+ }
569
+ } )
570
+ } )
472
571
} )
473
572
474
573
describe ( 'resolvePrunedPieceInstances' , ( ) => {
@@ -504,10 +603,10 @@ describe('resolvePrunedPieceInstances', () => {
504
603
}
505
604
506
605
test ( 'numeric start, no duration' , async ( ) => {
507
- const nowInPart = 123
606
+ const partTimes = createPartCurrentTimes ( 123 , 0 )
508
607
const piece = createPieceInstance ( { start : 2000 } )
509
608
510
- expect ( resolvePrunedPieceInstance ( nowInPart , clone ( piece ) ) ) . toStrictEqual ( {
609
+ expect ( resolvePrunedPieceInstance ( partTimes , clone ( piece ) ) ) . toStrictEqual ( {
511
610
instance : clone ( piece ) ,
512
611
timelinePriority : piece . priority ,
513
612
resolvedStart : 2000 ,
@@ -516,10 +615,10 @@ describe('resolvePrunedPieceInstances', () => {
516
615
} )
517
616
518
617
test ( 'numeric start, with planned duration' , async ( ) => {
519
- const nowInPart = 123
618
+ const partTimes = createPartCurrentTimes ( 123 , 0 )
520
619
const piece = createPieceInstance ( { start : 2000 , duration : 3400 } )
521
620
522
- expect ( resolvePrunedPieceInstance ( nowInPart , clone ( piece ) ) ) . toStrictEqual ( {
621
+ expect ( resolvePrunedPieceInstance ( partTimes , clone ( piece ) ) ) . toStrictEqual ( {
523
622
instance : clone ( piece ) ,
524
623
timelinePriority : piece . priority ,
525
624
resolvedStart : 2000 ,
@@ -528,127 +627,127 @@ describe('resolvePrunedPieceInstances', () => {
528
627
} )
529
628
530
629
test ( 'now start, no duration' , async ( ) => {
531
- const nowInPart = 123
630
+ const partTimes = createPartCurrentTimes ( 123 , 0 )
532
631
const piece = createPieceInstance ( { start : 'now' } )
533
632
534
- expect ( resolvePrunedPieceInstance ( nowInPart , clone ( piece ) ) ) . toStrictEqual ( {
633
+ expect ( resolvePrunedPieceInstance ( partTimes , clone ( piece ) ) ) . toStrictEqual ( {
535
634
instance : clone ( piece ) ,
536
635
timelinePriority : piece . priority ,
537
- resolvedStart : nowInPart ,
636
+ resolvedStart : partTimes . nowInPart ,
538
637
resolvedDuration : undefined ,
539
638
} satisfies ResolvedPieceInstance )
540
639
} )
541
640
542
641
test ( 'now start, with planned duration' , async ( ) => {
543
- const nowInPart = 123
642
+ const partTimes = createPartCurrentTimes ( 123 , 0 )
544
643
const piece = createPieceInstance ( { start : 'now' , duration : 3400 } )
545
644
546
- expect ( resolvePrunedPieceInstance ( nowInPart , clone ( piece ) ) ) . toStrictEqual ( {
645
+ expect ( resolvePrunedPieceInstance ( partTimes , clone ( piece ) ) ) . toStrictEqual ( {
547
646
instance : clone ( piece ) ,
548
647
timelinePriority : piece . priority ,
549
- resolvedStart : nowInPart ,
648
+ resolvedStart : partTimes . nowInPart ,
550
649
resolvedDuration : 3400 ,
551
650
} satisfies ResolvedPieceInstance )
552
651
} )
553
652
554
653
test ( 'now start, with end cap' , async ( ) => {
555
- const nowInPart = 123
654
+ const partTimes = createPartCurrentTimes ( 123 , 0 )
556
655
const piece = createPieceInstance ( { start : 'now' } , 5000 )
557
656
558
- expect ( resolvePrunedPieceInstance ( nowInPart , clone ( piece ) ) ) . toStrictEqual ( {
657
+ expect ( resolvePrunedPieceInstance ( partTimes , clone ( piece ) ) ) . toStrictEqual ( {
559
658
instance : clone ( piece ) ,
560
659
timelinePriority : piece . priority ,
561
- resolvedStart : nowInPart ,
562
- resolvedDuration : 5000 - nowInPart ,
660
+ resolvedStart : partTimes . nowInPart ,
661
+ resolvedDuration : 5000 - partTimes . nowInPart ,
563
662
} satisfies ResolvedPieceInstance )
564
663
} )
565
664
566
665
test ( 'now start, with end cap and longer planned duration' , async ( ) => {
567
- const nowInPart = 123
666
+ const partTimes = createPartCurrentTimes ( 123 , 0 )
568
667
const piece = createPieceInstance ( { start : 'now' , duration : 6000 } , 5000 )
569
668
570
- expect ( resolvePrunedPieceInstance ( nowInPart , clone ( piece ) ) ) . toStrictEqual ( {
669
+ expect ( resolvePrunedPieceInstance ( partTimes , clone ( piece ) ) ) . toStrictEqual ( {
571
670
instance : clone ( piece ) ,
572
671
timelinePriority : piece . priority ,
573
- resolvedStart : nowInPart ,
574
- resolvedDuration : 5000 - nowInPart ,
672
+ resolvedStart : partTimes . nowInPart ,
673
+ resolvedDuration : 5000 - partTimes . nowInPart ,
575
674
} satisfies ResolvedPieceInstance )
576
675
} )
577
676
578
677
test ( 'now start, with end cap and shorter planned duration' , async ( ) => {
579
- const nowInPart = 123
678
+ const partTimes = createPartCurrentTimes ( 123 , 0 )
580
679
const piece = createPieceInstance ( { start : 'now' , duration : 3000 } , 5000 )
581
680
582
- expect ( resolvePrunedPieceInstance ( nowInPart , clone ( piece ) ) ) . toStrictEqual ( {
681
+ expect ( resolvePrunedPieceInstance ( partTimes , clone ( piece ) ) ) . toStrictEqual ( {
583
682
instance : clone ( piece ) ,
584
683
timelinePriority : piece . priority ,
585
- resolvedStart : nowInPart ,
684
+ resolvedStart : partTimes . nowInPart ,
586
685
resolvedDuration : 3000 ,
587
686
} satisfies ResolvedPieceInstance )
588
687
} )
589
688
590
689
test ( 'now start, with userDuration.endRelativeToPart' , async ( ) => {
591
- const nowInPart = 123
690
+ const partTimes = createPartCurrentTimes ( 123 , 0 )
592
691
const piece = createPieceInstance ( { start : 'now' } , undefined , {
593
692
endRelativeToPart : 4000 ,
594
693
} )
595
694
596
- expect ( resolvePrunedPieceInstance ( nowInPart , clone ( piece ) ) ) . toStrictEqual ( {
695
+ expect ( resolvePrunedPieceInstance ( partTimes , clone ( piece ) ) ) . toStrictEqual ( {
597
696
instance : clone ( piece ) ,
598
697
timelinePriority : piece . priority ,
599
- resolvedStart : nowInPart ,
600
- resolvedDuration : 4000 - nowInPart ,
698
+ resolvedStart : partTimes . nowInPart ,
699
+ resolvedDuration : 4000 - partTimes . nowInPart ,
601
700
} satisfies ResolvedPieceInstance )
602
701
} )
603
702
604
703
test ( 'numeric start, with userDuration.endRelativeToNow' , async ( ) => {
605
- const nowInPart = 123
704
+ const partTimes = createPartCurrentTimes ( 123 , 0 )
606
705
const piece = createPieceInstance ( { start : 500 } , undefined , {
607
706
endRelativeToNow : 4000 ,
608
707
} )
609
708
610
- expect ( resolvePrunedPieceInstance ( nowInPart , clone ( piece ) ) ) . toStrictEqual ( {
709
+ expect ( resolvePrunedPieceInstance ( partTimes , clone ( piece ) ) ) . toStrictEqual ( {
611
710
instance : clone ( piece ) ,
612
711
timelinePriority : piece . priority ,
613
712
resolvedStart : 500 ,
614
- resolvedDuration : 4000 - 500 + nowInPart ,
713
+ resolvedDuration : 4000 - 500 + partTimes . nowInPart ,
615
714
} satisfies ResolvedPieceInstance )
616
715
} )
617
716
618
717
test ( 'now start, with userDuration.endRelativeToNow' , async ( ) => {
619
- const nowInPart = 123
718
+ const partTimes = createPartCurrentTimes ( 123 , 0 )
620
719
const piece = createPieceInstance ( { start : 'now' } , undefined , {
621
720
endRelativeToNow : 4000 ,
622
721
} )
623
722
624
- expect ( resolvePrunedPieceInstance ( nowInPart , clone ( piece ) ) ) . toStrictEqual ( {
723
+ expect ( resolvePrunedPieceInstance ( partTimes , clone ( piece ) ) ) . toStrictEqual ( {
625
724
instance : clone ( piece ) ,
626
725
timelinePriority : piece . priority ,
627
- resolvedStart : nowInPart ,
726
+ resolvedStart : partTimes . nowInPart ,
628
727
resolvedDuration : 4000 ,
629
728
} satisfies ResolvedPieceInstance )
630
729
} )
631
730
632
731
test ( 'now start, with end cap, planned duration and userDuration.endRelativeToPart' , async ( ) => {
633
- const nowInPart = 123
732
+ const partTimes = createPartCurrentTimes ( 123 , 0 )
634
733
const piece = createPieceInstance ( { start : 'now' , duration : 3000 } , 5000 , { endRelativeToPart : 2800 } )
635
734
636
- expect ( resolvePrunedPieceInstance ( nowInPart , clone ( piece ) ) ) . toStrictEqual ( {
735
+ expect ( resolvePrunedPieceInstance ( partTimes , clone ( piece ) ) ) . toStrictEqual ( {
637
736
instance : clone ( piece ) ,
638
737
timelinePriority : piece . priority ,
639
- resolvedStart : nowInPart ,
640
- resolvedDuration : 2800 - nowInPart ,
738
+ resolvedStart : partTimes . nowInPart ,
739
+ resolvedDuration : 2800 - partTimes . nowInPart ,
641
740
} satisfies ResolvedPieceInstance )
642
741
} )
643
742
644
743
test ( 'now start, with end cap, planned duration and userDuration.endRelativeToNow' , async ( ) => {
645
- const nowInPart = 123
744
+ const partTimes = createPartCurrentTimes ( 123 , 0 )
646
745
const piece = createPieceInstance ( { start : 'now' , duration : 3000 } , 5000 , { endRelativeToNow : 2800 } )
647
746
648
- expect ( resolvePrunedPieceInstance ( nowInPart , clone ( piece ) ) ) . toStrictEqual ( {
747
+ expect ( resolvePrunedPieceInstance ( partTimes , clone ( piece ) ) ) . toStrictEqual ( {
649
748
instance : clone ( piece ) ,
650
749
timelinePriority : piece . priority ,
651
- resolvedStart : nowInPart ,
750
+ resolvedStart : partTimes . nowInPart ,
652
751
resolvedDuration : 2800 ,
653
752
} satisfies ResolvedPieceInstance )
654
753
} )
0 commit comments