mirror of https://github.com/tc39/test262.git
Add Date.prototype.toJSON coverage (#2190)
This commit is contained in:
parent
57f0884396
commit
74e0cae407
|
@ -1,12 +0,0 @@
|
||||||
// Copyright (c) 2012 Ecma International. All rights reserved.
|
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
|
||||||
|
|
||||||
/*---
|
|
||||||
esid: sec-date.prototype.tojson
|
|
||||||
es5id: 15.9.5.44-0-1
|
|
||||||
description: Date.prototype.toJSON must exist as a function
|
|
||||||
---*/
|
|
||||||
|
|
||||||
var f = Date.prototype.toJSON;
|
|
||||||
|
|
||||||
assert.sameValue(typeof(f), "function", 'typeof(f)');
|
|
|
@ -1,10 +0,0 @@
|
||||||
// Copyright (c) 2012 Ecma International. All rights reserved.
|
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
|
||||||
|
|
||||||
/*---
|
|
||||||
esid: sec-date.prototype.tojson
|
|
||||||
es5id: 15.9.5.44-0-2
|
|
||||||
description: Date.prototype.toJSON must exist as a function taking 1 parameter
|
|
||||||
---*/
|
|
||||||
|
|
||||||
assert.sameValue(Date.prototype.toJSON.length, 1, 'Date.prototype.toJSON.length');
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date.prototype.tojson
|
||||||
|
description: >
|
||||||
|
Tests that Date.prototype.toJSON meets the requirements
|
||||||
|
for built-in objects defined by the introduction of chapter 17 of
|
||||||
|
the ECMAScript Language Specification.
|
||||||
|
includes: [isConstructor.js]
|
||||||
|
features: [Reflect.construct]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var toJSON = Date.prototype.toJSON;
|
||||||
|
|
||||||
|
assert(Object.isExtensible(toJSON));
|
||||||
|
assert.sameValue(typeof toJSON, 'function');
|
||||||
|
assert.sameValue(Object.prototype.toString.call(toJSON), '[object Function]');
|
||||||
|
assert.sameValue(Object.getPrototypeOf(toJSON), Function.prototype);
|
||||||
|
|
||||||
|
assert.sameValue(toJSON.hasOwnProperty('prototype'), false);
|
||||||
|
assert.sameValue(isConstructor(toJSON), false);
|
|
@ -0,0 +1,38 @@
|
||||||
|
// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date.prototype.tojson
|
||||||
|
description: >
|
||||||
|
Abrupt completion from GetV or Call.
|
||||||
|
info: |
|
||||||
|
Date.prototype.toJSON ( key )
|
||||||
|
|
||||||
|
[...]
|
||||||
|
4. Return ? Invoke(O, "toISOString").
|
||||||
|
|
||||||
|
Invoke ( V, P [ , argumentsList ] )
|
||||||
|
|
||||||
|
[...]
|
||||||
|
3. Let func be ? GetV(V, P).
|
||||||
|
4. Return ? Call(func, V, argumentsList).
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var abruptGet = {
|
||||||
|
get toISOString() {
|
||||||
|
throw new Test262Error();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.throws(Test262Error, function() {
|
||||||
|
Date.prototype.toJSON.call(abruptGet);
|
||||||
|
});
|
||||||
|
|
||||||
|
var abruptCall = {
|
||||||
|
toISOString() {
|
||||||
|
throw new Test262Error();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.throws(Test262Error, function() {
|
||||||
|
Date.prototype.toJSON.call(abruptCall);
|
||||||
|
});
|
|
@ -0,0 +1,42 @@
|
||||||
|
// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date.prototype.tojson
|
||||||
|
description: >
|
||||||
|
toISOString is called with correct context and without arguments.
|
||||||
|
info: |
|
||||||
|
Date.prototype.toJSON ( key )
|
||||||
|
|
||||||
|
[...]
|
||||||
|
4. Return ? Invoke(O, "toISOString").
|
||||||
|
|
||||||
|
Invoke ( V, P [ , argumentsList ] )
|
||||||
|
|
||||||
|
[...]
|
||||||
|
3. Let func be ? GetV(V, P).
|
||||||
|
4. Return ? Call(func, V, argumentsList).
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var getCount = 0, getContext;
|
||||||
|
var callCount = 0, callContext, callArguments;
|
||||||
|
var obj = {
|
||||||
|
get toISOString() {
|
||||||
|
getCount += 1;
|
||||||
|
getContext = this;
|
||||||
|
|
||||||
|
return function() {
|
||||||
|
callCount += 1;
|
||||||
|
callContext = this;
|
||||||
|
callArguments = arguments;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
Date.prototype.toJSON.call(obj);
|
||||||
|
|
||||||
|
assert.sameValue(getCount, 1);
|
||||||
|
assert.sameValue(getContext, obj);
|
||||||
|
|
||||||
|
assert.sameValue(callCount, 1);
|
||||||
|
assert.sameValue(callContext, obj);
|
||||||
|
assert.sameValue(callArguments.length, 0);
|
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date.prototype.tojson
|
||||||
|
description: >
|
||||||
|
Result of toISOString call is returned.
|
||||||
|
info: |
|
||||||
|
Date.prototype.toJSON ( key )
|
||||||
|
|
||||||
|
[...]
|
||||||
|
4. Return ? Invoke(O, "toISOString").
|
||||||
|
|
||||||
|
Invoke ( V, P [ , argumentsList ] )
|
||||||
|
|
||||||
|
[...]
|
||||||
|
3. Let func be ? GetV(V, P).
|
||||||
|
4. Return ? Call(func, V, argumentsList).
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var date = new Date();
|
||||||
|
assert.sameValue(date.toJSON(), date.toISOString());
|
||||||
|
|
||||||
|
var result = {};
|
||||||
|
assert.sameValue(
|
||||||
|
Date.prototype.toJSON.call({
|
||||||
|
toISOString: function() { return result; },
|
||||||
|
}),
|
||||||
|
result
|
||||||
|
);
|
|
@ -0,0 +1,23 @@
|
||||||
|
// Copyright (C) 2012 Ecma International. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date.prototype.tojson
|
||||||
|
description: >
|
||||||
|
Date.prototype.toJSON.length is 1.
|
||||||
|
info: |
|
||||||
|
Date.prototype.toJSON ( key )
|
||||||
|
|
||||||
|
ECMAScript Standard Built-in Objects
|
||||||
|
|
||||||
|
Unless otherwise specified, the length property of a built-in Function
|
||||||
|
object has the attributes { [[Writable]]: false, [[Enumerable]]: false,
|
||||||
|
[[Configurable]]: true }.
|
||||||
|
includes: [propertyHelper.js]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
verifyProperty(Date.prototype.toJSON, 'length', {
|
||||||
|
value: 1,
|
||||||
|
writable: false,
|
||||||
|
enumerable: false,
|
||||||
|
configurable: true,
|
||||||
|
});
|
|
@ -20,8 +20,9 @@ info: |
|
||||||
includes: [propertyHelper.js]
|
includes: [propertyHelper.js]
|
||||||
---*/
|
---*/
|
||||||
|
|
||||||
assert.sameValue(Date.prototype.toJSON.name, "toJSON");
|
verifyProperty(Date.prototype.toJSON, 'name', {
|
||||||
|
value: 'toJSON',
|
||||||
verifyNotEnumerable(Date.prototype.toJSON, "name");
|
writable: false,
|
||||||
verifyNotWritable(Date.prototype.toJSON, "name");
|
enumerable: false,
|
||||||
verifyConfigurable(Date.prototype.toJSON, "name");
|
configurable: true,
|
||||||
|
});
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date.prototype.tojson
|
||||||
|
description: >
|
||||||
|
If this value coerces to non-finite number, null is returned.
|
||||||
|
info: |
|
||||||
|
Date.prototype.toJSON ( key )
|
||||||
|
|
||||||
|
[...]
|
||||||
|
2. Let tv be ? ToPrimitive(O, hint Number).
|
||||||
|
3. If Type(tv) is Number and tv is not finite, return null.
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var toJSON = Date.prototype.toJSON;
|
||||||
|
|
||||||
|
assert.sameValue(
|
||||||
|
toJSON.call({
|
||||||
|
get toISOString() { throw new Test262Error(); },
|
||||||
|
valueOf: function() { return NaN; },
|
||||||
|
}),
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
|
var num = new Number(-Infinity);
|
||||||
|
num.toISOString = function() { throw new Test262Error(); };
|
||||||
|
assert.sameValue(toJSON.call(num), null);
|
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date.prototype.tojson
|
||||||
|
description: >
|
||||||
|
This value is coerced to an object.
|
||||||
|
info: |
|
||||||
|
Date.prototype.toJSON ( key )
|
||||||
|
|
||||||
|
1. Let O be ? ToObject(this value).
|
||||||
|
features: [Symbol]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var toJSON = Date.prototype.toJSON;
|
||||||
|
this.toISOString = function() { return 'global'; };
|
||||||
|
|
||||||
|
assert.throws(TypeError, function() {
|
||||||
|
toJSON.call(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.throws(TypeError, function() {
|
||||||
|
toJSON.call(null);
|
||||||
|
});
|
||||||
|
|
||||||
|
Number.prototype.toISOString = function() { return 'str'; };
|
||||||
|
assert.sameValue(toJSON.call(10), 'str');
|
||||||
|
|
||||||
|
Symbol.prototype.toISOString = function() { return 10; };
|
||||||
|
assert.sameValue(toJSON.call(Symbol()), 10);
|
|
@ -0,0 +1,56 @@
|
||||||
|
// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date.prototype.tojson
|
||||||
|
description: >
|
||||||
|
Abrupt completion from ToPrimitive.
|
||||||
|
info: |
|
||||||
|
Date.prototype.toJSON ( key )
|
||||||
|
|
||||||
|
[...]
|
||||||
|
2. Let tv be ? ToPrimitive(O, hint Number).
|
||||||
|
|
||||||
|
ToPrimitive ( input [ , PreferredType ] )
|
||||||
|
|
||||||
|
1. Assert: input is an ECMAScript language value.
|
||||||
|
2. If Type(input) is Object, then
|
||||||
|
[...]
|
||||||
|
g. Return ? OrdinaryToPrimitive(input, hint).
|
||||||
|
|
||||||
|
OrdinaryToPrimitive ( O, hint )
|
||||||
|
|
||||||
|
[...]
|
||||||
|
5. For each name in methodNames in List order, do
|
||||||
|
a. Let method be ? Get(O, name).
|
||||||
|
b. If IsCallable(method) is true, then
|
||||||
|
i. Let result be ? Call(method, O).
|
||||||
|
ii. If Type(result) is not Object, return result.
|
||||||
|
6. Throw a TypeError exception.
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var toJSON = Date.prototype.toJSON;
|
||||||
|
var getAbrupt = {
|
||||||
|
get valueOf() {
|
||||||
|
throw new Test262Error();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.throws(Test262Error, function() {
|
||||||
|
toJSON.call(getAbrupt);
|
||||||
|
});
|
||||||
|
|
||||||
|
var callAbrupt = {
|
||||||
|
toString: function() {
|
||||||
|
throw new Test262Error();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.throws(Test262Error, function() {
|
||||||
|
toJSON.call(callAbrupt);
|
||||||
|
});
|
||||||
|
|
||||||
|
var notCoercible = Object.create(null);
|
||||||
|
|
||||||
|
assert.throws(TypeError, function() {
|
||||||
|
toJSON.call(notCoercible);
|
||||||
|
});
|
|
@ -0,0 +1,45 @@
|
||||||
|
// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date.prototype.tojson
|
||||||
|
description: >
|
||||||
|
This value is coerced to primitive with Number hint (exotic @@toPrimitive).
|
||||||
|
info: |
|
||||||
|
Date.prototype.toJSON ( key )
|
||||||
|
|
||||||
|
[...]
|
||||||
|
2. Let tv be ? ToPrimitive(O, hint Number).
|
||||||
|
|
||||||
|
ToPrimitive ( input [ , PreferredType ] )
|
||||||
|
|
||||||
|
1. Assert: input is an ECMAScript language value.
|
||||||
|
2. If Type(input) is Object, then
|
||||||
|
[...]
|
||||||
|
d. Let exoticToPrim be ? GetMethod(input, @@toPrimitive).
|
||||||
|
e. If exoticToPrim is not undefined, then
|
||||||
|
i. Let result be ? Call(exoticToPrim, input, « hint »).
|
||||||
|
ii. If Type(result) is not Object, return result.
|
||||||
|
features: [Symbol, Symbol.toPrimitive]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var callCount = 0, _this, _arguments;
|
||||||
|
var result = new Boolean(false);
|
||||||
|
|
||||||
|
var obj = {
|
||||||
|
toISOString: function() { return result; },
|
||||||
|
toString: function() { throw new Test262Error('should not be called'); },
|
||||||
|
valueOf: function() { throw new Test262Error('should not be called'); },
|
||||||
|
};
|
||||||
|
|
||||||
|
obj[Symbol.toPrimitive] = function() {
|
||||||
|
callCount += 1;
|
||||||
|
_this = this;
|
||||||
|
_arguments = arguments;
|
||||||
|
return 3.14;
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.sameValue(Date.prototype.toJSON.call(obj), result);
|
||||||
|
assert.sameValue(callCount, 1);
|
||||||
|
assert.sameValue(_this, obj);
|
||||||
|
assert.sameValue(_arguments[0], 'number');
|
||||||
|
assert.sameValue(_arguments.length, 1);
|
|
@ -0,0 +1,46 @@
|
||||||
|
// Copyright (C) 2019 Aleksey Shvayka. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-date.prototype.tojson
|
||||||
|
description: >
|
||||||
|
This value is coerced to primitive with Number hint (OrdinaryToPrimitive).
|
||||||
|
info: |
|
||||||
|
Date.prototype.toJSON ( key )
|
||||||
|
|
||||||
|
[...]
|
||||||
|
2. Let tv be ? ToPrimitive(O, hint Number).
|
||||||
|
|
||||||
|
ToPrimitive ( input [ , PreferredType ] )
|
||||||
|
|
||||||
|
1. Assert: input is an ECMAScript language value.
|
||||||
|
2. If Type(input) is Object, then
|
||||||
|
[...]
|
||||||
|
g. Return ? OrdinaryToPrimitive(input, hint).
|
||||||
|
|
||||||
|
OrdinaryToPrimitive ( O, hint )
|
||||||
|
|
||||||
|
[...]
|
||||||
|
5. For each name in methodNames in List order, do
|
||||||
|
a. Let method be ? Get(O, name).
|
||||||
|
b. If IsCallable(method) is true, then
|
||||||
|
i. Let result be ? Call(method, O).
|
||||||
|
ii. If Type(result) is not Object, return result.
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var callCount = 0, _this, _arguments;
|
||||||
|
var result = [];
|
||||||
|
var obj = {
|
||||||
|
toISOString: function() { return result; },
|
||||||
|
toString: function() { throw new Test262Error('should not be called'); },
|
||||||
|
valueOf: function() {
|
||||||
|
callCount += 1;
|
||||||
|
_this = this;
|
||||||
|
_arguments = arguments;
|
||||||
|
return 'NaN';
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.sameValue(Date.prototype.toJSON.call(obj), result);
|
||||||
|
assert.sameValue(callCount, 1);
|
||||||
|
assert.sameValue(_this, obj);
|
||||||
|
assert.sameValue(_arguments.length, 0);
|
Loading…
Reference in New Issue