From be9faf702326bdc127874719532f4b534480f425 Mon Sep 17 00:00:00 2001 From: Frank Tang Date: Tue, 20 Jul 2021 23:44:45 -0700 Subject: [PATCH] Add tests for Temporal.Instant.p*.subtract (Philip, March 2022: I rebased Frank's original PR #3076, did some reformatting, removed duplicate tests, and combined with some existing tests.) --- .../Instant/prototype/subtract/basic.js | 72 +++++++++++++++++++ .../subtract/disallowed-duration-units.js | 31 ++++++++ .../prototype/subtract/result-out-of-range.js | 20 +++++- 3 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 test/built-ins/Temporal/Instant/prototype/subtract/basic.js create mode 100644 test/built-ins/Temporal/Instant/prototype/subtract/disallowed-duration-units.js diff --git a/test/built-ins/Temporal/Instant/prototype/subtract/basic.js b/test/built-ins/Temporal/Instant/prototype/subtract/basic.js new file mode 100644 index 00000000000..d910b0f3390 --- /dev/null +++ b/test/built-ins/Temporal/Instant/prototype/subtract/basic.js @@ -0,0 +1,72 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.instant.prototype.subtract +description: Basic functionality of Temporal.Instant.prototype.subtract() +info: | + 1. Let instant be the this value. + 2. Perform ? RequireInternalSlot(instant, [[InitializedTemporalInstant]]). + 3. Let duration be ? ToLimitedTemporalDuration(temporalDurationLike, « "years", "months", "weeks", "days" »). + 4. Let ns be ? AddInstant(instant.[[EpochNanoseconds]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]]). + 5. Return ! CreateTemporalInstant(ns). +features: [Temporal] +---*/ + +const i1 = new Temporal.Instant(50000n); + +let result = i1.subtract(new Temporal.Duration(0,0,0,0,0,0,0,3,2,1)); +assert.sameValue( + -2952001n, + result.epochNanoseconds, + "subtract positive sub-seconds" +); + +result = i1.subtract(new Temporal.Duration(0,0,0,0,0,0,4,3,2,1)); +assert.sameValue( + BigInt(-4 * 1e9) - 2952001n, + result.epochNanoseconds, + "subtract positive seconds" +); + +result = i1.subtract(new Temporal.Duration(0,0,0,0,0,5,4,3,2,1)); +assert.sameValue( + BigInt(5 * 60 + 4) * -1000000000n - 2952001n, + result.epochNanoseconds, + "subtract positive minutes" +); + +result = i1.subtract(new Temporal.Duration(0,0,0,0,6,5,4,3,2,1)); +assert.sameValue( + BigInt(6 * 3600 + 5 * 60 + 4) * -1000000000n - 2952001n, + result.epochNanoseconds, + "subtract positive hours" +); + +result = i1.subtract(new Temporal.Duration(0,0,0,0,0,0,0,-3,-2,-1)); +assert.sameValue( + 3052001n, + result.epochNanoseconds, + "subtract negative sub-seconds" +); + +result = i1.subtract(new Temporal.Duration(0,0,0,0,0,0,-4,-3,-2,-1)); +assert.sameValue( + BigInt(4 * 1e9) + 3052001n, + result.epochNanoseconds, + "subtract negative seconds" +); + +result = i1.subtract(new Temporal.Duration(0,0,0,0,0,-5,-4,-3,-2,-1)); +assert.sameValue( + BigInt(5 * 60 + 4) * 1000000000n + 3052001n, + result.epochNanoseconds, + "subtract negative minutes" +); + +result = i1.subtract(new Temporal.Duration(0,0,0,0,-6,-5,-4,-3,-2,-1)); +assert.sameValue( + BigInt(6 * 3600 + 5 * 60 + 4) * 1000000000n + 3052001n, + result.epochNanoseconds, + "subtract negative hours" +); diff --git a/test/built-ins/Temporal/Instant/prototype/subtract/disallowed-duration-units.js b/test/built-ins/Temporal/Instant/prototype/subtract/disallowed-duration-units.js new file mode 100644 index 00000000000..9a8cf9ae0e7 --- /dev/null +++ b/test/built-ins/Temporal/Instant/prototype/subtract/disallowed-duration-units.js @@ -0,0 +1,31 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.instant.prototype.subtract +description: | + Temporal.Instant.prototype.subtract() throws RangeError when the duration has + non-zero years, months, weeks or days. +info: | + 1. Let instant be the this value. + 3. Let duration be ? ToLimitedTemporalDuration(temporalDurationLike, « "years", "months", "weeks", "days" »). +features: [Temporal] +---*/ + +let i1 = new Temporal.Instant(500000n); +assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(1)), + "should throw RangeError when the duration has non-zero years (positive)"); +assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(0, 2)), + "should throw RangeError when the duration has non-zero months (positive)"); +assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(0, 0, 3)), + "should throw RangeError when the duration has non-zero weeks (positive)"); +assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(0, 0, 0, 4)), + "should throw RangeError when the duration has non-zero days (positive)"); +assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(-1)), + "should throw RangeError when the duration has non-zero years (negative)"); +assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(0, -2)), + "should throw RangeError when the duration has non-zero months (negative)"); +assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(0, 0, -3)), + "should throw RangeError when the duration has non-zero weeks (negative)"); +assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(0, 0, 0, -4)), + "should throw RangeError when the duration has non-zero days (negative)"); diff --git a/test/built-ins/Temporal/Instant/prototype/subtract/result-out-of-range.js b/test/built-ins/Temporal/Instant/prototype/subtract/result-out-of-range.js index 83804b758c4..82702dea68d 100644 --- a/test/built-ins/Temporal/Instant/prototype/subtract/result-out-of-range.js +++ b/test/built-ins/Temporal/Instant/prototype/subtract/result-out-of-range.js @@ -2,15 +2,29 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-temporal.instant.prototype.add +esid: sec-temporal.instant.prototype.subtract description: RangeError thrown if result is outside representable range features: [Temporal] ---*/ const fields = ["hours", "minutes", "seconds", "milliseconds", "microseconds", "nanoseconds"]; -const instance = Temporal.Instant.fromEpochNanoseconds(-8640000_000_000_000_000_000n); +const earliest = Temporal.Instant.fromEpochNanoseconds(-8640000_000_000_000_000_000n); fields.forEach((field) => { - assert.throws(RangeError, () => instance.subtract({ [field]: 1 })); + assert.throws( + RangeError, + () => earliest.subtract({ [field]: 1 }), + `subtracting ${field} with result out of range (negative)` + ); +}); + +const latest = Temporal.Instant.fromEpochNanoseconds(8640000_000_000_000_000_000n); + +fields.forEach((field) => { + assert.throws( + RangeError, + () => latest.subtract({ [field]: -1 }), + `subtracting ${field} with result out of range (positive)` + ); });