-
Notifications
You must be signed in to change notification settings - Fork 468
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add more static class property ordering tests
Since tc39/ecma262#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.
- Loading branch information
Showing
2 changed files
with
107 additions
and
12 deletions.
There are no files selected for viewing
82 changes: 82 additions & 0 deletions
82
test/language/statements/class/definition/fn-length-static-precedence.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
// 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 `length` attribute not inferred in presence of static `length` 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, | ||
a. Let constructorInfo be ! DefineMethod of constructor with arguments proto and constructorParent. | ||
[ This sets the length property on constructorInfo.[[Closure]]. ] | ||
b. Let F be constructorInfo.[[Closure]]. | ||
[...] | ||
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 length property on F. ] | ||
includes: [compareArray.js] | ||
features: [generators] | ||
---*/ | ||
|
||
class A { | ||
static method() { | ||
throw new Test262Error('Static method should not be executed during definition'); | ||
} | ||
static length() { | ||
throw new Test262Error('Static method should not be executed during definition'); | ||
} | ||
} | ||
|
||
assert.sameValue(typeof A.length, 'function'); | ||
assert(compareArray(Object.getOwnPropertyNames(A), ['length', 'name', 'prototype', 'method'])) | ||
|
||
var attr = 'length'; | ||
class B { | ||
static [attr]() { | ||
throw new Test262Error( | ||
'Static method defined via computed property should not be executed ' + | ||
'during definition' | ||
); | ||
} | ||
} | ||
|
||
assert.sameValue(typeof B.length, 'function'); | ||
assert(compareArray(Object.getOwnPropertyNames(B), ['length', 'name', 'prototype'])) | ||
|
||
var isDefined = false; | ||
class C { | ||
static get length() { | ||
if (isDefined) { | ||
return 'pass'; | ||
} | ||
throw new Test262Error('Static `get` accessor should not be executed during definition'); | ||
} | ||
} | ||
|
||
isDefined = true; | ||
assert.sameValue(C.length, 'pass'); | ||
assert(compareArray(Object.getOwnPropertyNames(C), ['length', 'name', 'prototype'])) | ||
|
||
class D { | ||
static set length(_) { | ||
throw new Test262Error('Static `set` accessor should not be executed during definition'); | ||
} | ||
} | ||
|
||
assert.sameValue(D.length, undefined); | ||
assert(compareArray(Object.getOwnPropertyNames(D), ['length', 'name', 'prototype'])) | ||
|
||
class E { | ||
static *length() { | ||
throw new Test262Error('Static GeneratorMethod should not be executed during definition'); | ||
} | ||
} | ||
|
||
assert.sameValue(typeof E.length, 'function'); | ||
assert(compareArray(Object.getOwnPropertyNames(E), ['length', 'name', 'prototype'])) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters