michael@0: /* michael@0: * Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommonn.org/licenses/publicdomain/ michael@0: */ michael@0: michael@0: var BUGNUMBER = 645464; michael@0: var summary = michael@0: "[[DefaultValue]] behavior wrong for Date with overridden valueOf/toString"; michael@0: michael@0: print(BUGNUMBER + ": " + summary); michael@0: michael@0: /************** michael@0: * BEGIN TEST * michael@0: **************/ michael@0: michael@0: function allTests() michael@0: { michael@0: var DS = new Date(2010, 1, 1).toString(); michael@0: michael@0: // equality michael@0: michael@0: var d = new Date(2010, 1, 1); michael@0: assertEq(d == DS, true); michael@0: michael@0: var d2 = new Date(2010, 1, 1); michael@0: d2.valueOf = function() { assertEq(arguments.length, 0); return 17; }; michael@0: assertEq(d2 == DS, true); michael@0: michael@0: var d3 = new Date(2010, 1, 1); michael@0: d3.toString = function() { return 42; }; michael@0: assertEq(d3 == 42, true); michael@0: michael@0: function testEquality() michael@0: { michael@0: var d = new Date(2010, 1, 1); michael@0: assertEq(d == DS, true); michael@0: michael@0: var d2 = new Date(2010, 1, 1); michael@0: d2.valueOf = function() { assertEq(arguments.length, 0); return 17; }; michael@0: assertEq(d2 == DS, true); michael@0: michael@0: var d3 = new Date(2010, 1, 1); michael@0: d3.toString = function() { return 42; }; michael@0: assertEq(d3 == 42, true); michael@0: } michael@0: testEquality(); michael@0: michael@0: michael@0: // addition of Date to number michael@0: michael@0: var d = new Date(2010, 1, 1); michael@0: assertEq(d + 5, DS + "5"); michael@0: michael@0: var d2 = new Date(2010, 1, 1); michael@0: d2.toString = function() { return 9; }; michael@0: assertEq(d2 + 3, 9 + 3); michael@0: michael@0: var d3 = new Date(2010, 1, 1); michael@0: d3.valueOf = function() { assertEq(arguments.length, 0); return 17; }; michael@0: assertEq(d3 + 5, DS + "5"); michael@0: michael@0: function testDateNumberAddition() michael@0: { michael@0: var d = new Date(2010, 1, 1); michael@0: assertEq(d + 5, DS + "5"); michael@0: michael@0: var d2 = new Date(2010, 1, 1); michael@0: d2.toString = function() { return 9; }; michael@0: assertEq(d2 + 3, 9 + 3); michael@0: michael@0: var d3 = new Date(2010, 1, 1); michael@0: d3.valueOf = function() { assertEq(arguments.length, 0); return 17; }; michael@0: assertEq(d3 + 5, DS + "5"); michael@0: } michael@0: testDateNumberAddition(); michael@0: michael@0: michael@0: // addition of Date to Date michael@0: michael@0: var d = new Date(2010, 1, 1); michael@0: assertEq(d + d, DS + DS); michael@0: michael@0: var d2 = new Date(2010, 1, 1); michael@0: d2.toString = function() { return 5; }; michael@0: assertEq(d2 + d2, 10); michael@0: michael@0: var d3 = new Date(2010, 1, 1); michael@0: d3.valueOf = function() { assertEq(arguments.length, 0); return 8.5; }; michael@0: assertEq(d3 + d3, DS + DS); michael@0: michael@0: function testDateDateAddition() michael@0: { michael@0: var d = new Date(2010, 1, 1); michael@0: assertEq(d + d, DS + DS); michael@0: michael@0: var d2 = new Date(2010, 1, 1); michael@0: d2.toString = function() { return 5; }; michael@0: assertEq(d2 + d2, 10); michael@0: michael@0: var d3 = new Date(2010, 1, 1); michael@0: d3.valueOf = function() { assertEq(arguments.length, 0); return 8.5; }; michael@0: assertEq(d3 + d3, DS + DS); michael@0: } michael@0: testDateDateAddition(); michael@0: michael@0: michael@0: // Date as bracketed property name michael@0: michael@0: var obj = { 8: 42, 9: 73 }; michael@0: obj[DS] = 17; michael@0: michael@0: var d = new Date(2010, 1, 1); michael@0: assertEq(obj[d], 17); michael@0: michael@0: var d2 = new Date(2010, 1, 1); michael@0: d2.valueOf = function() { assertEq(arguments.length, 0); return 8; } michael@0: assertEq(obj[d2], 17); michael@0: michael@0: var d3 = new Date(2010, 1, 1); michael@0: d3.toString = function() { return 9; }; michael@0: assertEq(obj[d3], 73); michael@0: michael@0: function testPropertyName() michael@0: { michael@0: var obj = { 8: 42, 9: 73 }; michael@0: obj[DS] = 17; michael@0: michael@0: var d = new Date(2010, 1, 1); michael@0: assertEq(obj[d], 17); michael@0: michael@0: var d2 = new Date(2010, 1, 1); michael@0: d2.valueOf = function() { assertEq(arguments.length, 0); return 8; } michael@0: assertEq(obj[d2], 17); michael@0: michael@0: var d3 = new Date(2010, 1, 1); michael@0: d3.toString = function() { return 9; }; michael@0: assertEq(obj[d3], 73); michael@0: } michael@0: testPropertyName(); michael@0: michael@0: michael@0: // Date as property name with |in| operator michael@0: michael@0: var obj = {}; michael@0: obj[DS] = 5; michael@0: michael@0: var d = new Date(2010, 1, 1); michael@0: assertEq(d in obj, true); michael@0: michael@0: var d2 = new Date(2010, 1, 1); michael@0: d2.toString = function() { return "baz"; }; michael@0: assertEq(d2 in { baz: 42 }, true); michael@0: michael@0: var d3 = new Date(2010, 1, 1); michael@0: d3.valueOf = function() { assertEq(arguments.length, 0); return "quux"; }; michael@0: assertEq(d3 in obj, true); michael@0: michael@0: function testInOperatorName() michael@0: { michael@0: var obj = {}; michael@0: obj[DS] = 5; michael@0: michael@0: var d = new Date(2010, 1, 1); michael@0: assertEq(d in obj, true); michael@0: michael@0: var d2 = new Date(2010, 1, 1); michael@0: d2.toString = function() { return "baz"; }; michael@0: assertEq(d2 in { baz: 42 }, true); michael@0: michael@0: var d3 = new Date(2010, 1, 1); michael@0: d3.valueOf = function() { assertEq(arguments.length, 0); return "quux"; }; michael@0: assertEq(d3 in obj, true); michael@0: } michael@0: testInOperatorName(); michael@0: } michael@0: michael@0: allTests(); michael@0: michael@0: if (typeof newGlobal === "function") michael@0: { michael@0: Date = newGlobal().Date; michael@0: allTests(); michael@0: } michael@0: michael@0: /******************************************************************************/ michael@0: michael@0: if (typeof reportCompare === "function") michael@0: reportCompare(true, true); michael@0: michael@0: print("All tests passed!");