import {Duration, PlainTime} from '@/'; import {describe, it, assert} from 'vitest'; let one = new PlainTime(15, 23, 30, 123); let two = new PlainTime(16, 23, 30, 123); let three = new PlainTime(17, 0, 30, 123); let time = new PlainTime(1, 1, 1, 1); let expected = [ // Basic [one, two, 'PT1H'], [two, one, '-PT1H'], [one, three, 'PT1H37M'], [three, one, '-PT1H37M'], [new PlainTime(0, 0, 0, 2), time, 'PT1H1M0.999S'], [new PlainTime(0, 0, 2), time, 'PT1H59.001S'], [new PlainTime(0, 2), time, 'PT59M1.001S'], [new PlainTime(2), time, '-PT58M58.999S'], // negative time ] as [PlainTime, PlainTime, string][]; let fourFortyEight = new PlainTime(4, 48, 55); let elevenFiftyNine = new PlainTime(11, 59, 58); let largestUnit = [ [fourFortyEight, elevenFiftyNine, 'auto', new Duration(0, 0, 0, 0, 7, 11, 3, 0)], [fourFortyEight, elevenFiftyNine, 'hour', new Duration(0, 0, 0, 0, 7, 11, 3, 0)], [fourFortyEight, elevenFiftyNine, 'minute', new Duration(0, 0, 0, 0, 0, 431, 3, 0)], [fourFortyEight, elevenFiftyNine, 'second', new Duration(0, 0, 0, 0, 0, 0, 25863, 0)], ] as [PlainTime, PlainTime, 'auto' | 'hour' | 'minute' | 'second', Duration][]; let roundingIncrements: [{smallestUnit: 'minute'; roundingIncrement: number}, Duration][] = [ [{smallestUnit: 'minute', roundingIncrement: 1}, new Duration(0, 0, 0, 0, 10, 35, 0, 0)], [{smallestUnit: 'minute', roundingIncrement: 2}, new Duration(0, 0, 0, 0, 10, 34, 0, 0)], [{smallestUnit: 'minute', roundingIncrement: 3}, new Duration(0, 0, 0, 0, 10, 33, 0, 0)], [{smallestUnit: 'minute', roundingIncrement: 4}, new Duration(0, 0, 0, 0, 10, 32, 0, 0)], [{smallestUnit: 'minute', roundingIncrement: 5}, new Duration(0, 0, 0, 0, 10, 35, 0, 0)], [{smallestUnit: 'minute', roundingIncrement: 6}, new Duration(0, 0, 0, 0, 10, 30, 0, 0)], [{smallestUnit: 'minute', roundingIncrement: 10}, new Duration(0, 0, 0, 0, 10, 30, 0, 0)], [{smallestUnit: 'minute', roundingIncrement: 12}, new Duration(0, 0, 0, 0, 10, 24, 0, 0)], [{smallestUnit: 'minute', roundingIncrement: 15}, new Duration(0, 0, 0, 0, 10, 30, 0, 0)], [{smallestUnit: 'minute', roundingIncrement: 20}, new Duration(0, 0, 0, 0, 10, 20, 0, 0)], [{smallestUnit: 'minute', roundingIncrement: 30}, new Duration(0, 0, 0, 0, 10, 30, 0, 0)], ]; describe('PlainTime', () => { describe('PlainTime#until', () => { it.each(expected)('diffs($0, $1) -> $2', (one, two, expected) => { let value = one.until(two); assert.deepEqual(value.toJSON(), expected); }); describe('largestUnit', () => { it.each(largestUnit)('largestUnit($0, $1) -> $2', (one, two, largestUnit, expected) => { let value = one.until(two, {largestUnit}); assert.deepEqual(value.toJSON(), expected.toJSON()); }); }); describe('rounding increment', () => { it.each(roundingIncrements)('ronding increment', (options, expected) => { let earlier = new PlainTime(3, 12, 34, 123); let later = new PlainTime(13, 47, 57, 988); let duration = earlier.until(later, options); assert.equal(duration.toJSON(), expected.toJSON()); }); }); it('round-cross-unit-boundary', () => { let earlier = new PlainTime(); let later = new PlainTime(1, 59, 59); let duration = earlier.until(later, {largestUnit: 'hour', smallestUnit: 'minute', roundingMode: 'expand'}); assert.equal(duration.toJSON(), 'PT2H'); }); }); });