diff --git a/packages/utils/src/date-utils/conversionUtils.ts b/packages/utils/src/date-utils/conversionUtils.ts index d245fe1b5..3f2d56868 100644 --- a/packages/utils/src/date-utils/conversionUtils.ts +++ b/packages/utils/src/date-utils/conversionUtils.ts @@ -1,4 +1,5 @@ import type { MaybeNumber } from 'ontime-types'; +import { TimerType } from 'ontime-types'; export const MILLIS_PER_SECOND = 1000; export const MILLIS_PER_MINUTE = 1000 * 60; @@ -25,8 +26,22 @@ function convertMillis(millis: MaybeNumber, conversion: number): number { * @param millis * @returns */ -export function millisToSeconds(millis: MaybeNumber): number { - return convertMillis(millis, MILLIS_PER_SECOND); +export function millisToSeconds( + millis: MaybeNumber, + direction: TimerType.CountDown | TimerType.CountUp = TimerType.CountDown, +) { + if (millis === null) return 0; + + if (direction === TimerType.CountDown) { + // 0 + is there to avoid result giving -0 + return 0 + Math.ceil(millis / MILLIS_PER_SECOND); + } + + if (direction === TimerType.CountUp) { + return Math.floor(millis / MILLIS_PER_SECOND); + } + + throw new Error('?????'); } /** diff --git a/packages/utils/src/date-utils/timeFormatting.test.ts b/packages/utils/src/date-utils/timeFormatting.test.ts index f0b114dec..fac223859 100644 --- a/packages/utils/src/date-utils/timeFormatting.test.ts +++ b/packages/utils/src/date-utils/timeFormatting.test.ts @@ -1,3 +1,5 @@ +import { TimerType } from 'ontime-types'; + import { dayInMs, MILLIS_PER_HOUR } from './conversionUtils'; import { formatFromMillis, millisToString, removeLeadingZero } from './timeFormatting'; @@ -13,32 +15,33 @@ describe('millisToString()', () => { test('negative times are rounded up', () => { const testScenarios = [ - { millis: 300, expected: '00:00:00' }, - { millis: -300, expected: '-00:00:01' }, - { millis: 1000, expected: '00:00:01' }, - { millis: -1000, expected: '-00:00:01' }, - { millis: 1500, expected: '00:00:01' }, - { millis: -1500, expected: '-00:00:02' }, - { millis: 60000 - 1, expected: '00:00:59' }, - { millis: -(60000 - 1), expected: '-00:01:00' }, - { millis: 60000, expected: '00:01:00' }, - { millis: -60000, expected: '-00:01:00' }, - { millis: 600000, expected: '00:10:00' }, - { millis: -600000, expected: '-00:10:00' }, - { millis: 3600000, expected: '01:00:00' }, - { millis: -3600000, expected: '-01:00:00' }, - { millis: 36000000, expected: '10:00:00' }, - { millis: -36000000, expected: '-10:00:00' }, - { millis: 86399000, expected: '23:59:59' }, - { millis: -86399000, expected: '-23:59:59' }, - { millis: 86400000, expected: '24:00:00' }, - { millis: -86400000, expected: '-24:00:00' }, - { millis: 86401000, expected: '24:00:01' }, - { millis: -86401000, expected: '-24:00:01' }, + { millis: 300, expected_down: '00:00:01', expected_up: '00:00:00' }, + { millis: -300, expected_down: '-00:00:00', expected_up: '-00:00:01' }, + { millis: 1000, expected_down: '00:00:01', expected_up: '00:00:01' }, + { millis: -1000, expected_down: '-00:00:01', expected_up: '-00:00:01' }, + { millis: 1500, expected_down: '00:00:02', expected_up: '00:00:01' }, + { millis: -1500, expected_down: '-00:00:01', expected_up: '-00:00:02' }, + { millis: 60000 - 1, expected_down: '00:01:00', expected_up: '00:00:59' }, + { millis: -(60000 - 1), expected_down: '-00:00:59', expected_up: '-00:01:00' }, + { millis: 60000, expected_down: '00:01:00', expected_up: '00:01:00' }, + { millis: -60000, expected_down: '-00:01:00', expected_up: '-00:01:00' }, + { millis: 600000, expected_down: '00:10:00', expected_up: '00:10:00' }, + { millis: -600000, expected_down: '-00:10:00', expected_up: '-00:10:00' }, + { millis: 3600000, expected_down: '01:00:00', expected_up: '01:00:00' }, + { millis: -3600000, expected_down: '-01:00:00', expected_up: '-01:00:00' }, + { millis: 36000000, expected_down: '10:00:00', expected_up: '10:00:00' }, + { millis: -36000000, expected_down: '-10:00:00', expected_up: '-10:00:00' }, + { millis: 86399000, expected_down: '23:59:59', expected_up: '23:59:59' }, + { millis: -86399000, expected_down: '-23:59:59', expected_up: '-23:59:59' }, + { millis: 86400000, expected_down: '24:00:00', expected_up: '24:00:00' }, + { millis: -86400000, expected_down: '-24:00:00', expected_up: '-24:00:00' }, + { millis: 86401000, expected_down: '24:00:01', expected_up: '24:00:01' }, + { millis: -86401000, expected_down: '-24:00:01', expected_up: '-24:00:01' }, ]; testScenarios.forEach((scenario) => { - expect(millisToString(scenario.millis)).toBe(scenario.expected); + expect(millisToString(scenario.millis, { direction: TimerType.CountDown })).toBe(scenario.expected_down); + expect(millisToString(scenario.millis, { direction: TimerType.CountUp })).toBe(scenario.expected_up); }); }); @@ -48,20 +51,21 @@ describe('millisToString()', () => { test('random properties', () => { const testScenarios = [ - { millis: 300, expected: '00:00:00' }, - { millis: 1000, expected: '00:00:01' }, - { millis: 1500, expected: '00:00:01' }, - { millis: 60000, expected: '00:01:00' }, - { millis: 600000, expected: '00:10:00' }, - { millis: 3600000, expected: '01:00:00' }, - { millis: 36000000, expected: '10:00:00' }, - { millis: 86399000, expected: '23:59:59' }, - { millis: 86400000, expected: '24:00:00' }, - { millis: 86401000, expected: '24:00:01' }, + { millis: 300, expected_down: '00:00:01', expected_up: '00:00:00' }, + { millis: 1000, expected_down: '00:00:01', expected_up: '00:00:01' }, + { millis: 1500, expected_down: '00:00:02', expected_up: '00:00:01' }, + { millis: 60000, expected_down: '00:01:00', expected_up: '00:01:00' }, + { millis: 600000, expected_down: '00:10:00', expected_up: '00:10:00' }, + { millis: 3600000, expected_down: '01:00:00', expected_up: '01:00:00' }, + { millis: 36000000, expected_down: '10:00:00', expected_up: '10:00:00' }, + { millis: 86399000, expected_down: '23:59:59', expected_up: '23:59:59' }, + { millis: 86400000, expected_down: '24:00:00', expected_up: '24:00:00' }, + { millis: 86401000, expected_down: '24:00:01', expected_up: '24:00:01' }, ]; testScenarios.forEach((scenario) => { - expect(millisToString(scenario.millis)).toBe(scenario.expected); + expect(millisToString(scenario.millis, { direction: TimerType.CountDown })).toBe(scenario.expected_down); + expect(millisToString(scenario.millis, { direction: TimerType.CountUp })).toBe(scenario.expected_up); }); }); }); diff --git a/packages/utils/src/date-utils/timeFormatting.ts b/packages/utils/src/date-utils/timeFormatting.ts index 01b3b3254..400cec36d 100644 --- a/packages/utils/src/date-utils/timeFormatting.ts +++ b/packages/utils/src/date-utils/timeFormatting.ts @@ -1,4 +1,4 @@ -import type { MaybeNumber } from 'ontime-types'; +import type { MaybeNumber, TimerType } from 'ontime-types'; import { millisToSeconds, secondsToHours, secondsToMinutes } from './conversionUtils.js'; @@ -8,6 +8,7 @@ export function pad(val: number): string { type FormatOptions = { fallback?: string; + direction?: TimerType.CountDown | TimerType.CountUp; }; /** @@ -23,7 +24,7 @@ export function millisToString(millis?: MaybeNumber, options?: FormatOptions): s const isNegative = millis < 0; - const totalSeconds = Math.abs(millisToSeconds(millis)); + const totalSeconds = Math.abs(millisToSeconds(millis, options?.direction)); const seconds = totalSeconds % 60; const minutes = secondsToMinutes(totalSeconds) % 60; const hours = secondsToHours(totalSeconds);