import {Duration, PlainDate} from '@/'; import {describe, it, assert} from 'vitest'; describe('Duration', () => { describe('Duration#round', () => { it('rounds duration (hour)', function () { let duration = Duration.from({ minutes: 46, }); assert.equal( duration .round({ roundingIncrement: 5, smallestUnit: 'minute', roundingMode: 'ceil', }) .toJSON(), 'PT50M', ); assert.equal(duration.round('hour').toJSON(), 'PT1H'); }); it('rounds with plain date reference', () => { let relativeTo = new PlainDate(2024, 3, 5); let duration = Duration.from({ days: 46, }); let rounded = duration.round({largestUnit: 'month', relativeTo}); assert.equal(rounded.toJSON(), 'P1M15D'); }); it('rounds with plain date reference (feb)', () => { let relativeTo = new PlainDate(2024, 2, 5); let duration = Duration.from({ days: 46, }); let rounded = duration.round({largestUnit: 'month', relativeTo}); assert.equal(rounded.toJSON(), 'P1M17D'); }); describe('smallest unit', () => { it('rounds time duration', function () { let duration = Duration.from({ days: 64, hours: 8, minutes: 32, seconds: 16, milliseconds: 128, }); assert.equal(duration.round({smallestUnit: 'second', roundingMode: 'trunc'}).toJSON(), 'P64DT8H32M16S'); assert.equal(duration.round({smallestUnit: 'minute', roundingMode: 'trunc'}).toJSON(), 'P64DT8H32M'); assert.equal(duration.round({smallestUnit: 'hour', roundingMode: 'trunc'}).toJSON(), 'P64DT8H'); assert.equal(duration.round({smallestUnit: 'day', roundingMode: 'trunc'}).toJSON(), 'P64D'); }); it('rounds date units', function () { let relativeTo = new PlainDate(2024, 3, 15); let duration = Duration.from({ days: 64, hours: 8, minutes: 32, seconds: 16, milliseconds: 128, }); assert.equal(duration.round({smallestUnit: 'month', roundingMode: 'trunc', relativeTo}).toJSON(), 'P2M'); assert.equal(duration.round({smallestUnit: 'month', roundingMode: 'ceil', relativeTo}).toJSON(), 'P3M'); assert.equal(duration.round({smallestUnit: 'day', roundingMode: 'trunc'}).toJSON(), 'P64D'); assert.equal(duration.round({smallestUnit: 'day', roundingMode: 'ceil'}).toJSON(), 'P65D'); }); }); }); });