Add tests for use of ToPrimitive in Date ctor

This commit is contained in:
Mike Pennisi 2016-07-05 14:51:52 -04:00
parent da0a8e33f0
commit 577a9cac9e
6 changed files with 243 additions and 0 deletions

View 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);
});

View 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');

View 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);
});

View 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');

View File

@ -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');

View 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);