blob: 8ca5d8209acd988d4273f9abfa3b5d9ebe52fc1b [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4//
5// Flags: --harmony-function-name
6
7(function testVariableDeclarationsFunction() {
8 'use strict';
9 var a = function(){};
10 assertEquals('a', a.name);
11 let b = () => {};
12 assertEquals('b', b.name);
13 const c = ((function(){}));
14 assertEquals('c', c.name);
15
16 var x = function(){}, y = () => {}, z = function withName() {};
17 assertEquals('x', x.name);
18 assertEquals('y', y.name);
19 assertEquals('withName', z.name);
20})();
21
22(function testVariableDeclarationsClass() {
23 'use strict';
24 var a = class {};
25 assertEquals('a', a.name);
26 let b = ((class {}));
27 assertEquals('b', b.name);
28 // Should not overwrite name property.
29 const c = class { static name() { } }
30 assertEquals('function', typeof c.name);
31
32 var x = class {}, y = class NamedClass {};
33 assertEquals('x', x.name);
34 assertEquals('NamedClass', y.name);
35})();
36
37(function testObjectProperties() {
38 'use strict';
39 var obj = {
40 a: function() {},
41 b: () => {},
42 c() { },
43 get d() { },
44 set d(val) { },
45 x: function withName() { },
46 y: class { },
47 z: class ClassName { },
48 42: function() {},
49 4.2: function() {},
50 __proto__: function() {},
51 };
52
53 assertEquals('a', obj.a.name);
54 assertEquals('b', obj.b.name);
55 assertEquals('c', obj.c.name);
56 var dDescriptor = Object.getOwnPropertyDescriptor(obj, 'd');
57 assertEquals('get d', dDescriptor.get.name);
58 assertEquals('set d', dDescriptor.set.name);
59 assertEquals('withName', obj.x.name);
60 assertEquals('y', obj.y.name);
61 assertEquals('ClassName', obj.z.name);
62 assertEquals('42', obj[42].name);
63 assertEquals('4.2', obj[4.2].name);
64 assertEquals('', obj.__proto__.name);
65})();
66
67(function testClassProperties() {
68 'use strict';
69 class C {
70 a() { }
71 static b() { }
72 get c() { }
73 set c(val) { }
74 42() { }
75 static 43() { }
76 get 44() { }
77 set 44(val) { }
78 };
79
80 assertEquals('a', C.prototype.a.name);
81 assertEquals('b', C.b.name);
82 var descriptor = Object.getOwnPropertyDescriptor(C.prototype, 'c');
83 assertEquals('get c', descriptor.get.name);
84 assertEquals('set c', descriptor.set.name);
85 assertEquals('42', C.prototype[42].name);
86 assertEquals('43', C[43].name);
87 var descriptor = Object.getOwnPropertyDescriptor(C.prototype, '44');
88 assertEquals('get 44', descriptor.get.name);
89 assertEquals('set 44', descriptor.set.name);
90})();
91
92// TODO(adamk): Make computed property names work.
93(function testComputedProperties() {
94 'use strict';
95 var a = 'a';
96 var sym1 = Symbol('1');
97 var sym2 = Symbol('2');
98 var obj = {
99 [a]: function() {},
100 [sym1]: function() {},
101 [sym2]: function withName() {},
102 };
103
104 // Should be 'a'
105 assertEquals('', obj[a].name);
106 // Should be '[1]'
107 assertEquals('', obj[sym1].name);
108 assertEquals('withName', obj[sym2].name);
109
110 class C {
111 [a]() { }
112 [sym1]() { }
113 static [sym2]() { }
114 }
115
116 // Should be 'a'
117 assertEquals('', C.prototype[a].name);
118 // Should be '[1]'
119 assertEquals('', C.prototype[sym1].name);
120 // Should be '[2]'
121 assertEquals('', C[sym2].name);
122})();
123
124
125(function testAssignment() {
126 var basicFn, arrowFn, generatorFn, classLit;
127
128 basicFn = function() { return true; };
129 assertEquals('basicFn', basicFn.name);
130 var basicFn2 = basicFn;
131 assertEquals('basicFn', basicFn2.name);
132 basicFn = function functionWithName() { };
133 assertEquals("functionWithName", basicFn.name);
134
135 arrowFn = x => x;
136 assertEquals('arrowFn', arrowFn.name);
137 var arrowFn2 = arrowFn;
138 assertEquals('arrowFn', arrowFn2.name);
139
140 generatorFn = function*() { yield true; };
141 assertEquals('generatorFn', generatorFn.name);
142 var generatorFn2 = generatorFn;
143 assertEquals('generatorFn', generatorFn2.name);
144 generatorFn = function* generatorWithName() { };
145 assertEquals("generatorWithName", generatorFn.name);
146
147 classLit = class { constructor() {} };
148 assertEquals('classLit', classLit.name);
149 var classLit2 = classLit;
150 assertEquals('classLit', classLit2.name);
151 classLit = class classWithName { constructor() {} };
152 assertEquals('classWithName', classLit.name);
153 classLit = class { constructor() {} static name() {} };
154 assertEquals('function', typeof classLit.name);
155 classLit = class { constructor() {} static get name() { return true; } };
156 assertTrue(classLit.name);
157 classLit = class { constructor() {} static ['name']() {} };
158 assertEquals('function', typeof classLit.name);
159 classLit = class { constructor() {} static get ['name']() { return true; } };
160 assertTrue(classLit.name);
161})();