| // Copyright 2014 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| var global = this; |
| |
| var funs = { |
| Object: [ Object ], |
| Function: [ Function ], |
| String: [ String ], |
| Boolean: [ Boolean ], |
| Number: [ Number ], |
| Date: [ Date ], |
| RegExp: [ RegExp ], |
| Error: [ Error, TypeError, RangeError, SyntaxError, ReferenceError, |
| EvalError, URIError ] |
| } |
| for (f in funs) { |
| for (i in funs[f]) { |
| assertEquals("[object " + f + "]", |
| Array.prototype.toString.call(new funs[f][i]), |
| funs[f][i]); |
| assertEquals("[object Function]", |
| Array.prototype.toString.call(funs[f][i]), |
| funs[f][i]); |
| } |
| } |
| |
| |
| function testToStringTag(className) { |
| // Using builtin toStringTags |
| var obj = {}; |
| obj[Symbol.toStringTag] = className; |
| assertEquals("[object " + className + "]", |
| Array.prototype.toString.call(obj)); |
| |
| // Getter throws |
| obj = {}; |
| Object.defineProperty(obj, Symbol.toStringTag, { |
| get: function() { throw className; } |
| }); |
| assertThrowsEquals(function() { |
| Array.prototype.toString.call(obj); |
| }, className); |
| |
| // Getter does not throw |
| obj = {}; |
| Object.defineProperty(obj, Symbol.toStringTag, { |
| get: function() { return className; } |
| }); |
| assertEquals("[object " + className + "]", |
| Array.prototype.toString.call(obj)); |
| |
| // Custom, non-builtin toStringTags |
| obj = {}; |
| obj[Symbol.toStringTag] = "X" + className; |
| assertEquals("[object X" + className + "]", |
| Array.prototype.toString.call(obj)); |
| |
| // With getter |
| obj = {}; |
| Object.defineProperty(obj, Symbol.toStringTag, { |
| get: function() { return "X" + className; } |
| }); |
| assertEquals("[object X" + className + "]", |
| Array.prototype.toString.call(obj)); |
| |
| // Undefined toStringTag should return [object className] |
| var obj = className === "Arguments" ? |
| (function() { return arguments; })() : new global[className]; |
| obj[Symbol.toStringTag] = undefined; |
| assertEquals("[object " + className + "]", |
| Array.prototype.toString.call(obj)); |
| |
| // With getter |
| var obj = className === "Arguments" ? |
| (function() { return arguments; })() : new global[className]; |
| Object.defineProperty(obj, Symbol.toStringTag, { |
| get: function() { return undefined; } |
| }); |
| assertEquals("[object " + className + "]", |
| Array.prototype.toString.call(obj)); |
| } |
| |
| |
| [ |
| "Arguments", |
| "Boolean", |
| "Date", |
| "Error", |
| "Function", |
| "Number", |
| "RegExp", |
| "String" |
| ].forEach(testToStringTag); |
| |
| |
| function testToStringTagNonString(value) { |
| var obj = {}; |
| obj[Symbol.toStringTag] = value; |
| assertEquals("[object Object]", Array.prototype.toString.call(obj)); |
| |
| // With getter |
| obj = {}; |
| Object.defineProperty(obj, Symbol.toStringTag, { |
| get: function() { return value; } |
| }); |
| assertEquals("[object Object]", Array.prototype.toString.call(obj)); |
| } |
| |
| |
| [ |
| null, |
| function() {}, |
| [], |
| {}, |
| /regexp/, |
| 42, |
| Symbol("sym"), |
| new Date(), |
| (function() { return arguments; })(), |
| true, |
| new Error("oops"), |
| new String("str") |
| ].forEach(testToStringTagNonString); |
| |
| |
| function testArrayToStringPropertyDesc() { |
| var desc = Object.getOwnPropertyDescriptor(Object.prototype, "toString"); |
| assertTrue(desc.writable); |
| assertFalse(desc.enumerable); |
| assertTrue(desc.configurable); |
| } |
| testArrayToStringPropertyDesc(); |
| |
| |
| function testArrayToStringOwnNonStringValue() { |
| var obj = Object.defineProperty({}, Symbol.toStringTag, { value: 1 }); |
| assertEquals("[object Object]", ([]).toString.call(obj)); |
| } |
| testArrayToStringOwnNonStringValue(); |
| |
| |
| function testArrayToStringBasic() { |
| assertEquals("1,2,3", [1,2,3].toString()); |
| assertEquals(",,3", [,,3].toString()); |
| } |
| testArrayToStringBasic(); |
| |
| |
| function testArrayToStringObjectWithCallableJoin() { |
| var obj = { join: function() { return "CallableJoin"; } }; |
| assertEquals("CallableJoin", Array.prototype.toString.call(obj)); |
| } |
| testArrayToStringObjectWithCallableJoin(); |