mirror of
				https://github.com/tc39/test262.git
				synced 2025-10-30 19:24:12 +01:00 
			
		
		
		
	sourceRevisionAtLastExport: 33f2fb0e53d135f0ee17cfccd9d993eb2a6f47de targetRevisionAtLastExport: 31340cbd9add103f586d501b0c3354b7b182abc0
		
			
				
	
	
		
			156 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // 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();
 |