/* * Any copyright is dedicated to the Public Domain. * http://creativecommonn.org/licenses/publicdomain/ */ var BUGNUMBER = 645464; var summary = "[[DefaultValue]] behavior wrong for Number with overridden valueOf/toString"; print(BUGNUMBER + ": " + summary); /************** * BEGIN TEST * **************/ // equality var n = new Number(); assertEq(n == 0, true); var n2 = new Number(); n2.valueOf = function() { return 17; }; assertEq(n2 == 17, true); var n3 = new Number(); n3.toString = function() { return 42; }; assertEq(n3 == 0, true); function testEquality() { var n = new Number(); assertEq(n == 0, true); var n2 = new Number(); n2.valueOf = function() { return 17; }; assertEq(n2 == 17, true); var n3 = new Number(); n3.toString = function() { return 42; }; assertEq(n3 == 0, true); } testEquality(); // addition of Number to number var n = new Number(); assertEq(n + 5, 5); var n2 = new Number(); n2.toString = function() { return 9; }; assertEq(n2 + 3, 3); var n3 = new Number(); n3.valueOf = function() { return 17; }; assertEq(n3 + 5, 22); function testNumberAddition() { var n = new Number(); assertEq(n + 5, 5); var n2 = new Number(); n2.toString = function() { return 9; }; assertEq(n2 + 3, 3); var n3 = new Number(); n3.valueOf = function() { return 17; }; assertEq(n3 + 5, 22); } testNumberAddition(); // addition of Number to Number var n = new Number(); assertEq(n + n, 0); var n2 = new Number(); n2.toString = function() { return 5; }; assertEq(n2 + n2, 0); var n3 = new Number(); n3.valueOf = function() { return 8.5; }; assertEq(n3 + n3, 17); function testNonNumberAddition() { var n = new Number(); assertEq(n + n, 0); var n2 = new Number(); n2.toString = function() { return 5; }; assertEq(n2 + n2, 0); var n3 = new Number(); n3.valueOf = function() { return 8.5; }; assertEq(n3 + n3, 17); } testNonNumberAddition(); // Number as bracketed property name var obj = { 0: 17, 8: 42, 9: 8675309 }; var n = new Number(); assertEq(obj[n], 17); var n2 = new Number(); n2.valueOf = function() { return 8; } assertEq(obj[n2], 17); var n3 = new Number(); n3.toString = function() { return 9; }; assertEq(obj[n3], 8675309); function testPropertyNameToNumber() { var obj = { 0: 17, 8: 42, 9: 8675309 }; var n = new Number(); assertEq(obj[n], 17); var n2 = new Number(); n2.valueOf = function() { return 8; } assertEq(obj[n2], 17); var n3 = new Number(); n3.toString = function() { return 9; }; assertEq(obj[n3], 8675309); } testPropertyNameToNumber(); // Number as property name with |in| operator var n = new Number(); assertEq(n in { 0: 5 }, true); var n2 = new Number(); n2.toString = function() { return "baz"; }; assertEq(n2 in { baz: 42 }, true); var n3 = new Number(); n3.valueOf = function() { return "quux"; }; assertEq(n3 in { 0: 17 }, true); function testInOperatorName() { var n = new Number(); assertEq(n in { 0: 5 }, true); var n2 = new Number(); n2.toString = function() { return "baz"; }; assertEq(n2 in { baz: 42 }, true); var n3 = new Number(); n3.valueOf = function() { return "quux"; }; assertEq(n3 in { 0: 17 }, true); } testInOperatorName(); /******************************************************************************/ if (typeof reportCompare === "function") reportCompare(true, true); print("All tests passed!");