mirror of
				https://github.com/tc39/test262.git
				synced 2025-10-31 11:44:31 +01:00 
			
		
		
		
	Temporal operation NanosecondsToDays: Test RangeErrors reachable in Duration and ZonedDateTime.
This commit is contained in:
		
							parent
							
								
									920a567b72
								
							
						
					
					
						commit
						f00d4118db
					
				| @ -23,6 +23,7 @@ function formatPropertyName(propertyKey, objectName = "") { | ||||
|       return objectName ? `${objectName}.${propertyKey}` : propertyKey; | ||||
|   } | ||||
| } | ||||
| const SKIP_SYMBOL = Symbol("Skip"); | ||||
| 
 | ||||
| var TemporalHelpers = { | ||||
|   /* | ||||
| @ -1381,6 +1382,38 @@ var TemporalHelpers = { | ||||
|     }); | ||||
|   }, | ||||
| 
 | ||||
|   /* | ||||
|    * Used for substituteMethod to indicate default behavior instead of a | ||||
|    * substituted value | ||||
|    */ | ||||
|   SUBSTITUTE_SKIP: SKIP_SYMBOL, | ||||
| 
 | ||||
|   /* | ||||
|    * substituteMethod(object, propertyName, values): | ||||
|    * | ||||
|    * Defines an own property @object.@propertyName that will, for each | ||||
|    * subsequent call to the method previously defined as | ||||
|    * @object.@propertyName: | ||||
|    *  - Call the method, if no more values remain | ||||
|    *  - Call the method, if the value in @values for the corresponding call | ||||
|    *    is SUBSTITUTE_SKIP | ||||
|    *  - Otherwise, return the corresponding value in @value | ||||
|    */ | ||||
|   substituteMethod(object, propertyName, values) { | ||||
|     let calls = 0; | ||||
|     const method = object[propertyName]; | ||||
|     object[propertyName] = function () { | ||||
|       if (calls >= values.length) { | ||||
|         return method.apply(object, arguments); | ||||
|       } else if (values[calls] === SKIP_SYMBOL) { | ||||
|         calls++; | ||||
|         return method.apply(object, arguments); | ||||
|       } else { | ||||
|         return values[calls++]; | ||||
|       } | ||||
|     }; | ||||
|   }, | ||||
| 
 | ||||
|   /* | ||||
|    * calendarObserver: | ||||
|    * A custom calendar that behaves exactly like the ISO 8601 calendar but | ||||
|  | ||||
| @ -0,0 +1,119 @@ | ||||
| // Copyright (C) 2022 Igalia, S.L. All rights reserved.
 | ||||
| // This code is governed by the BSD license found in the LICENSE file.
 | ||||
| /*--- | ||||
| esid: sec-temporal.duration.prototype.add | ||||
| description: > | ||||
|   Called abstract operation NanosecondsToDays can throw three different RangeErrors when paired with a ZonedDateTime. | ||||
| info: | | ||||
|   6.5.7 NanosecondsToDays ( nanoseconds, relativeTo ) | ||||
|     19. If days < 0 and sign = 1, throw a RangeError exception. | ||||
|     20. If days > 0 and sign = -1, throw a RangeError exception. | ||||
|     ... | ||||
|     22. If nanoseconds > 0 and sign = -1, throw a RangeError exception. | ||||
| features: [Temporal, BigInt] | ||||
| includes: [temporalHelpers.js] | ||||
| ---*/ | ||||
| 
 | ||||
| const dayNs = 86_400_000_000_000; | ||||
| const dayDuration = Temporal.Duration.from({ days: 1 }); | ||||
| const epochInstant = new Temporal.Instant(0n); | ||||
| 
 | ||||
| function timeZoneSubstituteValues( | ||||
|   getPossibleInstantsFor, | ||||
|   getOffsetNanosecondsFor | ||||
| ) { | ||||
|   const tz = new Temporal.TimeZone("UTC"); | ||||
|   TemporalHelpers.substituteMethod( | ||||
|     tz, | ||||
|     "getPossibleInstantsFor", | ||||
|     getPossibleInstantsFor | ||||
|   ); | ||||
|   TemporalHelpers.substituteMethod( | ||||
|     tz, | ||||
|     "getOffsetNanosecondsFor", | ||||
|     getOffsetNanosecondsFor | ||||
|   ); | ||||
|   return tz; | ||||
| } | ||||
| 
 | ||||
| // NanosecondsToDays.19: days < 0 and sign = 1
 | ||||
| let zdt = new Temporal.ZonedDateTime( | ||||
|   -1n, // Set DifferenceZonedDateTime _ns1_
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [ | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, // Behave normally for first call, AddDuration step 9
 | ||||
|       [epochInstant], // Returned for AddDuration step 10, setting _endNs_ -> DifferenceZonedDateTime _ns2_
 | ||||
|       [epochInstant], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|     ], | ||||
|     [ | ||||
|       // Behave normally in 4 calls made prior to NanosecondsToDays
 | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   // Adding day to day sets largestUnit to 'day', avoids having any week/month/year components in differences
 | ||||
|   dayDuration.add(dayDuration, { | ||||
|     relativeTo: zdt, | ||||
|   }) | ||||
| ); | ||||
| 
 | ||||
| // NanosecondsToDays.20: days > 0 and sign = -1
 | ||||
| zdt = new Temporal.ZonedDateTime( | ||||
|   1n, // Set DifferenceZonedDateTime _ns1_
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [ | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, // Behave normally for first call, AddDuration step 9
 | ||||
|       [epochInstant], // Returned for AddDuration step 10, setting _endNs_ -> DifferenceZonedDateTime _ns2_
 | ||||
|       [epochInstant], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|     ], | ||||
|     [ | ||||
|       // Behave normally in 4 calls made prior to NanosecondsToDays
 | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   // Adding day to day sets largestUnit to 'day', avoids having any week/month/year components in differences
 | ||||
|   dayDuration.add(dayDuration, { | ||||
|     relativeTo: zdt, | ||||
|   }) | ||||
| ); | ||||
| 
 | ||||
| // NanosecondsToDays.22: nanoseconds > 0 and sign = -1
 | ||||
| zdt = new Temporal.ZonedDateTime( | ||||
|   0n, // Set DifferenceZonedDateTime _ns1_
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [ | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, // Behave normally for first call, AddDuration step 9
 | ||||
|       [new Temporal.Instant(-1n)], // Returned for AddDuration step 10, setting _endNs_ -> DifferenceZonedDateTime _ns2_
 | ||||
|       [new Temporal.Instant(-2n)], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|       [new Temporal.Instant(-4n)], // Returned for NanosecondsToDays step 18.a, setting _oneDayFartherNs_
 | ||||
|     ], | ||||
|     [ | ||||
|       // Behave normally in 4 calls made prior to NanosecondsToDays
 | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   // Adding day to day sets largestUnit to 'day', avoids having any week/month/year components in differences
 | ||||
|   dayDuration.add(dayDuration, { | ||||
|     relativeTo: zdt, | ||||
|   }) | ||||
| ); | ||||
| @ -0,0 +1,101 @@ | ||||
| // Copyright (C) 2022 Igalia, S.L. All rights reserved.
 | ||||
| // This code is governed by the BSD license found in the LICENSE file.
 | ||||
| /*--- | ||||
| esid: sec-temporal.duration.prototype.round | ||||
| description: > | ||||
|   Called abstract operation NanosecondsToDays can throw three different RangeErrors when paired with a ZonedDateTime. | ||||
| info: | | ||||
|   6.5.7 NanosecondsToDays ( nanoseconds, relativeTo ) | ||||
|     19. If days < 0 and sign = 1, throw a RangeError exception. | ||||
|     20. If days > 0 and sign = -1, throw a RangeError exception. | ||||
|     ... | ||||
|     22. If nanoseconds > 0 and sign = -1, throw a RangeError exception. | ||||
| features: [Temporal, BigInt] | ||||
| includes: [temporalHelpers.js] | ||||
| ---*/ | ||||
| 
 | ||||
| const oneNsDuration = Temporal.Duration.from({ nanoseconds: 1 }); | ||||
| const negOneNsDuration = Temporal.Duration.from({ nanoseconds: -1 }); | ||||
| const dayNs = 86_400_000_000_000; | ||||
| const epochInstant = new Temporal.Instant(0n); | ||||
| 
 | ||||
| function timeZoneSubstituteValues( | ||||
|   getPossibleInstantsFor, | ||||
|   getOffsetNanosecondsFor | ||||
| ) { | ||||
|   const tz = new Temporal.TimeZone("UTC"); | ||||
|   TemporalHelpers.substituteMethod( | ||||
|     tz, | ||||
|     "getPossibleInstantsFor", | ||||
|     getPossibleInstantsFor | ||||
|   ); | ||||
|   TemporalHelpers.substituteMethod( | ||||
|     tz, | ||||
|     "getOffsetNanosecondsFor", | ||||
|     getOffsetNanosecondsFor | ||||
|   ); | ||||
|   return tz; | ||||
| } | ||||
| 
 | ||||
| // NanosecondsToDays.19: days < 0 and sign = 1
 | ||||
| let zdt = new Temporal.ZonedDateTime( | ||||
|   0n, // Sets _startNs_ to 0
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [[epochInstant]], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|     [ | ||||
|       0, // Returned for RoundDuration step 6.c.i, setting _intermediate_ - making _startNs_ 0 in NanosecondsToDays
 | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   // Using 1ns duration sets _nanoseconds_ to 1 and _sign_ to 1
 | ||||
|   oneNsDuration.round({ | ||||
|     relativeTo: zdt, | ||||
|     smallestUnit: "days", | ||||
|   }) | ||||
| ); | ||||
| 
 | ||||
| // NanosecondsToDays.20: days > 0 and sign = -1
 | ||||
| zdt = new Temporal.ZonedDateTime( | ||||
|   0n, // Sets _startNs_ to 0
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [[epochInstant]], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|     [ | ||||
|       0, // Returned for RoundDuration step 6.c.i, setting _intermediate_ - making _startNs_ 0 in NanosecondsToDays
 | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   // Using -1ns duration sets _nanoseconds_ to -1 and _sign_ to -1
 | ||||
|   negOneNsDuration.round({ | ||||
|     relativeTo: zdt, | ||||
|     smallestUnit: "days", | ||||
|   }) | ||||
| ); | ||||
| 
 | ||||
| // NanosecondsToDays.22: nanoseconds > 0 and sign = -1
 | ||||
| zdt = new Temporal.ZonedDateTime( | ||||
|   0n, // Sets _startNs_ to 0
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [ | ||||
|       [new Temporal.Instant(-2n)], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|       [new Temporal.Instant(-4n)], // Returned for NanosecondsToDays step 18.a, setting _oneDayFartherNs_
 | ||||
|     ], | ||||
|     [ | ||||
|       0, // Returned for RoundDuration step 6.c.i, setting _intermediate_ - making _startNs_ 0 in NanosecondsToDays
 | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   // Using -1ns duration sets _nanoseocnds_ to -1 and _sign_ to -1
 | ||||
|   negOneNsDuration.round({ | ||||
|     relativeTo: zdt, | ||||
|     smallestUnit: "days", | ||||
|   }) | ||||
| ); | ||||
| @ -0,0 +1,119 @@ | ||||
| // Copyright (C) 2022 Igalia, S.L. All rights reserved.
 | ||||
| // This code is governed by the BSD license found in the LICENSE file.
 | ||||
| /*--- | ||||
| esid: sec-temporal.duration.prototype.subtract | ||||
| description: > | ||||
|   Called abstract operation NanosecondsToDays can throw three different RangeErrors when paired with a ZonedDateTime. | ||||
| info: | | ||||
|   6.5.7 NanosecondsToDays ( nanoseconds, relativeTo ) | ||||
|     19. If days < 0 and sign = 1, throw a RangeError exception. | ||||
|     20. If days > 0 and sign = -1, throw a RangeError exception. | ||||
|     ... | ||||
|     22. If nanoseconds > 0 and sign = -1, throw a RangeError exception. | ||||
| features: [Temporal, BigInt] | ||||
| includes: [temporalHelpers.js] | ||||
| ---*/ | ||||
| 
 | ||||
| const dayNs = 86_400_000_000_000; | ||||
| const dayDuration = Temporal.Duration.from({ days: 1 }); | ||||
| const epochInstant = new Temporal.Instant(0n); | ||||
| 
 | ||||
| function timeZoneSubstituteValues( | ||||
|   getPossibleInstantsFor, | ||||
|   getOffsetNanosecondsFor | ||||
| ) { | ||||
|   const tz = new Temporal.TimeZone("UTC"); | ||||
|   TemporalHelpers.substituteMethod( | ||||
|     tz, | ||||
|     "getPossibleInstantsFor", | ||||
|     getPossibleInstantsFor | ||||
|   ); | ||||
|   TemporalHelpers.substituteMethod( | ||||
|     tz, | ||||
|     "getOffsetNanosecondsFor", | ||||
|     getOffsetNanosecondsFor | ||||
|   ); | ||||
|   return tz; | ||||
| } | ||||
| 
 | ||||
| // NanosecondsToDays.19: days < 0 and sign = 1
 | ||||
| let zdt = new Temporal.ZonedDateTime( | ||||
|   -1n, // Set DifferenceZonedDateTime _ns1_
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [ | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, // Behave normally for first call, AddDuration step 9
 | ||||
|       [epochInstant], // Returned for AddDuration step 10, setting _endNs_ -> DifferenceZonedDateTime _ns2_
 | ||||
|       [epochInstant], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|     ], | ||||
|     [ | ||||
|       // Behave normally in 4 calls made prior to NanosecondsToDays
 | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   // Subtracting day from day sets largestUnit to 'day', avoids having any week/month/year components in difference
 | ||||
|   dayDuration.subtract(dayDuration, { | ||||
|     relativeTo: zdt, | ||||
|   }) | ||||
| ); | ||||
| 
 | ||||
| // NanosecondsToDays.20: days > 0 and sign = -1
 | ||||
| zdt = new Temporal.ZonedDateTime( | ||||
|   1n, // Set DifferenceZonedDateTime _ns1_
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [ | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, // Behave normally for first call, AddDuration step 9
 | ||||
|       [epochInstant], // Returned for AddDuration step 10, setting _endNs_ -> DifferenceZonedDateTime _ns2_
 | ||||
|       [epochInstant], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|     ], | ||||
|     [ | ||||
|       // Behave normally in 4 calls made prior to NanosecondsToDays
 | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   // Subtracting day from day sets largestUnit to 'day', avoids having any week/month/year components in difference
 | ||||
|   dayDuration.subtract(dayDuration, { | ||||
|     relativeTo: zdt, | ||||
|   }) | ||||
| ); | ||||
| 
 | ||||
| // NanosecondsToDays.22: nanoseconds > 0 and sign = -1
 | ||||
| zdt = new Temporal.ZonedDateTime( | ||||
|   0n, // Set DifferenceZonedDateTime _ns1_
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [ | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, // Behave normally for first call, AddDuration step 9
 | ||||
|       [new Temporal.Instant(-1n)], // Returned for AddDuration step 10, setting _endNs_ -> DifferenceZonedDateTime _ns2_
 | ||||
|       [new Temporal.Instant(-2n)], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|       [new Temporal.Instant(-4n)], // Returned for NanosecondsToDays step 18.a, setting _oneDayFartherNs_
 | ||||
|     ], | ||||
|     [ | ||||
|       // Behave normally in 4 calls made prior to NanosecondsToDays
 | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   // Subtracting day from day sets largestUnit to 'day', avoids having any week/month/year components in difference
 | ||||
|   dayDuration.subtract(dayDuration, { | ||||
|     relativeTo: zdt, | ||||
|   }) | ||||
| ); | ||||
| @ -0,0 +1,98 @@ | ||||
| // Copyright (C) 2022 Igalia, S.L. All rights reserved.
 | ||||
| // This code is governed by the BSD license found in the LICENSE file.
 | ||||
| /*--- | ||||
| esid: sec-temporal.duration.prototype.total | ||||
| description: > | ||||
|   Called abstract operation NanosecondsToDays can throw three different RangeErrors when paired with a ZonedDateTime. | ||||
| info: | | ||||
|   6.5.7 NanosecondsToDays ( nanoseconds, relativeTo ) | ||||
|     19. If days < 0 and sign = 1, throw a RangeError exception. | ||||
|     20. If days > 0 and sign = -1, throw a RangeError exception. | ||||
|     ... | ||||
|     22. If nanoseconds > 0 and sign = -1, throw a RangeError exception. | ||||
| features: [Temporal, BigInt] | ||||
| includes: [temporalHelpers.js] | ||||
| ---*/ | ||||
| 
 | ||||
| const oneNsDuration = Temporal.Duration.from({ nanoseconds: 1 }); | ||||
| const negOneNsDuration = Temporal.Duration.from({ nanoseconds: -1 }); | ||||
| const dayNs = 86_400_000_000_000; | ||||
| const epochInstant = new Temporal.Instant(0n); | ||||
| 
 | ||||
| function timeZoneSubstituteValues( | ||||
|   getPossibleInstantsFor, | ||||
|   getOffsetNanosecondsFor | ||||
| ) { | ||||
|   const tz = new Temporal.TimeZone("UTC"); | ||||
|   TemporalHelpers.substituteMethod( | ||||
|     tz, | ||||
|     "getPossibleInstantsFor", | ||||
|     getPossibleInstantsFor | ||||
|   ); | ||||
|   TemporalHelpers.substituteMethod( | ||||
|     tz, | ||||
|     "getOffsetNanosecondsFor", | ||||
|     getOffsetNanosecondsFor | ||||
|   ); | ||||
|   return tz; | ||||
| } | ||||
| 
 | ||||
| // NanosecondsToDays.19: days < 0 and sign = 1
 | ||||
| let zdt = new Temporal.ZonedDateTime( | ||||
|   0n, // Sets _startNs_ to 0
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [[epochInstant]], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|     [ | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   // Using 1ns duration _nanoseconds_ to 1 and _sign_ to 1
 | ||||
|   oneNsDuration.total({ | ||||
|     relativeTo: zdt, | ||||
|     unit: "day", | ||||
|   }) | ||||
| ); | ||||
| 
 | ||||
| // NanosecondsToDays.20: days > 0 and sign = -1
 | ||||
| zdt = new Temporal.ZonedDateTime( | ||||
|   0n, // Sets _startNs_ to 0
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [[epochInstant]], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|     [ | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   // Using -1ns duration sets _nanoseconds_ to -1 and _sign_ to -1
 | ||||
|   negOneNsDuration.total({ | ||||
|     relativeTo: zdt, | ||||
|     unit: "day", | ||||
|   }) | ||||
| ); | ||||
| 
 | ||||
| // NanosecondsToDays.22: nanoseconds > 0 and sign = -1
 | ||||
| zdt = new Temporal.ZonedDateTime( | ||||
|   0n, // Sets _startNs_ to 0
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [ | ||||
|       [new Temporal.Instant(-2n)], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|       [new Temporal.Instant(-4n)], // Returned for NanosecondsToDays step 18.a, setting _oneDayFartherNs_
 | ||||
|     ], | ||||
|     [ | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   // Using -1ns duration sets _nanoseconds_ to -1 and _sign_ to -1
 | ||||
|   negOneNsDuration.total({ | ||||
|     relativeTo: zdt, | ||||
|     unit: "day", | ||||
|   }) | ||||
| ); | ||||
							
								
								
									
										102
									
								
								test/built-ins/Temporal/ZonedDateTime/prototype/since/nanoseconds-to-days-range-errors.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								test/built-ins/Temporal/ZonedDateTime/prototype/since/nanoseconds-to-days-range-errors.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,102 @@ | ||||
| // Copyright (C) 2022 Igalia, S.L. All rights reserved.
 | ||||
| // This code is governed by the BSD license found in the LICENSE file.
 | ||||
| /*--- | ||||
| esid: sec-temporal.zoneddatetime.prototype.since | ||||
| description: > | ||||
|   Called abstract operation NanosecondsToDays can throw three different RangeErrors when paired with a ZonedDateTime. | ||||
| info: | | ||||
|   6.5.7 NanosecondsToDays ( nanoseconds, relativeTo ) | ||||
|     19. If days < 0 and sign = 1, throw a RangeError exception. | ||||
|     20. If days > 0 and sign = -1, throw a RangeError exception. | ||||
|     ... | ||||
|     22. If nanoseconds > 0 and sign = -1, throw a RangeError exception. | ||||
| features: [Temporal, BigInt] | ||||
| includes: [temporalHelpers.js] | ||||
| ---*/ | ||||
| 
 | ||||
| function timeZoneSubstituteValues( | ||||
|   getPossibleInstantsFor, | ||||
|   getOffsetNanosecondsFor | ||||
| ) { | ||||
|   const tz = new Temporal.TimeZone("UTC"); | ||||
|   TemporalHelpers.substituteMethod( | ||||
|     tz, | ||||
|     "getPossibleInstantsFor", | ||||
|     getPossibleInstantsFor | ||||
|   ); | ||||
|   TemporalHelpers.substituteMethod( | ||||
|     tz, | ||||
|     "getOffsetNanosecondsFor", | ||||
|     getOffsetNanosecondsFor | ||||
|   ); | ||||
|   return tz; | ||||
| } | ||||
| 
 | ||||
| const dayNs = 86_400_000_000_000; | ||||
| const zeroZDT = new Temporal.ZonedDateTime(0n, "UTC"); | ||||
| const oneZDT = new Temporal.ZonedDateTime(1n, "UTC"); | ||||
| const epochInstant = new Temporal.Instant(0n); | ||||
| const options = { largestUnit: "days" }; | ||||
| 
 | ||||
| // NanosecondsToDays.19: days < 0 and sign = 1
 | ||||
| let start = new Temporal.ZonedDateTime( | ||||
|   0n, // Sets DifferenceZonedDateTime _ns1_
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [[epochInstant]], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|     [ | ||||
|       // Behave normally in 2 calls made prior to NanosecondsToDays
 | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   start.since( | ||||
|     oneZDT, // Sets DifferenceZonedDateTime _ns2_
 | ||||
|     options | ||||
|   ) | ||||
| ); | ||||
| 
 | ||||
| // NanosecondsToDays.20: days > 0 and sign = -1
 | ||||
| start = new Temporal.ZonedDateTime( | ||||
|   1n, // Sets DifferenceZonedDateTime _ns1_
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [[epochInstant]], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|     [ | ||||
|       // Behave normally in 2 calls made prior to NanosecondsToDays
 | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   start.since( | ||||
|     zeroZDT, // Sets DifferenceZonedDateTime _ns2_
 | ||||
|     options | ||||
|   ) | ||||
| ); | ||||
| 
 | ||||
| // NanosecondsToDays.22: nanoseconds > 0 and sign = -1
 | ||||
| start = new Temporal.ZonedDateTime( | ||||
|   1n, // Sets DifferenceZonedDateTime _ns1_
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [[new Temporal.Instant(-1n)]], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|     [ | ||||
|       // Behave normally in 2 calls made prior to NanosecondsToDays
 | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   start.since( | ||||
|     zeroZDT, // Sets DifferenceZonedDateTime _ns2_
 | ||||
|     options | ||||
|   ) | ||||
| ); | ||||
							
								
								
									
										102
									
								
								test/built-ins/Temporal/ZonedDateTime/prototype/until/nanoseconds-to-days-range-errors.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								test/built-ins/Temporal/ZonedDateTime/prototype/until/nanoseconds-to-days-range-errors.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,102 @@ | ||||
| // Copyright (C) 2022 Igalia, S.L. All rights reserved.
 | ||||
| // This code is governed by the BSD license found in the LICENSE file.
 | ||||
| /*--- | ||||
| esid: sec-temporal.zoneddatetime.prototype.until | ||||
| description: > | ||||
|   Called abstract operation NanosecondsToDays can throw three different RangeErrors when paired with a ZonedDateTime. | ||||
| info: | | ||||
|   6.5.7 NanosecondsToDays ( nanoseconds, relativeTo ) | ||||
|     19. If days < 0 and sign = 1, throw a RangeError exception. | ||||
|     20. If days > 0 and sign = -1, throw a RangeError exception. | ||||
|     ... | ||||
|     22. If nanoseconds > 0 and sign = -1, throw a RangeError exception. | ||||
| features: [Temporal, BigInt] | ||||
| includes: [temporalHelpers.js] | ||||
| ---*/ | ||||
| 
 | ||||
| function timeZoneSubstituteValues( | ||||
|   getPossibleInstantsFor, | ||||
|   getOffsetNanosecondsFor | ||||
| ) { | ||||
|   const tz = new Temporal.TimeZone("UTC"); | ||||
|   TemporalHelpers.substituteMethod( | ||||
|     tz, | ||||
|     "getPossibleInstantsFor", | ||||
|     getPossibleInstantsFor | ||||
|   ); | ||||
|   TemporalHelpers.substituteMethod( | ||||
|     tz, | ||||
|     "getOffsetNanosecondsFor", | ||||
|     getOffsetNanosecondsFor | ||||
|   ); | ||||
|   return tz; | ||||
| } | ||||
| 
 | ||||
| const dayNs = 86_400_000_000_000; | ||||
| const zeroZDT = new Temporal.ZonedDateTime(0n, "UTC"); | ||||
| const oneZDT = new Temporal.ZonedDateTime(1n, "UTC"); | ||||
| const epochInstant = new Temporal.Instant(0n); | ||||
| const options = { largestUnit: "days" }; | ||||
| 
 | ||||
| // NanosecondsToDays.19: days < 0 and sign = 1
 | ||||
| let start = new Temporal.ZonedDateTime( | ||||
|   0n, // Sets DifferenceZonedDateTime _ns1_
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [[epochInstant]], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|     [ | ||||
|       // Behave normally in 2 calls made prior to NanosecondsToDays
 | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   start.until( | ||||
|     oneZDT, // Sets DifferenceZonedDateTime _ns2_
 | ||||
|     options | ||||
|   ) | ||||
| ); | ||||
| 
 | ||||
| // NanosecondsToDays.20: days > 0 and sign = -1
 | ||||
| start = new Temporal.ZonedDateTime( | ||||
|   1n, // Sets DifferenceZonedDateTime _ns1_
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [[epochInstant]], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|     [ | ||||
|       // Behave normally in 2 calls made prior to NanosecondsToDays
 | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   start.until( | ||||
|     zeroZDT, // Sets DifferenceZonedDateTime _ns2_
 | ||||
|     options | ||||
|   ) | ||||
| ); | ||||
| 
 | ||||
| // NanosecondsToDays.22: nanoseconds > 0 and sign = -1
 | ||||
| start = new Temporal.ZonedDateTime( | ||||
|   1n, // Sets DifferenceZonedDateTime _ns1_
 | ||||
|   timeZoneSubstituteValues( | ||||
|     [[new Temporal.Instant(-1n)]], // Returned for NanosecondsToDays step 14, setting _intermediateNs_
 | ||||
|     [ | ||||
|       // Behave normally in 2 calls made prior to NanosecondsToDays
 | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       TemporalHelpers.SUBSTITUTE_SKIP, | ||||
|       dayNs - 1, // Returned for NanosecondsToDays step 7, setting _startDateTime_
 | ||||
|       -dayNs + 1, // Returned for NanosecondsToDays step 11, setting _endDateTime_
 | ||||
|     ] | ||||
|   ) | ||||
| ); | ||||
| assert.throws(RangeError, () => | ||||
|   start.until( | ||||
|     zeroZDT, // Sets DifferenceZonedDateTime _ns2_
 | ||||
|     options | ||||
|   ) | ||||
| ); | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user