mirror of https://github.com/tc39/test262.git
Add tests for use of ToPrimitive in Date ctor
This commit is contained in:
parent
da0a8e33f0
commit
577a9cac9e
|
@ -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);
|
||||
});
|
|
@ -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');
|
|
@ -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);
|
||||
});
|
|
@ -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');
|
|
@ -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…
Reference in New Issue