mirror of
https://github.com/tc39/test262.git
synced 2025-07-21 04:54:44 +02:00
Add tests for use of ToPrimitive in Date ctor
This commit is contained in:
parent
da0a8e33f0
commit
577a9cac9e
28
test/built-ins/Date/value-to-primitive-call-err.js
Normal file
28
test/built-ins/Date/value-to-primitive-call-err.js
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date-value
|
||||||
|
es6id: 20.3.2.2
|
||||||
|
description: Error invoking `Symbol.toPrimitive` method of object value
|
||||||
|
info: |
|
||||||
|
3. If NewTarget is not undefined, then
|
||||||
|
a. If Type(value) is Object and value has a [[DateValue]] internal slot, then
|
||||||
|
i. Let tv be thisTimeValue(value).
|
||||||
|
b. Else,
|
||||||
|
i. Let v be ? ToPrimitive(value).
|
||||||
|
|
||||||
|
ToPrimitive ( input [ , PreferredType ] )
|
||||||
|
|
||||||
|
[...]
|
||||||
|
4. Let exoticToPrim be ? GetMethod(input, @@toPrimitive).
|
||||||
|
features: [Symbol.toPrimitive]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var badToPrimitive = {};
|
||||||
|
badToPrimitive[Symbol.toPrimitive] = function() {
|
||||||
|
throw new Test262Error();
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.throws(Test262Error, function() {
|
||||||
|
new Date(badToPrimitive);
|
||||||
|
});
|
42
test/built-ins/Date/value-to-primitive-call.js
Normal file
42
test/built-ins/Date/value-to-primitive-call.js
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date-value
|
||||||
|
es6id: 20.3.2.2
|
||||||
|
description: Invocation of `Symbol.toPrimitive` method of object value
|
||||||
|
info: |
|
||||||
|
3. If NewTarget is not undefined, then
|
||||||
|
a. If Type(value) is Object and value has a [[DateValue]] internal slot, then
|
||||||
|
i. Let tv be thisTimeValue(value).
|
||||||
|
b. Else,
|
||||||
|
i. Let v be ? ToPrimitive(value).
|
||||||
|
[...]
|
||||||
|
|
||||||
|
|
||||||
|
ToPrimitive ( input [ , PreferredType ] )
|
||||||
|
|
||||||
|
1. If PreferredType was not passed, let hint be "default".
|
||||||
|
2. Else if PreferredType is hint String, let hint be "string".
|
||||||
|
3. Else PreferredType is hint Number, let hint be "number".
|
||||||
|
4. Let exoticToPrim be ? GetMethod(input, @@toPrimitive).
|
||||||
|
5. If exoticToPrim is not undefined, then
|
||||||
|
a. Let result be ? Call(exoticToPrim, input, « hint »).
|
||||||
|
[...]
|
||||||
|
features: [Symbol.toPrimitive]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var spyToPrimitive = {};
|
||||||
|
var callCount = 0;
|
||||||
|
var thisValue, args;
|
||||||
|
spyToPrimitive[Symbol.toPrimitive] = function() {
|
||||||
|
thisValue = this;
|
||||||
|
args = arguments;
|
||||||
|
callCount += 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
new Date(spyToPrimitive);
|
||||||
|
|
||||||
|
assert.sameValue(callCount, 1, 'function invoked exactly once');
|
||||||
|
assert.sameValue(thisValue, spyToPrimitive, 'function "this" value');
|
||||||
|
assert.sameValue(args.length, 1, 'function invoked with exactly one argument');
|
||||||
|
assert.sameValue(args[0], 'default', 'argument value');
|
36
test/built-ins/Date/value-to-primitive-get-meth-err.js
Normal file
36
test/built-ins/Date/value-to-primitive-get-meth-err.js
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date-value
|
||||||
|
es6id: 20.3.2.2
|
||||||
|
description: Error retrieving `Symbol.toPrimitive` method from object value
|
||||||
|
info: |
|
||||||
|
3. If NewTarget is not undefined, then
|
||||||
|
a. If Type(value) is Object and value has a [[DateValue]] internal slot, then
|
||||||
|
i. Let tv be thisTimeValue(value).
|
||||||
|
b. Else,
|
||||||
|
i. Let v be ? ToPrimitive(value).
|
||||||
|
[...]
|
||||||
|
features: [Symbol.toPrimitive]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var poisonedObject = {};
|
||||||
|
var poisonedDate = new Date();
|
||||||
|
Object.defineProperty(poisonedObject, Symbol.toPrimitive, {
|
||||||
|
get: function() {
|
||||||
|
throw new Test262Error();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(poisonedDate, Symbol.toPrimitive, {
|
||||||
|
get: function() {
|
||||||
|
throw new Test262Error();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Date(poisonedObject);
|
||||||
|
|
||||||
|
new Date(poisonedDate);
|
||||||
|
|
||||||
|
assert.throws(Test262Error, function() {
|
||||||
|
new Date(poisonedObject);
|
||||||
|
});
|
46
test/built-ins/Date/value-to-primitive-result-faulty.js
Normal file
46
test/built-ins/Date/value-to-primitive-result-faulty.js
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date-value
|
||||||
|
es6id: 20.3.2.2
|
||||||
|
description: Exotic `Symbol.toPrimitive` method returns a non-primitive
|
||||||
|
info: |
|
||||||
|
3. If NewTarget is not undefined, then
|
||||||
|
a. If Type(value) is Object and value has a [[DateValue]] internal slot, then
|
||||||
|
i. Let tv be thisTimeValue(value).
|
||||||
|
b. Else,
|
||||||
|
i. Let v be ? ToPrimitive(value).
|
||||||
|
|
||||||
|
ToPrimitive ( input [ , PreferredType ] )
|
||||||
|
|
||||||
|
1. If PreferredType was not passed, let hint be "default".
|
||||||
|
2. Else if PreferredType is hint String, let hint be "string".
|
||||||
|
3. Else PreferredType is hint Number, let hint be "number".
|
||||||
|
4. Let exoticToPrim be ? GetMethod(input, @@toPrimitive).
|
||||||
|
5. If exoticToPrim is not undefined, then
|
||||||
|
a. Let result be ? Call(exoticToPrim, input, « hint »).
|
||||||
|
b. If Type(result) is not Object, return result.
|
||||||
|
c. Throw a TypeError exception.
|
||||||
|
features: [Symbol.toPrimitive]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var faultyToPrimitive = {};
|
||||||
|
var returnValue;
|
||||||
|
faultyToPrimitive[Symbol.toPrimitive] = function() {
|
||||||
|
return returnValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
returnValue = {};
|
||||||
|
assert.throws(TypeError, function() {
|
||||||
|
new Date(faultyToPrimitive);
|
||||||
|
}, 'ordinary object');
|
||||||
|
|
||||||
|
returnValue = [];
|
||||||
|
assert.throws(TypeError, function() {
|
||||||
|
new Date(faultyToPrimitive);
|
||||||
|
}, 'Array exotic object');
|
||||||
|
|
||||||
|
returnValue = (function() { return arguments; }());
|
||||||
|
assert.throws(TypeError, function() {
|
||||||
|
new Date(faultyToPrimitive);
|
||||||
|
}, 'arguments exotic object');
|
@ -0,0 +1,56 @@
|
|||||||
|
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date-value
|
||||||
|
es6id: 20.3.2.2
|
||||||
|
description: >
|
||||||
|
Exotic `Symbol.toPrimitive` method returns a primitive value other than a
|
||||||
|
string
|
||||||
|
info: |
|
||||||
|
3. If NewTarget is not undefined, then
|
||||||
|
a. If Type(value) is Object and value has a [[DateValue]] internal slot, then
|
||||||
|
i. Let tv be thisTimeValue(value).
|
||||||
|
b. Else,
|
||||||
|
i. Let v be ? ToPrimitive(value).
|
||||||
|
ii. If Type(v) is String, then
|
||||||
|
1. Let tv be the result of parsing v as a date, in exactly the same
|
||||||
|
manner as for the parse method (20.3.3.2). If the parse resulted
|
||||||
|
in an abrupt completion, tv is the Completion Record.
|
||||||
|
|
||||||
|
ToPrimitive ( input [ , PreferredType ] )
|
||||||
|
|
||||||
|
1. If PreferredType was not passed, let hint be "default".
|
||||||
|
2. Else if PreferredType is hint String, let hint be "string".
|
||||||
|
3. Else PreferredType is hint Number, let hint be "number".
|
||||||
|
4. Let exoticToPrim be ? GetMethod(input, @@toPrimitive).
|
||||||
|
5. If exoticToPrim is not undefined, then
|
||||||
|
a. Let result be ? Call(exoticToPrim, input, « hint »).
|
||||||
|
b. If Type(result) is not Object, return result.
|
||||||
|
features: [Symbol.toPrimitive]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var toPrimitive = {};
|
||||||
|
var returnValue;
|
||||||
|
toPrimitive[Symbol.toPrimitive] = function() {
|
||||||
|
return returnValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
returnValue = 8;
|
||||||
|
assert.sameValue(new Date(toPrimitive).getTime(), 8, 'number');
|
||||||
|
|
||||||
|
returnValue = undefined;
|
||||||
|
assert.sameValue(new Date(toPrimitive).getTime(), NaN, 'undefined');
|
||||||
|
|
||||||
|
returnValue = true;
|
||||||
|
assert.sameValue(new Date(toPrimitive).getTime(), 1, 'boolean `true`');
|
||||||
|
|
||||||
|
returnValue = false;
|
||||||
|
assert.sameValue(new Date(toPrimitive).getTime(), 0, 'boolean `false`');
|
||||||
|
|
||||||
|
returnValue = null;
|
||||||
|
assert.sameValue(new Date(toPrimitive).getTime(), 0, 'null');
|
||||||
|
|
||||||
|
returnValue = Symbol.toPrimitive;
|
||||||
|
assert.throws(TypeError, function() {
|
||||||
|
new Date(toPrimitive);
|
||||||
|
}, 'symbol');
|
35
test/built-ins/Date/value-to-primitive-result-string.js
Normal file
35
test/built-ins/Date/value-to-primitive-result-string.js
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date-value
|
||||||
|
es6id: 20.3.2.2
|
||||||
|
description: Exotic `Symbol.toPrimitive` method returns a String value
|
||||||
|
info: |
|
||||||
|
3. If NewTarget is not undefined, then
|
||||||
|
a. If Type(value) is Object and value has a [[DateValue]] internal slot, then
|
||||||
|
i. Let tv be thisTimeValue(value).
|
||||||
|
b. Else,
|
||||||
|
i. Let v be ? ToPrimitive(value).
|
||||||
|
ii. If Type(v) is String, then
|
||||||
|
1. Let tv be the result of parsing v as a date, in exactly the same
|
||||||
|
manner as for the parse method (20.3.3.2). If the parse resulted
|
||||||
|
in an abrupt completion, tv is the Completion Record.
|
||||||
|
|
||||||
|
ToPrimitive ( input [ , PreferredType ] )
|
||||||
|
|
||||||
|
1. If PreferredType was not passed, let hint be "default".
|
||||||
|
2. Else if PreferredType is hint String, let hint be "string".
|
||||||
|
3. Else PreferredType is hint Number, let hint be "number".
|
||||||
|
4. Let exoticToPrim be ? GetMethod(input, @@toPrimitive).
|
||||||
|
5. If exoticToPrim is not undefined, then
|
||||||
|
a. Let result be ? Call(exoticToPrim, input, « hint »).
|
||||||
|
b. If Type(result) is not Object, return result.
|
||||||
|
features: [Symbol.toPrimitive]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var stringToPrimitive = {};
|
||||||
|
stringToPrimitive[Symbol.toPrimitive] = function() {
|
||||||
|
return '2016-06-05T18:40:00.000Z';
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.sameValue(new Date(stringToPrimitive).getTime(), 1465152000000);
|
Loading…
x
Reference in New Issue
Block a user