| /* |
| * Any copyright is dedicated to the Public Domain. |
| * http://creativecommons.org/licenses/publicdomain/ |
| */ |
| |
| var BUGNUMBER = 645464; |
| var summary = |
| "[[DefaultValue]] behavior wrong for String with overridden valueOf/toString"; |
| |
| print(BUGNUMBER + ": " + summary); |
| |
| /************** |
| * BEGIN TEST * |
| **************/ |
| |
| // equality |
| |
| var s = new String("c"); |
| assertEq(s == "c", true); |
| |
| var s2 = new String(); |
| s2.valueOf = function() { return "foo"; }; |
| assertEq(s2 == "foo", true); |
| |
| var s3 = new String(); |
| s3.toString = function() { return "bar"; }; |
| assertEq(s3 == "", true); |
| |
| function testEquality() |
| { |
| var s = new String("c"); |
| assertEq(s == "c", true); |
| |
| var s2 = new String(); |
| s2.valueOf = function() { return "foo"; }; |
| assertEq(s2 == "foo", true); |
| |
| var s3 = new String(); |
| s3.toString = function() { return "bar"; }; |
| assertEq(s3 == "", true); |
| } |
| testEquality(); |
| |
| |
| // addition of String to string |
| |
| var s = new String(); |
| assertEq(s + "", ""); |
| |
| var s2 = new String(); |
| s2.toString = function() { return "bar"; }; |
| assertEq(s2 + "", ""); |
| |
| var s3 = new String(); |
| s3.valueOf = function() { return "baz"; }; |
| assertEq(s3 + "", "baz"); |
| |
| function testStringAddition() |
| { |
| var s = new String(); |
| assertEq(s + "", ""); |
| |
| var s2 = new String(); |
| s2.toString = function() { return "bar"; }; |
| assertEq(s2 + "", ""); |
| |
| var s3 = new String(); |
| s3.valueOf = function() { return "baz"; }; |
| assertEq(s3 + "", "baz"); |
| } |
| testStringAddition(); |
| |
| |
| // addition of String to String |
| |
| var s = new String(); |
| assertEq(s + s, ""); |
| |
| var s2 = new String(); |
| s2.toString = function() { return "baz"; }; |
| assertEq(s2 + s2, ""); |
| |
| var s3 = new String(); |
| s3.valueOf = function() { return "quux"; }; |
| assertEq(s3 + s3, "quuxquux"); |
| |
| function testNonStringAddition() |
| { |
| var s = new String(); |
| assertEq(s + s, ""); |
| |
| var s2 = new String(); |
| s2.toString = function() { return "baz"; }; |
| assertEq(s2 + s2, ""); |
| |
| var s3 = new String(); |
| s3.valueOf = function() { return "quux"; }; |
| assertEq(s3 + s3, "quuxquux"); |
| } |
| testNonStringAddition(); |
| |
| |
| // String as bracketed property name |
| |
| var obj = { primitive: 17, valueOf: 42, toString: 8675309 }; |
| |
| var s = new String("primitive"); |
| assertEq(obj[s], 17); |
| |
| var s2 = new String("primitive"); |
| s2.valueOf = function() { return "valueOf"; } |
| assertEq(obj[s2], 17); |
| |
| var s3 = new String("primitive"); |
| s3.toString = function() { return "toString"; }; |
| assertEq(obj[s3], 8675309); |
| |
| function testPropertyNameToString() |
| { |
| var obj = { primitive: 17, valueOf: 42, toString: 8675309 }; |
| |
| var s = new String("primitive"); |
| assertEq(obj[s], 17); |
| |
| var s2 = new String("primitive"); |
| s2.valueOf = function() { return "valueOf"; } |
| assertEq(obj[s2], 17); |
| |
| var s3 = new String("primitive"); |
| s3.toString = function() { return "toString"; }; |
| assertEq(obj[s3], 8675309); |
| } |
| testPropertyNameToString(); |
| |
| |
| // String as property name with |in| operator |
| |
| var s = new String(); |
| assertEq(s in { "": 5 }, true); |
| |
| var s2 = new String(); |
| s.toString = function() { return "baz"; }; |
| assertEq(s in { baz: 42 }, true); |
| |
| var s3 = new String(); |
| s3.valueOf = function() { return "quux"; }; |
| assertEq(s3 in { "": 17 }, true); |
| |
| function testInOperatorName() |
| { |
| var s = new String(); |
| assertEq(s in { "": 5 }, true); |
| |
| var s2 = new String(); |
| s.toString = function() { return "baz"; }; |
| assertEq(s in { baz: 42 }, true); |
| |
| var s3 = new String(); |
| s3.valueOf = function() { return "quux"; }; |
| assertEq(s3 in { "": 17 }, true); |
| } |
| testInOperatorName(); |
| |
| /******************************************************************************/ |
| |
| if (typeof reportCompare === "function") |
| reportCompare(true, true); |
| |
| print("All tests passed!"); |