diff --git a/test/language/destructuring/binding/initialization-requires-object-coercible-null.js b/test/language/destructuring/binding/initialization-requires-object-coercible-null.js new file mode 100644 index 0000000000000000000000000000000000000000..7397f490a263cfcd9a2b0b7b8b8ac5c0292cbfff --- /dev/null +++ b/test/language/destructuring/binding/initialization-requires-object-coercible-null.js @@ -0,0 +1,21 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3.5 +description: > + Cannot convert null argument value to object +info: > + 13.3.3.5 Runtime Semantics: BindingInitialization + + BindingPattern : ObjectBindingPattern + + 1. Let valid be RequireObjectCoercible(value). + 2. ReturnIfAbrupt(valid). +---*/ + +function fn({}) {} + +assert.throws(TypeError, function() { + fn(null); +}); diff --git a/test/language/destructuring/binding/initialization-requires-object-coercible-undefined.js b/test/language/destructuring/binding/initialization-requires-object-coercible-undefined.js new file mode 100644 index 0000000000000000000000000000000000000000..58c6c58e4e7d411cd090b4179d17767f29574b2f --- /dev/null +++ b/test/language/destructuring/binding/initialization-requires-object-coercible-undefined.js @@ -0,0 +1,21 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3.5 +description: > + Cannot convert undefined argument value to object +info: > + 13.3.3.5 Runtime Semantics: BindingInitialization + + BindingPattern : ObjectBindingPattern + + 1. Let valid be RequireObjectCoercible(value). + 2. ReturnIfAbrupt(valid). +---*/ + +function fn({}) {} + +assert.throws(TypeError, function() { + fn(); +}); diff --git a/test/language/destructuring/binding/initialization-returns-normal-completion-for-empty-objects.js b/test/language/destructuring/binding/initialization-returns-normal-completion-for-empty-objects.js new file mode 100644 index 0000000000000000000000000000000000000000..5ac7fb1d7672f9f5284a79951c7c065cb0f8ab52 --- /dev/null +++ b/test/language/destructuring/binding/initialization-returns-normal-completion-for-empty-objects.js @@ -0,0 +1,30 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3.5 +description: > + Normal completion when initializing an empty ObjectBindingPattern +info: > + 13.3.3.5 Runtime Semantics: BindingInitialization + + BindingPattern : ObjectBindingPattern + + ... + 3. Return the result of performing BindingInitialization for + ObjectBindingPattern using value and environment as arguments. + + ObjectBindingPattern : { } + + 1. Return NormalCompletion(empty). + +---*/ + +function fn({}) { return true; } + +assert(fn(0)); +assert(fn(NaN)); +assert(fn('')); +assert(fn(false)); +assert(fn({})); +assert(fn([])); diff --git a/test/language/destructuring/binding/syntax/array-elements-with-initializer.js b/test/language/destructuring/binding/syntax/array-elements-with-initializer.js new file mode 100644 index 0000000000000000000000000000000000000000..25f551f23cf22c9e8c89446236263f4762765b03 --- /dev/null +++ b/test/language/destructuring/binding/syntax/array-elements-with-initializer.js @@ -0,0 +1,32 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3 +description: > + The ArrayBindingPattern with an element list with initializers +info: > + Destructuring Binding Patterns - Syntax + + ArrayBindingPattern[Yield] : + [ Elisionopt BindingRestElement[?Yield]opt ] + [ BindingElementList[?Yield] ] + [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ] + + BindingElementList[Yield] : + BindingElisionElement[?Yield] + BindingElementList[?Yield] , BindingElisionElement[?Yield] + + BindingElisionElement[Yield] : + Elisionopt BindingElement[?Yield] + + BindingElement[Yield ] : + SingleNameBinding[?Yield] + BindingPattern[?Yield] Initializer[In, ?Yield]opt +---*/ + +function fn1([a, b = 42]) {} + +function fn2([a = 42, b,]) {} + +function fn3([a,, b = a, c = 42]) {} diff --git a/test/language/destructuring/binding/syntax/array-elements-with-object-patterns.js b/test/language/destructuring/binding/syntax/array-elements-with-object-patterns.js new file mode 100644 index 0000000000000000000000000000000000000000..8bf0df93ec409e793192333b64ca6d1c0c95196f --- /dev/null +++ b/test/language/destructuring/binding/syntax/array-elements-with-object-patterns.js @@ -0,0 +1,34 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3 +description: > + The ArrayBindingPattern with Object patterns on the element list +info: > + Destructuring Binding Patterns - Syntax + + ArrayBindingPattern[Yield] : + [ Elisionopt BindingRestElement[?Yield]opt ] + [ BindingElementList[?Yield] ] + [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ] + + BindingElementList[Yield] : + BindingElisionElement[?Yield] + BindingElementList[?Yield] , BindingElisionElement[?Yield] + + BindingElisionElement[Yield] : + Elisionopt BindingElement[?Yield] + + BindingElement[Yield ] : + SingleNameBinding[?Yield] + BindingPattern[?Yield] Initializer[In, ?Yield]opt +---*/ + +function fn1([{}]) {} + +function fn2([{} = 42]) {} + +function fn3([a, {b: c}]) {} + +function fn4([a, {b: []}]) {} diff --git a/test/language/destructuring/binding/syntax/array-elements-without-initializer.js b/test/language/destructuring/binding/syntax/array-elements-without-initializer.js new file mode 100644 index 0000000000000000000000000000000000000000..2e0c4cc2bd6e633dbadfb8159279af9f9fb353f3 --- /dev/null +++ b/test/language/destructuring/binding/syntax/array-elements-without-initializer.js @@ -0,0 +1,32 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3 +description: > + The ArrayBindingPattern with an element list without initializers +info: > + Destructuring Binding Patterns - Syntax + + ArrayBindingPattern[Yield] : + [ Elisionopt BindingRestElement[?Yield]opt ] + [ BindingElementList[?Yield] ] + [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ] + + BindingElementList[Yield] : + BindingElisionElement[?Yield] + BindingElementList[?Yield] , BindingElisionElement[?Yield] + + BindingElisionElement[Yield] : + Elisionopt BindingElement[?Yield] + + BindingElement[Yield ] : + SingleNameBinding[?Yield] + BindingPattern[?Yield] Initializer[In, ?Yield]opt +---*/ + +function fn1([a, b]) {} + +function fn2([a, b,]) {} + +function fn3([a,, b,]) {} diff --git a/test/language/destructuring/binding/syntax/array-pattern-with-elisions.js b/test/language/destructuring/binding/syntax/array-pattern-with-elisions.js new file mode 100644 index 0000000000000000000000000000000000000000..d2f86f7d2ceff43884600edb613f6bd461f911ea --- /dev/null +++ b/test/language/destructuring/binding/syntax/array-pattern-with-elisions.js @@ -0,0 +1,18 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3 +description: > + The ArrayBindingPattern with elisions only +info: > + Destructuring Binding Patterns - Syntax + + ArrayBindingPattern[Yield] : + [ Elisionopt BindingRestElement[?Yield]opt ] + [ BindingElementList[?Yield] ] + [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ] +---*/ + +function fn1([,]) {} +function fn2([,,]) {} diff --git a/test/language/destructuring/binding/syntax/array-pattern-with-no-elements.js b/test/language/destructuring/binding/syntax/array-pattern-with-no-elements.js new file mode 100644 index 0000000000000000000000000000000000000000..32d5af920ab72985eb8558cae344f1c868b2de1f --- /dev/null +++ b/test/language/destructuring/binding/syntax/array-pattern-with-no-elements.js @@ -0,0 +1,17 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3 +description: > + The ArrayBindingPattern with no elements +info: > + Destructuring Binding Patterns - Syntax + + ArrayBindingPattern[Yield] : + [ Elisionopt BindingRestElement[?Yield]opt ] + [ BindingElementList[?Yield] ] + [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ] +---*/ + +function fn([]) {} diff --git a/test/language/destructuring/binding/syntax/array-rest-elements.js b/test/language/destructuring/binding/syntax/array-rest-elements.js new file mode 100644 index 0000000000000000000000000000000000000000..a40fac6dcc4db15e1e72a2438c84b96ea0842d32 --- /dev/null +++ b/test/language/destructuring/binding/syntax/array-rest-elements.js @@ -0,0 +1,28 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3 +description: > + Array Binding Pattern with Rest Element +info: > + Destructuring Binding Patterns - Syntax + + ArrayBindingPattern[Yield] : + [ Elisionopt BindingRestElement[?Yield]opt ] + [ BindingElementList[?Yield] ] + [ BindingElementList[?Yield] , Elisionopt BindingRestElement[?Yield]opt ] + + BindingRestElement[Yield] : + ... BindingIdentifier[?Yield] +---*/ + +function fn1([...args]) {} + +function fn2([,,,,,,,...args]) {} + +function fn3([x, {y}, ...z]) {} + +function fn4([,x, {y}, , ...z]) {} + +function fn5({x: [...y]}) {} diff --git a/test/language/destructuring/binding/syntax/object-pattern-with-no-property-list.js b/test/language/destructuring/binding/syntax/object-pattern-with-no-property-list.js new file mode 100644 index 0000000000000000000000000000000000000000..5299f26cb6d69e6e1cb290d1fb4ca58a366b4ba8 --- /dev/null +++ b/test/language/destructuring/binding/syntax/object-pattern-with-no-property-list.js @@ -0,0 +1,18 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3 +description: > + The ObjectBindingPattern can be `{ }` +info: > + Destructuring Binding Patterns - Syntax + + ObjectBindingPattern[Yield] : + { } + { BindingPropertyList[?Yield] } + { BindingPropertyList[?Yield] , } + +---*/ + +function fn({}) {} diff --git a/test/language/destructuring/binding/syntax/property-list-bindings-elements.js b/test/language/destructuring/binding/syntax/property-list-bindings-elements.js new file mode 100644 index 0000000000000000000000000000000000000000..87a21d1938962f790e6e26b81f6d625ce651fd8d --- /dev/null +++ b/test/language/destructuring/binding/syntax/property-list-bindings-elements.js @@ -0,0 +1,45 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3 +description: > + The ObjectBindingPattern with binding elements +info: > + Destructuring Binding Patterns - Syntax + + ObjectBindingPattern[Yield] : + { } + { BindingPropertyList[?Yield] } + { BindingPropertyList[?Yield] , } + + BindingPropertyList[Yield] : + BindingProperty[?Yield] + BindingPropertyList[?Yield] , BindingProperty[?Yield] + + BindingProperty[Yield] : + SingleNameBinding[?Yield] + PropertyName[?Yield] : BindingElement[?Yield] + + BindingElement[Yield ] : + SingleNameBinding[?Yield] + BindingPattern[?Yield] Initializer[In, ?Yield]opt + + SingleNameBinding[Yield] : + BindingIdentifier[?Yield] Initializer[In, ?Yield]opt + +---*/ + +// BindingElement w/ SingleNameBinding +function fna({x: y}) {} + +// BindingElement w/ SingleNameBinding with initializer +function fnb({x: y = 42}) {} + +// BindingElement w/ BindingPattern +function fnc({x: {}}) {} +function fnd({x: {y}}) {} + +// BindingElement w/ BindingPattern w/ initializer +function fne({x: {} = 42}) {} +function fnf({x: {y} = 42}) {} diff --git a/test/language/destructuring/binding/syntax/property-list-followed-by-a-single-comma.js b/test/language/destructuring/binding/syntax/property-list-followed-by-a-single-comma.js new file mode 100644 index 0000000000000000000000000000000000000000..c5fa12ea697d0d18b03a359f3c3522ff88488cf4 --- /dev/null +++ b/test/language/destructuring/binding/syntax/property-list-followed-by-a-single-comma.js @@ -0,0 +1,24 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3 +description: > + The Binding Property List followed by a single comma is a valid syntax +info: > + Destructuring Binding Patterns - Syntax + + ObjectBindingPattern[Yield] : + { } + { BindingPropertyList[?Yield] } + { BindingPropertyList[?Yield] , } + +---*/ + +function fn1({x,}) {} + +function fn2({a: {p: q, }, }) {} + +function fn3({x,,}) {} + +function fn4({x,,,,,,,}) {} diff --git a/test/language/destructuring/binding/syntax/property-list-single-name-bindings.js b/test/language/destructuring/binding/syntax/property-list-single-name-bindings.js new file mode 100644 index 0000000000000000000000000000000000000000..69c745bb3d7014e0a5648962fa5caa1b50daa2ca --- /dev/null +++ b/test/language/destructuring/binding/syntax/property-list-single-name-bindings.js @@ -0,0 +1,32 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3 +description: > + The ObjectBindingPattern with a simple property list and single name binding +info: > + Destructuring Binding Patterns - Syntax + + ObjectBindingPattern[Yield] : + { } + { BindingPropertyList[?Yield] } + { BindingPropertyList[?Yield] , } + + BindingPropertyList[Yield] : + BindingProperty[?Yield] + BindingPropertyList[?Yield] , BindingProperty[?Yield] + + BindingProperty[Yield] : + SingleNameBinding[?Yield] + PropertyName[?Yield] : BindingElement[?Yield] + + SingleNameBinding[Yield] : + BindingIdentifier[?Yield] Initializer[In, ?Yield]opt + +---*/ + +function fna({x}) {} +function fnb({x, y}) {} +function fnc({x = 42}) {} +function fnd({x, y = 42}) {} \ No newline at end of file diff --git a/test/language/destructuring/binding/syntax/property-list-with-property-list.js b/test/language/destructuring/binding/syntax/property-list-with-property-list.js new file mode 100644 index 0000000000000000000000000000000000000000..d421e12c07c47055192146c936a01f34109dd582 --- /dev/null +++ b/test/language/destructuring/binding/syntax/property-list-with-property-list.js @@ -0,0 +1,26 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3 +description: > + The ObjectBindingPattern with deep binding property lists +info: > + Destructuring Binding Patterns - Syntax + + ObjectBindingPattern[Yield] : + { } + { BindingPropertyList[?Yield] } + { BindingPropertyList[?Yield] , } + + BindingPropertyList[Yield] : + BindingProperty[?Yield] + BindingPropertyList[?Yield] , BindingProperty[?Yield] + +---*/ + +function fn1({a: {p: q}, b: {r}, c: {s = 0}, d: {}}) {} + +function fn2(x, {a: r, b: s, c: t}, y) {} + +function fn3({x: {y: {z: {} = 42}}}) {} diff --git a/test/language/destructuring/binding/syntax/recursive-array-and-object-patterns.js b/test/language/destructuring/binding/syntax/recursive-array-and-object-patterns.js new file mode 100644 index 0000000000000000000000000000000000000000..3c3289f609a0ddf7597df2693ff4afaaa928fe6f --- /dev/null +++ b/test/language/destructuring/binding/syntax/recursive-array-and-object-patterns.js @@ -0,0 +1,24 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +es6id: 13.3.3 +description: > + Recursive array and object binding patterns +info: > + Destructuring Binding Patterns - Syntax + + BindingPattern[Yield] : + ObjectBindingPattern[?Yield] + ArrayBindingPattern[?Yield] +---*/ + +function fn1([{}]) {} + +function fn2([{a: [{}]}]) {} + +function fn3({a: [,,,] = 42}) {} + +function fn4([], [[]], [[[[[[[[[x]]]]]]]]]) {} + +function fn4([[x, y, ...z]]) {}