blob: 7bb1f6ae01e59c107e0f99ef8766ea3e5942016f [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
Ben Murdoch097c5b22016-05-18 11:27:45 +01006// Flags: --harmony-destructuring-bind --harmony-destructuring-assignment
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00007
8(function testVariableDeclarationsFunction() {
9 'use strict';
10 var a = function(){};
11 assertEquals('a', a.name);
12 let b = () => {};
13 assertEquals('b', b.name);
14 const c = ((function(){}));
15 assertEquals('c', c.name);
16
17 var x = function(){}, y = () => {}, z = function withName() {};
18 assertEquals('x', x.name);
19 assertEquals('y', y.name);
20 assertEquals('withName', z.name);
21})();
22
23(function testVariableDeclarationsClass() {
24 'use strict';
25 var a = class {};
26 assertEquals('a', a.name);
27 let b = ((class {}));
28 assertEquals('b', b.name);
29 // Should not overwrite name property.
30 const c = class { static name() { } }
31 assertEquals('function', typeof c.name);
32
33 var x = class {}, y = class NamedClass {};
34 assertEquals('x', x.name);
35 assertEquals('NamedClass', y.name);
36})();
37
38(function testObjectProperties() {
39 'use strict';
40 var obj = {
41 a: function() {},
42 b: () => {},
43 c() { },
44 get d() { },
45 set d(val) { },
46 x: function withName() { },
47 y: class { },
48 z: class ClassName { },
49 42: function() {},
50 4.2: function() {},
51 __proto__: function() {},
52 };
53
54 assertEquals('a', obj.a.name);
55 assertEquals('b', obj.b.name);
56 assertEquals('c', obj.c.name);
57 var dDescriptor = Object.getOwnPropertyDescriptor(obj, 'd');
58 assertEquals('get d', dDescriptor.get.name);
59 assertEquals('set d', dDescriptor.set.name);
60 assertEquals('withName', obj.x.name);
61 assertEquals('y', obj.y.name);
62 assertEquals('ClassName', obj.z.name);
63 assertEquals('42', obj[42].name);
64 assertEquals('4.2', obj[4.2].name);
65 assertEquals('', obj.__proto__.name);
66})();
67
68(function testClassProperties() {
69 'use strict';
70 class C {
71 a() { }
72 static b() { }
73 get c() { }
74 set c(val) { }
75 42() { }
76 static 43() { }
77 get 44() { }
78 set 44(val) { }
79 };
80
81 assertEquals('a', C.prototype.a.name);
82 assertEquals('b', C.b.name);
83 var descriptor = Object.getOwnPropertyDescriptor(C.prototype, 'c');
84 assertEquals('get c', descriptor.get.name);
85 assertEquals('set c', descriptor.set.name);
86 assertEquals('42', C.prototype[42].name);
87 assertEquals('43', C[43].name);
88 var descriptor = Object.getOwnPropertyDescriptor(C.prototype, '44');
89 assertEquals('get 44', descriptor.get.name);
90 assertEquals('set 44', descriptor.set.name);
91})();
92
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000093(function testComputedProperties() {
94 'use strict';
95 var a = 'a';
Ben Murdoch097c5b22016-05-18 11:27:45 +010096 var b = 'b';
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000097 var sym1 = Symbol('1');
98 var sym2 = Symbol('2');
Ben Murdoch097c5b22016-05-18 11:27:45 +010099 var sym3 = Symbol('3');
100 var symNoDescription = Symbol();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000101 var obj = {
102 [a]: function() {},
103 [sym1]: function() {},
104 [sym2]: function withName() {},
Ben Murdoch097c5b22016-05-18 11:27:45 +0100105 [symNoDescription]: function() {},
106
107 get [sym3]() {},
108 set [b](val) {},
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000109 };
110
Ben Murdoch097c5b22016-05-18 11:27:45 +0100111 assertEquals('a', obj[a].name);
112 assertEquals('[1]', obj[sym1].name);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000113 assertEquals('withName', obj[sym2].name);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100114 assertEquals('', obj[symNoDescription].name);
115
116 assertEquals('get [3]', Object.getOwnPropertyDescriptor(obj, sym3).get.name);
117 assertEquals('set b', Object.getOwnPropertyDescriptor(obj, 'b').set.name);
118
119 var objMethods = {
120 [a]() {},
121 [sym1]() {},
122 [symNoDescription]: function() {},
123 };
124
125 assertEquals('a', objMethods[a].name);
126 assertEquals('[1]', objMethods[sym1].name);
127 assertEquals('', objMethods[symNoDescription].name);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000128
129 class C {
130 [a]() { }
131 [sym1]() { }
132 static [sym2]() { }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100133 [symNoDescription]() { }
134
135 get [sym3]() { }
136 static set [b](val) { }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000137 }
138
Ben Murdoch097c5b22016-05-18 11:27:45 +0100139 assertEquals('a', C.prototype[a].name);
140 assertEquals('[1]', C.prototype[sym1].name);
141 assertEquals('[2]', C[sym2].name);
142 assertEquals('', C.prototype[symNoDescription].name);
143
144 assertEquals('get [3]', Object.getOwnPropertyDescriptor(C.prototype, sym3).get.name);
145 assertEquals('set b', Object.getOwnPropertyDescriptor(C, 'b').set.name);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000146})();
147
148
149(function testAssignment() {
150 var basicFn, arrowFn, generatorFn, classLit;
151
152 basicFn = function() { return true; };
153 assertEquals('basicFn', basicFn.name);
154 var basicFn2 = basicFn;
155 assertEquals('basicFn', basicFn2.name);
156 basicFn = function functionWithName() { };
157 assertEquals("functionWithName", basicFn.name);
158
159 arrowFn = x => x;
160 assertEquals('arrowFn', arrowFn.name);
161 var arrowFn2 = arrowFn;
162 assertEquals('arrowFn', arrowFn2.name);
163
164 generatorFn = function*() { yield true; };
165 assertEquals('generatorFn', generatorFn.name);
166 var generatorFn2 = generatorFn;
167 assertEquals('generatorFn', generatorFn2.name);
168 generatorFn = function* generatorWithName() { };
169 assertEquals("generatorWithName", generatorFn.name);
170
171 classLit = class { constructor() {} };
172 assertEquals('classLit', classLit.name);
173 var classLit2 = classLit;
174 assertEquals('classLit', classLit2.name);
175 classLit = class classWithName { constructor() {} };
176 assertEquals('classWithName', classLit.name);
177 classLit = class { constructor() {} static name() {} };
178 assertEquals('function', typeof classLit.name);
179 classLit = class { constructor() {} static get name() { return true; } };
180 assertTrue(classLit.name);
181 classLit = class { constructor() {} static ['name']() {} };
182 assertEquals('function', typeof classLit.name);
183 classLit = class { constructor() {} static get ['name']() { return true; } };
184 assertTrue(classLit.name);
185})();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100186
187(function testObjectBindingPattern() {
188 var {
189 a = function() {},
190 b = () => {},
191 x = function withName() { },
192 y = class { },
193 z = class ClassName { },
194 q = class { static name() { return 42 } },
195 foo: bar = function() {},
196 inParens = (() => {}),
197 inManyParens = ((((() => {})))),
198 } = {};
199 assertEquals('a', a.name);
200 assertEquals('b', b.name);
201 assertEquals('withName', x.name);
202 assertEquals('y', y.name);
203 assertEquals('ClassName', z.name);
204 assertEquals('function', typeof q.name);
205 assertEquals('bar', bar.name);
206 assertEquals('inParens', inParens.name)
207 assertEquals('inManyParens', inManyParens.name)
208})();
209
210(function testArrayBindingPattern() {
211 var [
212 a = function() {},
213 b = () => {},
214 x = function withName() { },
215 y = class { },
216 z = class ClassName { },
217 q = class { static name() { return 42 } },
218 inParens = (() => {}),
219 inManyParens = ((((() => {})))),
220 ] = [];
221 assertEquals('a', a.name);
222 assertEquals('b', b.name);
223 assertEquals('withName', x.name);
224 assertEquals('y', y.name);
225 assertEquals('ClassName', z.name);
226 assertEquals('function', typeof q.name);
227 assertEquals('inParens', inParens.name)
228 assertEquals('inManyParens', inManyParens.name)
229})();
230
231(function testObjectAssignmentPattern() {
232 var a, b, x, y, z, q;
233 ({
234 a = function() {},
235 b = () => {},
236 x = function withName() { },
237 y = class { },
238 z = class ClassName { },
239 q = class { static name() { return 42 } },
240 foo: bar = function() {},
241 inParens = (() => {}),
242 inManyParens = ((((() => {})))),
243 } = {});
244 assertEquals('a', a.name);
245 assertEquals('b', b.name);
246 assertEquals('withName', x.name);
247 assertEquals('y', y.name);
248 assertEquals('ClassName', z.name);
249 assertEquals('function', typeof q.name);
250 assertEquals('bar', bar.name);
251 assertEquals('inParens', inParens.name)
252 assertEquals('inManyParens', inManyParens.name)
253})();
254
255(function testArrayAssignmentPattern() {
256 var a, b, x, y, z, q;
257 [
258 a = function() {},
259 b = () => {},
260 x = function withName() { },
261 y = class { },
262 z = class ClassName { },
263 q = class { static name() { return 42 } },
264 inParens = (() => {}),
265 inManyParens = ((((() => {})))),
266 ] = [];
267 assertEquals('a', a.name);
268 assertEquals('b', b.name);
269 assertEquals('withName', x.name);
270 assertEquals('y', y.name);
271 assertEquals('ClassName', z.name);
272 assertEquals('function', typeof q.name);
273 assertEquals('inParens', inParens.name)
274 assertEquals('inManyParens', inManyParens.name)
275})();
276
277(function testParameterDestructuring() {
278 (function({ a = function() {},
279 b = () => {},
280 x = function withName() { },
281 y = class { },
282 z = class ClassName { },
283 q = class { static name() { return 42 } },
284 foo: bar = function() {},
285 inParens = (() => {}),
286 inManyParens = ((((() => {})))) }) {
287 assertEquals('a', a.name);
288 assertEquals('b', b.name);
289 assertEquals('withName', x.name);
290 assertEquals('y', y.name);
291 assertEquals('ClassName', z.name);
292 assertEquals('function', typeof q.name);
293 assertEquals('bar', bar.name);
294 assertEquals('inParens', inParens.name)
295 assertEquals('inManyParens', inManyParens.name)
296 })({});
297
298 (function([ a = function() {},
299 b = () => {},
300 x = function withName() { },
301 y = class { },
302 z = class ClassName { },
303 q = class { static name() { return 42 } },
304 inParens = (() => {}),
305 inManyParens = ((((() => {})))) ]) {
306 assertEquals('a', a.name);
307 assertEquals('b', b.name);
308 assertEquals('withName', x.name);
309 assertEquals('y', y.name);
310 assertEquals('ClassName', z.name);
311 assertEquals('function', typeof q.name);
312 assertEquals('inParens', inParens.name)
313 assertEquals('inManyParens', inManyParens.name)
314 })([]);
315})();
316
317(function testDefaultParameters() {
318 (function(a = function() {},
319 b = () => {},
320 x = function withName() { },
321 y = class { },
322 z = class ClassName { },
323 q = class { static name() { return 42 } },
324 inParens = (() => {}),
325 inManyParens = ((((() => {}))))) {
326 assertEquals('a', a.name);
327 assertEquals('b', b.name);
328 assertEquals('withName', x.name);
329 assertEquals('y', y.name);
330 assertEquals('ClassName', z.name);
331 assertEquals('function', typeof q.name);
332 assertEquals('inParens', inParens.name)
333 assertEquals('inManyParens', inManyParens.name)
334 })();
335})();
336
337(function testComputedNameNotShared() {
338 function makeClass(propName) {
339 return class {
340 static [propName]() {}
341 }
342 }
343
344 var sym1 = Symbol('1');
345 var sym2 = Symbol('2');
346 var class1 = makeClass(sym1);
347 assertEquals('[1]', class1[sym1].name);
348 var class2 = makeClass(sym2);
349 assertEquals('[2]', class2[sym2].name);
350 assertEquals('[1]', class1[sym1].name);
351})();
352
353
354(function testComputedNamesOnlyAppliedSyntactically() {
355 function factory() { return () => {}; }
356
357 var obj = { ['foo']: factory() };
358 assertEquals('', obj.foo.name);
359})();
360
361
362(function testNameNotReflectedInToString() {
363 var f = function() {};
364 var g = function*() {};
365 var obj = {
366 ['h']: function() {},
367 i: () => {}
368 };
369 assertEquals('function () {}', f.toString());
370 assertEquals('function* () {}', g.toString());
371 assertEquals('function () {}', obj.h.toString());
372 assertEquals('() => {}', obj.i.toString());
373})();