Home | History | Annotate | Download | only in harmony
      1 // 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 })();
    162