From 6a5d125dcd573d7fc61df325f6dc3a1cb4bf9cef Mon Sep 17 00:00:00 2001 From: Caio Lima Date: Mon, 19 Aug 2019 17:35:12 -0300 Subject: [PATCH] Added cases with declaration and usage of private static accessors --- ...getter-access-on-inner-arrow-function.case | 41 ++++++++++++++ ...-private-getter-access-on-inner-class.case | 39 ++++++++++++++ ...ivate-getter-access-on-inner-function.case | 43 +++++++++++++++ src/class-elements/static-private-getter.case | 53 ++++++++++++++++++ ...setter-access-on-inner-arrow-function.case | 42 +++++++++++++++ ...-private-setter-access-on-inner-class.case | 40 ++++++++++++++ ...ivate-setter-access-on-inner-function.case | 44 +++++++++++++++ src/class-elements/static-private-setter.case | 54 +++++++++++++++++++ 8 files changed, 356 insertions(+) create mode 100644 src/class-elements/static-private-getter-access-on-inner-arrow-function.case create mode 100644 src/class-elements/static-private-getter-access-on-inner-class.case create mode 100644 src/class-elements/static-private-getter-access-on-inner-function.case create mode 100644 src/class-elements/static-private-getter.case create mode 100644 src/class-elements/static-private-setter-access-on-inner-arrow-function.case create mode 100644 src/class-elements/static-private-setter-access-on-inner-class.case create mode 100644 src/class-elements/static-private-setter-access-on-inner-function.case create mode 100644 src/class-elements/static-private-setter.case diff --git a/src/class-elements/static-private-getter-access-on-inner-arrow-function.case b/src/class-elements/static-private-getter-access-on-inner-arrow-function.case new file mode 100644 index 0000000000..3088dadecd --- /dev/null +++ b/src/class-elements/static-private-getter-access-on-inner-arrow-function.case @@ -0,0 +1,41 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: static private getter access inside of an arrow function +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + ... + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +template: default +features: [class-static-methods-private] +---*/ + +//- elements +static get #f() { + return 'Test262'; +} + +static access() { + const arrowFunction = () => { + return this.#f; + }; + + return arrowFunction(); +} + +//- assertions +assert.sameValue(C.access(), 'Test262'); +assert.throws(TypeError, function() { + C.access.call({}); +}, 'Accessed static private getter from an object which did not contain it'); diff --git a/src/class-elements/static-private-getter-access-on-inner-class.case b/src/class-elements/static-private-getter-access-on-inner-class.case new file mode 100644 index 0000000000..f2fd9e12ea --- /dev/null +++ b/src/class-elements/static-private-getter-access-on-inner-class.case @@ -0,0 +1,39 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: static private getter access inside of an inner class +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + ... + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +template: default +features: [class-static-methods-private, class-static-fields-public] +---*/ + +//- elements +static get #f() { + return 'Test262'; +} + +static Inner = class { + static access(o) { + return o.#f; + } +} + +//- assertions +assert.sameValue(C.Inner.access(C), 'Test262'); +assert.throws(TypeError, function() { + C.Inner.access(C.Inner); +}, 'Accessed static private getter from an object which did not contain it'); diff --git a/src/class-elements/static-private-getter-access-on-inner-function.case b/src/class-elements/static-private-getter-access-on-inner-function.case new file mode 100644 index 0000000000..267269c527 --- /dev/null +++ b/src/class-elements/static-private-getter-access-on-inner-function.case @@ -0,0 +1,43 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: static private getter access inside of a nested function +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + ... + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +template: default +features: [class-static-methods-private] +---*/ + +//- elements +static get #f() { + return 'Test262'; +} + +static access() { + const self = this; + + function innerFunction() { + return self.#f; + } + + return innerFunction(); +} + +//- assertions +assert.sameValue(C.access(), 'Test262'); +assert.throws(TypeError, function() { + C.access.call({}); +}, 'Accessed static private getter from an arbitrary object'); diff --git a/src/class-elements/static-private-getter.case b/src/class-elements/static-private-getter.case new file mode 100644 index 0000000000..8d472769e3 --- /dev/null +++ b/src/class-elements/static-private-getter.case @@ -0,0 +1,53 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: static private getter declaration and usage +info: | + + MethodDefinition : + get ClassElementName () { FunctionBody } + set ClassElementName ( PropertySetParameterList ) { FunctionBody } + + ClassTail : ClassHeritage { ClassBody } + ... + 33. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that P's [[Kind]] field is either "method" or "accessor" and P's [[Brand]] is F, + a. PrivateBrandAdd(F, F). + 34. For each item fieldRecord in order from staticFields, + a. Perform ? DefineField(F, field). + + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + ... + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + ... + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +template: default +features: [class-static-methods-private] +---*/ + +//- elements +static get #f() { + return 'Test262'; +} + +static access() { + return this.#f; +} + +//- assertions +assert.sameValue(C.access(), 'Test262'); +assert.throws(TypeError, function() { + C.access.call({}); +}, 'Accessed static private getter from an arbitrary object'); diff --git a/src/class-elements/static-private-setter-access-on-inner-arrow-function.case b/src/class-elements/static-private-setter-access-on-inner-arrow-function.case new file mode 100644 index 0000000000..13b75a8d4e --- /dev/null +++ b/src/class-elements/static-private-setter-access-on-inner-arrow-function.case @@ -0,0 +1,42 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: static private setter access inside of an arrow function +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + ... + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +template: default +features: [class-static-methods-private] +---*/ + +//- elements +static set #f(v) { + this._v = v; +} + +static access() { + const arrowFunction = () => { + this.#f = 'Test262'; + }; + + arrowFunction(); +} + +//- assertions +C.access(); +assert.sameValue(C._v, 'Test262'); +assert.throws(TypeError, function() { + C.access.call({}); +}, 'Accessed static private setter from an object which did not contain it'); diff --git a/src/class-elements/static-private-setter-access-on-inner-class.case b/src/class-elements/static-private-setter-access-on-inner-class.case new file mode 100644 index 0000000000..4e60da9881 --- /dev/null +++ b/src/class-elements/static-private-setter-access-on-inner-class.case @@ -0,0 +1,40 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: static private setter access inside of an inner class +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + ... + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +template: default +features: [class-static-methods-private, class-static-fields-public] +---*/ + +//- elements +static set #f(v) { + return this._v = v; +} + +static Inner = class { + static access(o) { + o.#f = 'Test262'; + } +} + +//- assertions +C.Inner.access(C) +assert.sameValue(C._v, 'Test262'); +assert.throws(TypeError, function() { + C.Inner.access(C.Inner); +}, 'Accessed static private setter from an object which did not contain it'); diff --git a/src/class-elements/static-private-setter-access-on-inner-function.case b/src/class-elements/static-private-setter-access-on-inner-function.case new file mode 100644 index 0000000000..176f6118f7 --- /dev/null +++ b/src/class-elements/static-private-setter-access-on-inner-function.case @@ -0,0 +1,44 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: static private setter access inside of a nested function +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + ... + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +template: default +features: [class-static-methods-private] +---*/ + +//- elements +static set #f(v) { + this._v = v; +} + +static access() { + const self = this; + + function innerFunction() { + self.#f = 'Test262'; + } + + innerFunction(); +} + +//- assertions +C.access(); +assert.sameValue(C._v, 'Test262'); +assert.throws(TypeError, function() { + C.access.call({}); +}, 'Accessed static private setter from an arbitrary object'); diff --git a/src/class-elements/static-private-setter.case b/src/class-elements/static-private-setter.case new file mode 100644 index 0000000000..bf1f387b02 --- /dev/null +++ b/src/class-elements/static-private-setter.case @@ -0,0 +1,54 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: static private setter declaration and usage +info: | + + MethodDefinition : + get ClassElementName () { FunctionBody } + set ClassElementName ( PropertySetParameterList ) { FunctionBody } + + ClassTail : ClassHeritage { ClassBody } + ... + 33. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that P's [[Kind]] field is either "method" or "accessor" and P's [[Brand]] is F, + a. PrivateBrandAdd(F, F). + 34. For each item fieldRecord in order from staticFields, + a. Perform ? DefineField(F, field). + + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + ... + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + ... + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +template: default +features: [class-static-methods-private] +---*/ + +//- elements +static set #f(v) { + this._v = v; +} + +static access() { + this.#f = 'Test262'; +} + +//- assertions +C.access(); +assert.sameValue(C._v, 'Test262'); +assert.throws(TypeError, function() { + C.access.call({}); +}, 'Accessed static private setter from an arbitrary object');