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 Number 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: michael@0: // equality michael@0: michael@0: var n = new Number(); michael@0: assertEq(n == 0, true); michael@0: michael@0: var n2 = new Number(); michael@0: n2.valueOf = function() { return 17; }; michael@0: assertEq(n2 == 17, true); michael@0: michael@0: var n3 = new Number(); michael@0: n3.toString = function() { return 42; }; michael@0: assertEq(n3 == 0, true); michael@0: michael@0: function testEquality() michael@0: { michael@0: var n = new Number(); michael@0: assertEq(n == 0, true); michael@0: michael@0: var n2 = new Number(); michael@0: n2.valueOf = function() { return 17; }; michael@0: assertEq(n2 == 17, true); michael@0: michael@0: var n3 = new Number(); michael@0: n3.toString = function() { return 42; }; michael@0: assertEq(n3 == 0, true); michael@0: } michael@0: testEquality(); michael@0: michael@0: michael@0: // addition of Number to number michael@0: michael@0: var n = new Number(); michael@0: assertEq(n + 5, 5); michael@0: michael@0: var n2 = new Number(); michael@0: n2.toString = function() { return 9; }; michael@0: assertEq(n2 + 3, 3); michael@0: michael@0: var n3 = new Number(); michael@0: n3.valueOf = function() { return 17; }; michael@0: assertEq(n3 + 5, 22); michael@0: michael@0: function testNumberAddition() michael@0: { michael@0: var n = new Number(); michael@0: assertEq(n + 5, 5); michael@0: michael@0: var n2 = new Number(); michael@0: n2.toString = function() { return 9; }; michael@0: assertEq(n2 + 3, 3); michael@0: michael@0: var n3 = new Number(); michael@0: n3.valueOf = function() { return 17; }; michael@0: assertEq(n3 + 5, 22); michael@0: } michael@0: testNumberAddition(); michael@0: michael@0: michael@0: // addition of Number to Number michael@0: michael@0: var n = new Number(); michael@0: assertEq(n + n, 0); michael@0: michael@0: var n2 = new Number(); michael@0: n2.toString = function() { return 5; }; michael@0: assertEq(n2 + n2, 0); michael@0: michael@0: var n3 = new Number(); michael@0: n3.valueOf = function() { return 8.5; }; michael@0: assertEq(n3 + n3, 17); michael@0: michael@0: function testNonNumberAddition() michael@0: { michael@0: var n = new Number(); michael@0: assertEq(n + n, 0); michael@0: michael@0: var n2 = new Number(); michael@0: n2.toString = function() { return 5; }; michael@0: assertEq(n2 + n2, 0); michael@0: michael@0: var n3 = new Number(); michael@0: n3.valueOf = function() { return 8.5; }; michael@0: assertEq(n3 + n3, 17); michael@0: } michael@0: testNonNumberAddition(); michael@0: michael@0: michael@0: // Number as bracketed property name michael@0: michael@0: var obj = { 0: 17, 8: 42, 9: 8675309 }; michael@0: michael@0: var n = new Number(); michael@0: assertEq(obj[n], 17); michael@0: michael@0: var n2 = new Number(); michael@0: n2.valueOf = function() { return 8; } michael@0: assertEq(obj[n2], 17); michael@0: michael@0: var n3 = new Number(); michael@0: n3.toString = function() { return 9; }; michael@0: assertEq(obj[n3], 8675309); michael@0: michael@0: function testPropertyNameToNumber() michael@0: { michael@0: var obj = { 0: 17, 8: 42, 9: 8675309 }; michael@0: michael@0: var n = new Number(); michael@0: assertEq(obj[n], 17); michael@0: michael@0: var n2 = new Number(); michael@0: n2.valueOf = function() { return 8; } michael@0: assertEq(obj[n2], 17); michael@0: michael@0: var n3 = new Number(); michael@0: n3.toString = function() { return 9; }; michael@0: assertEq(obj[n3], 8675309); michael@0: } michael@0: testPropertyNameToNumber(); michael@0: michael@0: michael@0: // Number as property name with |in| operator michael@0: michael@0: var n = new Number(); michael@0: assertEq(n in { 0: 5 }, true); michael@0: michael@0: var n2 = new Number(); michael@0: n2.toString = function() { return "baz"; }; michael@0: assertEq(n2 in { baz: 42 }, true); michael@0: michael@0: var n3 = new Number(); michael@0: n3.valueOf = function() { return "quux"; }; michael@0: assertEq(n3 in { 0: 17 }, true); michael@0: michael@0: function testInOperatorName() michael@0: { michael@0: var n = new Number(); michael@0: assertEq(n in { 0: 5 }, true); michael@0: michael@0: var n2 = new Number(); michael@0: n2.toString = function() { return "baz"; }; michael@0: assertEq(n2 in { baz: 42 }, true); michael@0: michael@0: var n3 = new Number(); michael@0: n3.valueOf = function() { return "quux"; }; michael@0: assertEq(n3 in { 0: 17 }, true); michael@0: } michael@0: testInOperatorName(); 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!");