diff --git a/src/dstr-assignment/obj-rest-descriptors.case b/src/dstr-assignment/obj-rest-descriptors.case new file mode 100644 index 0000000000000000000000000000000000000000..a6d645d21001c1b7acb4719fb2e49f51a346f334 --- /dev/null +++ b/src/dstr-assignment/obj-rest-descriptors.case @@ -0,0 +1,33 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + Object created from rest deconstruction doesn't copy source + object property descriptors. +template: default +esid: pending +includes: [propertyHelper.js] +---*/ + +//- setup +var rest; +var obj = {}; +Object.defineProperty(obj, "a", { value: 3, configurable: false, enumerable: true }); +Object.defineProperty(obj, "b", { value: 4, writable: false, enumerable: true }); +//- elems +{...rest} +//- vals +obj +//- body +assert.sameValue(rest.a, 3); +assert.sameValue(rest.b, 4); + +verifyEnumerable(rest, "a"); +verifyWritable(rest, "a"); +verifyConfigurable(rest, "a"); + +verifyEnumerable(rest, "b"); +verifyWritable(rest, "b"); +verifyConfigurable(rest, "b"); + diff --git a/src/dstr-assignment/obj-rest-empty-obj.case b/src/dstr-assignment/obj-rest-empty-obj.case new file mode 100644 index 0000000000000000000000000000000000000000..96953623a2dea82860173d5784ff275b270fc1cd --- /dev/null +++ b/src/dstr-assignment/obj-rest-empty-obj.case @@ -0,0 +1,22 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + RestBindingInitialization creates a new object even if lhs is an empty object +template: default +esid: pending +---*/ + +//- setup +var rest; + +//- elems +{...rest} +//- vals +{} +//- body +assert.notSameValue(rest, undefined); +assert.notSameValue(rest, null); +assert.sameValue(typeof rest, "object"); + diff --git a/src/dstr-assignment/obj-rest-getter-abrupt-get-error.case b/src/dstr-assignment/obj-rest-getter-abrupt-get-error.case new file mode 100644 index 0000000000000000000000000000000000000000..dc3e1f3ba557f8b39f16e44f421c8260be3af3b0 --- /dev/null +++ b/src/dstr-assignment/obj-rest-getter-abrupt-get-error.case @@ -0,0 +1,22 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + Rest deconstruction doesn't happen if getter return is abrupt +template: error +esid: pending +---*/ + +//- setup +var x; +var count = 0; +//- elems +{...x} +//- vals +{ get v() { count++; throw new Test262Error(); } } +//- error +Test262Error +//- teardown +assert.sameValue(count, 1); + diff --git a/src/dstr-assignment/obj-rest-getter.case b/src/dstr-assignment/obj-rest-getter.case new file mode 100644 index 0000000000000000000000000000000000000000..5d6264e3069f98b6c141b118482f539fd04f4f84 --- /dev/null +++ b/src/dstr-assignment/obj-rest-getter.case @@ -0,0 +1,26 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + Getter is called when obj is being deconstructed to a rest Object +template: default +esid: pending +includes: [propertyHelper.js] +---*/ + +//- setup +var x; +var count = 0; +//- elems +{...x} +//- vals +{ get v() { count++; return 2; } } +//- body +assert.sameValue(x.v, 2); +assert.sameValue(count, 1); + +verifyEnumerable(x, "v"); +verifyWritable(x, "v"); +verifyConfigurable(x, "v"); + diff --git a/src/dstr-assignment/obj-rest-nested-obj-nested-rest.case b/src/dstr-assignment/obj-rest-nested-obj-nested-rest.case new file mode 100644 index 0000000000000000000000000000000000000000..5971ad243c0fea453dc019cc56f75424f8c2614a --- /dev/null +++ b/src/dstr-assignment/obj-rest-nested-obj-nested-rest.case @@ -0,0 +1,35 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + When DestructuringAssignmentTarget is an object literal, it should be parsed + parsed as a DestructuringAssignmentPattern and evaluated as a destructuring + assignment and object rest desconstruction is allowed in that case. +template: default +esid: pending +includes: [propertyHelper.js] +---*/ + +//- setup +var a, b, c, rest; +//- elems +{a, b, ...{c, ...rest}} +//- vals +{a: 1, b: 2, c: 3, d: 4, e: 5} +//- body +assert.sameValue(a, 1); +assert.sameValue(b, 2); +assert.sameValue(c, 3); + +assert.sameValue(rest.d, 4); +assert.sameValue(rest.e, 5); + +verifyEnumerable(rest, "d"); +verifyWritable(rest, "d"); +verifyConfigurable(rest, "d"); + +verifyEnumerable(rest, "e"); +verifyWritable(rest, "e"); +verifyConfigurable(rest, "e"); + diff --git a/src/dstr-assignment/obj-rest-nested-obj.case b/src/dstr-assignment/obj-rest-nested-obj.case new file mode 100644 index 0000000000000000000000000000000000000000..9352e224133496ff23233875fcfe453b5da780ae --- /dev/null +++ b/src/dstr-assignment/obj-rest-nested-obj.case @@ -0,0 +1,25 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + When DestructuringAssignmentTarget is an object literal, it should be parsed + parsed as a DestructuringAssignmentPattern and evaluated as a destructuring + assignment. +template: default +esid: pending +---*/ + +//- setup +var a, b, c, d, e; +//- elems +{a, b, ...{c, e}} +//- vals +{a: 1, b: 2, c: 3, d: 4, e: 5} +//- body +assert.sameValue(a, 1); +assert.sameValue(b, 2); +assert.sameValue(c, 3); +assert.sameValue(e, 5); +assert.sameValue(d, undefined); + diff --git a/src/dstr-assignment/obj-rest-not-last-element-invalid.case b/src/dstr-assignment/obj-rest-not-last-element-invalid.case new file mode 100644 index 0000000000000000000000000000000000000000..2124baac0fbe11f5ff39e368bba3199a40412ca0 --- /dev/null +++ b/src/dstr-assignment/obj-rest-not-last-element-invalid.case @@ -0,0 +1,21 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + Object rest element needs to be the last AssignmenProperty + in ObjectAssignmentPattern. +template: syntax +esid: pending +negative: + phase: early + type: SyntaxError +---*/ + +//- setup +var rest, b; +//- elems +{...rest, b} +//- vals +{} + diff --git a/src/dstr-assignment/obj-rest-number.case b/src/dstr-assignment/obj-rest-number.case new file mode 100644 index 0000000000000000000000000000000000000000..d54ef3b3fe72aa7fafe27ad7cdc84a63c0d9f489 --- /dev/null +++ b/src/dstr-assignment/obj-rest-number.case @@ -0,0 +1,22 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + RestBindingInitialization creates a new object even if lhs is a Number +template: default +esid: pending +---*/ + +//- setup +var rest; + +//- elems +{...rest} +//- vals +51 +//- body +assert.notSameValue(rest, undefined); +assert.notSameValue(rest, null); +assert(rest instanceof Object); + diff --git a/src/dstr-assignment/obj-rest-obj-own-property.case b/src/dstr-assignment/obj-rest-obj-own-property.case new file mode 100644 index 0000000000000000000000000000000000000000..cfe355060b730f7f5d76caef32911f2320d76eb2 --- /dev/null +++ b/src/dstr-assignment/obj-rest-obj-own-property.case @@ -0,0 +1,25 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + Rest object contains just soruce object's own properties +template: default +esid: pending +includes: [propertyHelper.js] +---*/ + +//- setup +var o = Object.create({ x: 1, y: 2 }); +o.z = 3; + +var x, y, z; +//- elems +{ x, ...{y , z} } +//- vals +o +//- body +assert.sameValue(x, 1); +assert.sameValue(y, undefined); +assert.sameValue(z, 3); + diff --git a/src/dstr-assignment/obj-rest-put-const.case b/src/dstr-assignment/obj-rest-put-const.case new file mode 100644 index 0000000000000000000000000000000000000000..0793b375bc8e5efdce558b82d80eca27dad5dd4a --- /dev/null +++ b/src/dstr-assignment/obj-rest-put-const.case @@ -0,0 +1,20 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + The object rest deconstruction assignment target should obey `const` semantics. +template: error +esid: pending +features: [const] +---*/ + +//- setup +const rest = null; +//- error +TypeError +//- elems +{...rest} +//- vals +{} + diff --git a/src/dstr-assignment/obj-rest-skip-non-enumerable.case b/src/dstr-assignment/obj-rest-skip-non-enumerable.case new file mode 100644 index 0000000000000000000000000000000000000000..9d661f396236b1ea9028de016c5003fd8f8e73f1 --- /dev/null +++ b/src/dstr-assignment/obj-rest-skip-non-enumerable.case @@ -0,0 +1,32 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + Rest object doesn't contain non-enumerable properties +template: default +esid: pending +includes: [propertyHelper.js] +---*/ + +//- setup +var rest; +var obj = {a: 3, b: 4}; +Object.defineProperty(obj, "x", { value: 4, enumerable: false }); +//- elems +{...rest} +//- vals +obj +//- body +assert.sameValue(rest.a, 3); +assert.sameValue(rest.b, 4); +assert.sameValue(Object.getOwnPropertyDescriptor(rest, "x"), undefined); + +verifyEnumerable(rest, "a"); +verifyWritable(rest, "a"); +verifyConfigurable(rest, "a"); + +verifyEnumerable(rest, "b"); +verifyWritable(rest, "b"); +verifyConfigurable(rest, "b"); + diff --git a/src/dstr-assignment/obj-rest-str-val.case b/src/dstr-assignment/obj-rest-str-val.case new file mode 100644 index 0000000000000000000000000000000000000000..04667aa4b07da5f7778fdfed977b83b32108d37a --- /dev/null +++ b/src/dstr-assignment/obj-rest-str-val.case @@ -0,0 +1,23 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + RestBindingInitialization creats an object with indexes as property name +template: default +esid: pending +---*/ + +//- setup +var rest; + +//- elems +{...rest} +//- vals +"foo" +//- body +assert.sameValue(rest["0"], "f"); +assert.sameValue(rest["1"], "o"); +assert.sameValue(rest["2"], "o"); +assert(rest instanceof Object); + diff --git a/src/dstr-assignment/obj-rest-symbol-val.case b/src/dstr-assignment/obj-rest-symbol-val.case new file mode 100644 index 0000000000000000000000000000000000000000..2a4e991f3bf29b0e538f17c1ffec60a9766d3009 --- /dev/null +++ b/src/dstr-assignment/obj-rest-symbol-val.case @@ -0,0 +1,22 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + RestBindingInitialization creates a new object if lhs is a Symbol +template: default +esid: pending +---*/ + +//- setup +var rest; + +//- elems +{...rest} +//- vals +Symbol("foo") +//- body +assert.notSameValue(rest, undefined); +assert.notSameValue(rest, null); +assert(rest instanceof Object); + diff --git a/src/dstr-assignment/obj-rest-to-property-with-setter.case b/src/dstr-assignment/obj-rest-to-property-with-setter.case new file mode 100644 index 0000000000000000000000000000000000000000..61be6767cebc4dc9fad564d8d94144222ac2b96a --- /dev/null +++ b/src/dstr-assignment/obj-rest-to-property-with-setter.case @@ -0,0 +1,30 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + When DestructuringAssignmentTarget is an object property setter, its value should be + binded as rest object. +template: default +esid: pending +---*/ + +//- setup +var settedValue; +var executedGetter = false; +var src = { + get y() { executedGetter = true; }, + set y(v) { + settedValue = v; + } +} +src.y = undefined; +//- elems +{...src.y} +//- vals +{ x: 1, y: 2} +//- body +assert.sameValue(settedValue.x, 1); +assert.sameValue(settedValue.y, 2); +assert(!executedGetter, "The property should not be accessed"); + diff --git a/src/dstr-assignment/obj-rest-to-property.case b/src/dstr-assignment/obj-rest-to-property.case new file mode 100644 index 0000000000000000000000000000000000000000..78aac9ea143e261cff9ca1935af39cd3bd437c17 --- /dev/null +++ b/src/dstr-assignment/obj-rest-to-property.case @@ -0,0 +1,26 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + When DestructuringAssignmentTarget is an object property, its value should be binded + as rest object. +template: default +esid: pending +includes: [propertyHelper.js] +---*/ + +//- setup +var src = {}; +//- elems +{...src.y} +//- vals +{ x: 1, y: 2} +//- body +assert.sameValue(src.y.x, 1); +assert.sameValue(src.y.y, 2); + +verifyEnumerable(src, "y"); +verifyWritable(src, "y"); +verifyConfigurable(src, "y"); + diff --git a/src/dstr-assignment/obj-rest-val-null.case b/src/dstr-assignment/obj-rest-val-null.case new file mode 100644 index 0000000000000000000000000000000000000000..a09343aaa72c97a0de3503e0bf9b157348a7c885 --- /dev/null +++ b/src/dstr-assignment/obj-rest-val-null.case @@ -0,0 +1,20 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + TypeError is thrown when rhs is null because of 7.1.13 ToObject ( argument ) + used by CopyDataProperties +template: error +esid: pending +---*/ + +//- error +TypeError +//- setup +var rest; +//- elems +{...rest} +//- vals +null + diff --git a/src/dstr-assignment/obj-rest-val-undefined.case b/src/dstr-assignment/obj-rest-val-undefined.case new file mode 100644 index 0000000000000000000000000000000000000000..5c6c570faf91892096fdc410303290a5c06d1e0b --- /dev/null +++ b/src/dstr-assignment/obj-rest-val-undefined.case @@ -0,0 +1,20 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + TypeError is thrown when rhs is ```undefined``` because of 7.1.13 ToObject ( argument ) + used by CopyDataProperties +template: error +esid: pending +---*/ + +//- error +TypeError +//- setup +var rest; +//- elems +{...rest} +//- vals +undefined + diff --git a/src/dstr-assignment/obj-rest-valid-object.case b/src/dstr-assignment/obj-rest-valid-object.case new file mode 100644 index 0000000000000000000000000000000000000000..732d13162dba83b3890d862dc2e85513b6d5356b --- /dev/null +++ b/src/dstr-assignment/obj-rest-valid-object.case @@ -0,0 +1,32 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + Rest object contains just unextracted data +template: default +esid: pending +includes: [propertyHelper.js] +---*/ + +//- setup +var rest, a, b; + +//- elems +{a, b, ...rest} +//- vals +{x: 1, y: 2, a: 5, b: 3} +//- body +assert.sameValue(rest.x, 1); +assert.sameValue(rest.y, 2); +assert.sameValue(rest.a, undefined); +assert.sameValue(rest.b, undefined); + +verifyEnumerable(rest, "x"); +verifyWritable(rest, "x"); +verifyConfigurable(rest, "x"); + +verifyEnumerable(rest, "y"); +verifyWritable(rest, "y"); +verifyConfigurable(rest, "y"); + diff --git a/src/dstr-binding/obj-ptrn-rest-getter.case b/src/dstr-binding/obj-ptrn-rest-getter.case new file mode 100644 index 0000000000000000000000000000000000000000..fd0ed892985f8a755cad0a4cd4afa71850f9f03e --- /dev/null +++ b/src/dstr-binding/obj-ptrn-rest-getter.case @@ -0,0 +1,25 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + Getter is called when obj is being deconstructed to a rest Object +template: default +esid: pending +includes: [propertyHelper.js] +---*/ + +//- setup +var count = 0; +//- elems +{...x} +//- vals +{ get v() { count++; return 2; } } +//- body +assert.sameValue(x.v, 2); +assert.sameValue(count, 1); + +verifyEnumerable(x, "v"); +verifyWritable(x, "v"); +verifyConfigurable(x, "v"); + diff --git a/src/dstr-binding/obj-ptrn-rest-nested-obj.case b/src/dstr-binding/obj-ptrn-rest-nested-obj.case new file mode 100644 index 0000000000000000000000000000000000000000..8c726e8ef0feb1e388b24369c0bd9fb702ab4119 --- /dev/null +++ b/src/dstr-binding/obj-ptrn-rest-nested-obj.case @@ -0,0 +1,24 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + When DestructuringAssignmentTarget is an object literal, it should be parsed + parsed as a DestructuringAssignmentPattern and evaluated as a destructuring + assignment. +template: default +esid: pending +---*/ + +//- setup +var obj = {a: 3, b: 4}; +//- elems +{a, b, ...{c, e}} +//- vals +{a: 1, b: 2, c: 3, d: 4, e: 5} +//- body +assert.sameValue(a, 1); +assert.sameValue(b, 2); +assert.sameValue(c, 3); +assert.sameValue(e, 5); + diff --git a/src/dstr-binding/obj-ptrn-rest-obj-nested-rest.case b/src/dstr-binding/obj-ptrn-rest-obj-nested-rest.case new file mode 100644 index 0000000000000000000000000000000000000000..166bf66e435d595bcfc92c86f83c2ae59a537131 --- /dev/null +++ b/src/dstr-binding/obj-ptrn-rest-obj-nested-rest.case @@ -0,0 +1,33 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + When DestructuringAssignmentTarget is an object literal, it should be parsed + parsed as a DestructuringAssignmentPattern and evaluated as a destructuring + assignment and object rest desconstruction is allowed in that case. +template: default +esid: pending +includes: [propertyHelper.js] +---*/ + +//- elems +{a, b, ...{c, ...rest}} +//- vals +{a: 1, b: 2, c: 3, d: 4, e: 5} +//- body +assert.sameValue(a, 1); +assert.sameValue(b, 2); +assert.sameValue(c, 3); + +assert.sameValue(rest.d, 4); +assert.sameValue(rest.e, 5); + +verifyEnumerable(rest, "d"); +verifyWritable(rest, "d"); +verifyConfigurable(rest, "d"); + +verifyEnumerable(rest, "e"); +verifyWritable(rest, "e"); +verifyConfigurable(rest, "e"); + diff --git a/src/dstr-binding/obj-ptrn-rest-obj-own-property.case b/src/dstr-binding/obj-ptrn-rest-obj-own-property.case new file mode 100644 index 0000000000000000000000000000000000000000..74dafe6c13ce3bbb6c7c0ef1240a66ccedcd6db3 --- /dev/null +++ b/src/dstr-binding/obj-ptrn-rest-obj-own-property.case @@ -0,0 +1,23 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + Rest object contains just soruce object's own properties +template: default +esid: pending +includes: [propertyHelper.js] +---*/ + +//- setup +var o = Object.create({ x: 1, y: 2 }); +o.z = 3; +//- elems +{ x, ...{y , z} } +//- vals +o +//- body +assert.sameValue(x, 1); +assert.sameValue(y, undefined); +assert.sameValue(z, 3); + diff --git a/src/dstr-binding/obj-ptrn-rest-skip-non-enumerable.case b/src/dstr-binding/obj-ptrn-rest-skip-non-enumerable.case new file mode 100644 index 0000000000000000000000000000000000000000..de32046d2cfaff7422095bcef387ce5509ff6e5f --- /dev/null +++ b/src/dstr-binding/obj-ptrn-rest-skip-non-enumerable.case @@ -0,0 +1,31 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + Rest object doesn't contain non-enumerable properties +template: default +esid: pending +includes: [propertyHelper.js] +---*/ + +//- setup +var o = {a: 3, b: 4}; +Object.defineProperty(o, "x", { value: 4, enumerable: false }); +//- elems +{...rest} +//- vals +o +//- body +assert.sameValue(rest.a, 3); +assert.sameValue(rest.b, 4); +assert.sameValue(rest.x, undefined); + +verifyEnumerable(rest, "a"); +verifyWritable(rest, "a"); +verifyConfigurable(rest, "a"); + +verifyEnumerable(rest, "b"); +verifyWritable(rest, "b"); +verifyConfigurable(rest, "b"); + diff --git a/src/dstr-binding/obj-ptrn-rest-val-obj.case b/src/dstr-binding/obj-ptrn-rest-val-obj.case new file mode 100644 index 0000000000000000000000000000000000000000..46060f2de78b5479600d1b7c1ae0a3f59db2b9bb --- /dev/null +++ b/src/dstr-binding/obj-ptrn-rest-val-obj.case @@ -0,0 +1,29 @@ +// Copyright (C) 2017 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: > + Rest object contains just unextracted data +template: default +esid: pending +includes: [propertyHelper.js] +---*/ + +//- elems +{a, b, ...rest} +//- vals +{x: 1, y: 2, a: 5, b: 3} +//- body +assert.sameValue(rest.x, 1); +assert.sameValue(rest.y, 2); +assert.sameValue(rest.a, undefined); +assert.sameValue(rest.b, undefined); + +verifyEnumerable(rest, "x"); +verifyWritable(rest, "x"); +verifyConfigurable(rest, "x"); + +verifyEnumerable(rest, "y"); +verifyWritable(rest, "y"); +verifyConfigurable(rest, "y"); +