mirror of https://github.com/svaarala/duktape.git
Sami Vaarala
12 years ago
2 changed files with 284 additions and 0 deletions
@ -0,0 +1,244 @@ |
|||||
|
/* Date.prototype.toJSON() is a generic function, check that it behaves |
||||
|
* that way. |
||||
|
* |
||||
|
* E5.1 Section 15.9.5.44. |
||||
|
*/ |
||||
|
|
||||
|
var obj; |
||||
|
|
||||
|
/*=== |
||||
|
2012-01-02T03:04:05.006Z |
||||
|
===*/ |
||||
|
|
||||
|
try { |
||||
|
// this ends up in toISOString(), so output is exact
|
||||
|
print(new Date('2012-01-02T03:04:05.006Z').toJSON()); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
||||
|
/*=== |
||||
|
TypeError |
||||
|
TypeError |
||||
|
===*/ |
||||
|
|
||||
|
try { |
||||
|
// Step 1: ToObject(undefined) -> TypeError
|
||||
|
Date.prototype.toJSON.call(undefined); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
// Step 1: ToObject(null) -> TypeError
|
||||
|
Date.prototype.toJSON.call(undefined); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
||||
|
/*=== |
||||
|
valueOf() |
||||
|
toString() |
||||
|
toISOString() |
||||
|
ISOString |
||||
|
===*/ |
||||
|
|
||||
|
try { |
||||
|
// Step 2: ToPrimitive(hint Number) -> valueOf first, toString second
|
||||
|
obj = { |
||||
|
valueOf: function() { |
||||
|
// non-primitive value -> toString() will get called
|
||||
|
print('valueOf()'); |
||||
|
return []; |
||||
|
}, |
||||
|
toString: function() { |
||||
|
print('toString()'); |
||||
|
return 'foo'; |
||||
|
}, |
||||
|
toISOString: function() { |
||||
|
print('toISOString()'); |
||||
|
return 'ISOString'; |
||||
|
} |
||||
|
}; |
||||
|
print(Date.prototype.toJSON.call(obj)); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
||||
|
/*=== |
||||
|
valueOf() |
||||
|
TypeError |
||||
|
===*/ |
||||
|
|
||||
|
try { |
||||
|
// toISOString does not exist -> TypeError
|
||||
|
obj = { |
||||
|
valueOf: function() { |
||||
|
// primitive value -> toString() won't be called
|
||||
|
print('valueOf()'); |
||||
|
return 123; |
||||
|
}, |
||||
|
toString: function() { |
||||
|
print('toString()'); |
||||
|
return 'foo'; |
||||
|
} |
||||
|
}; |
||||
|
print(Date.prototype.toJSON.call(obj)); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
||||
|
/*=== |
||||
|
valueOf() |
||||
|
null |
||||
|
valueOf() |
||||
|
null |
||||
|
valueOf() |
||||
|
null |
||||
|
valueOf() |
||||
|
toISOString() |
||||
|
ISOString |
||||
|
valueOf() |
||||
|
toISOString() |
||||
|
ISOString |
||||
|
===*/ |
||||
|
|
||||
|
// ToPrimitive returns a non-finite number -> returns 'null'
|
||||
|
|
||||
|
try { |
||||
|
obj = { |
||||
|
valueOf: function() { |
||||
|
print('valueOf()'); |
||||
|
return Number.POSITIVE_INFINITY; |
||||
|
} |
||||
|
}; |
||||
|
print(Date.prototype.toJSON.call(obj)); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
obj = { |
||||
|
valueOf: function() { |
||||
|
print('valueOf()'); |
||||
|
return Number.NEGATIVE_INFINITY; |
||||
|
} |
||||
|
}; |
||||
|
print(Date.prototype.toJSON.call(obj)); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
obj = { |
||||
|
valueOf: function() { |
||||
|
print('valueOf()'); |
||||
|
return Number.NaN; |
||||
|
} |
||||
|
}; |
||||
|
print(Date.prototype.toJSON.call(obj)); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
obj = { |
||||
|
valueOf: function() { |
||||
|
// Note: returning a finite number which is still outside
|
||||
|
// Ecmascript range should NOT cause a 'null' return!
|
||||
|
print('valueOf()'); |
||||
|
return (100e6 * 86400e3) + 1e10; |
||||
|
}, |
||||
|
toISOString: function() { |
||||
|
print('toISOString()'); |
||||
|
return 'ISOString'; |
||||
|
} |
||||
|
}; |
||||
|
print(Date.prototype.toJSON.call(obj)); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
obj = { |
||||
|
valueOf: function() { |
||||
|
print('valueOf()'); |
||||
|
return -(100e6 * 86400e3) - 1e10; |
||||
|
}, |
||||
|
toISOString: function() { |
||||
|
print('toISOString()'); |
||||
|
return 'ISOString'; |
||||
|
} |
||||
|
}; |
||||
|
print(Date.prototype.toJSON.call(obj)); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
||||
|
/*=== |
||||
|
valueOf() |
||||
|
TypeError |
||||
|
===*/ |
||||
|
|
||||
|
try { |
||||
|
// toISOString exists but is not callable -> TypeError
|
||||
|
obj = { |
||||
|
valueOf: function() { |
||||
|
// primitive value -> toString() won't be called
|
||||
|
print('valueOf()'); |
||||
|
return 123; |
||||
|
}, |
||||
|
toString: function() { |
||||
|
print('toString()'); |
||||
|
return 'foo'; |
||||
|
}, |
||||
|
toISOString: 1 |
||||
|
}; |
||||
|
print(Date.prototype.toJSON.call(obj)); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
||||
|
/*=== |
||||
|
Number.prototype.toISOString() |
||||
|
this binding type: object |
||||
|
ISOString |
||||
|
===*/ |
||||
|
|
||||
|
try { |
||||
|
// toISOString gets the ToObject() coercion of the base value as
|
||||
|
// its 'this' binding
|
||||
|
|
||||
|
Number.prototype.toISOString = function() { |
||||
|
print('Number.prototype.toISOString()'); |
||||
|
print('this binding type: ' + typeof this); |
||||
|
return 'ISOString'; |
||||
|
} |
||||
|
|
||||
|
print(Date.prototype.toJSON.call(123)); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
||||
|
/*=== |
||||
|
toISOString() |
||||
|
this matches: true |
||||
|
ISOString |
||||
|
===*/ |
||||
|
|
||||
|
try { |
||||
|
// another 'this' binding test with an object value
|
||||
|
|
||||
|
obj = { |
||||
|
toISOString: function() { |
||||
|
print('toISOString()'); |
||||
|
print('this matches: ' + (this === obj)); |
||||
|
return 'ISOString'; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
print(Date.prototype.toJSON.call(obj)); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
@ -0,0 +1,40 @@ |
|||||
|
/*--- |
||||
|
{ |
||||
|
"custom": true |
||||
|
} |
||||
|
---*/ |
||||
|
|
||||
|
/*=== |
||||
|
RangeError |
||||
|
RangeError |
||||
|
1900-01-01T00:00:00.000Z |
||||
|
===*/ |
||||
|
|
||||
|
/* Date.UTC() has implementation defined results when it is given less than |
||||
|
* 2 arguments. |
||||
|
* |
||||
|
* V8 sets internal time value to NaN, i.e. behaves the same as if two |
||||
|
* 'undefined' arguments were given. Rhino, on the other hand, defaults |
||||
|
* the values to zero (leading to year 1970 and January). |
||||
|
* |
||||
|
* Our current behavior matches V8, so test for this behavior. |
||||
|
*/ |
||||
|
|
||||
|
try { |
||||
|
print(new Date(Date.UTC()).toISOString()); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
print(new Date(Date.UTC(0)).toISOString()); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
print(new Date(Date.UTC(0,0)).toISOString()); |
||||
|
} catch (e) { |
||||
|
print(e.name); |
||||
|
} |
||||
|
|
Loading…
Reference in new issue