import {Duration} from '@/'; import {PlainDateTime} from '@/plain-date-time.js'; import {describe, it, assert} from 'vitest'; type PlainTypeDeltaParameters = Parameters[1]; let a = new PlainDateTime(2017, 10, 5, 8, 7, 14); let b = new PlainDateTime(2021, 3, 5, 3, 32, 45); let c = new PlainDateTime(2021, 3, 5, 9, 32, 45); let simpleA = new PlainDateTime(2017, 10, 5, 8, 7, 14); let simpleB = new PlainDateTime(2017, 12, 3, 8, 7, 14); let earlier = new PlainDateTime(2019, 1, 8, 8, 22, 36, 123); let later = new PlainDateTime(2021, 9, 7, 12, 39, 40, 987); let roundingModeEarlier = new PlainDateTime(2019, 1, 8, 8, 22, 36, 123); let roundingModeLater = new PlainDateTime(2021, 9, 7, 12, 39, 40, 987); let testCases: [PlainDateTime, PlainDateTime, PlainTypeDeltaParameters, Duration][] = [ [simpleA, simpleB, {largestUnit: 'month'}, new Duration(0, 1, 0, 28, 0, 0, 0, 0)], [a, b, {largestUnit: 'month'}, new Duration(0, 40, 0, 27, 19, 25, 31, 0)], [b, a, {largestUnit: 'month'}, new Duration(0, -40, 0, -30, -19, -25, -31, 0)], [c, a, {largestUnit: 'month'}, new Duration(0, -41, 0, 0, -1, -25, -31, 0)], [ earlier, later, {smallestUnit: 'hour', roundingIncrement: 3, roundingMode: 'halfExpand'}, new Duration(0, 0, 0, 973, 3, 0, 0, 0), ], [ earlier, later, {smallestUnit: 'minute', roundingIncrement: 30, roundingMode: 'halfExpand'}, new Duration(0, 0, 0, 973, 4, 30, 0, 0), ], [ earlier, later, {smallestUnit: 'second', roundingIncrement: 15, roundingMode: 'halfExpand'}, new Duration(0, 0, 0, 973, 4, 17, 0, 0), ], [ earlier, later, {smallestUnit: 'millisecond', roundingIncrement: 10, roundingMode: 'halfExpand'}, new Duration(0, 0, 0, 973, 4, 17, 4, 860), ], [roundingModeEarlier, roundingModeLater, {smallestUnit: 'year', roundingMode: 'halfCeil'}, new Duration(3)], [roundingModeEarlier, roundingModeLater, {smallestUnit: 'month', roundingMode: 'halfCeil'}, new Duration(0, 32)], // [roundingModeEarlier, roundingModeLater, {smallestUnit: 'week', roundingMode: 'halfCeil'}, new Duration(0, 0, 139)], [roundingModeEarlier, roundingModeLater, {smallestUnit: 'day', roundingMode: 'halfCeil'}, new Duration(0, 0, 0, 973)], [ roundingModeEarlier, roundingModeLater, {smallestUnit: 'hour', roundingMode: 'halfCeil'}, new Duration(0, 0, 0, 973, 4), ], [ roundingModeEarlier, roundingModeLater, {smallestUnit: 'minute', roundingMode: 'halfCeil'}, new Duration(0, 0, 0, 973, 4, 17), ], [ roundingModeEarlier, roundingModeLater, {smallestUnit: 'second', roundingMode: 'halfCeil'}, new Duration(0, 0, 0, 973, 4, 17, 5), ], [ roundingModeEarlier, roundingModeLater, {smallestUnit: 'millisecond', roundingMode: 'halfCeil'}, new Duration(0, 0, 0, 973, 4, 17, 4, 864), ], [ PlainDateTime.from('2023-02-28T03:00:00'), PlainDateTime.from('2023-04-01T02:00:00'), {largestUnit: 'year'}, new Duration(0, 1, 0, 0, 23), ], ]; describe('PlainDateTime', () => { describe('PlainTime#until', () => { it.each(testCases)('%j until(%j, %j) -> %j', (one, two, options, expected) => { let result = one.until(two, options); assert.equal(result.toJSON(), expected.toJSON()); }); }); });