From 92b592547d1d2cbe9c5e91ff4d3e80175dfd3bc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bargull?= Date: Thu, 10 Oct 2024 18:06:32 +0200 Subject: [PATCH] Ensure NaN time values are correctly handled in various Date setters Related PR: https://github.com/tc39/ecma262/pull/2136 --- ...ad-before-tonumber-when-date-is-invalid.js | 39 ++++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 39 ++++++++++++++++ ...ad-before-tonumber-when-date-is-invalid.js | 36 +++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 39 ++++++++++++++++ ...ad-before-tonumber-when-date-is-invalid.js | 38 ++++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 38 ++++++++++++++++ ...ad-before-tonumber-when-date-is-invalid.js | 39 ++++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 42 ++++++++++++++++++ ...ad-before-tonumber-when-date-is-invalid.js | 36 +++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 39 ++++++++++++++++ ...ad-before-tonumber-when-date-is-invalid.js | 38 ++++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 41 +++++++++++++++++ ...ad-before-tonumber-when-date-is-invalid.js | 37 ++++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 44 +++++++++++++++++++ ...ad-before-tonumber-when-date-is-invalid.js | 37 ++++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 40 +++++++++++++++++ ...ad-before-tonumber-when-date-is-invalid.js | 36 +++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 39 ++++++++++++++++ ...ad-before-tonumber-when-date-is-invalid.js | 38 ++++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 38 ++++++++++++++++ ...ad-before-tonumber-when-date-is-invalid.js | 39 ++++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 42 ++++++++++++++++++ ...ad-before-tonumber-when-date-is-invalid.js | 36 +++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 39 ++++++++++++++++ ...ad-before-tonumber-when-date-is-invalid.js | 38 ++++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 41 +++++++++++++++++ ...ad-before-tonumber-when-date-is-invalid.js | 37 ++++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 40 +++++++++++++++++ ...ad-before-tonumber-when-date-is-invalid.js | 37 ++++++++++++++++ ...read-before-tonumber-when-date-is-valid.js | 40 +++++++++++++++++ 30 files changed, 1162 insertions(+) create mode 100644 test/annexB/built-ins/Date/prototype/setYear/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/annexB/built-ins/Date/prototype/setYear/date-value-read-before-tonumber-when-date-is-valid.js create mode 100644 test/built-ins/Date/prototype/setDate/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/built-ins/Date/prototype/setDate/date-value-read-before-tonumber-when-date-is-valid.js create mode 100644 test/built-ins/Date/prototype/setFullYear/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/built-ins/Date/prototype/setFullYear/date-value-read-before-tonumber-when-date-is-valid.js create mode 100644 test/built-ins/Date/prototype/setHours/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/built-ins/Date/prototype/setHours/date-value-read-before-tonumber-when-date-is-valid.js create mode 100644 test/built-ins/Date/prototype/setMilliseconds/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/built-ins/Date/prototype/setMilliseconds/date-value-read-before-tonumber-when-date-is-valid.js create mode 100644 test/built-ins/Date/prototype/setMinutes/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/built-ins/Date/prototype/setMinutes/date-value-read-before-tonumber-when-date-is-valid.js create mode 100644 test/built-ins/Date/prototype/setMonth/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/built-ins/Date/prototype/setMonth/date-value-read-before-tonumber-when-date-is-valid.js create mode 100644 test/built-ins/Date/prototype/setSeconds/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/built-ins/Date/prototype/setSeconds/date-value-read-before-tonumber-when-date-is-valid.js create mode 100644 test/built-ins/Date/prototype/setUTCDate/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/built-ins/Date/prototype/setUTCDate/date-value-read-before-tonumber-when-date-is-valid.js create mode 100644 test/built-ins/Date/prototype/setUTCFullYear/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/built-ins/Date/prototype/setUTCFullYear/date-value-read-before-tonumber-when-date-is-valid.js create mode 100644 test/built-ins/Date/prototype/setUTCHours/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/built-ins/Date/prototype/setUTCHours/date-value-read-before-tonumber-when-date-is-valid.js create mode 100644 test/built-ins/Date/prototype/setUTCMilliseconds/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/built-ins/Date/prototype/setUTCMilliseconds/date-value-read-before-tonumber-when-date-is-valid.js create mode 100644 test/built-ins/Date/prototype/setUTCMinutes/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/built-ins/Date/prototype/setUTCMinutes/date-value-read-before-tonumber-when-date-is-valid.js create mode 100644 test/built-ins/Date/prototype/setUTCMonth/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/built-ins/Date/prototype/setUTCMonth/date-value-read-before-tonumber-when-date-is-valid.js create mode 100644 test/built-ins/Date/prototype/setUTCSeconds/date-value-read-before-tonumber-when-date-is-invalid.js create mode 100644 test/built-ins/Date/prototype/setUTCSeconds/date-value-read-before-tonumber-when-date-is-valid.js diff --git a/test/annexB/built-ins/Date/prototype/setYear/date-value-read-before-tonumber-when-date-is-invalid.js b/test/annexB/built-ins/Date/prototype/setYear/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..0913a52e08 --- /dev/null +++ b/test/annexB/built-ins/Date/prototype/setYear/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setyear +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setYear ( year ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let y be ? ToNumber(year). + 5. If t is NaN, set t to +0𝔽; otherwise, set t to LocalTime(t). + 6. Let yyyy be MakeFullYear(y). + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setYear(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getYear(), 1, "date value correctly updated"); diff --git a/test/annexB/built-ins/Date/prototype/setYear/date-value-read-before-tonumber-when-date-is-valid.js b/test/annexB/built-ins/Date/prototype/setYear/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..074ce76101 --- /dev/null +++ b/test/annexB/built-ins/Date/prototype/setYear/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setyear +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setYear ( year ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let y be ? ToNumber(year). + 5. If t is NaN, set t to +0𝔽; otherwise, set t to LocalTime(t). + 6. Let yyyy be MakeFullYear(y). + ... +---*/ + +var dt = new Date(0); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setYear(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getYear(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setDate/date-value-read-before-tonumber-when-date-is-invalid.js b/test/built-ins/Date/prototype/setDate/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..c971f11ceb --- /dev/null +++ b/test/built-ins/Date/prototype/setDate/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setdate +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setDate ( date ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let dt be ? ToNumber(date). + 5. If t is NaN, return NaN. + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setDate(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.sameValue(result, NaN, "result is NaN"); + +assert.sameValue(dt.getTime(), 0, "time updated in valueOf"); diff --git a/test/built-ins/Date/prototype/setDate/date-value-read-before-tonumber-when-date-is-valid.js b/test/built-ins/Date/prototype/setDate/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..c338830c89 --- /dev/null +++ b/test/built-ins/Date/prototype/setDate/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setdate +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setDate ( date ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let dt be ? ToNumber(date). + 5. If t is NaN, return NaN. + 6. Set t to LocalTime(t). + ... +---*/ + +var dt = new Date(0); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setDate(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getDate(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setFullYear/date-value-read-before-tonumber-when-date-is-invalid.js b/test/built-ins/Date/prototype/setFullYear/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..283355886d --- /dev/null +++ b/test/built-ins/Date/prototype/setFullYear/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setfullyear +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setFullYear ( year [ , month [ , date ] ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let y be ? ToNumber(year). + 5. If t is NaN, set t to +0𝔽; otherwise, set t to LocalTime(t). + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setFullYear(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getFullYear(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setFullYear/date-value-read-before-tonumber-when-date-is-valid.js b/test/built-ins/Date/prototype/setFullYear/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..d5ae984387 --- /dev/null +++ b/test/built-ins/Date/prototype/setFullYear/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setfullyear +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setFullYear ( year [ , month [ , date ] ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let y be ? ToNumber(year). + 5. If t is NaN, set t to +0𝔽; otherwise, set t to LocalTime(t). + ... +---*/ + +var dt = new Date(0); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setFullYear(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getFullYear(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setHours/date-value-read-before-tonumber-when-date-is-invalid.js b/test/built-ins/Date/prototype/setHours/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..67e2c7f534 --- /dev/null +++ b/test/built-ins/Date/prototype/setHours/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.sethours +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setHours ( hour [ , min [ , sec [ , ms ] ] ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let h be ? ToNumber(hour). + 5. If min is present, let m be ? ToNumber(min). + 6. If sec is present, let s be ? ToNumber(sec). + 7. If ms is present, let milli be ? ToNumber(ms). + 8. If t is NaN, return NaN. + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setHours(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.sameValue(result, NaN, "result is NaN"); + +assert.sameValue(dt.getTime(), 0, "time updated in valueOf"); diff --git a/test/built-ins/Date/prototype/setHours/date-value-read-before-tonumber-when-date-is-valid.js b/test/built-ins/Date/prototype/setHours/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..0b9804145e --- /dev/null +++ b/test/built-ins/Date/prototype/setHours/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.sethours +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setHours ( hour [ , min [ , sec [ , ms ] ] ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let h be ? ToNumber(hour). + 5. If min is present, let m be ? ToNumber(min). + 6. If sec is present, let s be ? ToNumber(sec). + 7. If ms is present, let milli be ? ToNumber(ms). + 8. If t is NaN, return NaN. + 9. Set t to LocalTime(t). + ... +---*/ + +var dt = new Date(0); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setHours(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getHours(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setMilliseconds/date-value-read-before-tonumber-when-date-is-invalid.js b/test/built-ins/Date/prototype/setMilliseconds/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..3e521c111a --- /dev/null +++ b/test/built-ins/Date/prototype/setMilliseconds/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setmilliseconds +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setMilliseconds ( ms ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Set ms to ? ToNumber(ms). + 5. If t is NaN, return NaN. + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setMilliseconds(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.sameValue(result, NaN, "result is NaN"); + +assert.sameValue(dt.getTime(), 0, "time updated in valueOf"); diff --git a/test/built-ins/Date/prototype/setMilliseconds/date-value-read-before-tonumber-when-date-is-valid.js b/test/built-ins/Date/prototype/setMilliseconds/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..29dc7d2624 --- /dev/null +++ b/test/built-ins/Date/prototype/setMilliseconds/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setmilliseconds +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setMilliseconds ( ms ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Set ms to ? ToNumber(ms). + 5. If t is NaN, return NaN. + 6. Set t to LocalTime(t). + ... +---*/ + +var dt = new Date(0); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setMilliseconds(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getMilliseconds(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setMinutes/date-value-read-before-tonumber-when-date-is-invalid.js b/test/built-ins/Date/prototype/setMinutes/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..cdb444d660 --- /dev/null +++ b/test/built-ins/Date/prototype/setMinutes/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setminutes +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setMinutes ( min [ , sec [ , ms ] ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let m be ? ToNumber(min). + 5. If sec is present, let s be ? ToNumber(sec). + 6. If ms is present, let milli be ? ToNumber(ms). + 7. If t is NaN, return NaN. + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setMinutes(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.sameValue(result, NaN, "result is NaN"); + +assert.sameValue(dt.getTime(), 0, "time updated in valueOf"); diff --git a/test/built-ins/Date/prototype/setMinutes/date-value-read-before-tonumber-when-date-is-valid.js b/test/built-ins/Date/prototype/setMinutes/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..11961d5048 --- /dev/null +++ b/test/built-ins/Date/prototype/setMinutes/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,41 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setminutes +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setMinutes ( min [ , sec [ , ms ] ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let m be ? ToNumber(min). + 5. If sec is present, let s be ? ToNumber(sec). + 6. If ms is present, let milli be ? ToNumber(ms). + 7. If t is NaN, return NaN. + 8. Set t to LocalTime(t). + ... +---*/ + +var dt = new Date(0); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setMinutes(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getMinutes(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setMonth/date-value-read-before-tonumber-when-date-is-invalid.js b/test/built-ins/Date/prototype/setMonth/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..e80b333d8c --- /dev/null +++ b/test/built-ins/Date/prototype/setMonth/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setmonth +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setMonth ( month [ , date ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let m be ? ToNumber(month). + 5. If date is present, let dt be ? ToNumber(date). + 6. If t is NaN, return NaN. + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setMonth(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.sameValue(result, NaN, "result is NaN"); + +assert.sameValue(dt.getTime(), 0, "time updated in valueOf"); diff --git a/test/built-ins/Date/prototype/setMonth/date-value-read-before-tonumber-when-date-is-valid.js b/test/built-ins/Date/prototype/setMonth/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..359caf5d5b --- /dev/null +++ b/test/built-ins/Date/prototype/setMonth/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,44 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setmonth +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setMonth ( month [ , date ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let m be ? ToNumber(month). + 5. If date is present, let dt be ? ToNumber(date). + 6. If t is NaN, return NaN. + 7. Set t to LocalTime(t). + ... +---*/ + +var dt = new Date(0); + +// Change date from "Jan 1 1970" to "Jan 2 1970" to ensure this test passes in +// all time zones. +dt.setDate(2); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setMonth(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getMonth(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setSeconds/date-value-read-before-tonumber-when-date-is-invalid.js b/test/built-ins/Date/prototype/setSeconds/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..8fc4c48551 --- /dev/null +++ b/test/built-ins/Date/prototype/setSeconds/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setseconds +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setSeconds ( sec [ , ms ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let s be ? ToNumber(sec). + 5. If ms is present, let milli be ? ToNumber(ms). + 6. If t is NaN, return NaN. + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setSeconds(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.sameValue(result, NaN, "result is NaN"); + +assert.sameValue(dt.getTime(), 0, "time updated in valueOf"); diff --git a/test/built-ins/Date/prototype/setSeconds/date-value-read-before-tonumber-when-date-is-valid.js b/test/built-ins/Date/prototype/setSeconds/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..6d53ac05ce --- /dev/null +++ b/test/built-ins/Date/prototype/setSeconds/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setseconds +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setSeconds ( sec [ , ms ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let s be ? ToNumber(sec). + 5. If ms is present, let milli be ? ToNumber(ms). + 6. If t is NaN, return NaN. + 7. Set t to LocalTime(t). + ... +---*/ + +var dt = new Date(0); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setSeconds(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getSeconds(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setUTCDate/date-value-read-before-tonumber-when-date-is-invalid.js b/test/built-ins/Date/prototype/setUTCDate/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..fa71468c9e --- /dev/null +++ b/test/built-ins/Date/prototype/setUTCDate/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setutcdate +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setUTCDate ( date ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let dt be ? ToNumber(date). + 5. If t is NaN, return NaN. + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setUTCDate(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.sameValue(result, NaN, "result is NaN"); + +assert.sameValue(dt.getTime(), 0, "time updated in valueOf"); diff --git a/test/built-ins/Date/prototype/setUTCDate/date-value-read-before-tonumber-when-date-is-valid.js b/test/built-ins/Date/prototype/setUTCDate/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..cf17a11ec4 --- /dev/null +++ b/test/built-ins/Date/prototype/setUTCDate/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setutcdate +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setUTCDate ( date ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let dt be ? ToNumber(date). + 5. If t is NaN, return NaN. + 6. Let newDate be MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t)). + ... +---*/ + +var dt = new Date(0); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setUTCDate(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getUTCDate(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setUTCFullYear/date-value-read-before-tonumber-when-date-is-invalid.js b/test/built-ins/Date/prototype/setUTCFullYear/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..cdc7168df2 --- /dev/null +++ b/test/built-ins/Date/prototype/setUTCFullYear/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setutcfullyear +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setUTCFullYear ( year [ , month [ , date ] ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. If t is NaN, set t to +0𝔽. + 5. Let y be ? ToNumber(year). + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setUTCFullYear(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getUTCFullYear(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setUTCFullYear/date-value-read-before-tonumber-when-date-is-valid.js b/test/built-ins/Date/prototype/setUTCFullYear/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..5300705776 --- /dev/null +++ b/test/built-ins/Date/prototype/setUTCFullYear/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setutcfullyear +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setUTCFullYear ( year [ , month [ , date ] ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. If t is NaN, set t to +0𝔽. + 5. Let y be ? ToNumber(year). + ... +---*/ + +var dt = new Date(0); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setUTCFullYear(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getUTCFullYear(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setUTCHours/date-value-read-before-tonumber-when-date-is-invalid.js b/test/built-ins/Date/prototype/setUTCHours/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..1fe9ff64ed --- /dev/null +++ b/test/built-ins/Date/prototype/setUTCHours/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setutchours +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setUTCHours ( hour [ , min [ , sec [ , ms ] ] ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let h be ? ToNumber(hour). + 5. If min is present, let m be ? ToNumber(min). + 6. If sec is present, let s be ? ToNumber(sec). + 7. If ms is present, let milli be ? ToNumber(ms). + 8. If t is NaN, return NaN. + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setUTCHours(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.sameValue(result, NaN, "result is NaN"); + +assert.sameValue(dt.getTime(), 0, "time updated in valueOf"); diff --git a/test/built-ins/Date/prototype/setUTCHours/date-value-read-before-tonumber-when-date-is-valid.js b/test/built-ins/Date/prototype/setUTCHours/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..722c203141 --- /dev/null +++ b/test/built-ins/Date/prototype/setUTCHours/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,42 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setutchours +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setUTCHours ( hour [ , min [ , sec [ , ms ] ] ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let h be ? ToNumber(hour). + 5. If min is present, let m be ? ToNumber(min). + 6. If sec is present, let s be ? ToNumber(sec). + 7. If ms is present, let milli be ? ToNumber(ms). + 8. If t is NaN, return NaN. + 9. If min is not present, let m be MinFromTime(t). + ... +---*/ + +var dt = new Date(0); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setUTCHours(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getUTCHours(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setUTCMilliseconds/date-value-read-before-tonumber-when-date-is-invalid.js b/test/built-ins/Date/prototype/setUTCMilliseconds/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..807318c63b --- /dev/null +++ b/test/built-ins/Date/prototype/setUTCMilliseconds/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,36 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setutcmilliseconds +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setUTCMilliseconds ( ms ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Set ms to ? ToNumber(ms). + 5. If t is NaN, return NaN. + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setUTCMilliseconds(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.sameValue(result, NaN, "result is NaN"); + +assert.sameValue(dt.getTime(), 0, "time updated in valueOf"); diff --git a/test/built-ins/Date/prototype/setUTCMilliseconds/date-value-read-before-tonumber-when-date-is-valid.js b/test/built-ins/Date/prototype/setUTCMilliseconds/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..bc1493ca64 --- /dev/null +++ b/test/built-ins/Date/prototype/setUTCMilliseconds/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,39 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setutcmilliseconds +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setUTCMilliseconds ( ms ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Set ms to ? ToNumber(ms). + 5. If t is NaN, return NaN. + 6. Let time be MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms). + ... +---*/ + +var dt = new Date(0); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setUTCMilliseconds(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getUTCMilliseconds(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setUTCMinutes/date-value-read-before-tonumber-when-date-is-invalid.js b/test/built-ins/Date/prototype/setUTCMinutes/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..ea2654dd3c --- /dev/null +++ b/test/built-ins/Date/prototype/setUTCMinutes/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,38 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setutcminutes +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setUTCMinutes ( min [ , sec [ , ms ] ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let m be ? ToNumber(min). + 5. If sec is present, let s be ? ToNumber(sec). + 6. If ms is present, let milli be ? ToNumber(ms). + 7. If t is NaN, return NaN. + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setUTCMinutes(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.sameValue(result, NaN, "result is NaN"); + +assert.sameValue(dt.getTime(), 0, "time updated in valueOf"); diff --git a/test/built-ins/Date/prototype/setUTCMinutes/date-value-read-before-tonumber-when-date-is-valid.js b/test/built-ins/Date/prototype/setUTCMinutes/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..8de9c38573 --- /dev/null +++ b/test/built-ins/Date/prototype/setUTCMinutes/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,41 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setutcminutes +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setUTCMinutes ( min [ , sec [ , ms ] ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let m be ? ToNumber(min). + 5. If sec is present, let s be ? ToNumber(sec). + 6. If ms is present, let milli be ? ToNumber(ms). + 7. If t is NaN, return NaN. + 8. If sec is not present, let s be SecFromTime(t). + ... +---*/ + +var dt = new Date(0); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setUTCMinutes(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getUTCMinutes(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setUTCMonth/date-value-read-before-tonumber-when-date-is-invalid.js b/test/built-ins/Date/prototype/setUTCMonth/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..b05e701157 --- /dev/null +++ b/test/built-ins/Date/prototype/setUTCMonth/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setutcmonth +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setUTCMonth ( month [ , date ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let m be ? ToNumber(month). + 5. If date is present, let dt be ? ToNumber(date). + 6. If t is NaN, return NaN. + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setUTCMonth(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.sameValue(result, NaN, "result is NaN"); + +assert.sameValue(dt.getTime(), 0, "time updated in valueOf"); diff --git a/test/built-ins/Date/prototype/setUTCMonth/date-value-read-before-tonumber-when-date-is-valid.js b/test/built-ins/Date/prototype/setUTCMonth/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..619e95b2be --- /dev/null +++ b/test/built-ins/Date/prototype/setUTCMonth/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setutcmonth +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setUTCMonth ( month [ , date ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let m be ? ToNumber(month). + 5. If date is present, let dt be ? ToNumber(date). + 6. If t is NaN, return NaN. + 7. If date is not present, let dt be DateFromTime(t). + ... +---*/ + +var dt = new Date(0); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setUTCMonth(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getUTCMonth(), 1, "date value correctly updated"); diff --git a/test/built-ins/Date/prototype/setUTCSeconds/date-value-read-before-tonumber-when-date-is-invalid.js b/test/built-ins/Date/prototype/setUTCSeconds/date-value-read-before-tonumber-when-date-is-invalid.js new file mode 100644 index 0000000000..f43efb9523 --- /dev/null +++ b/test/built-ins/Date/prototype/setUTCSeconds/date-value-read-before-tonumber-when-date-is-invalid.js @@ -0,0 +1,37 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setutcseconds +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is invalid. +info: | + Date.prototype.setUTCSeconds ( sec [ , ms ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let s be ? ToNumber(sec). + 5. If ms is present, let milli be ? ToNumber(ms). + 6. If t is NaN, return NaN. + ... +---*/ + +var dt = new Date(NaN); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(0); + return 1; + } +}; + +var result = dt.setUTCSeconds(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.sameValue(result, NaN, "result is NaN"); + +assert.sameValue(dt.getTime(), 0, "time updated in valueOf"); diff --git a/test/built-ins/Date/prototype/setUTCSeconds/date-value-read-before-tonumber-when-date-is-valid.js b/test/built-ins/Date/prototype/setUTCSeconds/date-value-read-before-tonumber-when-date-is-valid.js new file mode 100644 index 0000000000..7c2c146be1 --- /dev/null +++ b/test/built-ins/Date/prototype/setUTCSeconds/date-value-read-before-tonumber-when-date-is-valid.js @@ -0,0 +1,40 @@ +// Copyright (C) 2024 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-date.prototype.setutcseconds +description: > + Read [[DateValue]] and then call ToNumber when stored time-value is valid. +info: | + Date.prototype.setUTCSeconds ( sec [ , ms ] ) + + ... + 3. Let t be dateObject.[[DateValue]]. + 4. Let s be ? ToNumber(sec). + 5. If ms is present, let milli be ? ToNumber(ms). + 6. If t is NaN, return NaN. + 7. If ms is not present, let milli be msFromTime(t). + ... +---*/ + +var dt = new Date(0); + +var valueOfCalled = 0; + +var value = { + valueOf() { + valueOfCalled++; + dt.setTime(NaN); + return 1; + } +}; + +var result = dt.setUTCSeconds(value); + +assert.sameValue(valueOfCalled, 1, "valueOf called exactly once"); + +assert.notSameValue(result, NaN, "result is not NaN"); + +assert.sameValue(result, dt.getTime(), "result is equal to getTime"); + +assert.sameValue(dt.getUTCSeconds(), 1, "date value correctly updated");