mirror of
				https://github.com/tc39/test262.git
				synced 2025-11-04 05:33:50 +01:00 
			
		
		
		
	sourceRevisionAtLastExport: 33f2fb0e53d135f0ee17cfccd9d993eb2a6f47de targetRevisionAtLastExport: 31340cbd9add103f586d501b0c3354b7b182abc0
		
			
				
	
	
		
			116 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// Copyright 2015 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.
 | 
						|
 | 
						|
function getStrictF() {
 | 
						|
  'use strict';
 | 
						|
  return function f() {};
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
function getSloppyF() {
 | 
						|
  return function f() {};
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
function test(testFunction) {
 | 
						|
  testFunction(getStrictF());
 | 
						|
  testFunction(getSloppyF());
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
function testDescriptor(f) {
 | 
						|
  var descr = Object.getOwnPropertyDescriptor(f, 'name');
 | 
						|
  assertTrue(descr.configurable);
 | 
						|
  assertFalse(descr.enumerable);
 | 
						|
  assertEquals('f', descr.value);
 | 
						|
  assertFalse(descr.writable);
 | 
						|
}
 | 
						|
test(testDescriptor);
 | 
						|
 | 
						|
 | 
						|
function testSet(f) {
 | 
						|
  f.name = 'g';
 | 
						|
  assertEquals('f', f.name);
 | 
						|
}
 | 
						|
test(testSet);
 | 
						|
 | 
						|
 | 
						|
function testSetStrict(f) {
 | 
						|
  'use strict';
 | 
						|
  assertThrows(function() {
 | 
						|
    f.name = 'g';
 | 
						|
  }, TypeError);
 | 
						|
}
 | 
						|
test(testSetStrict);
 | 
						|
 | 
						|
 | 
						|
function testReconfigureAsDataProperty(f) {
 | 
						|
  Object.defineProperty(f, 'name', {
 | 
						|
    value: 'g',
 | 
						|
  });
 | 
						|
  assertEquals('g', f.name);
 | 
						|
  Object.defineProperty(f, 'name', {
 | 
						|
    writable: true
 | 
						|
  });
 | 
						|
  f.name = 'h';
 | 
						|
  assertEquals('h', f.name);
 | 
						|
 | 
						|
  f.name = 42;
 | 
						|
  assertEquals(42, f.name);
 | 
						|
}
 | 
						|
test(testReconfigureAsDataProperty);
 | 
						|
 | 
						|
 | 
						|
function testReconfigureAsAccessorProperty(f) {
 | 
						|
  var name = 'g';
 | 
						|
  Object.defineProperty(f, 'name', {
 | 
						|
    get: function() { return name; },
 | 
						|
    set: function(v) { name = v; }
 | 
						|
  });
 | 
						|
  assertEquals('g', f.name);
 | 
						|
  f.name = 'h';
 | 
						|
  assertEquals('h', f.name);
 | 
						|
}
 | 
						|
test(testReconfigureAsAccessorProperty);
 | 
						|
 | 
						|
 | 
						|
function testFunctionToString(f) {
 | 
						|
  Object.defineProperty(f, 'name', {
 | 
						|
    value: {toString: function() { assertUnreachable(); }},
 | 
						|
  });
 | 
						|
  assertEquals('function f() {}', f.toString());
 | 
						|
}
 | 
						|
test(testFunctionToString);
 | 
						|
 | 
						|
 | 
						|
(function testSetOnInstance() {
 | 
						|
  // This needs to come before testDelete below
 | 
						|
  assertTrue(Function.prototype.hasOwnProperty('name'));
 | 
						|
 | 
						|
  function f() {}
 | 
						|
  delete f.name;
 | 
						|
  assertEquals('', f.name);
 | 
						|
 | 
						|
  f.name = 42;
 | 
						|
  assertEquals('', f.name);  // non writable prototype property.
 | 
						|
  assertFalse(f.hasOwnProperty('name'));
 | 
						|
 | 
						|
  Object.defineProperty(Function.prototype, 'name', {writable: true});
 | 
						|
 | 
						|
  f.name = 123;
 | 
						|
  assertTrue(f.hasOwnProperty('name'));
 | 
						|
  assertEquals(123, f.name);
 | 
						|
})();
 | 
						|
 | 
						|
 | 
						|
(function testDelete() {
 | 
						|
  function f() {}
 | 
						|
  assertTrue(delete f.name);
 | 
						|
  assertFalse(f.hasOwnProperty('name'));
 | 
						|
  assertEquals('', f.name);
 | 
						|
 | 
						|
  assertTrue(delete Function.prototype.name);
 | 
						|
  assertEquals(undefined, f.name);
 | 
						|
})();
 |