// 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 testVariableDeclarationsFunction() { 'use strict'; var a = function(){}; assertEquals('a', a.name); let b = () => {}; assertEquals('b', b.name); const c = ((function(){})); assertEquals('c', c.name); var x = function(){}, y = () => {}, z = function withName() {}; assertEquals('x', x.name); assertEquals('y', y.name); assertEquals('withName', z.name); })(); (function testVariableDeclarationsClass() { 'use strict'; var a = class {}; assertEquals('a', a.name); let b = ((class {})); assertEquals('b', b.name); // Should not overwrite name property. const c = class { static name() { } } assertEquals('function', typeof c.name); var x = class {}, y = class NamedClass {}; assertEquals('x', x.name); assertEquals('NamedClass', y.name); })(); (function testObjectProperties() { 'use strict'; var obj = { a: function() {}, b: () => {}, c() { }, get d() { }, set d(val) { }, x: function withName() { }, y: class { }, z: class ClassName { }, ''() {}, 42: function() {}, 4.2: function() {}, __proto__: function() {}, }; assertEquals('a', obj.a.name); assertEquals('b', obj.b.name); assertEquals('c', obj.c.name); var dDescriptor = Object.getOwnPropertyDescriptor(obj, 'd'); assertEquals('get d', dDescriptor.get.name); assertEquals('set d', dDescriptor.set.name); assertEquals('withName', obj.x.name); assertEquals('y', obj.y.name); assertEquals('ClassName', obj.z.name); assertEquals('', obj[''].name); assertEquals('42', obj[42].name); assertEquals('4.2', obj[4.2].name); assertEquals('', obj.__proto__.name); })(); (function testClassProperties() { 'use strict'; class C { a() { } static b() { } get c() { } set c(val) { } ''() { } static ''() { } 42() { } static 43() { } get 44() { } set 44(val) { } static get constructor() { } static set constructor(val) { } }; assertEquals('a', C.prototype.a.name); assertEquals('b', C.b.name); var descriptor = Object.getOwnPropertyDescriptor(C.prototype, 'c'); assertEquals('get c', descriptor.get.name); assertEquals('set c', descriptor.set.name); assertEquals('', C.prototype[''].name); assertEquals('', C[''].name); assertEquals('42', C.prototype[42].name); assertEquals('43', C[43].name); var descriptor = Object.getOwnPropertyDescriptor(C.prototype, '44'); assertEquals('get 44', descriptor.get.name); assertEquals('set 44', descriptor.set.name); var descriptor = Object.getOwnPropertyDescriptor(C, 'constructor'); assertEquals('get constructor', descriptor.get.name); assertEquals('set constructor', descriptor.set.name); })(); (function testComputedProperties() { 'use strict'; var a = 'a'; var b = 'b'; var sym1 = Symbol('1'); var sym2 = Symbol('2'); var sym3 = Symbol('3'); var symNoDescription = Symbol(); var proto = "__proto__"; var obj = { ['']: function() {}, [a]: function() {}, [sym1]: function() {}, [sym2]: function withName() {}, [symNoDescription]: function() {}, [proto]: function() {}, get [sym3]() {}, set [b](val) {}, }; assertEquals('', obj[''].name); assertEquals('a', obj[a].name); assertEquals('[1]', obj[sym1].name); assertEquals('withName', obj[sym2].name); assertEquals('', obj[symNoDescription].name); assertEquals('__proto__', obj[proto].name); assertEquals('get [3]', Object.getOwnPropertyDescriptor(obj, sym3).get.name); assertEquals('set b', Object.getOwnPropertyDescriptor(obj, 'b').set.name); var objMethods = { ['']() {}, [a]() {}, [sym1]() {}, [symNoDescription]() {}, [proto]() {}, }; assertEquals('', objMethods[''].name); assertEquals('a', objMethods[a].name); assertEquals('[1]', objMethods[sym1].name); assertEquals('', objMethods[symNoDescription].name); assertEquals('__proto__', objMethods[proto].name); class C { ['']() { } static ''() {} [a]() { } [sym1]() { } static [sym2]() { } [symNoDescription]() { } get [sym3]() { } static set [b](val) { } } assertEquals('', C.prototype[''].name); assertEquals('', C[''].name); assertEquals('a', C.prototype[a].name); assertEquals('[1]', C.prototype[sym1].name); assertEquals('[2]', C[sym2].name); assertEquals('', C.prototype[symNoDescription].name); assertEquals('get [3]', Object.getOwnPropertyDescriptor(C.prototype, sym3).get.name); assertEquals('set b', Object.getOwnPropertyDescriptor(C, 'b').set.name); })(); (function testAssignment() { var basicFn, arrowFn, generatorFn, classLit; basicFn = function() { return true; }; assertEquals('basicFn', basicFn.name); var basicFn2 = basicFn; assertEquals('basicFn', basicFn2.name); basicFn = function functionWithName() { }; assertEquals("functionWithName", basicFn.name); arrowFn = x => x; assertEquals('arrowFn', arrowFn.name); var arrowFn2 = arrowFn; assertEquals('arrowFn', arrowFn2.name); generatorFn = function*() { yield true; }; assertEquals('generatorFn', generatorFn.name); var generatorFn2 = generatorFn; assertEquals('generatorFn', generatorFn2.name); generatorFn = function* generatorWithName() { }; assertEquals("generatorWithName", generatorFn.name); classLit = class { constructor() {} }; assertEquals('classLit', classLit.name); var classLit2 = classLit; assertEquals('classLit', classLit2.name); classLit = class classWithName { constructor() {} }; assertEquals('classWithName', classLit.name); classLit = class { constructor() {} static name() {} }; assertEquals('function', typeof classLit.name); classLit = class { constructor() {} static get name() { return true; } }; assertTrue(classLit.name); classLit = class { constructor() {} static ['name']() {} }; assertEquals('function', typeof classLit.name); classLit = class { constructor() {} static get ['name']() { return true; } }; assertTrue(classLit.name); })(); (function testObjectBindingPattern() { var { a = function() {}, b = () => {}, x = function withName() { }, y = class { }, z = class ClassName { }, q = class { static name() { return 42 } }, foo: bar = function() {}, inParens = (() => {}), inManyParens = ((((() => {})))), } = {}; assertEquals('a', a.name); assertEquals('b', b.name); assertEquals('withName', x.name); assertEquals('y', y.name); assertEquals('ClassName', z.name); assertEquals('function', typeof q.name); assertEquals('bar', bar.name); assertEquals('inParens', inParens.name) assertEquals('inManyParens', inManyParens.name) })(); (function testArrayBindingPattern() { var [ a = function() {}, b = () => {}, x = function withName() { }, y = class { }, z = class ClassName { }, q = class { static name() { return 42 } }, inParens = (() => {}), inManyParens = ((((() => {})))), ] = []; assertEquals('a', a.name); assertEquals('b', b.name); assertEquals('withName', x.name); assertEquals('y', y.name); assertEquals('ClassName', z.name); assertEquals('function', typeof q.name); assertEquals('inParens', inParens.name) assertEquals('inManyParens', inManyParens.name) })(); (function testObjectAssignmentPattern() { var a, b, x, y, z, q; ({ a = function() {}, b = () => {}, x = function withName() { }, y = class { }, z = class ClassName { }, q = class { static name() { return 42 } }, foo: bar = function() {}, inParens = (() => {}), inManyParens = ((((() => {})))), } = {}); assertEquals('a', a.name); assertEquals('b', b.name); assertEquals('withName', x.name); assertEquals('y', y.name); assertEquals('ClassName', z.name); assertEquals('function', typeof q.name); assertEquals('bar', bar.name); assertEquals('inParens', inParens.name) assertEquals('inManyParens', inManyParens.name) })(); (function testArrayAssignmentPattern() { var a, b, x, y, z, q; [ a = function() {}, b = () => {}, x = function withName() { }, y = class { }, z = class ClassName { }, q = class { static name() { return 42 } }, inParens = (() => {}), inManyParens = ((((() => {})))), ] = []; assertEquals('a', a.name); assertEquals('b', b.name); assertEquals('withName', x.name); assertEquals('y', y.name); assertEquals('ClassName', z.name); assertEquals('function', typeof q.name); assertEquals('inParens', inParens.name) assertEquals('inManyParens', inManyParens.name) })(); (function testParameterDestructuring() { (function({ a = function() {}, b = () => {}, x = function withName() { }, y = class { }, z = class ClassName { }, q = class { static name() { return 42 } }, foo: bar = function() {}, inParens = (() => {}), inManyParens = ((((() => {})))) }) { assertEquals('a', a.name); assertEquals('b', b.name); assertEquals('withName', x.name); assertEquals('y', y.name); assertEquals('ClassName', z.name); assertEquals('function', typeof q.name); assertEquals('bar', bar.name); assertEquals('inParens', inParens.name) assertEquals('inManyParens', inManyParens.name) })({}); (function([ a = function() {}, b = () => {}, x = function withName() { }, y = class { }, z = class ClassName { }, q = class { static name() { return 42 } }, inParens = (() => {}), inManyParens = ((((() => {})))) ]) { assertEquals('a', a.name); assertEquals('b', b.name); assertEquals('withName', x.name); assertEquals('y', y.name); assertEquals('ClassName', z.name); assertEquals('function', typeof q.name); assertEquals('inParens', inParens.name) assertEquals('inManyParens', inManyParens.name) })([]); })(); (function testDefaultParameters() { (function(a = function() {}, b = () => {}, x = function withName() { }, y = class { }, z = class ClassName { }, q = class { static name() { return 42 } }, inParens = (() => {}), inManyParens = ((((() => {}))))) { assertEquals('a', a.name); assertEquals('b', b.name); assertEquals('withName', x.name); assertEquals('y', y.name); assertEquals('ClassName', z.name); assertEquals('function', typeof q.name); assertEquals('inParens', inParens.name) assertEquals('inManyParens', inManyParens.name) })(); })(); (function testComputedNameNotShared() { function makeClass(propName) { return class { static [propName]() {} } } var sym1 = Symbol('1'); var sym2 = Symbol('2'); var class1 = makeClass(sym1); assertEquals('[1]', class1[sym1].name); var class2 = makeClass(sym2); assertEquals('[2]', class2[sym2].name); assertEquals('[1]', class1[sym1].name); })(); (function testComputedNamesOnlyAppliedSyntactically() { function factory() { return () => {}; } var obj = { ['foo']: factory() }; assertEquals('', obj.foo.name); })(); (function testNameNotReflectedInToString() { var f = function () {}; var g = function* () {}; var obj = { ['h']: function () {}, i: () => {} }; assertEquals('function () {}', f.toString()); assertEquals('function* () {}', g.toString()); assertEquals('function () {}', obj.h.toString()); assertEquals('() => {}', obj.i.toString()); })(); (function testClassNameOrder() { assertEquals(['length', 'prototype', 'name'], Object.getOwnPropertyNames(class {})); var tmp = {'': class {}}; var Tmp = tmp['']; assertEquals(['length', 'prototype', 'name'], Object.getOwnPropertyNames(Tmp)); var name = () => ''; var tmp = {[name()]: class {}}; var Tmp = tmp[name()]; assertEquals(['length', 'prototype', 'name'], Object.getOwnPropertyNames(Tmp)); class A { } assertEquals(['length', 'prototype', 'name'], Object.getOwnPropertyNames(A)); class B { static foo() { } } assertEquals(['length', 'prototype', 'foo', 'name'], Object.getOwnPropertyNames(B)); class C { static name() { } static foo() { } } assertEquals(['length', 'prototype', 'name', 'foo'], Object.getOwnPropertyNames(C)); })(); (function testStaticName() { class C { static name() { return 42; } } assertEquals(42, C.name()); assertEquals(undefined, new C().name); class D { static get name() { return 17; } } assertEquals(17, D.name); assertEquals(undefined, new D().name); var c = class { static name() { return 42; } } assertEquals(42, c.name()); assertEquals(undefined, new c().name); var d = class { static get name() { return 17; } } assertEquals(17, d.name); assertEquals(undefined, new d().name); })(); (function testNonStaticName() { class C { name() { return 42; } } assertEquals('C', C.name); assertEquals(42, new C().name()); class D { get name() { return 17; } } assertEquals('D', D.name); assertEquals(17, new D().name); var c = class { name() { return 42; } } assertEquals('c', c.name); assertEquals(42, new c().name()); var d = class { get name() { return 17; } } assertEquals('d', d.name); assertEquals(17, new d().name); })();