Adding new test cases to validate public class fields initialization. (#2186)

This commit is contained in:
Caio Lima 2019-05-30 17:21:26 +02:00 committed by Leo Balter
parent b88a8b182c
commit c0c0417f04
5 changed files with 175 additions and 0 deletions

View File

@ -0,0 +1,46 @@
// Copyright (C) 2019 Caio Lima. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Public class fields initialization calls [[DefineOwnProperty]]
esid: sec-define-field
info: |
DefineField(receiver, fieldRecord)
...
8. If fieldName is a Private Name,
a. Perform ? PrivateFieldAdd(fieldName, receiver, initValue).
9. Else,
a. Assert: IsPropertyKey(fieldName) is true.
b. Perform ? CreateDataPropertyOrThrow(receiver, fieldName, initValue).
10. Return.
includes: [compareArray.js]
features: [class, class-fields-public, Proxy]
---*/
let arr = [];
let expectedTarget = null;
function ProxyBase() {
expectedTarget = this;
return new Proxy(this, {
defineProperty: function (target, key, descriptor) {
arr.push(key);
arr.push(descriptor.value);
arr.push(target);
assert.sameValue(descriptor.enumerable, true);
assert.sameValue(descriptor.configurable, true);
assert.sameValue(descriptor.writable, true);
return Reflect.defineProperty(target, key, descriptor);
}
});
}
class Test extends ProxyBase {
f = 3;
g = "Test262";
}
let t = new Test();
assert.sameValue(t.f, 3);
assert.sameValue(t.g, "Test262");
assert.compareArray(arr, ["f", 3, expectedTarget, "g", "Test262", expectedTarget]);

View File

@ -0,0 +1,28 @@
// Copyright (C) 2019 Caio Lima. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Public class field initialization fails on frozen object
esid: sec-define-field
info: |
DefineField(receiver, fieldRecord)
...
8. If fieldName is a Private Name,
a. Perform ? PrivateFieldAdd(fieldName, receiver, initValue).
9. Else,
a. Assert: IsPropertyKey(fieldName) is true.
b. Perform ? CreateDataPropertyOrThrow(receiver, fieldName, initValue).
10. Return.
includes: [compareArray.js]
features: [class, class-fields-public]
flags: [onlyStrict]
---*/
class Test {
f = Object.freeze(this);
g = "Test262";
}
assert.throws(TypeError, function() {
new Test();
}, "Frozen objects can't be changed");

View File

@ -0,0 +1,32 @@
// Copyright (C) 2019 Caio Lima. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: It is possible to add private fields on frozen objects
esid: sec-define-field
info: |
DefineField(receiver, fieldRecord)
...
8. If fieldName is a Private Name,
a. Perform ? PrivateFieldAdd(fieldName, receiver, initValue).
9. Else,
a. Assert: IsPropertyKey(fieldName) is true.
b. Perform ? CreateDataPropertyOrThrow(receiver, fieldName, initValue).
10. Return.
includes: [compareArray.js]
features: [class, class-fields-private]
flags: [onlyStrict]
---*/
class Test {
f = this;
#g = (Object.freeze(this), "Test262");
get g() {
return this.#g;
}
}
let t = new Test();
assert.sameValue(t.f, t);
assert.sameValue(t.g, "Test262");

View File

@ -0,0 +1,32 @@
// Copyright (C) 2019 Caio Lima. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Public class field initialization calls [[DefineOwnProperty]] and can be observed by Proxies
esid: sec-define-field
info: |
DefineField(receiver, fieldRecord)
...
8. If fieldName is a Private Name,
a. Perform ? PrivateFieldAdd(fieldName, receiver, initValue).
9. Else,
a. Assert: IsPropertyKey(fieldName) is true.
b. Perform ? CreateDataPropertyOrThrow(receiver, fieldName, initValue).
10. Return.
includes: [propertyHelper.js]
features: [class, class-fields-public]
---*/
function ProxyBase() {
return new Proxy(this, {
defineProperty: function (target, key, descriptor) {
throw new Test262Error();
}
});
}
class Base extends ProxyBase {
f = "Test262";
}
assert.throws(Test262Error, () => { new Base(); });

View File

@ -0,0 +1,37 @@
// Copyright (C) 2019 Caio Lima. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Public class field initialization calls [[DefineOwnProperty]] and don't execute super's getter
esid: sec-define-field
info: |
DefineField(receiver, fieldRecord)
...
8. If fieldName is a Private Name,
a. Perform ? PrivateFieldAdd(fieldName, receiver, initValue).
9. Else,
a. Assert: IsPropertyKey(fieldName) is true.
b. Perform ? CreateDataPropertyOrThrow(receiver, fieldName, initValue).
10. Return.
includes: [propertyHelper.js]
features: [class, class-fields-public]
---*/
class Super {
set f(v) {
throw new Test262Error();
}
}
class Base extends Super {
f = "Test262";
}
let o = new Base();
verifyProperty(o, "f", {
value: "Test262",
enumerable: true,
writable: true,
configurable: true,
});