V2 fix delay (#340)

* fix: avoid modifying original objects
This commit is contained in:
Carlos Valente
2023-04-15 13:26:57 +02:00
committed by GitHub
parent e9fe0c0a3a
commit 6732314f15
3 changed files with 244 additions and 128 deletions
@@ -1,6 +1,7 @@
import { formatEventList, getEventsWithDelay, trimEventlist } from '../eventsManager'; import { formatEventList, getEventsWithDelay, trimEventlist } from '../eventsManager';
test('getEventsWithDelay function', () => { describe('getEventsWithDelay function', () => {
test('with positive delays', () => {
const testData = [ const testData = [
{ {
title: 'Welcome to Ontime', title: 'Welcome to Ontime',
@@ -120,8 +121,112 @@ test('getEventsWithDelay function', () => {
expect(getEventsWithDelay(testData)).toStrictEqual(expected); expect(getEventsWithDelay(testData)).toStrictEqual(expected);
}); });
test('with negative delays', () => {
const testData = [
{
duration: -20,
type: 'delay',
id: '24240',
},
{
title: 'Welcome to Ontime',
timeStart: 100,
timeEnd: 200,
colour: '',
type: 'event',
id: '5946',
},
];
const expected = [
{
title: 'Welcome to Ontime',
timeStart: 80,
timeEnd: 180,
colour: '',
type: 'event',
id: '5946',
},
];
expect(getEventsWithDelay(testData)).toStrictEqual(expected);
});
});
describe('getEventsWithDelay edge cases', () => { describe('getEventsWithDelay edge cases', () => {
it('ensures time start cannot be below 0', () => {
const testData = [
{
duration: -200,
type: 'delay',
id: '24240',
},
{
title: 'Welcome to Ontime',
timeStart: 10,
timeEnd: 20,
colour: '',
type: 'event',
id: '5946',
},
];
const expected = [
{
title: 'Welcome to Ontime',
timeStart: 0,
timeEnd: 0,
colour: '',
type: 'event',
id: '5946',
},
];
expect(getEventsWithDelay(testData)).toStrictEqual(expected);
});
it('does not modify original array', () => {
const testData = [
{
duration: 10,
type: 'delay',
id: '24240',
},
{
title: 'Welcome to Ontime',
timeStart: 10,
timeEnd: 20,
colour: '',
type: 'event',
id: '5946',
},
];
const expected = [
{
title: 'Welcome to Ontime',
timeStart: 20,
timeEnd: 30,
colour: '',
type: 'event',
id: '5946',
},
];
const expectedSafe = [
{
title: 'Welcome to Ontime',
timeStart: 20,
timeEnd: 30,
colour: '',
type: 'event',
id: '5946',
},
];
expect(getEventsWithDelay(testData)).toStrictEqual(expected);
expect(getEventsWithDelay(expectedSafe)).toStrictEqual(expected);
});
it('given an empty array', () => { it('given an empty array', () => {
const emptyArray = { const emptyArray = {
test: [], test: [],
+21 -10
View File
@@ -11,21 +11,27 @@ import { formatTime } from './time';
export const getEventsWithDelay = (events: OntimeRundownEntry[]): OntimeEvent[] => { export const getEventsWithDelay = (events: OntimeRundownEntry[]): OntimeEvent[] => {
if (events == null) return []; if (events == null) return [];
const unfilteredEvents = [...events]; const delayedEvents: OntimeEvent[] = [];
// Add running delay // Add running delay
let delay = 0; let delay = 0;
for (const event of unfilteredEvents) { for (const event of events) {
if (event.type === SupportedEvent.Block) delay = 0; if (event.type === SupportedEvent.Block) delay = 0;
else if (event.type === SupportedEvent.Delay) delay = delay + event.duration; else if (event.type === SupportedEvent.Delay) {
else if (event.type === SupportedEvent.Event && delay > 0) { if (typeof event.duration === 'number') {
event.timeStart += delay; delay += event.duration;
event.timeEnd += delay; }
} else if (event.type === SupportedEvent.Event) {
const delayedEvent = { ...event };
if (delay !== 0) {
delayedEvent.timeStart = Math.max(delayedEvent.timeStart + delay, 0);
delayedEvent.timeEnd = Math.max(delayedEvent.timeEnd + delay, 0);
}
delayedEvents.push(delayedEvent);
} }
} }
// filter just events return delayedEvents;
return unfilteredEvents.filter((event) => event.type === SupportedEvent.Event) as OntimeEvent[];
}; };
/** /**
@@ -57,7 +63,7 @@ export const trimEventlist = (events: OntimeRundownEntry[], selectedId: string,
type FormatEventListOptionsProp = { type FormatEventListOptionsProp = {
showEnd?: boolean; showEnd?: boolean;
} };
/** /**
* @description Returns list of events formatted to be displayed * @description Returns list of events formatted to be displayed
* @param {Object[]} events - given events * @param {Object[]} events - given events
@@ -67,7 +73,12 @@ type FormatEventListOptionsProp = {
* @param {boolean} [options.showEnd] - whether to show the end time * @param {boolean} [options.showEnd] - whether to show the end time
* @returns {Object[]} Formatted list of events [{time: -, title: -, isNow, isNext}] * @returns {Object[]} Formatted list of events [{time: -, title: -, isNow, isNext}]
*/ */
export const formatEventList = (events: OntimeEvent[], selectedId: string, nextId: string, options: FormatEventListOptionsProp) => { export const formatEventList = (
events: OntimeEvent[],
selectedId: string,
nextId: string,
options: FormatEventListOptionsProp,
) => {
if (events == null) return []; if (events == null) return [];
const { showEnd = false } = options; const { showEnd = false } = options;
+1 -1
View File
@@ -46,7 +46,7 @@ type FormatOptions = {
* @param {function} resolver * @param {function} resolver
* @return {string} * @return {string}
*/ */
export const formatTime = (milliseconds: number | null, options: FormatOptions, resolver = resolveTimeFormat) => { export const formatTime = (milliseconds: number | null, options?: FormatOptions, resolver = resolveTimeFormat) => {
if (milliseconds === null) { if (milliseconds === null) {
return '...'; return '...';
} }