test262/test/language/statements/class/definition/fn-name-static-precedence.js
Timothy Gu 6319cb1e2a Add more static class property ordering tests
Since https://github.com/tc39/ecma262/pull/1490, the "length" and "name"
properties of a class are defined before any static methods. This is
tested by #2057, in test/language/computed-property-names of all places.

At the same time, static methods with "name" as the name would overwrite
the original property, but retain the original property enumeration
order. This was not previously tested. In fact, the overwriting behavior
was not tested at all for the "length" property.

This commit mends both holes in test coverage.
2021-07-16 09:27:16 -04:00

80 lines
2.4 KiB
JavaScript

// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-runtime-semantics-classdefinitionevaluation
description: >
Function `name` attribute not inferred in presence of static `name` method
info: |
ClassTail : ClassHeritage_opt { ClassBody_opt }
14. If constructor is empty, then [...]
b. Let F be ! CreateBuiltinFunction(steps, 0, className, « [[ConstructorKind]], [[SourceText]] », empty, constructorParent).
15. Else, [...]
d. Perform ! SetFunctionName(F, className).
25. For each ClassElement e of elements, do
a. If IsStatic of e is false, then [...]
b. Else,
i. Let field be ClassElementEvaluation of e with arguments F and false.
[ This overwrites the name property on F. ]
includes: [compareArray.js]
features: [generators]
---*/
class A {
static method() {
throw new Test262Error('Static method should not be executed during definition');
}
static name() {
throw new Test262Error('Static method should not be executed during definition');
}
}
assert.sameValue(typeof A.name, 'function');
assert(compareArray(Object.getOwnPropertyNames(A), ['length', 'name', 'prototype', 'method']))
var attr = 'name';
class B {
static [attr]() {
throw new Test262Error(
'Static method defined via computed property should not be executed ' +
'during definition'
);
}
}
assert.sameValue(typeof B.name, 'function');
assert(compareArray(Object.getOwnPropertyNames(B), ['length', 'name', 'prototype']))
var isDefined = false;
class C {
static get name() {
if (isDefined) {
return 'pass';
}
throw new Test262Error('Static `get` accessor should not be executed during definition');
}
}
isDefined = true;
assert.sameValue(C.name, 'pass');
assert(compareArray(Object.getOwnPropertyNames(C), ['length', 'name', 'prototype']))
class D {
static set name(_) {
throw new Test262Error('Static `set` accessor should not be executed during definition');
}
}
assert.sameValue(D.name, undefined);
assert(compareArray(Object.getOwnPropertyNames(D), ['length', 'name', 'prototype']))
class E {
static *name() {
throw new Test262Error('Static GeneratorMethod should not be executed during definition');
}
}
assert.sameValue(typeof E.name, 'function');
assert(compareArray(Object.getOwnPropertyNames(E), ['length', 'name', 'prototype']))