mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-15 04:13:47 +00:00
340f5478fb
* add shortcut * chore: rename getRelevantBlock to getPreviousBlock
318 lines
9.6 KiB
TypeScript
318 lines
9.6 KiB
TypeScript
import type { NormalisedRundown, OntimeEvent, OntimeRundown } from 'ontime-types';
|
|
import { SupportedEvent } from 'ontime-types';
|
|
|
|
import {
|
|
filterPlayable,
|
|
getLastEvent,
|
|
getLastNormal,
|
|
getNext,
|
|
getNextEvent,
|
|
getPrevious,
|
|
getPreviousBlock,
|
|
getPreviousEvent,
|
|
swapEventData,
|
|
} from './rundownUtils';
|
|
|
|
describe('getNext()', () => {
|
|
it('returns the next event of type event', () => {
|
|
const testRundown = [
|
|
{ id: '1', type: SupportedEvent.Event },
|
|
{ id: '2', type: SupportedEvent.Event },
|
|
{ id: '3', type: SupportedEvent.Event },
|
|
];
|
|
|
|
const { nextEvent, nextIndex } = getNext(testRundown as OntimeRundown, '1');
|
|
expect(nextEvent?.id).toBe('2');
|
|
expect(nextIndex).toBe(1);
|
|
});
|
|
it('alows other event types', () => {
|
|
const testRundown = [
|
|
{ id: '1', type: SupportedEvent.Event },
|
|
{ id: '2', type: SupportedEvent.Delay },
|
|
{ id: '3', type: SupportedEvent.Block },
|
|
{ id: '4', type: SupportedEvent.Event },
|
|
];
|
|
|
|
const { nextEvent, nextIndex } = getNext(testRundown as OntimeRundown, '1');
|
|
expect(nextEvent?.id).toBe('2');
|
|
expect(nextIndex).toBe(1);
|
|
});
|
|
it('returns null if none found', () => {
|
|
const testRundown = [
|
|
{ id: '1', type: SupportedEvent.Event },
|
|
{ id: '2', type: SupportedEvent.Delay },
|
|
{ id: '3', type: SupportedEvent.Block },
|
|
];
|
|
|
|
const { nextEvent, nextIndex } = getNext(testRundown as OntimeRundown, '3');
|
|
expect(nextEvent).toBe(null);
|
|
expect(nextIndex).toBe(null);
|
|
});
|
|
});
|
|
|
|
describe('getNextEvent()', () => {
|
|
it('returns the next event of type event', () => {
|
|
const testRundown = [
|
|
{ id: '1', type: SupportedEvent.Event },
|
|
{ id: '2', type: SupportedEvent.Event },
|
|
{ id: '3', type: SupportedEvent.Event },
|
|
];
|
|
|
|
const { nextEvent, nextIndex } = getNextEvent(testRundown as OntimeRundown, '1');
|
|
expect(nextEvent?.id).toBe('2');
|
|
expect(nextIndex).toBe(1);
|
|
});
|
|
it('ignores other event types', () => {
|
|
const testRundown = [
|
|
{ id: '1', type: SupportedEvent.Event },
|
|
{ id: '2', type: SupportedEvent.Delay },
|
|
{ id: '3', type: SupportedEvent.Block },
|
|
{ id: '4', type: SupportedEvent.Event },
|
|
];
|
|
|
|
const { nextEvent, nextIndex } = getNextEvent(testRundown as OntimeRundown, '1');
|
|
expect(nextEvent?.id).toBe('4');
|
|
expect(nextIndex).toBe(3);
|
|
});
|
|
it('returns null if none found', () => {
|
|
const testRundown = [
|
|
{ id: '1', type: SupportedEvent.Event },
|
|
{ id: '2', type: SupportedEvent.Delay },
|
|
{ id: '3', type: SupportedEvent.Block },
|
|
];
|
|
|
|
const { nextEvent, nextIndex } = getNextEvent(testRundown as OntimeRundown, '1');
|
|
expect(nextEvent).toBe(null);
|
|
expect(nextIndex).toBe(null);
|
|
});
|
|
});
|
|
|
|
describe('getPrevious()', () => {
|
|
it('returns the previous event of type event', () => {
|
|
const testRundown = [
|
|
{ id: '1', type: SupportedEvent.Event },
|
|
{ id: '2', type: SupportedEvent.Event },
|
|
{ id: '3', type: SupportedEvent.Event },
|
|
];
|
|
|
|
const { entry, index } = getPrevious(testRundown as OntimeRundown, '3');
|
|
expect(entry?.id).toBe('2');
|
|
expect(index).toBe(1);
|
|
});
|
|
it('allow other event types', () => {
|
|
const testRundown = [
|
|
{ id: '1', type: SupportedEvent.Event },
|
|
{ id: '2', type: SupportedEvent.Delay },
|
|
{ id: '3', type: SupportedEvent.Block },
|
|
{ id: '4', type: SupportedEvent.Event },
|
|
];
|
|
|
|
const { entry, index } = getPrevious(testRundown as OntimeRundown, '3');
|
|
expect(entry?.id).toBe('2');
|
|
expect(index).toBe(1);
|
|
});
|
|
it('returns null if none found', () => {
|
|
const testRundown = [
|
|
{ id: '2', type: SupportedEvent.Delay },
|
|
{ id: '3', type: SupportedEvent.Block },
|
|
{ id: '4', type: SupportedEvent.Event },
|
|
];
|
|
|
|
const { entry, index } = getPrevious(testRundown as OntimeRundown, '2');
|
|
expect(entry).toBe(null);
|
|
expect(index).toBe(null);
|
|
});
|
|
});
|
|
|
|
describe('getPreviousEvent()', () => {
|
|
it('returns the previous event of type event', () => {
|
|
const testRundown = [
|
|
{ id: '1', type: SupportedEvent.Event },
|
|
{ id: '2', type: SupportedEvent.Event },
|
|
{ id: '3', type: SupportedEvent.Event },
|
|
];
|
|
|
|
const { previousEvent, previousIndex } = getPreviousEvent(testRundown as OntimeRundown, '3');
|
|
expect(previousEvent?.id).toBe('2');
|
|
expect(previousIndex).toBe(1);
|
|
});
|
|
it('ignores other event types', () => {
|
|
const testRundown = [
|
|
{ id: '1', type: SupportedEvent.Event },
|
|
{ id: '2', type: SupportedEvent.Delay },
|
|
{ id: '3', type: SupportedEvent.Block },
|
|
{ id: '4', type: SupportedEvent.Event },
|
|
];
|
|
|
|
const { previousEvent, previousIndex } = getPreviousEvent(testRundown as OntimeRundown, '4');
|
|
expect(previousEvent?.id).toBe('1');
|
|
expect(previousIndex).toBe(0);
|
|
});
|
|
it('returns null if none found', () => {
|
|
const testRundown = [
|
|
{ id: '2', type: SupportedEvent.Delay },
|
|
{ id: '3', type: SupportedEvent.Block },
|
|
{ id: '4', type: SupportedEvent.Event },
|
|
];
|
|
|
|
const { previousEvent, previousIndex } = getPreviousEvent(testRundown as OntimeRundown, '2');
|
|
expect(previousEvent).toBe(null);
|
|
expect(previousIndex).toBe(null);
|
|
});
|
|
});
|
|
|
|
describe('swapEventData', () => {
|
|
it('swaps some data between two events', () => {
|
|
const eventA = {
|
|
id: '1',
|
|
cue: 'A',
|
|
timeStart: 1,
|
|
timeEnd: 1,
|
|
duration: 1,
|
|
delay: 1,
|
|
} as OntimeEvent;
|
|
const eventB = {
|
|
id: '2',
|
|
cue: 'B',
|
|
timeStart: 2,
|
|
timeEnd: 2,
|
|
duration: 2,
|
|
delay: 2,
|
|
} as OntimeEvent;
|
|
|
|
const { newA, newB } = swapEventData(eventA, eventB);
|
|
|
|
expect(newA).toMatchObject({
|
|
id: '1',
|
|
cue: 'B',
|
|
timeStart: 1,
|
|
timeEnd: 1,
|
|
duration: 1,
|
|
delay: 1,
|
|
});
|
|
expect(newB).toMatchObject({
|
|
id: '2',
|
|
cue: 'A',
|
|
timeStart: 2,
|
|
timeEnd: 2,
|
|
duration: 2,
|
|
delay: 2,
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('getLastEvent', () => {
|
|
it('returns the last event of type event', () => {
|
|
const testRundown = [
|
|
{ id: '1', type: SupportedEvent.Event },
|
|
{ id: '2', type: SupportedEvent.Delay },
|
|
{ id: '3', type: SupportedEvent.Event },
|
|
{ id: '4', type: SupportedEvent.Block },
|
|
];
|
|
|
|
const { lastEvent } = getLastEvent(testRundown as OntimeRundown);
|
|
expect(lastEvent?.id).toBe('3');
|
|
});
|
|
it('handles rundowns with a single event', () => {
|
|
const testRundown = [{ id: '1', type: SupportedEvent.Event }];
|
|
|
|
const { lastEvent } = getLastEvent(testRundown as OntimeRundown);
|
|
expect(lastEvent?.id).toBe('1');
|
|
});
|
|
|
|
describe('getLastNormal', () => {
|
|
it('returns the last entry', () => {
|
|
const testRundown = {
|
|
4: { id: '4', type: SupportedEvent.Block },
|
|
1: { id: '1', type: SupportedEvent.Event },
|
|
3: { id: '3', type: SupportedEvent.Event },
|
|
2: { id: '2', type: SupportedEvent.Delay },
|
|
};
|
|
|
|
const order = ['1', '2', '3', '4'];
|
|
|
|
const lastEntry = getLastNormal(testRundown as unknown as NormalisedRundown, order);
|
|
expect(lastEntry?.id).toBe('4');
|
|
});
|
|
it('handles rundowns with a single event', () => {
|
|
const testRundown = [{ id: '1', type: SupportedEvent.Event }];
|
|
|
|
const { lastEvent } = getLastEvent(testRundown as OntimeRundown);
|
|
expect(lastEvent?.id).toBe('1');
|
|
});
|
|
|
|
it('handles empty order', () => {
|
|
const testRundown = {
|
|
4: { id: '4', type: SupportedEvent.Block },
|
|
1: { id: '1', type: SupportedEvent.Event },
|
|
3: { id: '3', type: SupportedEvent.Event },
|
|
2: { id: '2', type: SupportedEvent.Delay },
|
|
};
|
|
|
|
const order: string[] = [];
|
|
|
|
const lastEntry = getLastNormal(testRundown as unknown as NormalisedRundown, order);
|
|
expect(lastEntry).toBe(null);
|
|
});
|
|
|
|
it('handles empty rundown', () => {
|
|
const testRundown = {};
|
|
|
|
const order = ['1', '2', '3', '4'];
|
|
|
|
const lastEntry = getLastNormal(testRundown as unknown as NormalisedRundown, order);
|
|
expect(lastEntry).toBe(null);
|
|
});
|
|
});
|
|
|
|
describe('relevantBlock', () => {
|
|
const testRundown = [
|
|
{ id: 'a', type: SupportedEvent.Event },
|
|
{ id: 'b', type: SupportedEvent.Event },
|
|
{ id: 'c', type: SupportedEvent.Event },
|
|
{ id: 'd', type: SupportedEvent.Delay },
|
|
{ id: 'e', type: SupportedEvent.Block },
|
|
{ id: 'f', type: SupportedEvent.Event },
|
|
{ id: 'g', type: SupportedEvent.Block },
|
|
{ id: 'h', type: SupportedEvent.Event },
|
|
];
|
|
|
|
it('returns the relevant block', () => {
|
|
const block = getPreviousBlock(testRundown as unknown as OntimeRundown, 'h');
|
|
|
|
expect(block?.id).toBe('g');
|
|
});
|
|
it('returns the relevant block', () => {
|
|
const block = getPreviousBlock(testRundown as unknown as OntimeRundown, 'f');
|
|
|
|
expect(block?.id).toBe('e');
|
|
});
|
|
it('returns the relevant block', () => {
|
|
const block = getPreviousBlock(testRundown as unknown as OntimeRundown, 'a');
|
|
|
|
expect(block).toBeNull();
|
|
});
|
|
it('also works on index 0', () => {
|
|
testRundown.unshift({ id: '0', type: SupportedEvent.Block });
|
|
const block = getPreviousBlock(testRundown as unknown as OntimeRundown, 'a');
|
|
expect(block?.id).toBe('0');
|
|
});
|
|
});
|
|
|
|
describe('filterPlayable()', () => {
|
|
test('should return an array with only playable events', () => {
|
|
const eventA = { id: 'a', type: SupportedEvent.Event } as OntimeEvent;
|
|
const eventB = { id: 'b', skip: true, type: SupportedEvent.Event } as OntimeEvent;
|
|
const testRundown = [
|
|
eventA,
|
|
eventB,
|
|
{ id: 'c', type: SupportedEvent.Delay },
|
|
{ id: 'd', type: SupportedEvent.Block },
|
|
];
|
|
|
|
const result = filterPlayable(testRundown as unknown as OntimeRundown);
|
|
expect(result).toMatchObject([eventA]);
|
|
});
|
|
});
|
|
});
|