mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-16 12:53:32 +00:00
657cc22b44
* feat: parse cue * refactor: get delay from backend * feat: add cue to UI * refactor: remove deprecated delay logic * refactor: extract studio clock specific logic * refactor: extract utilities * refactor: fix issue with missing key * style: prevent cue overflow * style: prevent whitespace wrap * feat: add support for cues in integrations
458 lines
10 KiB
TypeScript
458 lines
10 KiB
TypeScript
import { EndAction, OntimeEvent, OntimeRundown, SupportedEvent, TimerType } from 'ontime-types';
|
|
|
|
import { calculateRuntimeDelays, calculateRuntimeDelaysFrom, getDelayAt } from '../delayedRundown.utils.js';
|
|
|
|
describe('calculateRuntimeDelays', () => {
|
|
it('calculates all delays in a given rundown', () => {
|
|
const rundown: OntimeRundown = [
|
|
{
|
|
title: '',
|
|
subtitle: '',
|
|
presenter: '',
|
|
note: '',
|
|
endAction: EndAction.None,
|
|
timerType: TimerType.CountDown,
|
|
timeStart: 600000,
|
|
timeEnd: 1200000,
|
|
duration: 600000,
|
|
isPublic: true,
|
|
skip: false,
|
|
colour: '',
|
|
user0: '',
|
|
user1: '',
|
|
user2: '',
|
|
user3: '',
|
|
user4: '',
|
|
user5: '',
|
|
user6: '',
|
|
user7: '',
|
|
user8: '',
|
|
user9: '',
|
|
type: SupportedEvent.Event,
|
|
revision: 0,
|
|
id: '659e1',
|
|
cue: '1',
|
|
},
|
|
{
|
|
duration: 600000,
|
|
type: SupportedEvent.Delay,
|
|
revision: 0,
|
|
id: '07986',
|
|
},
|
|
{
|
|
title: '',
|
|
subtitle: '',
|
|
presenter: '',
|
|
note: '',
|
|
endAction: EndAction.None,
|
|
timerType: TimerType.CountDown,
|
|
timeStart: 1200000,
|
|
timeEnd: 1200000,
|
|
duration: 0,
|
|
isPublic: true,
|
|
skip: false,
|
|
colour: '',
|
|
user0: '',
|
|
user1: '',
|
|
user2: '',
|
|
user3: '',
|
|
user4: '',
|
|
user5: '',
|
|
user6: '',
|
|
user7: '',
|
|
user8: '',
|
|
user9: '',
|
|
type: SupportedEvent.Event,
|
|
revision: 0,
|
|
id: '1c48f',
|
|
cue: '2',
|
|
},
|
|
{
|
|
duration: 1200000,
|
|
type: SupportedEvent.Delay,
|
|
revision: 0,
|
|
id: '7db42',
|
|
},
|
|
{
|
|
title: '',
|
|
subtitle: '',
|
|
presenter: '',
|
|
note: '',
|
|
endAction: EndAction.None,
|
|
timerType: TimerType.CountDown,
|
|
timeStart: 600000,
|
|
timeEnd: 1200000,
|
|
duration: 600000,
|
|
isPublic: true,
|
|
skip: false,
|
|
colour: '',
|
|
user0: '',
|
|
user1: '',
|
|
user2: '',
|
|
user3: '',
|
|
user4: '',
|
|
user5: '',
|
|
user6: '',
|
|
user7: '',
|
|
user8: '',
|
|
user9: '',
|
|
type: SupportedEvent.Event,
|
|
revision: 0,
|
|
id: 'd48c2',
|
|
cue: '3',
|
|
},
|
|
{
|
|
title: '',
|
|
type: SupportedEvent.Block,
|
|
id: '9870d',
|
|
},
|
|
{
|
|
title: '',
|
|
subtitle: '',
|
|
presenter: '',
|
|
note: '',
|
|
endAction: EndAction.None,
|
|
timerType: TimerType.CountDown,
|
|
timeStart: 1200000,
|
|
timeEnd: 1800000,
|
|
duration: 600000,
|
|
isPublic: true,
|
|
skip: false,
|
|
colour: '',
|
|
user0: '',
|
|
user1: '',
|
|
user2: '',
|
|
user3: '',
|
|
user4: '',
|
|
user5: '',
|
|
user6: '',
|
|
user7: '',
|
|
user8: '',
|
|
user9: '',
|
|
type: SupportedEvent.Event,
|
|
revision: 0,
|
|
id: '2f185',
|
|
cue: '4',
|
|
},
|
|
];
|
|
|
|
const updatedRundown = calculateRuntimeDelays(rundown);
|
|
|
|
expect(rundown.length).toBe(updatedRundown.length);
|
|
expect((updatedRundown[0] as OntimeEvent).delay).toBe(0);
|
|
expect((updatedRundown[2] as OntimeEvent).delay).toBe(600000);
|
|
expect((updatedRundown[4] as OntimeEvent).delay).toBe(600000 + 1200000);
|
|
expect((updatedRundown[6] as OntimeEvent).delay).toBe(0);
|
|
});
|
|
});
|
|
|
|
describe('getDelayAt()', () => {
|
|
const delayedRundown: OntimeRundown = [
|
|
{
|
|
title: '',
|
|
subtitle: '',
|
|
presenter: '',
|
|
note: '',
|
|
endAction: EndAction.None,
|
|
timerType: TimerType.CountDown,
|
|
timeStart: 600000,
|
|
timeEnd: 1200000,
|
|
duration: 600000,
|
|
isPublic: true,
|
|
skip: false,
|
|
colour: '',
|
|
user0: '',
|
|
user1: '',
|
|
user2: '',
|
|
user3: '',
|
|
user4: '',
|
|
user5: '',
|
|
user6: '',
|
|
user7: '',
|
|
user8: '',
|
|
user9: '',
|
|
type: SupportedEvent.Event,
|
|
revision: 0,
|
|
id: '659e1',
|
|
delay: 0,
|
|
cue: '1',
|
|
},
|
|
{
|
|
duration: 600000,
|
|
type: SupportedEvent.Delay,
|
|
revision: 0,
|
|
id: '07986',
|
|
},
|
|
{
|
|
title: '',
|
|
subtitle: '',
|
|
presenter: '',
|
|
note: '',
|
|
endAction: EndAction.None,
|
|
timerType: TimerType.CountDown,
|
|
timeStart: 1200000,
|
|
timeEnd: 1200000,
|
|
duration: 0,
|
|
isPublic: true,
|
|
skip: false,
|
|
colour: '',
|
|
user0: '',
|
|
user1: '',
|
|
user2: '',
|
|
user3: '',
|
|
user4: '',
|
|
user5: '',
|
|
user6: '',
|
|
user7: '',
|
|
user8: '',
|
|
user9: '',
|
|
type: SupportedEvent.Event,
|
|
revision: 0,
|
|
id: '1c48f',
|
|
delay: 600000,
|
|
cue: '2',
|
|
},
|
|
{
|
|
duration: 1200000,
|
|
type: SupportedEvent.Delay,
|
|
revision: 0,
|
|
id: '7db42',
|
|
},
|
|
{
|
|
title: '',
|
|
subtitle: '',
|
|
presenter: '',
|
|
note: '',
|
|
endAction: EndAction.None,
|
|
timerType: TimerType.CountDown,
|
|
timeStart: 600000,
|
|
timeEnd: 1200000,
|
|
duration: 600000,
|
|
isPublic: true,
|
|
skip: false,
|
|
colour: '',
|
|
user0: '',
|
|
user1: '',
|
|
user2: '',
|
|
user3: '',
|
|
user4: '',
|
|
user5: '',
|
|
user6: '',
|
|
user7: '',
|
|
user8: '',
|
|
user9: '',
|
|
type: SupportedEvent.Event,
|
|
revision: 0,
|
|
id: 'd48c2',
|
|
delay: 1800000,
|
|
cue: '3',
|
|
},
|
|
{
|
|
title: '',
|
|
type: SupportedEvent.Block,
|
|
id: '9870d',
|
|
},
|
|
{
|
|
title: '',
|
|
subtitle: '',
|
|
presenter: '',
|
|
note: '',
|
|
endAction: EndAction.None,
|
|
timerType: TimerType.CountDown,
|
|
timeStart: 1200000,
|
|
timeEnd: 1800000,
|
|
duration: 600000,
|
|
isPublic: true,
|
|
skip: false,
|
|
colour: '',
|
|
user0: '',
|
|
user1: '',
|
|
user2: '',
|
|
user3: '',
|
|
user4: '',
|
|
user5: '',
|
|
user6: '',
|
|
user7: '',
|
|
user8: '',
|
|
user9: '',
|
|
type: SupportedEvent.Event,
|
|
revision: 0,
|
|
id: '2f185',
|
|
delay: 0,
|
|
cue: '4',
|
|
},
|
|
];
|
|
|
|
it('calculates delay in a rundown', () => {
|
|
const delayAtStart = getDelayAt(0, delayedRundown);
|
|
const delayOnFirstEvent = getDelayAt(2, delayedRundown);
|
|
const delayOnSecondEvent = getDelayAt(4, delayedRundown);
|
|
const delayOnBlockedEvent = getDelayAt(0, delayedRundown);
|
|
|
|
expect(delayAtStart).toBe(0);
|
|
expect(delayOnFirstEvent).toBe(600000);
|
|
expect(delayOnSecondEvent).toBe(600000 + 1200000);
|
|
expect(delayOnBlockedEvent).toBe(0);
|
|
});
|
|
it('finds delay before a delay block', () => {
|
|
const valueOnFirstDelayBlock = getDelayAt(1, delayedRundown);
|
|
const valueOnSecondDelayBlock = getDelayAt(3, delayedRundown);
|
|
const valueAfterSecondDelayBlock = getDelayAt(4, delayedRundown);
|
|
|
|
expect(valueOnFirstDelayBlock).toBe(0);
|
|
expect(valueOnSecondDelayBlock).toBe(600000);
|
|
expect(valueAfterSecondDelayBlock).toBe(600000 + 1200000);
|
|
});
|
|
it('returns 0 after blocks', () => {
|
|
const valueOnBlock = getDelayAt(6, delayedRundown);
|
|
expect(valueOnBlock).toBe(0);
|
|
});
|
|
});
|
|
|
|
describe('calculateRuntimeDelaysFrom()', () => {
|
|
it('updates delays from given id', () => {
|
|
const delayedRundown: OntimeRundown = [
|
|
{
|
|
title: '',
|
|
subtitle: '',
|
|
presenter: '',
|
|
note: '',
|
|
endAction: EndAction.None,
|
|
timerType: TimerType.CountDown,
|
|
timeStart: 600000,
|
|
timeEnd: 1200000,
|
|
duration: 600000,
|
|
isPublic: true,
|
|
skip: false,
|
|
colour: '',
|
|
user0: '',
|
|
user1: '',
|
|
user2: '',
|
|
user3: '',
|
|
user4: '',
|
|
user5: '',
|
|
user6: '',
|
|
user7: '',
|
|
user8: '',
|
|
user9: '',
|
|
type: SupportedEvent.Event,
|
|
revision: 0,
|
|
id: '659e1',
|
|
delay: 0,
|
|
cue: '1',
|
|
},
|
|
{
|
|
duration: 600000,
|
|
type: SupportedEvent.Delay,
|
|
revision: 0,
|
|
id: '07986',
|
|
},
|
|
{
|
|
title: '',
|
|
subtitle: '',
|
|
presenter: '',
|
|
note: '',
|
|
endAction: EndAction.None,
|
|
timerType: TimerType.CountDown,
|
|
timeStart: 1200000,
|
|
timeEnd: 1200000,
|
|
duration: 0,
|
|
isPublic: true,
|
|
skip: false,
|
|
colour: '',
|
|
user0: '',
|
|
user1: '',
|
|
user2: '',
|
|
user3: '',
|
|
user4: '',
|
|
user5: '',
|
|
user6: '',
|
|
user7: '',
|
|
user8: '',
|
|
user9: '',
|
|
type: SupportedEvent.Event,
|
|
revision: 0,
|
|
id: '1c48f',
|
|
delay: 0,
|
|
cue: '2',
|
|
},
|
|
{
|
|
duration: 1200000,
|
|
type: SupportedEvent.Delay,
|
|
revision: 0,
|
|
id: '7db42',
|
|
},
|
|
{
|
|
title: '',
|
|
subtitle: '',
|
|
presenter: '',
|
|
note: '',
|
|
endAction: EndAction.None,
|
|
timerType: TimerType.CountDown,
|
|
timeStart: 600000,
|
|
timeEnd: 1200000,
|
|
duration: 600000,
|
|
isPublic: true,
|
|
skip: false,
|
|
colour: '',
|
|
user0: '',
|
|
user1: '',
|
|
user2: '',
|
|
user3: '',
|
|
user4: '',
|
|
user5: '',
|
|
user6: '',
|
|
user7: '',
|
|
user8: '',
|
|
user9: '',
|
|
type: SupportedEvent.Event,
|
|
revision: 0,
|
|
id: 'd48c2',
|
|
delay: 1800000,
|
|
cue: '3',
|
|
},
|
|
{
|
|
title: '',
|
|
type: SupportedEvent.Block,
|
|
id: '9870d',
|
|
},
|
|
{
|
|
title: '',
|
|
subtitle: '',
|
|
presenter: '',
|
|
note: '',
|
|
endAction: EndAction.None,
|
|
timerType: TimerType.CountDown,
|
|
timeStart: 1200000,
|
|
timeEnd: 1800000,
|
|
duration: 600000,
|
|
isPublic: true,
|
|
skip: false,
|
|
colour: '',
|
|
user0: '',
|
|
user1: '',
|
|
user2: '',
|
|
user3: '',
|
|
user4: '',
|
|
user5: '',
|
|
user6: '',
|
|
user7: '',
|
|
user8: '',
|
|
user9: '',
|
|
type: SupportedEvent.Event,
|
|
revision: 0,
|
|
id: '2f185',
|
|
delay: 0,
|
|
cue: '4',
|
|
},
|
|
];
|
|
|
|
const updatedRundown = calculateRuntimeDelaysFrom('07986', delayedRundown);
|
|
|
|
// we only update from the 4th on
|
|
expect((updatedRundown[0] as OntimeEvent).delay).toBe(0);
|
|
// 1 + 3
|
|
expect((updatedRundown[4] as OntimeEvent).delay).toBe(600000 + 1200000);
|
|
});
|
|
});
|