From c24a206511841e14f156b929005b9e5597c05965 Mon Sep 17 00:00:00 2001
From: Mike Pennisi <mike@mikepennisi.com>
Date: Fri, 20 May 2016 18:58:23 -0400
Subject: [PATCH] Re-format destructuring assignment tests

Utilize the test generation tool to increase coverage of destructuring
assignment semantics. Previously, only destructuring assignment in the
AssignmentExpression position was tested. With this change applied, the
same tests will assert expected behavior for destructuring assignment in
`for..of` statements, as well.

A limited number of tests are applied to the `for..in` statement as
well, but due to the iteration protocol observed by that statement, many
destructuring tests are not relevant, and others cannot be automatically
generated from this format.
---
 .../array-elem-init-assignment.case           | 23 ++++++++
 .../array-elem-init-evaluation.case           | 20 +++++++
 .../array-elem-init-fn-name-arrow.case        | 12 +++--
 .../array-elem-init-fn-name-class.case        | 13 +++--
 .../array-elem-init-fn-name-cover.case        | 13 +++--
 .../array-elem-init-fn-name-fn.case           | 13 +++--
 .../array-elem-init-fn-name-gen.case          | 15 +++---
 .../dstr-assignment/array-elem-init-in.case   | 16 +++---
 .../dstr-assignment/array-elem-init-let.case  | 17 +++---
 .../array-elem-init-order.case                | 16 +++---
 .../array-elem-init-simple-no-strict.case     | 16 +++---
 .../array-elem-init-simple-strict.case        |  8 ++-
 .../array-elem-init-yield-expr.case           | 15 +++---
 .../array-elem-init-yield-ident-invalid.case  |  9 ++--
 .../array-elem-init-yield-ident-valid.case    | 16 +++---
 .../array-elem-iter-get-err.case              | 16 +++---
 .../array-elem-iter-nrml-close-err.case       | 18 ++++---
 .../array-elem-iter-nrml-close-null.case      | 16 +++---
 .../array-elem-iter-nrml-close-skip.case      | 14 +++--
 .../array-elem-iter-nrml-close.case           | 14 +++--
 .../array-elem-iter-rtrn-close-err.case       | 13 +++--
 .../array-elem-iter-rtrn-close-null.case      | 11 +++-
 .../array-elem-iter-rtrn-close.case           | 13 +++--
 .../array-elem-iter-thrw-close-err.case       | 16 +++---
 .../array-elem-iter-thrw-close-skip.case      | 18 ++++---
 .../array-elem-iter-thrw-close.case           | 16 +++---
 .../array-elem-nested-array-invalid.case      | 10 ++--
 .../array-elem-nested-array-null.case         | 16 +++---
 ...rray-elem-nested-array-undefined-hole.case | 16 +++---
 ...array-elem-nested-array-undefined-own.case | 16 +++---
 .../array-elem-nested-array-undefined.case    | 16 +++---
 .../array-elem-nested-array-yield-expr.case   | 14 +++--
 ...elem-nested-array-yield-ident-invalid.case |  8 ++-
 ...y-elem-nested-array-yield-ident-valid.case | 15 +++---
 .../array-elem-nested-array.case              | 16 +++---
 .../array-elem-nested-obj-invalid.case        | 10 ++--
 .../array-elem-nested-obj-null.case           | 14 +++--
 .../array-elem-nested-obj-undefined-hole.case | 14 +++--
 .../array-elem-nested-obj-undefined-own.case  | 14 +++--
 .../array-elem-nested-obj-undefined.case      | 14 +++--
 .../array-elem-nested-obj-yield-expr.case     | 15 +++---
 ...y-elem-nested-obj-yield-ident-invalid.case |  8 ++-
 ...ray-elem-nested-obj-yield-ident-valid.case | 16 +++---
 .../array-elem-nested-obj.case                | 16 +++---
 .../dstr-assignment/array-elem-put-const.case | 14 +++--
 .../dstr-assignment/array-elem-put-let.case   | 15 ++++--
 .../array-elem-put-prop-ref-no-get.case       | 16 +++---
 .../array-elem-put-prop-ref-user-err.case     | 15 +++---
 .../array-elem-put-prop-ref.case              | 15 +++---
 ...array-elem-put-unresolvable-no-strict.case | 10 +++-
 .../array-elem-put-unresolvable-strict.case   | 12 +++--
 .../array-elem-target-identifier.case         | 15 +++---
 .../array-elem-target-simple-no-strict.case   | 16 +++---
 .../array-elem-target-simple-strict.case      |  8 ++-
 .../array-elem-target-yield-expr.case         | 14 +++--
 .../array-elem-target-yield-invalid.case      |  8 ++-
 .../array-elem-target-yield-valid.case        | 15 +++---
 ...rray-elem-trlg-iter-elision-iter-abpt.case | 15 ++++--
 ...trlg-iter-elision-iter-nrml-close-err.case | 16 +++---
 ...rlg-iter-elision-iter-nrml-close-null.case | 14 +++--
 ...rlg-iter-elision-iter-nrml-close-skip.case | 12 +++--
 ...lem-trlg-iter-elision-iter-nrml-close.case | 12 +++--
 .../array-elem-trlg-iter-get-err.case         | 14 +++--
 ...ay-elem-trlg-iter-list-nrml-close-err.case | 16 +++---
 ...y-elem-trlg-iter-list-nrml-close-null.case | 14 +++--
 ...y-elem-trlg-iter-list-nrml-close-skip.case | 12 +++--
 .../array-elem-trlg-iter-list-nrml-close.case | 12 +++--
 ...ay-elem-trlg-iter-list-rtrn-close-err.case | 13 +++--
 ...y-elem-trlg-iter-list-rtrn-close-null.case | 10 +++-
 .../array-elem-trlg-iter-list-rtrn-close.case | 11 +++-
 ...ay-elem-trlg-iter-list-thrw-close-err.case | 14 +++--
 ...y-elem-trlg-iter-list-thrw-close-skip.case | 16 +++---
 .../array-elem-trlg-iter-list-thrw-close.case | 16 +++---
 ...y-elem-trlg-iter-rest-nrml-close-skip.case | 12 +++--
 ...ay-elem-trlg-iter-rest-rtrn-close-err.case | 11 +++-
 ...y-elem-trlg-iter-rest-rtrn-close-null.case | 10 +++-
 .../array-elem-trlg-iter-rest-rtrn-close.case | 11 +++-
 ...ay-elem-trlg-iter-rest-thrw-close-err.case | 16 +++---
 ...y-elem-trlg-iter-rest-thrw-close-skip.case | 16 +++---
 .../array-elem-trlg-iter-rest-thrw-close.case | 16 +++---
 .../array-elision-iter-abpt.case              | 16 +++---
 .../array-elision-iter-get-err.case           | 14 +++--
 .../array-elision-iter-nrml-close-err.case    | 16 +++---
 .../array-elision-iter-nrml-close-null.case   | 14 +++--
 .../array-elision-iter-nrml-close-skip.case   | 12 +++--
 .../array-elision-iter-nrml-close.case        | 12 +++--
 .../array-elision-val-array.case              | 13 +++++
 .../array-elision-val-bool.case               | 16 ++++++
 .../array-elision-val-null.case               | 16 ++++++
 .../array-elision-val-num.case                | 16 ++++++
 .../array-elision-val-string.case             | 13 +++++
 .../array-elision-val-symbol.case             | 19 +++++++
 .../array-elision-val-undef.case              | 16 ++++++
 .../array-empty-iter-close-err.case           | 16 +++---
 .../array-empty-iter-close-null.case          | 14 +++--
 .../array-empty-iter-close.case               | 12 +++--
 .../array-empty-iter-get-err.case             | 14 +++--
 .../array-empty-val-array.case                | 15 ++++++
 src/dstr-assignment/array-empty-val-bool.case | 17 ++++++
 src/dstr-assignment/array-empty-val-null.case | 17 ++++++
 src/dstr-assignment/array-empty-val-num.case  | 17 ++++++
 .../array-empty-val-string.case               | 15 ++++++
 .../array-empty-val-symbol.case               | 19 +++++++
 .../array-empty-val-undef.case                | 17 ++++++
 src/dstr-assignment/array-iteration.case      | 27 ++++++++++
 .../array-rest-after-element.case             | 12 +++--
 .../array-rest-after-elision.case             | 12 +++--
 .../array-rest-before-element.case            | 10 ++--
 .../array-rest-before-elision.case            | 10 ++--
 .../array-rest-before-rest.case               | 10 ++--
 .../array-rest-elision-invalid.case           |  8 ++-
 .../array-rest-elision-iter-abpt.case         | 16 +++---
 .../dstr-assignment/array-rest-elision.case   | 15 +++---
 .../dstr-assignment/array-rest-init.case      | 10 ++--
 .../array-rest-iter-get-err.case              | 14 +++--
 .../array-rest-iter-nrml-close-skip.case      | 12 +++--
 .../array-rest-iter-rtrn-close-err.case       | 13 +++--
 .../array-rest-iter-rtrn-close-null.case      | 10 +++-
 .../array-rest-iter-rtrn-close.case           | 13 +++--
 .../array-rest-iter-thrw-close-err.case       | 15 ++++--
 .../array-rest-iter-thrw-close-skip.case      | 16 +++---
 .../array-rest-iter-thrw-close.case           | 16 +++---
 .../dstr-assignment/array-rest-iteration.case | 16 +++---
 .../dstr-assignment/array-rest-lref-err.case  | 16 +++---
 .../dstr-assignment/array-rest-lref.case      | 12 +++--
 .../array-rest-nested-array-invalid.case      |  8 ++-
 ...est-nested-array-iter-thrw-close-skip.case | 16 +++---
 .../array-rest-nested-array-null.case         | 16 +++---
 ...rray-rest-nested-array-undefined-hole.case | 16 +++---
 ...array-rest-nested-array-undefined-own.case | 16 +++---
 .../array-rest-nested-array-undefined.case    | 16 +++---
 .../array-rest-nested-array-yield-expr.case   | 14 +++--
 ...rest-nested-array-yield-ident-invalid.case |  9 ++--
 ...y-rest-nested-array-yield-ident-valid.case | 15 +++---
 .../array-rest-nested-array.case              | 16 +++---
 .../array-rest-nested-obj-invalid.case        |  8 ++-
 .../array-rest-nested-obj-null.case           | 16 +++---
 .../array-rest-nested-obj-undefined-hole.case | 17 +++---
 .../array-rest-nested-obj-undefined-own.case  | 17 +++---
 .../array-rest-nested-obj-undefined.case      | 17 +++---
 .../array-rest-nested-obj-yield-expr.case     | 15 +++---
 ...y-rest-nested-obj-yield-ident-invalid.case |  9 ++--
 ...ray-rest-nested-obj-yield-ident-valid.case | 16 +++---
 .../array-rest-nested-obj.case                | 16 +++---
 .../dstr-assignment/array-rest-put-const.case | 14 +++--
 .../dstr-assignment/array-rest-put-let.case   | 16 +++---
 .../array-rest-put-prop-ref-no-get.case       | 18 ++++---
 ...put-prop-ref-user-err-iter-close-skip.case | 15 ++++--
 .../array-rest-put-prop-ref-user-err.case     | 15 +++---
 .../array-rest-put-prop-ref.case              | 15 +++---
 ...array-rest-put-unresolvable-no-strict.case | 10 +++-
 .../array-rest-put-unresolvable-strict.case   | 12 +++--
 .../array-rest-yield-expr.case                | 15 +++---
 .../array-rest-yield-ident-invalid.case       |  9 +++-
 .../array-rest-yield-ident-valid.case         | 15 +++---
 .../default/assignment-expr.template          | 27 ++++++++++
 src/dstr-assignment/default/for-of.template   | 36 +++++++++++++
 .../error/assignment-expr.template            | 22 ++++++++
 src/dstr-assignment/error/for-of.template     | 38 +++++++++++++
 src/dstr-assignment/obj-empty-bool.case       | 15 ++++++
 src/dstr-assignment/obj-empty-null.case       | 17 ++++++
 src/dstr-assignment/obj-empty-num.case        | 15 ++++++
 src/dstr-assignment/obj-empty-obj.case        | 15 ++++++
 src/dstr-assignment/obj-empty-string.case     | 15 ++++++
 src/dstr-assignment/obj-empty-symbol.case     | 18 +++++++
 src/dstr-assignment/obj-empty-undef.case      | 17 ++++++
 .../obj-id-identifier-resolution-first.case   | 18 +++++++
 .../obj-id-identifier-resolution-last.case    | 18 +++++++
 .../obj-id-identifier-resolution-lone.case    | 17 ++++++
 .../obj-id-identifier-resolution-middle.case  | 18 +++++++
 .../obj-id-identifier-resolution-trlng.case   | 18 +++++++
 .../obj-id-identifier-yield-expr.case         | 14 +++--
 ...obj-id-identifier-yield-ident-invalid.case | 12 +++--
 .../obj-id-identifier-yield-ident-valid.case  | 20 +++++++
 .../obj-id-init-assignment-missing.case       | 20 +++++++
 .../obj-id-init-assignment-null.case          | 20 +++++++
 .../obj-id-init-assignment-truthy.case        | 20 +++++++
 .../obj-id-init-assignment-undef.case         | 20 +++++++
 .../obj-id-init-evaluation.case               | 21 ++++++++
 .../obj-id-init-fn-name-arrow.case            | 12 +++--
 .../obj-id-init-fn-name-class.case            | 15 +++---
 .../obj-id-init-fn-name-cover.case            | 15 +++---
 .../obj-id-init-fn-name-fn.case               | 15 +++---
 .../obj-id-init-fn-name-gen.case              | 15 +++---
 .../dstr-assignment/obj-id-init-in.case       | 16 +++---
 .../dstr-assignment/obj-id-init-let.case      | 17 +++---
 .../dstr-assignment/obj-id-init-order.case    | 16 +++---
 .../obj-id-init-simple-no-strict.case         | 16 +++---
 .../obj-id-init-simple-strict.case            |  8 ++-
 .../obj-id-init-yield-expr.case               | 15 +++---
 .../obj-id-init-yield-ident-invalid.case      |  9 ++--
 .../obj-id-init-yield-ident-valid.case        | 16 +++---
 .../dstr-assignment/obj-id-put-const.case     | 14 +++--
 .../dstr-assignment/obj-id-put-let.case       | 15 ++++--
 .../obj-id-put-unresolvable-no-strict.case    | 10 +++-
 .../obj-id-put-unresolvable-strict.case       | 12 +++--
 .../obj-id-simple-no-strict.case              | 16 +++---
 .../dstr-assignment/obj-id-simple-strict.case |  8 ++-
 ...obj-prop-elem-init-assignment-missing.case | 20 +++++++
 .../obj-prop-elem-init-assignment-null.case   | 19 +++++++
 .../obj-prop-elem-init-assignment-truthy.case | 19 +++++++
 .../obj-prop-elem-init-assignment-undef.case  | 19 +++++++
 .../obj-prop-elem-init-evaluation.case        | 23 ++++++++
 .../obj-prop-elem-init-fn-name-arrow.case     | 12 +++--
 .../obj-prop-elem-init-fn-name-class.case     | 15 +++---
 .../obj-prop-elem-init-fn-name-cover.case     | 15 +++---
 .../obj-prop-elem-init-fn-name-fn.case        | 15 +++---
 .../obj-prop-elem-init-fn-name-gen.case       | 15 +++---
 .../obj-prop-elem-init-in.case                | 16 +++---
 .../obj-prop-elem-init-let.case               | 17 +++---
 .../obj-prop-elem-init-yield-expr.case        | 16 +++---
 ...bj-prop-elem-init-yield-ident-invalid.case |  9 ++--
 .../obj-prop-elem-init-yield-ident-valid.case | 14 ++---
 .../obj-prop-elem-target-yield-expr.case      | 15 +++---
 ...-prop-elem-target-yield-ident-invalid.case |  9 ++--
 ...bj-prop-elem-target-yield-ident-valid.case | 15 +++---
 .../obj-prop-identifier-resolution-first.case | 19 +++++++
 .../obj-prop-identifier-resolution-last.case  | 19 +++++++
 .../obj-prop-identifier-resolution-lone.case  | 18 +++++++
 ...obj-prop-identifier-resolution-middle.case | 19 +++++++
 .../obj-prop-identifier-resolution-trlng.case | 19 +++++++
 .../obj-prop-name-evaluation-error.case       | 14 +++--
 .../obj-prop-name-evaluation.case             | 16 +++---
 .../obj-prop-nested-array-invalid.case        | 18 +++++++
 .../obj-prop-nested-array-null.case           | 14 +++--
 .../obj-prop-nested-array-undefined-own.case  | 14 +++--
 .../obj-prop-nested-array-undefined.case      | 14 +++--
 .../obj-prop-nested-array-yield-expr.case     | 15 +++---
 ...prop-nested-array-yield-ident-invalid.case |  9 ++--
 ...j-prop-nested-array-yield-ident-valid.case | 16 +++---
 .../obj-prop-nested-array.case                | 16 +++---
 .../obj-prop-nested-obj-invalid.case          |  8 ++-
 .../obj-prop-nested-obj-null.case             | 14 +++--
 .../obj-prop-nested-obj-undefined-own.case    | 14 +++--
 .../obj-prop-nested-obj-undefined.case        | 14 +++--
 .../obj-prop-nested-obj-yield-expr.case       | 15 +++---
 ...j-prop-nested-obj-yield-ident-invalid.case |  9 ++--
 ...obj-prop-nested-obj-yield-ident-valid.case | 14 ++---
 .../dstr-assignment/obj-prop-nested-obj.case  | 14 ++---
 .../dstr-assignment/obj-prop-put-const.case   | 14 +++--
 .../dstr-assignment/obj-prop-put-let.case     | 15 ++++--
 .../dstr-assignment/obj-prop-put-order.case   | 16 +++---
 .../obj-prop-put-prop-ref-no-get.case         | 18 ++++---
 .../obj-prop-put-prop-ref-user-err.case       | 15 +++---
 .../obj-prop-put-prop-ref.case                | 15 +++---
 .../obj-prop-put-unresolvable-no-strict.case  | 10 +++-
 .../obj-prop-put-unresolvable-strict.case     | 12 +++--
 .../syntax/assignment-expr.template           | 20 +++++++
 src/dstr-assignment/syntax/for-in.template    | 29 ++++++++++
 src/dstr-assignment/syntax/for-of.template    | 29 ++++++++++
 .../destructuring/array-elem-elision.js       | 19 -------
 .../array-elem-init-assignment.js             | 41 --------------
 .../array-elem-init-evaluation.js             | 24 ---------
 .../assignment/destructuring/array-elision.js | 40 --------------
 .../assignment/destructuring/array-empty.js   | 40 --------------
 .../destructuring/array-iteration.js          | 53 -------------------
 .../obj-id-identifier-resolution.js           | 45 ----------------
 .../obj-id-identifier-yield-ident-valid.js    | 18 -------
 .../destructuring/obj-id-init-assignment.js   | 35 ------------
 .../destructuring/obj-id-init-evaluation.js   | 24 ---------
 .../obj-prop-elem-init-assignment.js          | 35 ------------
 .../obj-prop-elem-init-evaluation.js          | 24 ---------
 .../obj-prop-identifier-resolution.js         | 45 ----------------
 .../obj-prop-nested-array-invalid.js          | 16 ------
 .../assignment/destructuring/object-empty.js  | 41 --------------
 265 files changed, 2737 insertions(+), 1505 deletions(-)
 create mode 100644 src/dstr-assignment/array-elem-init-assignment.case
 create mode 100644 src/dstr-assignment/array-elem-init-evaluation.case
 rename test/language/expressions/assignment/destructuring/array-elem-init-fn-name-arrow.js => src/dstr-assignment/array-elem-init-fn-name-arrow.case (85%)
 rename test/language/expressions/assignment/destructuring/array-elem-init-fn-name-class.js => src/dstr-assignment/array-elem-init-fn-name-class.case (84%)
 rename test/language/expressions/assignment/destructuring/array-elem-init-fn-name-cover.js => src/dstr-assignment/array-elem-init-fn-name-cover.case (88%)
 rename test/language/expressions/assignment/destructuring/array-elem-init-fn-name-fn.js => src/dstr-assignment/array-elem-init-fn-name-fn.case (83%)
 rename test/language/expressions/assignment/destructuring/array-elem-init-fn-name-gen.js => src/dstr-assignment/array-elem-init-fn-name-gen.case (79%)
 rename test/language/expressions/assignment/destructuring/array-elem-init-in.js => src/dstr-assignment/array-elem-init-in.case (69%)
 rename test/language/expressions/assignment/destructuring/array-elem-init-let.js => src/dstr-assignment/array-elem-init-let.case (69%)
 rename test/language/expressions/assignment/destructuring/array-elem-init-order.js => src/dstr-assignment/array-elem-init-order.case (71%)
 rename test/language/expressions/assignment/destructuring/array-elem-init-simple-no-strict.js => src/dstr-assignment/array-elem-init-simple-no-strict.case (76%)
 rename test/language/expressions/assignment/destructuring/array-elem-target-simple-strict.js => src/dstr-assignment/array-elem-init-simple-strict.case (86%)
 rename test/language/expressions/assignment/destructuring/array-elem-init-yield-expr.js => src/dstr-assignment/array-elem-init-yield-expr.case (78%)
 rename test/language/expressions/assignment/destructuring/array-elem-init-yield-ident-invalid.js => src/dstr-assignment/array-elem-init-yield-ident-invalid.case (85%)
 rename test/language/expressions/assignment/destructuring/array-elem-init-yield-ident-valid.js => src/dstr-assignment/array-elem-init-yield-ident-valid.case (77%)
 rename test/language/expressions/assignment/destructuring/array-elem-iter-get-err.js => src/dstr-assignment/array-elem-iter-get-err.case (77%)
 rename test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close-err.js => src/dstr-assignment/array-elem-iter-nrml-close-err.case (85%)
 rename test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close-null.js => src/dstr-assignment/array-elem-iter-nrml-close-null.case (92%)
 rename test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close-skip.js => src/dstr-assignment/array-elem-iter-nrml-close-skip.case (91%)
 rename test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close.js => src/dstr-assignment/array-elem-iter-nrml-close.case (94%)
 rename test/language/expressions/assignment/destructuring/array-elem-iter-rtrn-close-err.js => src/dstr-assignment/array-elem-iter-rtrn-close-err.case (91%)
 rename test/language/expressions/assignment/destructuring/array-elem-iter-rtrn-close-null.js => src/dstr-assignment/array-elem-iter-rtrn-close-null.case (92%)
 rename test/language/expressions/assignment/destructuring/array-elem-iter-rtrn-close.js => src/dstr-assignment/array-elem-iter-rtrn-close.case (92%)
 rename test/language/expressions/assignment/destructuring/array-elem-iter-thrw-close-err.js => src/dstr-assignment/array-elem-iter-thrw-close-err.case (89%)
 rename test/language/expressions/assignment/destructuring/array-elem-iter-thrw-close-skip.js => src/dstr-assignment/array-elem-iter-thrw-close-skip.case (88%)
 rename test/language/expressions/assignment/destructuring/array-elem-iter-thrw-close.js => src/dstr-assignment/array-elem-iter-thrw-close.case (91%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-array-invalid.js => src/dstr-assignment/array-elem-nested-array-invalid.case (88%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-array-null.js => src/dstr-assignment/array-elem-nested-array-null.case (75%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-array-undefined-hole.js => src/dstr-assignment/array-elem-nested-array-undefined-hole.case (75%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-array-undefined-own.js => src/dstr-assignment/array-elem-nested-array-undefined-own.case (74%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-array-undefined.js => src/dstr-assignment/array-elem-nested-array-undefined.case (75%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-array-yield-expr.js => src/dstr-assignment/array-elem-nested-array-yield-expr.case (80%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-array-yield-ident-invalid.js => src/dstr-assignment/array-elem-nested-array-yield-ident-invalid.case (86%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-array-yield-ident-valid.js => src/dstr-assignment/array-elem-nested-array-yield-ident-valid.case (79%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-array.js => src/dstr-assignment/array-elem-nested-array.case (77%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-array-invalid.js => src/dstr-assignment/array-elem-nested-obj-invalid.case (87%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-obj-null.js => src/dstr-assignment/array-elem-nested-obj-null.case (77%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-obj-undefined-hole.js => src/dstr-assignment/array-elem-nested-obj-undefined-hole.case (77%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-obj-undefined-own.js => src/dstr-assignment/array-elem-nested-obj-undefined-own.case (76%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-obj-undefined.js => src/dstr-assignment/array-elem-nested-obj-undefined.case (77%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-obj-yield-expr.js => src/dstr-assignment/array-elem-nested-obj-yield-expr.case (76%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-obj-yield-ident-invalid.js => src/dstr-assignment/array-elem-nested-obj-yield-ident-invalid.case (85%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-obj-yield-ident-valid.js => src/dstr-assignment/array-elem-nested-obj-yield-ident-valid.case (77%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-obj.js => src/dstr-assignment/array-elem-nested-obj.case (75%)
 rename test/language/expressions/assignment/destructuring/array-elem-put-const.js => src/dstr-assignment/array-elem-put-const.case (75%)
 rename test/language/expressions/assignment/destructuring/array-rest-put-let.js => src/dstr-assignment/array-elem-put-let.case (71%)
 rename test/language/expressions/assignment/destructuring/array-elem-put-prop-ref-no-get.js => src/dstr-assignment/array-elem-put-prop-ref-no-get.case (78%)
 rename test/language/expressions/assignment/destructuring/array-elem-put-prop-ref-user-err.js => src/dstr-assignment/array-elem-put-prop-ref-user-err.case (77%)
 rename test/language/expressions/assignment/destructuring/array-elem-put-prop-ref.js => src/dstr-assignment/array-elem-put-prop-ref.case (74%)
 rename test/language/expressions/assignment/destructuring/array-elem-put-unresolvable-no-strict.js => src/dstr-assignment/array-elem-put-unresolvable-no-strict.case (81%)
 rename test/language/expressions/assignment/destructuring/array-elem-put-unresolvable-strict.js => src/dstr-assignment/array-elem-put-unresolvable-strict.case (77%)
 rename test/language/expressions/assignment/destructuring/array-elem-target-identifier.js => src/dstr-assignment/array-elem-target-identifier.case (79%)
 rename test/language/expressions/assignment/destructuring/array-elem-target-simple-no-strict.js => src/dstr-assignment/array-elem-target-simple-no-strict.case (76%)
 rename test/language/expressions/assignment/destructuring/array-elem-init-simple-strict.js => src/dstr-assignment/array-elem-target-simple-strict.case (86%)
 rename test/language/expressions/assignment/destructuring/array-elem-target-yield-expr.js => src/dstr-assignment/array-elem-target-yield-expr.case (79%)
 rename test/language/expressions/assignment/destructuring/array-elem-target-yield-invalid.js => src/dstr-assignment/array-elem-target-yield-invalid.case (86%)
 rename test/language/expressions/assignment/destructuring/array-elem-target-yield-valid.js => src/dstr-assignment/array-elem-target-yield-valid.case (79%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-abpt.js => src/dstr-assignment/array-elem-trlg-iter-elision-iter-abpt.case (88%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close-err.js => src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-err.case (88%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close-null.js => src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-null.case (94%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close-skip.js => src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-skip.case (88%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close.js => src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close.case (91%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-get-err.js => src/dstr-assignment/array-elem-trlg-iter-get-err.case (80%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close-err.js => src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-err.case (89%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close-null.js => src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-null.case (94%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close-skip.js => src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-skip.case (94%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close.js => src/dstr-assignment/array-elem-trlg-iter-list-nrml-close.case (95%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-rtrn-close-err.js => src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-err.case (93%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-rtrn-close-null.js => src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-null.case (94%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-rtrn-close.js => src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close.case (95%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-thrw-close-err.js => src/dstr-assignment/array-elem-trlg-iter-list-thrw-close-err.case (92%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-thrw-close-skip.js => src/dstr-assignment/array-elem-trlg-iter-list-thrw-close-skip.case (92%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-thrw-close.js => src/dstr-assignment/array-elem-trlg-iter-list-thrw-close.case (93%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-nrml-close-skip.js => src/dstr-assignment/array-elem-trlg-iter-rest-nrml-close-skip.case (93%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-rtrn-close-err.js => src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close-err.case (94%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-rtrn-close-null.js => src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close-null.case (94%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-rtrn-close.js => src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close.case (95%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-thrw-close-err.js => src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close-err.case (92%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-thrw-close-skip.js => src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close-skip.case (87%)
 rename test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-thrw-close.js => src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close.case (93%)
 rename test/language/expressions/assignment/destructuring/array-elision-iter-abpt.js => src/dstr-assignment/array-elision-iter-abpt.case (89%)
 rename test/language/expressions/assignment/destructuring/array-elision-iter-get-err.js => src/dstr-assignment/array-elision-iter-get-err.case (78%)
 rename test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close-err.js => src/dstr-assignment/array-elision-iter-nrml-close-err.case (90%)
 rename test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close-null.js => src/dstr-assignment/array-elision-iter-nrml-close-null.case (93%)
 rename test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close-skip.js => src/dstr-assignment/array-elision-iter-nrml-close-skip.case (91%)
 rename test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close.js => src/dstr-assignment/array-elision-iter-nrml-close.case (94%)
 create mode 100644 src/dstr-assignment/array-elision-val-array.case
 create mode 100644 src/dstr-assignment/array-elision-val-bool.case
 create mode 100644 src/dstr-assignment/array-elision-val-null.case
 create mode 100644 src/dstr-assignment/array-elision-val-num.case
 create mode 100644 src/dstr-assignment/array-elision-val-string.case
 create mode 100644 src/dstr-assignment/array-elision-val-symbol.case
 create mode 100644 src/dstr-assignment/array-elision-val-undef.case
 rename test/language/expressions/assignment/destructuring/array-empty-iter-close-err.js => src/dstr-assignment/array-empty-iter-close-err.case (84%)
 rename test/language/expressions/assignment/destructuring/array-empty-iter-close-null.js => src/dstr-assignment/array-empty-iter-close-null.case (92%)
 rename test/language/expressions/assignment/destructuring/array-empty-iter-close.js => src/dstr-assignment/array-empty-iter-close.case (91%)
 rename test/language/expressions/assignment/destructuring/array-empty-iter-get-err.js => src/dstr-assignment/array-empty-iter-get-err.case (78%)
 create mode 100644 src/dstr-assignment/array-empty-val-array.case
 create mode 100644 src/dstr-assignment/array-empty-val-bool.case
 create mode 100644 src/dstr-assignment/array-empty-val-null.case
 create mode 100644 src/dstr-assignment/array-empty-val-num.case
 create mode 100644 src/dstr-assignment/array-empty-val-string.case
 create mode 100644 src/dstr-assignment/array-empty-val-symbol.case
 create mode 100644 src/dstr-assignment/array-empty-val-undef.case
 create mode 100644 src/dstr-assignment/array-iteration.case
 rename test/language/expressions/assignment/destructuring/array-rest-after-element.js => src/dstr-assignment/array-rest-after-element.case (82%)
 rename test/language/expressions/assignment/destructuring/array-rest-after-elision.js => src/dstr-assignment/array-rest-after-elision.case (81%)
 rename test/language/expressions/assignment/destructuring/array-rest-before-element.js => src/dstr-assignment/array-rest-before-element.case (83%)
 rename test/language/expressions/assignment/destructuring/array-rest-before-elision.js => src/dstr-assignment/array-rest-before-elision.case (83%)
 rename test/language/expressions/assignment/destructuring/array-rest-before-rest.js => src/dstr-assignment/array-rest-before-rest.case (83%)
 rename test/language/expressions/assignment/destructuring/array-rest-elision-invalid.js => src/dstr-assignment/array-rest-elision-invalid.case (84%)
 rename test/language/expressions/assignment/destructuring/array-rest-elision-iter-abpt.js => src/dstr-assignment/array-rest-elision-iter-abpt.case (91%)
 rename test/language/expressions/assignment/destructuring/array-rest-elision.js => src/dstr-assignment/array-rest-elision.case (76%)
 rename test/language/expressions/assignment/destructuring/array-rest-init.js => src/dstr-assignment/array-rest-init.case (79%)
 rename test/language/expressions/assignment/destructuring/array-rest-iter-get-err.js => src/dstr-assignment/array-rest-iter-get-err.case (79%)
 rename test/language/expressions/assignment/destructuring/array-rest-iter-nrml-close-skip.js => src/dstr-assignment/array-rest-iter-nrml-close-skip.case (92%)
 rename test/language/expressions/assignment/destructuring/array-rest-iter-rtrn-close-err.js => src/dstr-assignment/array-rest-iter-rtrn-close-err.case (93%)
 rename test/language/expressions/assignment/destructuring/array-rest-iter-rtrn-close-null.js => src/dstr-assignment/array-rest-iter-rtrn-close-null.case (94%)
 rename test/language/expressions/assignment/destructuring/array-rest-iter-rtrn-close.js => src/dstr-assignment/array-rest-iter-rtrn-close.case (94%)
 rename test/language/expressions/assignment/destructuring/array-rest-iter-thrw-close-err.js => src/dstr-assignment/array-rest-iter-thrw-close-err.case (93%)
 rename test/language/expressions/assignment/destructuring/array-rest-iter-thrw-close-skip.js => src/dstr-assignment/array-rest-iter-thrw-close-skip.case (90%)
 rename test/language/expressions/assignment/destructuring/array-rest-iter-thrw-close.js => src/dstr-assignment/array-rest-iter-thrw-close.case (94%)
 rename test/language/expressions/assignment/destructuring/array-rest-iteration.js => src/dstr-assignment/array-rest-iteration.case (79%)
 rename test/language/expressions/assignment/destructuring/array-rest-lref-err.js => src/dstr-assignment/array-rest-lref-err.case (92%)
 rename test/language/expressions/assignment/destructuring/array-rest-lref.js => src/dstr-assignment/array-rest-lref.case (90%)
 rename test/language/expressions/assignment/destructuring/array-elem-nested-obj-invalid.js => src/dstr-assignment/array-rest-nested-array-invalid.case (87%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-array-iter-thrw-close-skip.js => src/dstr-assignment/array-rest-nested-array-iter-thrw-close-skip.case (92%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-array-null.js => src/dstr-assignment/array-rest-nested-array-null.case (79%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-array-undefined-hole.js => src/dstr-assignment/array-rest-nested-array-undefined-hole.case (79%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-array-undefined-own.js => src/dstr-assignment/array-rest-nested-array-undefined-own.case (78%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-array-undefined.js => src/dstr-assignment/array-rest-nested-array-undefined.case (78%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-array-yield-expr.js => src/dstr-assignment/array-rest-nested-array-yield-expr.case (79%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-array-yield-ident-invalid.js => src/dstr-assignment/array-rest-nested-array-yield-ident-invalid.case (86%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-array-yield-ident-valid.js => src/dstr-assignment/array-rest-nested-array-yield-ident-valid.case (79%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-array.js => src/dstr-assignment/array-rest-nested-array.case (76%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-obj-invalid.js => src/dstr-assignment/array-rest-nested-obj-invalid.case (86%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-obj-null.js => src/dstr-assignment/array-rest-nested-obj-null.case (77%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-obj-undefined-hole.js => src/dstr-assignment/array-rest-nested-obj-undefined-hole.case (77%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-obj-undefined-own.js => src/dstr-assignment/array-rest-nested-obj-undefined-own.case (76%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-obj-undefined.js => src/dstr-assignment/array-rest-nested-obj-undefined.case (76%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-obj-yield-expr.js => src/dstr-assignment/array-rest-nested-obj-yield-expr.case (76%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-obj-yield-ident-invalid.js => src/dstr-assignment/array-rest-nested-obj-yield-ident-invalid.case (85%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-obj-yield-ident-valid.js => src/dstr-assignment/array-rest-nested-obj-yield-ident-valid.case (74%)
 rename test/language/expressions/assignment/destructuring/array-rest-nested-obj.js => src/dstr-assignment/array-rest-nested-obj.case (75%)
 rename test/language/expressions/assignment/destructuring/array-rest-put-const.js => src/dstr-assignment/array-rest-put-const.case (75%)
 rename test/language/expressions/assignment/destructuring/array-elem-put-let.js => src/dstr-assignment/array-rest-put-let.case (70%)
 rename test/language/expressions/assignment/destructuring/array-rest-put-prop-ref-no-get.js => src/dstr-assignment/array-rest-put-prop-ref-no-get.case (80%)
 rename test/language/expressions/assignment/destructuring/array-rest-put-prop-ref-user-err-iter-close-skip.js => src/dstr-assignment/array-rest-put-prop-ref-user-err-iter-close-skip.case (92%)
 rename test/language/expressions/assignment/destructuring/array-rest-put-prop-ref-user-err.js => src/dstr-assignment/array-rest-put-prop-ref-user-err.case (76%)
 rename test/language/expressions/assignment/destructuring/array-rest-put-prop-ref.js => src/dstr-assignment/array-rest-put-prop-ref.case (77%)
 rename test/language/expressions/assignment/destructuring/array-rest-put-unresolvable-no-strict.js => src/dstr-assignment/array-rest-put-unresolvable-no-strict.case (81%)
 rename test/language/expressions/assignment/destructuring/array-rest-put-unresolvable-strict.js => src/dstr-assignment/array-rest-put-unresolvable-strict.case (77%)
 rename test/language/expressions/assignment/destructuring/array-rest-yield-expr.js => src/dstr-assignment/array-rest-yield-expr.case (79%)
 rename test/language/expressions/assignment/destructuring/array-rest-yield-ident-invalid.js => src/dstr-assignment/array-rest-yield-ident-invalid.case (85%)
 rename test/language/expressions/assignment/destructuring/array-rest-yield-ident-valid.js => src/dstr-assignment/array-rest-yield-ident-valid.case (82%)
 create mode 100644 src/dstr-assignment/default/assignment-expr.template
 create mode 100644 src/dstr-assignment/default/for-of.template
 create mode 100644 src/dstr-assignment/error/assignment-expr.template
 create mode 100644 src/dstr-assignment/error/for-of.template
 create mode 100644 src/dstr-assignment/obj-empty-bool.case
 create mode 100644 src/dstr-assignment/obj-empty-null.case
 create mode 100644 src/dstr-assignment/obj-empty-num.case
 create mode 100644 src/dstr-assignment/obj-empty-obj.case
 create mode 100644 src/dstr-assignment/obj-empty-string.case
 create mode 100644 src/dstr-assignment/obj-empty-symbol.case
 create mode 100644 src/dstr-assignment/obj-empty-undef.case
 create mode 100644 src/dstr-assignment/obj-id-identifier-resolution-first.case
 create mode 100644 src/dstr-assignment/obj-id-identifier-resolution-last.case
 create mode 100644 src/dstr-assignment/obj-id-identifier-resolution-lone.case
 create mode 100644 src/dstr-assignment/obj-id-identifier-resolution-middle.case
 create mode 100644 src/dstr-assignment/obj-id-identifier-resolution-trlng.case
 rename test/language/expressions/assignment/destructuring/obj-id-identifier-yield-expr.js => src/dstr-assignment/obj-id-identifier-yield-expr.case (57%)
 rename test/language/expressions/assignment/destructuring/obj-id-identifier-yield-ident-invalid.js => src/dstr-assignment/obj-id-identifier-yield-ident-invalid.case (57%)
 create mode 100644 src/dstr-assignment/obj-id-identifier-yield-ident-valid.case
 create mode 100644 src/dstr-assignment/obj-id-init-assignment-missing.case
 create mode 100644 src/dstr-assignment/obj-id-init-assignment-null.case
 create mode 100644 src/dstr-assignment/obj-id-init-assignment-truthy.case
 create mode 100644 src/dstr-assignment/obj-id-init-assignment-undef.case
 create mode 100644 src/dstr-assignment/obj-id-init-evaluation.case
 rename test/language/expressions/assignment/destructuring/obj-id-init-fn-name-arrow.js => src/dstr-assignment/obj-id-init-fn-name-arrow.case (84%)
 rename test/language/expressions/assignment/destructuring/obj-id-init-fn-name-class.js => src/dstr-assignment/obj-id-init-fn-name-class.case (79%)
 rename test/language/expressions/assignment/destructuring/obj-id-init-fn-name-cover.js => src/dstr-assignment/obj-id-init-fn-name-cover.case (83%)
 rename test/language/expressions/assignment/destructuring/obj-id-init-fn-name-fn.js => src/dstr-assignment/obj-id-init-fn-name-fn.case (78%)
 rename test/language/expressions/assignment/destructuring/obj-id-init-fn-name-gen.js => src/dstr-assignment/obj-id-init-fn-name-gen.case (78%)
 rename test/language/expressions/assignment/destructuring/obj-id-init-in.js => src/dstr-assignment/obj-id-init-in.case (68%)
 rename test/language/expressions/assignment/destructuring/obj-prop-elem-init-let.js => src/dstr-assignment/obj-id-init-let.case (69%)
 rename test/language/expressions/assignment/destructuring/obj-id-init-order.js => src/dstr-assignment/obj-id-init-order.case (71%)
 rename test/language/expressions/assignment/destructuring/obj-id-init-simple-no-strict.js => src/dstr-assignment/obj-id-init-simple-no-strict.case (67%)
 rename test/language/expressions/assignment/destructuring/obj-id-init-simple-strict.js => src/dstr-assignment/obj-id-init-simple-strict.case (83%)
 rename test/language/expressions/assignment/destructuring/obj-id-init-yield-expr.js => src/dstr-assignment/obj-id-init-yield-expr.case (76%)
 rename test/language/expressions/assignment/destructuring/obj-id-init-yield-ident-invalid.js => src/dstr-assignment/obj-id-init-yield-ident-invalid.case (86%)
 rename test/language/expressions/assignment/destructuring/obj-id-init-yield-ident-valid.js => src/dstr-assignment/obj-id-init-yield-ident-valid.case (77%)
 rename test/language/expressions/assignment/destructuring/obj-id-put-const.js => src/dstr-assignment/obj-id-put-const.case (74%)
 rename test/language/expressions/assignment/destructuring/obj-prop-put-let.js => src/dstr-assignment/obj-id-put-let.case (71%)
 rename test/language/expressions/assignment/destructuring/obj-id-put-unresolvable-no-strict.js => src/dstr-assignment/obj-id-put-unresolvable-no-strict.case (81%)
 rename test/language/expressions/assignment/destructuring/obj-id-put-unresolvable-strict.js => src/dstr-assignment/obj-id-put-unresolvable-strict.case (77%)
 rename test/language/expressions/assignment/destructuring/obj-id-simple-no-strict.js => src/dstr-assignment/obj-id-simple-no-strict.case (65%)
 rename test/language/expressions/assignment/destructuring/obj-id-simple-strict.js => src/dstr-assignment/obj-id-simple-strict.case (84%)
 create mode 100644 src/dstr-assignment/obj-prop-elem-init-assignment-missing.case
 create mode 100644 src/dstr-assignment/obj-prop-elem-init-assignment-null.case
 create mode 100644 src/dstr-assignment/obj-prop-elem-init-assignment-truthy.case
 create mode 100644 src/dstr-assignment/obj-prop-elem-init-assignment-undef.case
 create mode 100644 src/dstr-assignment/obj-prop-elem-init-evaluation.case
 rename test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-arrow.js => src/dstr-assignment/obj-prop-elem-init-fn-name-arrow.case (85%)
 rename test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-class.js => src/dstr-assignment/obj-prop-elem-init-fn-name-class.case (80%)
 rename test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-cover.js => src/dstr-assignment/obj-prop-elem-init-fn-name-cover.case (84%)
 rename test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-fn.js => src/dstr-assignment/obj-prop-elem-init-fn-name-fn.case (79%)
 rename test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-gen.js => src/dstr-assignment/obj-prop-elem-init-fn-name-gen.case (79%)
 rename test/language/expressions/assignment/destructuring/obj-prop-elem-init-in.js => src/dstr-assignment/obj-prop-elem-init-in.case (68%)
 rename test/language/expressions/assignment/destructuring/obj-id-init-let.js => src/dstr-assignment/obj-prop-elem-init-let.case (68%)
 rename test/language/expressions/assignment/destructuring/obj-prop-elem-init-yield-expr.js => src/dstr-assignment/obj-prop-elem-init-yield-expr.case (76%)
 rename test/language/expressions/assignment/destructuring/obj-prop-elem-init-yield-ident-invalid.js => src/dstr-assignment/obj-prop-elem-init-yield-ident-invalid.case (85%)
 rename test/language/expressions/assignment/destructuring/obj-prop-elem-init-yield-ident-valid.js => src/dstr-assignment/obj-prop-elem-init-yield-ident-valid.case (77%)
 rename test/language/expressions/assignment/destructuring/obj-prop-elem-target-yield-expr.js => src/dstr-assignment/obj-prop-elem-target-yield-expr.case (77%)
 rename test/language/expressions/assignment/destructuring/obj-prop-elem-target-yield-ident-invalid.js => src/dstr-assignment/obj-prop-elem-target-yield-ident-invalid.case (86%)
 rename test/language/expressions/assignment/destructuring/obj-prop-elem-target-yield-ident-valid.js => src/dstr-assignment/obj-prop-elem-target-yield-ident-valid.case (78%)
 create mode 100644 src/dstr-assignment/obj-prop-identifier-resolution-first.case
 create mode 100644 src/dstr-assignment/obj-prop-identifier-resolution-last.case
 create mode 100644 src/dstr-assignment/obj-prop-identifier-resolution-lone.case
 create mode 100644 src/dstr-assignment/obj-prop-identifier-resolution-middle.case
 create mode 100644 src/dstr-assignment/obj-prop-identifier-resolution-trlng.case
 rename test/language/expressions/assignment/destructuring/obj-prop-name-evaluation-error.js => src/dstr-assignment/obj-prop-name-evaluation-error.case (75%)
 rename test/language/expressions/assignment/destructuring/obj-prop-name-evaluation.js => src/dstr-assignment/obj-prop-name-evaluation.case (69%)
 create mode 100644 src/dstr-assignment/obj-prop-nested-array-invalid.case
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-array-null.js => src/dstr-assignment/obj-prop-nested-array-null.case (75%)
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-array-undefined-own.js => src/dstr-assignment/obj-prop-nested-array-undefined-own.case (74%)
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-array-undefined.js => src/dstr-assignment/obj-prop-nested-array-undefined.case (77%)
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-array-yield-expr.js => src/dstr-assignment/obj-prop-nested-array-yield-expr.case (76%)
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-array-yield-ident-invalid.js => src/dstr-assignment/obj-prop-nested-array-yield-ident-invalid.case (84%)
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-array-yield-ident-valid.js => src/dstr-assignment/obj-prop-nested-array-yield-ident-valid.case (76%)
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-array.js => src/dstr-assignment/obj-prop-nested-array.case (75%)
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-obj-invalid.js => src/dstr-assignment/obj-prop-nested-obj-invalid.case (85%)
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-obj-null.js => src/dstr-assignment/obj-prop-nested-obj-null.case (75%)
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-obj-undefined-own.js => src/dstr-assignment/obj-prop-nested-obj-undefined-own.case (74%)
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-obj-undefined.js => src/dstr-assignment/obj-prop-nested-obj-undefined.case (77%)
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-obj-yield-expr.js => src/dstr-assignment/obj-prop-nested-obj-yield-expr.case (76%)
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-obj-yield-ident-invalid.js => src/dstr-assignment/obj-prop-nested-obj-yield-ident-invalid.case (84%)
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-obj-yield-ident-valid.js => src/dstr-assignment/obj-prop-nested-obj-yield-ident-valid.case (79%)
 rename test/language/expressions/assignment/destructuring/obj-prop-nested-obj.js => src/dstr-assignment/obj-prop-nested-obj.case (77%)
 rename test/language/expressions/assignment/destructuring/obj-prop-put-const.js => src/dstr-assignment/obj-prop-put-const.case (73%)
 rename test/language/expressions/assignment/destructuring/obj-id-put-let.js => src/dstr-assignment/obj-prop-put-let.case (70%)
 rename test/language/expressions/assignment/destructuring/obj-prop-put-order.js => src/dstr-assignment/obj-prop-put-order.case (69%)
 rename test/language/expressions/assignment/destructuring/obj-prop-put-prop-ref-no-get.js => src/dstr-assignment/obj-prop-put-prop-ref-no-get.case (76%)
 rename test/language/expressions/assignment/destructuring/obj-prop-put-prop-ref-user-err.js => src/dstr-assignment/obj-prop-put-prop-ref-user-err.case (75%)
 rename test/language/expressions/assignment/destructuring/obj-prop-put-prop-ref.js => src/dstr-assignment/obj-prop-put-prop-ref.case (72%)
 rename test/language/expressions/assignment/destructuring/obj-prop-put-unresolvable-no-strict.js => src/dstr-assignment/obj-prop-put-unresolvable-no-strict.case (81%)
 rename test/language/expressions/assignment/destructuring/obj-prop-put-unresolvable-strict.js => src/dstr-assignment/obj-prop-put-unresolvable-strict.case (76%)
 create mode 100644 src/dstr-assignment/syntax/assignment-expr.template
 create mode 100644 src/dstr-assignment/syntax/for-in.template
 create mode 100644 src/dstr-assignment/syntax/for-of.template
 delete mode 100644 test/language/expressions/assignment/destructuring/array-elem-elision.js
 delete mode 100644 test/language/expressions/assignment/destructuring/array-elem-init-assignment.js
 delete mode 100644 test/language/expressions/assignment/destructuring/array-elem-init-evaluation.js
 delete mode 100644 test/language/expressions/assignment/destructuring/array-elision.js
 delete mode 100644 test/language/expressions/assignment/destructuring/array-empty.js
 delete mode 100644 test/language/expressions/assignment/destructuring/array-iteration.js
 delete mode 100644 test/language/expressions/assignment/destructuring/obj-id-identifier-resolution.js
 delete mode 100644 test/language/expressions/assignment/destructuring/obj-id-identifier-yield-ident-valid.js
 delete mode 100644 test/language/expressions/assignment/destructuring/obj-id-init-assignment.js
 delete mode 100644 test/language/expressions/assignment/destructuring/obj-id-init-evaluation.js
 delete mode 100644 test/language/expressions/assignment/destructuring/obj-prop-elem-init-assignment.js
 delete mode 100644 test/language/expressions/assignment/destructuring/obj-prop-elem-init-evaluation.js
 delete mode 100644 test/language/expressions/assignment/destructuring/obj-prop-identifier-resolution.js
 delete mode 100644 test/language/expressions/assignment/destructuring/obj-prop-nested-array-invalid.js
 delete mode 100644 test/language/expressions/assignment/destructuring/object-empty.js

diff --git a/src/dstr-assignment/array-elem-init-assignment.case b/src/dstr-assignment/array-elem-init-assignment.case
new file mode 100644
index 0000000000..a03405902a
--- /dev/null
+++ b/src/dstr-assignment/array-elem-init-assignment.case
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+    If the Initializer is present and v is undefined, the Initializer should be
+    evaluated and the result assigned to the target reference.
+template: default
+es6id: 12.14.5.3
+---*/
+
+//- setup
+var v2, vNull, vHole, vUndefined, vOob;
+//- elems
+[v2 = 10, vNull = 11, vHole = 12, vUndefined = 13, vOob = 14]
+//- vals
+[2, null, , undefined]
+//- body
+assert.sameValue(v2, 2);
+assert.sameValue(vNull, null);
+assert.sameValue(vHole, 12);
+assert.sameValue(vUndefined, 13);
+assert.sameValue(vOob, 14);
diff --git a/src/dstr-assignment/array-elem-init-evaluation.case b/src/dstr-assignment/array-elem-init-evaluation.case
new file mode 100644
index 0000000000..5feea93a8e
--- /dev/null
+++ b/src/dstr-assignment/array-elem-init-evaluation.case
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+    The Initializer should only be evaluated if v is undefined.
+template: default
+es6id: 12.14.5.3
+---*/
+
+//- setup
+var flag1 = false, flag2 = false;
+var _;
+//- elems
+[ _ = flag1 = true, _ = flag2 = true ]
+//- vals
+[14]
+//- body
+assert.sameValue(flag1, false);
+assert.sameValue(flag2, true);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-fn-name-arrow.js b/src/dstr-assignment/array-elem-init-fn-name-arrow.case
similarity index 85%
rename from test/language/expressions/assignment/destructuring/array-elem-init-fn-name-arrow.js
rename to src/dstr-assignment/array-elem-init-fn-name-arrow.case
index d729c2a895..75d60e512a 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-init-fn-name-arrow.js
+++ b/src/dstr-assignment/array-elem-init-fn-name-arrow.case
@@ -2,7 +2,8 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: Assignment of function `name` attribute (ArrowFunction)
+desc: Assignment of function `name` attribute (ArrowFunction)
+template: default
 es6id: 12.14.5.3
 info: >
     AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt
@@ -18,10 +19,13 @@ info: >
 includes: [propertyHelper.js]
 ---*/
 
+//- setup
 var arrow;
-
-[ arrow = () => {} ] = [];
-
+//- elems
+[ arrow = () => {} ]
+//- vals
+[]
+//- body
 assert.sameValue(arrow.name, 'arrow');
 verifyNotEnumerable(arrow, 'name');
 verifyNotWritable(arrow, 'name');
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-fn-name-class.js b/src/dstr-assignment/array-elem-init-fn-name-class.case
similarity index 84%
rename from test/language/expressions/assignment/destructuring/array-elem-init-fn-name-class.js
rename to src/dstr-assignment/array-elem-init-fn-name-class.case
index d781dd593c..91be890976 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-init-fn-name-class.js
+++ b/src/dstr-assignment/array-elem-init-fn-name-class.case
@@ -2,7 +2,8 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: Assignment of function `name` attribute (ClassExpression)
+desc: Assignment of function `name` attribute (ClassExpression)
+template: default
 es6id: 12.14.5.3
 info: >
     AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt
@@ -19,11 +20,13 @@ includes: [propertyHelper.js]
 features: [class]
 ---*/
 
+//- setup
 var xCls, cls;
-
-[ xCls = class x {} ] = [];;
-[ cls = class {} ] = [];
-
+//- elems
+[ xCls = class x {},cls = class {} ]
+//- vals
+[]
+//- body
 assert(xCls.name !== 'xCls');
 
 assert.sameValue(cls.name, 'cls');
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-fn-name-cover.js b/src/dstr-assignment/array-elem-init-fn-name-cover.case
similarity index 88%
rename from test/language/expressions/assignment/destructuring/array-elem-init-fn-name-cover.js
rename to src/dstr-assignment/array-elem-init-fn-name-cover.case
index 4e4b393516..43cb369481 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-init-fn-name-cover.js
+++ b/src/dstr-assignment/array-elem-init-fn-name-cover.case
@@ -2,8 +2,9 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Assignment of function `name` attribute (CoverParenthesizedExpression)
+template: default
 es6id: 12.14.5.3
 info: >
     AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt
@@ -19,11 +20,13 @@ info: >
 includes: [propertyHelper.js]
 ---*/
 
+//- setup
 var xCover, cover;
-
-[ xCover = (0, function() {}) ] = [];
-[ cover = (function() {}) ] = [];
-
+//- elems
+[ xCover = (0, function() {}), cover = (function() {}) ]
+//- vals
+[]
+//- body
 assert(xCover.name !== 'xCover');
 
 assert.sameValue(cover.name, 'cover');
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-fn-name-fn.js b/src/dstr-assignment/array-elem-init-fn-name-fn.case
similarity index 83%
rename from test/language/expressions/assignment/destructuring/array-elem-init-fn-name-fn.js
rename to src/dstr-assignment/array-elem-init-fn-name-fn.case
index 70e29b56ab..4493b8e043 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-init-fn-name-fn.js
+++ b/src/dstr-assignment/array-elem-init-fn-name-fn.case
@@ -2,7 +2,8 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: Assignment of function `name` attribute (FunctionExpression)
+desc: Assignment of function `name` attribute (FunctionExpression)
+template: default
 es6id: 12.14.5.3
 info: >
     AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt
@@ -19,11 +20,13 @@ includes: [propertyHelper.js]
 features: [class]
 ---*/
 
+//- setup
 var xFn, fn;
-
-[ xFn = function x() {} ] = [];;
-[ fn = function() {} ] = [];
-
+//- elems
+[ xFn = function x() {}, fn = function() {} ]
+//- vals
+[]
+//- body
 assert(xFn.name !== 'xFn');
 
 assert.sameValue(fn.name, 'fn');
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-fn-name-gen.js b/src/dstr-assignment/array-elem-init-fn-name-gen.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/array-elem-init-fn-name-gen.js
rename to src/dstr-assignment/array-elem-init-fn-name-gen.case
index 0d17fc6490..fea3bbaa2e 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-init-fn-name-gen.js
+++ b/src/dstr-assignment/array-elem-init-fn-name-gen.case
@@ -2,7 +2,8 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: Assignment of function `name` attribute (GeneratorExpression)
+desc: Assignment of function `name` attribute (GeneratorExpression)
+template: default
 es6id: 12.14.5.3
 info: >
     AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt
@@ -19,12 +20,14 @@ includes: [propertyHelper.js]
 features: [generators]
 ---*/
 
+//- setup
 var xGen, gen;
-
-[ xGen = function* x() {} ] = [];
-[ gen = function*() {} ] = [];;
-
-assert(xGen.name !== 'xGen');
+//- elems
+[ xGen = function* x() {}, gen = function*() {} ]
+//- vals
+[]
+//- body
+assert.notSameValue(xGen.name, 'xGen');
 
 assert.sameValue(gen.name, 'gen');
 verifyNotEnumerable(gen, 'name');
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-in.js b/src/dstr-assignment/array-elem-init-in.case
similarity index 69%
rename from test/language/expressions/assignment/destructuring/array-elem-init-in.js
rename to src/dstr-assignment/array-elem-init-in.case
index 8fddbff152..d3afbe2760 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-init-in.js
+++ b/src/dstr-assignment/array-elem-init-in.case
@@ -2,15 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The Initializer in an AssignmentElement may be an `in` expression.
+template: default
 es6id: 12.14.5
 ---*/
 
-var value = [];
-var result, x;
-
-result = [ x = 'x' in {} ] = value;
-
-assert.sameValue(result, value);
+//- setup
+var x;
+//- elems
+[ x = 'x' in {} ]
+//- vals
+[]
+//- body
 assert.sameValue(x, false);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-let.js b/src/dstr-assignment/array-elem-init-let.case
similarity index 69%
rename from test/language/expressions/assignment/destructuring/array-elem-init-let.js
rename to src/dstr-assignment/array-elem-init-let.case
index b11f14491f..b3b8aea289 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-init-let.js
+++ b/src/dstr-assignment/array-elem-init-let.case
@@ -2,15 +2,20 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Value retrieval of Initializer obeys `let` semantics.
+template: error
 es6id: 12.14.5.3
 features: [let]
 ---*/
 
+//- error
+ReferenceError
+//- setup
 var x;
-
-assert.throws(ReferenceError, function() {
-  [ x = y ] = [];
-  let y;
-});
+//- elems
+[ x = y ]
+//- vals
+[]
+//- teardown
+let y;
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-order.js b/src/dstr-assignment/array-elem-init-order.case
similarity index 71%
rename from test/language/expressions/assignment/destructuring/array-elem-init-order.js
rename to src/dstr-assignment/array-elem-init-order.case
index 43ff62a456..f6e4830241 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-init-order.js
+++ b/src/dstr-assignment/array-elem-init-order.case
@@ -2,18 +2,20 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Initializer values should be assigned in left-to-right order.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [];
+//- setup
 var x = 0;
-var a, b, result;
-
-result = [ a = x += 1, b = x *= 2 ] = value;
-
-assert.sameValue(result, value);
+var a, b;
+//- elems
+[ a = x += 1, b = x *= 2 ]
+//- vals
+[]
+//- body
 assert.sameValue(a, 1);
 assert.sameValue(b, 2);
 assert.sameValue(x, 2);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-simple-no-strict.js b/src/dstr-assignment/array-elem-init-simple-no-strict.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/array-elem-init-simple-no-strict.js
rename to src/dstr-assignment/array-elem-init-simple-no-strict.case
index b3a5e9c73c..200238d079 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-init-simple-no-strict.js
+++ b/src/dstr-assignment/array-elem-init-simple-no-strict.case
@@ -2,19 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Identifiers that appear as the DestructuringAssignmentTarget in an
     AssignmentElement should take on the iterated value corresponding to their
     position in the ArrayAssignmentPattern.
+template: default
 es6id: 12.14.5.3
 flags: [noStrict]
 ---*/
 
-var value = [];
-var result, argument, eval;
-
-result = [arguments = 4, eval = 5] = value;
-
-assert.sameValue(result, value);
+//- setup
+var argument, eval;
+//- elems
+[arguments = 4, eval = 5]
+//- vals
+[]
+//- body
 assert.sameValue(arguments, 4);
 assert.sameValue(eval, 5);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-target-simple-strict.js b/src/dstr-assignment/array-elem-init-simple-strict.case
similarity index 86%
rename from test/language/expressions/assignment/destructuring/array-elem-target-simple-strict.js
rename to src/dstr-assignment/array-elem-init-simple-strict.case
index 2d0659bf42..7158a328b8 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-target-simple-strict.js
+++ b/src/dstr-assignment/array-elem-init-simple-strict.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     It is a Syntax Error if LeftHandSideExpression is neither an
     ObjectLiteral nor an ArrayLiteral and
     IsValidSimpleAssignmentTarget(LeftHandSideExpression) is
     false.
+template: syntax
 es6id: 12.14.5.1
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-([arguments] = []);
+//- elems
+[arguments]
+//- values
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-yield-expr.js b/src/dstr-assignment/array-elem-init-yield-expr.case
similarity index 78%
rename from test/language/expressions/assignment/destructuring/array-elem-init-yield-expr.js
rename to src/dstr-assignment/array-elem-init-yield-expr.case
index 8f4a5d8b24..6aa3a97ed7 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-init-yield-expr.js
+++ b/src/dstr-assignment/array-elem-init-yield-expr.case
@@ -2,31 +2,34 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of an
     AssignmentElement within a generator function body, it behaves as a
     YieldExpression.
+template: default
 es6id: 12.14.5.4
 features: [generators]
 ---*/
 
+//- setup
 var value = [];
-var assignmentResult, iterationResult, iter, x;
-
+var iterationResult, iter, x;
 iter = (function*() {
-  assignmentResult = [ x = yield ] = value;
+//- elems
+[ x = yield ]
+//- vals
+[]
+//- teardown
 })();
 
 iterationResult = iter.next();
 
-assert.sameValue(assignmentResult, undefined);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, false);
 assert.sameValue(x, undefined);
 
 iterationResult = iter.next(86);
 
-assert.sameValue(assignmentResult, value);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, true);
 assert.sameValue(x, 86);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-yield-ident-invalid.js b/src/dstr-assignment/array-elem-init-yield-ident-invalid.case
similarity index 85%
rename from test/language/expressions/assignment/destructuring/array-elem-init-yield-ident-invalid.js
rename to src/dstr-assignment/array-elem-init-yield-ident-invalid.case
index 429eb26b89..c67ee2c344 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-init-yield-ident-invalid.js
+++ b/src/dstr-assignment/array-elem-init-yield-ident-invalid.case
@@ -2,13 +2,16 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of an AssignmentElement
     outside of a generator function body, it behaves as an IdentifierReference.
+template: syntax
 es6id: 12.14.5.4
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-var x;
-[ x = yield ] = [];
+//- elems
+[ x = yield ]
+//- vals
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-yield-ident-valid.js b/src/dstr-assignment/array-elem-init-yield-ident-valid.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/array-elem-init-yield-ident-valid.js
rename to src/dstr-assignment/array-elem-init-yield-ident-valid.case
index 3d8d87cc57..05b7baac63 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-init-yield-ident-valid.js
+++ b/src/dstr-assignment/array-elem-init-yield-ident-valid.case
@@ -2,18 +2,20 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of an AssignmentElement
     outside of a generator function body, it behaves as an IdentifierReference.
+template: default
 es6id: 12.14.5.4
 flags: [noStrict]
 ---*/
 
-var value = [];
+//- setup
 var yield = 4;
-var result, x;
-
-result = [ x = yield ] = value;
-
-assert.sameValue(result, value);
+var x;
+//- elems
+[ x = yield ]
+//- vals
+[]
+//- body
 assert.sameValue(x, 4);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-iter-get-err.js b/src/dstr-assignment/array-elem-iter-get-err.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/array-elem-iter-get-err.js
rename to src/dstr-assignment/array-elem-iter-get-err.case
index 2f545842fd..ed4a51ffa1 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-iter-get-err.js
+++ b/src/dstr-assignment/array-elem-iter-get-err.case
@@ -1,23 +1,27 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: Abrupt completion returned from GetIterator
+desc: Abrupt completion returned from GetIterator
 info: |
     ArrayAssignmentPattern : [ AssignmentElementList ]
 
     1. Let iterator be GetIterator(value).
     2. ReturnIfAbrupt(iterator).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var iterable = {};
 iterable[Symbol.iterator] = function() {
   throw new Test262Error();
 };
-var x;
-
-assert.throws(Test262Error, function() {
-  [ x ] = iterable;
-});
+var _;
+//- error
+Test262Error
+//- elems
+[ _ ]
+//- vals
+iterable
diff --git a/test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close-err.js b/src/dstr-assignment/array-elem-iter-nrml-close-err.case
similarity index 85%
rename from test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close-err.js
rename to src/dstr-assignment/array-elem-iter-nrml-close-err.case
index 414495122c..197b79a77d 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close-err.js
+++ b/src/dstr-assignment/array-elem-iter-nrml-close-err.case
@@ -1,20 +1,22 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: Abrupt completion returned from IteratorClose
+desc: Abrupt completion returned from IteratorClose
 info: |
     ArrayAssignmentPattern : [ AssignmentElementList ]
 
     [...]
     5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, result).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
-var x;
+var _;
 var iterable = {};
 var iterator = {
   next: function() {
@@ -31,10 +33,12 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [ x ] = iterable;
-});
-
+//- elems
+[ _ ]
+//- vals
+iterable
+//- error
+Test262Error
+//- teardown
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close-null.js b/src/dstr-assignment/array-elem-iter-nrml-close-null.case
similarity index 92%
rename from test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close-null.js
rename to src/dstr-assignment/array-elem-iter-nrml-close-null.case
index 67e3ead4d0..37314b7c17 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close-null.js
+++ b/src/dstr-assignment/array-elem-iter-nrml-close-null.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose throws a TypeError when `return` returns a non-Object value
 info: |
     ArrayAssignmentPattern : [ AssignmentElementList ]
@@ -20,11 +20,13 @@ info: |
     9. If Type(innerResult.[[value]]) is not Object, throw a TypeError
        exception.
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
-var x;
+//- setup
+var _;
 var iterable = {};
 var nextCount = 0;
 var iterator = {
@@ -41,7 +43,9 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(TypeError, function() {
-  [ x ] = iterable;
-});
+//- elems
+[ _ ]
+//- vals
+iterable
+//- error
+TypeError
diff --git a/test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close-skip.js b/src/dstr-assignment/array-elem-iter-nrml-close-skip.case
similarity index 91%
rename from test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close-skip.js
rename to src/dstr-assignment/array-elem-iter-nrml-close-skip.case
index c3b2087e8b..5ae2913345 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close-skip.js
+++ b/src/dstr-assignment/array-elem-iter-nrml-close-skip.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is not called when assignment evaluation has exhausted the
     iterator
 info: |
@@ -11,13 +11,15 @@ info: |
     5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, result).
     6. Return result.
 features: [Symbol.iterator]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
-var x;
+var _;
 var iterable = {};
 var iterator = {
   next: function() {
@@ -32,8 +34,10 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-[ x ] = iterable;
-
+//- elems
+[ _ ]
+//- vals
+iterable
+//- body
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close.js b/src/dstr-assignment/array-elem-iter-nrml-close.case
similarity index 94%
rename from test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close.js
rename to src/dstr-assignment/array-elem-iter-nrml-close.case
index 80f9902b03..f66f0ccda0 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-iter-nrml-close.js
+++ b/src/dstr-assignment/array-elem-iter-nrml-close.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when assignment evaluation has not exhausted the
     iterator
 info: |
@@ -18,15 +18,17 @@ info: |
     6. Let innerResult be Call(return, iterator, « »).
     [...]
 features: [Symbol.iterator]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var thisValue = null;
 var args = null;
-var x;
+var _;
 var iterable = {};
 var iterator = {
   next: function() {
@@ -45,9 +47,11 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-[ x ] = iterable;
-
+//- elems
+[ _ ]
+//- vals
+iterable
+//- body
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
 assert.sameValue(thisValue, iterator, 'correct `this` value');
diff --git a/test/language/expressions/assignment/destructuring/array-elem-iter-rtrn-close-err.js b/src/dstr-assignment/array-elem-iter-rtrn-close-err.case
similarity index 91%
rename from test/language/expressions/assignment/destructuring/array-elem-iter-rtrn-close-err.js
rename to src/dstr-assignment/array-elem-iter-rtrn-close-err.case
index 4b3b2a36ae..3742cf1509 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-iter-rtrn-close-err.js
+++ b/src/dstr-assignment/array-elem-iter-rtrn-close-err.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when reference evaluation produces a "return"
     completion
 info: |
@@ -19,10 +19,12 @@ info: |
     7. If completion.[[type]] is throw, return Completion(completion).
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 features: [Symbol.iterator, generators]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var returnCount = 0;
 var unreachable = 0;
 var iterable = {};
@@ -38,8 +40,13 @@ iterable[Symbol.iterator] = function() {
 };
 
 function* g() {
-  [ {}[yield] ] = iterable;
-  unreachable += 1;
+//- elems
+[ {}[ yield ] ]
+//- vals
+iterable
+//- body
+unreachable += 1;
+//- teardown
 }
 iter = g();
 iter.next();
diff --git a/test/language/expressions/assignment/destructuring/array-elem-iter-rtrn-close-null.js b/src/dstr-assignment/array-elem-iter-rtrn-close-null.case
similarity index 92%
rename from test/language/expressions/assignment/destructuring/array-elem-iter-rtrn-close-null.js
rename to src/dstr-assignment/array-elem-iter-rtrn-close-null.case
index 4e95868e8c..817ca7b6bb 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-iter-rtrn-close-null.js
+++ b/src/dstr-assignment/array-elem-iter-rtrn-close-null.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose throws a TypeError when `return` returns a non-Object value
 info: |
     ArrayAssignmentPattern : [ AssignmentElementList ]
@@ -20,10 +20,12 @@ info: |
     9. If Type(innerResult.[[value]]) is not Object, throw a TypeError
        exception.
 features: [Symbol.iterator, generators]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var iterable = {};
 var iterator = {
   return: function() {
@@ -35,8 +37,13 @@ iterable[Symbol.iterator] = function() {
   return iterator;
 };
 function* g() {
-  [ {}[yield] ] = iterable;
+//- elems
+[ {}[yield] ]
+//- vals
+iterable
+//- body
   unreachable += 1;
+//- teardown
 }
 
 iter = g();
diff --git a/test/language/expressions/assignment/destructuring/array-elem-iter-rtrn-close.js b/src/dstr-assignment/array-elem-iter-rtrn-close.case
similarity index 92%
rename from test/language/expressions/assignment/destructuring/array-elem-iter-rtrn-close.js
rename to src/dstr-assignment/array-elem-iter-rtrn-close.case
index 2d9380de20..7f1c482fe5 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-iter-rtrn-close.js
+++ b/src/dstr-assignment/array-elem-iter-rtrn-close.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when reference evaluation produces a "return"
     completion
 info: |
@@ -19,10 +19,12 @@ info: |
     7. If completion.[[type]] is throw, return Completion(completion).
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 features: [Symbol.iterator, generators]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var returnCount = 0;
 var unreachable = 0;
 var thisValue = null;
@@ -42,8 +44,13 @@ iterable[Symbol.iterator] = function() {
 };
 
 function* g() {
-  [ {}[yield] ] = iterable;
-  unreachable += 1;
+//- elems
+[ {}[yield] ]
+//- vals
+iterable
+//- body
+unreachable += 1;
+//- teardown
 }
 iter = g();
 iter.next();
diff --git a/test/language/expressions/assignment/destructuring/array-elem-iter-thrw-close-err.js b/src/dstr-assignment/array-elem-iter-thrw-close-err.case
similarity index 89%
rename from test/language/expressions/assignment/destructuring/array-elem-iter-thrw-close-err.js
rename to src/dstr-assignment/array-elem-iter-thrw-close-err.case
index d92f9a4359..04c4da8cc1 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-iter-thrw-close-err.js
+++ b/src/dstr-assignment/array-elem-iter-thrw-close-err.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when reference evaluation produces a "throw"
     completion
 info: |
@@ -12,10 +12,12 @@ info: |
        result).
     6. Return result.
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 function ReturnError() {}
@@ -38,10 +40,12 @@ var thrower = function() {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [ {}[thrower()] ] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[ {}[thrower()] ]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 0);
 assert.sameValue(returnCount, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-iter-thrw-close-skip.js b/src/dstr-assignment/array-elem-iter-thrw-close-skip.case
similarity index 88%
rename from test/language/expressions/assignment/destructuring/array-elem-iter-thrw-close-skip.js
rename to src/dstr-assignment/array-elem-iter-thrw-close-skip.case
index fc27f58e38..7ac68788d2 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-iter-thrw-close-skip.js
+++ b/src/dstr-assignment/array-elem-iter-thrw-close-skip.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is not called when iteration produces an abrupt completion
 info: |
     ArrayAssignmentPattern : [ AssignmentElementList ]
@@ -11,10 +11,12 @@ info: |
        result).
     6. Return result.
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -30,11 +32,13 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-var x;
-
-assert.throws(Test262Error, function() {
-  [ x ] = iterable;
-});
-
+var _;
+//- error
+Test262Error
+//- elems
+[ x ]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-iter-thrw-close.js b/src/dstr-assignment/array-elem-iter-thrw-close.case
similarity index 91%
rename from test/language/expressions/assignment/destructuring/array-elem-iter-thrw-close.js
rename to src/dstr-assignment/array-elem-iter-thrw-close.case
index 4474c432fc..17129f09db 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-iter-thrw-close.js
+++ b/src/dstr-assignment/array-elem-iter-thrw-close.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when reference evaluation produces a "throw"
     completion
 info: |
@@ -18,10 +18,12 @@ info: |
     6. Let innerResult be Call(return, iterator, « »).
     [...]
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var thisValue = null;
@@ -44,11 +46,13 @@ var thrower = function() {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [ {}[thrower()] ] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[ {}[thrower()] ]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 0);
 assert.sameValue(returnCount, 1);
 assert.sameValue(thisValue, iterator, 'correct `this` value');
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-array-invalid.js b/src/dstr-assignment/array-elem-nested-array-invalid.case
similarity index 88%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-array-invalid.js
rename to src/dstr-assignment/array-elem-nested-array-invalid.case
index 1b0a2471ed..9cceb9f06f 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-array-invalid.js
+++ b/src/dstr-assignment/array-elem-nested-array-invalid.case
@@ -2,15 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral
     or an ArrayLiteral and if the lexical token sequence matched by
     LeftHandSideExpression cannot be parsed with no tokens left over using
     AssignmentPattern as the goal symbol.
+template: syntax
 es6id: 12.14.5.1
 negative: SyntaxError
 ---*/
 
-var x, y;
-
-[...[(x, y)]] = [[]];
+//- elems
+[[(x, y)]]
+//- vals
+[[]]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-array-null.js b/src/dstr-assignment/array-elem-nested-array-null.case
similarity index 75%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-array-null.js
rename to src/dstr-assignment/array-elem-nested-array-null.case
index 98362d693f..5910534f2b 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-array-null.js
+++ b/src/dstr-assignment/array-elem-nested-array-null.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal and the value is
     `null`, a TypeError should be thrown.
+template: error
 es6id: 12.14.5.3
 ---*/
 
-var x;
-
-assert.throws(TypeError, function() {
-  [[ x ]] = [null];
-});
+//- setup
+var _;
+//- error
+TypeError
+//- elems
+[[ _ ]]
+//- vals
+[null]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-array-undefined-hole.js b/src/dstr-assignment/array-elem-nested-array-undefined-hole.case
similarity index 75%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-array-undefined-hole.js
rename to src/dstr-assignment/array-elem-nested-array-undefined-hole.case
index 047e093c2e..f0561b8be7 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-array-undefined-hole.js
+++ b/src/dstr-assignment/array-elem-nested-array-undefined-hole.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal and the value is a
     "hole", a TypeError should be thrown.
+template: error
 es6id: 12.14.5.3
 ---*/
 
-var x;
-
-assert.throws(TypeError, function() {
-  [[ x ]] = [ , ];
-});
+//- setup
+var _;
+//- error
+TypeError
+//- elems
+[[ _ ]]
+//- vals
+[ , ]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-array-undefined-own.js b/src/dstr-assignment/array-elem-nested-array-undefined-own.case
similarity index 74%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-array-undefined-own.js
rename to src/dstr-assignment/array-elem-nested-array-undefined-own.case
index c9b72457c8..1972f02ee8 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-array-undefined-own.js
+++ b/src/dstr-assignment/array-elem-nested-array-undefined-own.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal and the value is
     `undefined`, a TypeError should be thrown.
+template: error
 es6id: 12.14.5.3
 ---*/
 
-var x;
-
-assert.throws(TypeError, function() {
-  [[ x ]] = [undefined];
-});
+//- setup
+var _;
+//- error
+TypeError
+//- elems
+[[ x ]]
+//- vals
+[undefined]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-array-undefined.js b/src/dstr-assignment/array-elem-nested-array-undefined.case
similarity index 75%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-array-undefined.js
rename to src/dstr-assignment/array-elem-nested-array-undefined.case
index d280bf2697..6b07a4f03b 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-array-undefined.js
+++ b/src/dstr-assignment/array-elem-nested-array-undefined.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal and no value is
     defined, a TypeError should be thrown.
+template: error
 es6id: 12.14.5.3
 ---*/
 
-var x;
-
-assert.throws(TypeError, function() {
-  [[ x ]] = [];
-});
+//- setup
+var _;
+//- error
+TypeError
+//- elems
+[[ x ]]
+//- vals
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-array-yield-expr.js b/src/dstr-assignment/array-elem-nested-array-yield-expr.case
similarity index 80%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-array-yield-expr.js
rename to src/dstr-assignment/array-elem-nested-array-yield-expr.case
index 5128f3774e..bd5d94ffab 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-array-yield-expr.js
+++ b/src/dstr-assignment/array-elem-nested-array-yield-expr.case
@@ -2,32 +2,36 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of a
     nested destructuring assignment and within a generator function body, it
     behaves as a YieldExpression.
+template: default
 es6id: 12.14.5.3
 features: [generators]
 ---*/
 
+//- setup
 var value = [[22]];
 var x = {};
-var assignmentResult, iterationResult, iter;
+var iterationResult, iter;
 
 iter = (function*() {
-  assignmentResult = [[x[yield]]] = value;
+//- elems
+[[x[yield]]]
+//- vals
+value
+//- teardown
 }());
 
 iterationResult = iter.next();
 
-assert.sameValue(assignmentResult, undefined);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, false);
 assert.sameValue(x.prop, undefined);
 
 iterationResult = iter.next('prop');
 
-assert.sameValue(assignmentResult, value);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, true);
 assert.sameValue(x.prop, 22);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-array-yield-ident-invalid.js b/src/dstr-assignment/array-elem-nested-array-yield-ident-invalid.case
similarity index 86%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-array-yield-ident-invalid.js
rename to src/dstr-assignment/array-elem-nested-array-yield-ident-invalid.case
index bba32536e3..006428417b 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-array-yield-ident-invalid.js
+++ b/src/dstr-assignment/array-elem-nested-array-yield-ident-invalid.case
@@ -2,13 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of a
     nested destructuring assignment outside of strict mode, it behaves as an
     IdentifierReference.
+template: syntax
 es6id: 12.14.5.3
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-[[x[yield]]] = value;
+//- elems
+[[x[yield]]]
+//- vals
+[[]]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-array-yield-ident-valid.js b/src/dstr-assignment/array-elem-nested-array-yield-ident-valid.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-array-yield-ident-valid.js
rename to src/dstr-assignment/array-elem-nested-array-yield-ident-valid.case
index 01ea78ebae..c1bcd3c67b 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-array-yield-ident-valid.js
+++ b/src/dstr-assignment/array-elem-nested-array-yield-ident-valid.case
@@ -2,20 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of a
     nested destructuring assignment outside of strict mode, it behaves as an
     IdentifierReference.
+template: default
 es6id: 12.14.5.3
 flags: [noStrict]
 ---*/
 
-var value = [[22]];
+//- setup
 var yield = 'prop';
 var x = {};
-var result;
-
-result = [[x[yield]]] = value;
-
-assert.sameValue(result, value);
+//- elems
+[[x[yield]]]
+//- vals
+[[22]]
+//- body
 assert.sameValue(x.prop, 22);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-array.js b/src/dstr-assignment/array-elem-nested-array.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-array.js
rename to src/dstr-assignment/array-elem-nested-array.case
index 0fb07e27b1..7c5902abfc 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-array.js
+++ b/src/dstr-assignment/array-elem-nested-array.case
@@ -2,17 +2,19 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal, it should be parsed
     parsed as a DestructuringAssignmentPattern and evaluated as a destructuring
     assignment.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [[1]];
-var x, result;
-
-result = [[x]] = value;
-
-assert.sameValue(result, value);
+//- setup
+var x;
+//- elems
+[[x]]
+//- vals
+[[1]]
+//- body
 assert.sameValue(x, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-array-invalid.js b/src/dstr-assignment/array-elem-nested-obj-invalid.case
similarity index 87%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-array-invalid.js
rename to src/dstr-assignment/array-elem-nested-obj-invalid.case
index 8c5e183190..3bf2ec0f31 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-array-invalid.js
+++ b/src/dstr-assignment/array-elem-nested-obj-invalid.case
@@ -2,15 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral
     or an ArrayLiteral and if the lexical token sequence matched by
     LeftHandSideExpression cannot be parsed with no tokens left over using
     AssignmentPattern as the goal symbol.
+template: syntax
 es6id: 12.14.5.1
 negative: SyntaxError
 ---*/
 
-var x, y;
-
-[[(x, y)]] = [[]];
+//- elems
+[{ get x() {} }]
+//- vals
+[{}]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-null.js b/src/dstr-assignment/array-elem-nested-obj-null.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-obj-null.js
rename to src/dstr-assignment/array-elem-nested-obj-null.case
index 5485fde736..fb72843814 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-null.js
+++ b/src/dstr-assignment/array-elem-nested-obj-null.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an object literal and the value is
     `null`, a TypeError should be thrown.
+template: error
 es6id: 12.14.5.3
 ---*/
 
+//- setup
 var x;
-
-assert.throws(TypeError, function() {
-  [{ x }] = [null];
-});
+//- error
+TypeError
+//- elems
+[{ x }]
+//- vals
+[null]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-undefined-hole.js b/src/dstr-assignment/array-elem-nested-obj-undefined-hole.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-obj-undefined-hole.js
rename to src/dstr-assignment/array-elem-nested-obj-undefined-hole.case
index 3984ff7a31..dc463ec815 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-undefined-hole.js
+++ b/src/dstr-assignment/array-elem-nested-obj-undefined-hole.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an object literal and the value is a
     "hole", a TypeError should be thrown.
+template: error
 es6id: 12.14.5.3
 ---*/
 
+//- setup
 var x;
-
-assert.throws(TypeError, function() {
-  [{ x }] = [ , ];
-});
+//- error
+TypeError
+//- elems
+[{ x }]
+//- vals
+[ , ]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-undefined-own.js b/src/dstr-assignment/array-elem-nested-obj-undefined-own.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-obj-undefined-own.js
rename to src/dstr-assignment/array-elem-nested-obj-undefined-own.case
index 39614e4bdf..179ae08e89 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-undefined-own.js
+++ b/src/dstr-assignment/array-elem-nested-obj-undefined-own.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an object literal and the value is
     `undefined`, a TypeError should be thrown.
+template: error
 es6id: 12.14.5.3
 ---*/
 
+//- setup
 var x;
-
-assert.throws(TypeError, function() {
-  [{ x }] = [undefined];
-});
+//- error
+TypeError
+//- elems
+[{ x }]
+//- vals
+[undefined]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-undefined.js b/src/dstr-assignment/array-elem-nested-obj-undefined.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-obj-undefined.js
rename to src/dstr-assignment/array-elem-nested-obj-undefined.case
index 8326c339aa..016d0590be 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-undefined.js
+++ b/src/dstr-assignment/array-elem-nested-obj-undefined.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an object literal and no value is
     defined, a TypeError should be thrown.
+template: error
 es6id: 12.14.5.3
 ---*/
 
+//- setup
 var x;
-
-assert.throws(TypeError, function() {
-  [{ x }] = [];
-});
+//- error
+TypeError
+//- elems
+[{ x }]
+//- vals
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-yield-expr.js b/src/dstr-assignment/array-elem-nested-obj-yield-expr.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-obj-yield-expr.js
rename to src/dstr-assignment/array-elem-nested-obj-yield-expr.case
index 3d72841db9..4622b03b72 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-yield-expr.js
+++ b/src/dstr-assignment/array-elem-nested-obj-yield-expr.case
@@ -2,31 +2,34 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of a nested
     destructuring assignment and within a generator function body, it behaves
     as a YieldExpression.
+template: default
 es6id: 12.14.5.3
 features: [generators]
 ---*/
 
-var value = [{}];
-var assignmentResult, iterationResult, iter, x;
+//- setup
+var iterationResult, iter, x;
 
 iter = (function*() {
-  assignmentResult = [{ x = yield }] = value;
+//- elems
+[{ x = yield }]
+//- vals
+[{}]
+//- teardown
 }());
 
 iterationResult = iter.next();
 
-assert.sameValue(assignmentResult, undefined);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, false);
 assert.sameValue(x, undefined);
 
 iterationResult = iter.next(4);
 
-assert.sameValue(assignmentResult, value);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, true);
 assert.sameValue(x, 4);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-yield-ident-invalid.js b/src/dstr-assignment/array-elem-nested-obj-yield-ident-invalid.case
similarity index 85%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-obj-yield-ident-invalid.js
rename to src/dstr-assignment/array-elem-nested-obj-yield-ident-invalid.case
index 39a024f393..ce9db76419 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-yield-ident-invalid.js
+++ b/src/dstr-assignment/array-elem-nested-obj-yield-ident-invalid.case
@@ -2,13 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of a nested
     destructuring assignment outside of a generator function body, it behaves
     as a IdentifierReference.
+template: syntax
 es6id: 12.14.5.3
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-[{ x = yield }] = [{}];
+//- elems
+[{ x = yield }]
+//- vals
+[{}]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-yield-ident-valid.js b/src/dstr-assignment/array-elem-nested-obj-yield-ident-valid.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-obj-yield-ident-valid.js
rename to src/dstr-assignment/array-elem-nested-obj-yield-ident-valid.case
index 6837411f45..d0caa64d4d 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-yield-ident-valid.js
+++ b/src/dstr-assignment/array-elem-nested-obj-yield-ident-valid.case
@@ -2,19 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of a nested
     destructuring assignment outside of a generator function body, it behaves
     as an IdentifierReference.
+template: default
 es6id: 12.14.5.3
 flags: [noStrict]
 ---*/
 
-var value = [{}];
+//- setup
 var yield = 2;
-var result, x;
-
-result = [{ x = yield }] = value;
-
-assert.sameValue(result, value);
+var x;
+//- elems
+[{ x = yield }]
+//- vals
+[{}]
+//- body
 assert.sameValue(x, 2);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-obj.js b/src/dstr-assignment/array-elem-nested-obj.case
similarity index 75%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-obj.js
rename to src/dstr-assignment/array-elem-nested-obj.case
index 94778a614e..bcb9877600 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-obj.js
+++ b/src/dstr-assignment/array-elem-nested-obj.case
@@ -2,17 +2,19 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an object literal, it should be
     parsed as a DestructuringAssignmentPattern and evaluated as a destructuring
     assignment.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [{ x: 2 }];
-var result, x;
-
-result = [{ x }] = value;
-
-assert.sameValue(result, value);
+//- setup
+var x;
+//- elems
+[{ x }]
+//- vals
+[{ x: 2 }]
+//- body
 assert.sameValue(x, 2);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-put-const.js b/src/dstr-assignment/array-elem-put-const.case
similarity index 75%
rename from test/language/expressions/assignment/destructuring/array-elem-put-const.js
rename to src/dstr-assignment/array-elem-put-const.case
index 44f8985b57..cbd2841782 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-put-const.js
+++ b/src/dstr-assignment/array-elem-put-const.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The assignment target should obey `const` semantics.
+template: error
 es6id: 12.14.5.3
 features: [const]
 ---*/
 
+//- setup
 const c = null;
-
-assert.throws(TypeError, function() {
-  [ c ] = [1];
-});
+//- error
+TypeError
+//- elems
+[ c ]
+//- vals
+[1]
diff --git a/test/language/expressions/assignment/destructuring/array-rest-put-let.js b/src/dstr-assignment/array-elem-put-let.case
similarity index 71%
rename from test/language/expressions/assignment/destructuring/array-rest-put-let.js
rename to src/dstr-assignment/array-elem-put-let.case
index a150723461..54dbfb4c4f 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-put-let.js
+++ b/src/dstr-assignment/array-elem-put-let.case
@@ -2,13 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The assignment target should obey `let` semantics.
+template: error
 es6id: 12.14.5.3
 features: [let]
 ---*/
 
-assert.throws(ReferenceError, function() {
-  [ ...x ] = [];
-  let x;
-});
+//- elems
+[ x ]
+//- vals
+[]
+//- error
+ReferenceError
+//- teardown
+let x;
diff --git a/test/language/expressions/assignment/destructuring/array-elem-put-prop-ref-no-get.js b/src/dstr-assignment/array-elem-put-prop-ref-no-get.case
similarity index 78%
rename from test/language/expressions/assignment/destructuring/array-elem-put-prop-ref-no-get.js
rename to src/dstr-assignment/array-elem-put-prop-ref-no-get.case
index 4bd7a8a8ad..6763ca4fcf 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-put-prop-ref-no-get.js
+++ b/src/dstr-assignment/array-elem-put-prop-ref-no-get.case
@@ -2,14 +2,15 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     If the DestructuringAssignmentTarget of an AssignmentElement is a
     PropertyReference, it should not be evaluated.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [23];
-var x, setValue, result;
+//- setup
+var x, setValue;
 x = {
   get y() {
     $ERROR('The property should not be accessed.');
@@ -18,8 +19,9 @@ x = {
     setValue = val;
   }
 };
-
-result = [x.y] = value;
-
-assert.sameValue(result, value);
+//- elems
+[x.y]
+//- vals
+[23]
+//- body
 assert.sameValue(setValue, 23);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-put-prop-ref-user-err.js b/src/dstr-assignment/array-elem-put-prop-ref-user-err.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/array-elem-put-prop-ref-user-err.js
rename to src/dstr-assignment/array-elem-put-prop-ref-user-err.case
index 00c43f2656..4f4792b43f 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-put-prop-ref-user-err.js
+++ b/src/dstr-assignment/array-elem-put-prop-ref-user-err.case
@@ -2,19 +2,22 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Any error raised as a result of setting the value should be forwarded to
     the runtime.
+template: error
 es6id: 12.14.5.3
 ---*/
 
-var value = [23];
+//- setup
 var x = {
   set y(val) {
     throw new Test262Error();
   }
 };
-
-assert.throws(Test262Error, function() {
-  [x.y] = value;
-});
+//- error
+Test262Error
+//- elems
+[x.y]
+//- vals
+[23]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-put-prop-ref.js b/src/dstr-assignment/array-elem-put-prop-ref.case
similarity index 74%
rename from test/language/expressions/assignment/destructuring/array-elem-put-prop-ref.js
rename to src/dstr-assignment/array-elem-put-prop-ref.case
index b0b419c7bd..983bcfc57c 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-put-prop-ref.js
+++ b/src/dstr-assignment/array-elem-put-prop-ref.case
@@ -2,17 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The DestructuringAssignmentTarget of an AssignmentElement may be a
     PropertyReference.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [4];
+//- setup
 var x = {};
-var result;
-
-result = [x.y] = value;
-
-assert.sameValue(result, value);
+//- elems
+[x.y]
+//- vals
+[4]
+//- body
 assert.sameValue(x.y, 4);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-put-unresolvable-no-strict.js b/src/dstr-assignment/array-elem-put-unresolvable-no-strict.case
similarity index 81%
rename from test/language/expressions/assignment/destructuring/array-elem-put-unresolvable-no-strict.js
rename to src/dstr-assignment/array-elem-put-unresolvable-no-strict.case
index 41fc5d4153..fe7be7c70e 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-put-unresolvable-no-strict.js
+++ b/src/dstr-assignment/array-elem-put-unresolvable-no-strict.case
@@ -2,15 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Outside of strict mode, if the the assignment target is an unresolvable
     reference, a new `var` binding should be created in the environment record.
+template: default
 es6id: 12.14.5.3
 flags: [noStrict]
 ---*/
 
+//- setup
 {
-  [ unresolvable ] = [];
+//- elems
+[ unresolvable ]
+//- vals
+[]
+//- teardown
 }
 
 assert.sameValue(unresolvable, undefined);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-put-unresolvable-strict.js b/src/dstr-assignment/array-elem-put-unresolvable-strict.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/array-elem-put-unresolvable-strict.js
rename to src/dstr-assignment/array-elem-put-unresolvable-strict.case
index b06bac9c55..98dbacc75f 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-put-unresolvable-strict.js
+++ b/src/dstr-assignment/array-elem-put-unresolvable-strict.case
@@ -2,13 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     In strict mode, if the the assignment target is an unresolvable reference,
     a ReferenceError should be thrown.
+template: error
 es6id: 12.14.5.3
 flags: [onlyStrict]
 ---*/
 
-assert.throws(ReferenceError, function() {
-  [ unresolvable ] = [];
-});
+//- error
+ReferenceError
+//- elems
+[ unresolvable ]
+//- vals
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-target-identifier.js b/src/dstr-assignment/array-elem-target-identifier.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/array-elem-target-identifier.js
rename to src/dstr-assignment/array-elem-target-identifier.case
index 17e1e403d9..c45bbc8ac6 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-target-identifier.js
+++ b/src/dstr-assignment/array-elem-target-identifier.case
@@ -2,20 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Identifiers that appear as the DestructuringAssignmentTarget in an
     AssignmentElement should take on the iterated value corresponding to their
     position in the ArrayAssignmentPattern.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [1, 2, 3];
+//- setup
 var x, y, z;
-var result;
-
-result = [x, y, z] = value;
-
-assert.sameValue(result, value);
+//- elems
+[x, y, z]
+//- vals
+[1, 2, 3]
+//- body
 assert.sameValue(x, 1);
 assert.sameValue(y, 2);
 assert.sameValue(z, 3);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-target-simple-no-strict.js b/src/dstr-assignment/array-elem-target-simple-no-strict.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/array-elem-target-simple-no-strict.js
rename to src/dstr-assignment/array-elem-target-simple-no-strict.case
index 93421ae7ef..6c442211b1 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-target-simple-no-strict.js
+++ b/src/dstr-assignment/array-elem-target-simple-no-strict.case
@@ -2,19 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Identifiers that appear as the DestructuringAssignmentTarget in an
     AssignmentElement should take on the iterated value corresponding to their
     position in the ArrayAssignmentPattern.
+template: default
 es6id: 12.14.5.3
 flags: [noStrict]
 ---*/
 
-var value = [2, 3];
-var result, argument, eval;
-
-result = [arguments, eval] = value;
-
-assert.sameValue(result, value);
+//- setup
+var argument, eval;
+//- elems
+[arguments, eval]
+//- vals
+[2, 3]
+//- body
 assert.sameValue(arguments, 2);
 assert.sameValue(eval, 3);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-simple-strict.js b/src/dstr-assignment/array-elem-target-simple-strict.case
similarity index 86%
rename from test/language/expressions/assignment/destructuring/array-elem-init-simple-strict.js
rename to src/dstr-assignment/array-elem-target-simple-strict.case
index 2d0659bf42..b9a8adf770 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-init-simple-strict.js
+++ b/src/dstr-assignment/array-elem-target-simple-strict.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     It is a Syntax Error if LeftHandSideExpression is neither an
     ObjectLiteral nor an ArrayLiteral and
     IsValidSimpleAssignmentTarget(LeftHandSideExpression) is
     false.
+template: syntax
 es6id: 12.14.5.1
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-([arguments] = []);
+//- elems
+[arguments]
+//- vals
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-target-yield-expr.js b/src/dstr-assignment/array-elem-target-yield-expr.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/array-elem-target-yield-expr.js
rename to src/dstr-assignment/array-elem-target-yield-expr.case
index 6505a39694..316af932ba 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-target-yield-expr.js
+++ b/src/dstr-assignment/array-elem-target-yield-expr.case
@@ -2,32 +2,36 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of an
     AssignmentElement within a generator function body, it behaves as a
     YieldExpression.
+template: default
 es6id: 12.14.5.4
 features: [generators]
 ---*/
 
+//- setup
 var value = [33];
 var x = {};
-var assignmentResult, iterationResult, iter;
+var iterationResult, iter;
 
 iter = (function*() {
-  assignmentResult = [ x[yield] ] = value;
+//- elems
+[ x[yield] ]
+//- vals
+[33]
+//- teardown
 }());
 
 iterationResult = iter.next();
 
-assert.sameValue(assignmentResult, undefined);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, false);
 assert.sameValue(x.prop, undefined);
 
 iterationResult = iter.next('prop');
 
-assert.sameValue(assignmentResult, value);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, true);
 assert.sameValue(x.prop, 33);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-target-yield-invalid.js b/src/dstr-assignment/array-elem-target-yield-invalid.case
similarity index 86%
rename from test/language/expressions/assignment/destructuring/array-elem-target-yield-invalid.js
rename to src/dstr-assignment/array-elem-target-yield-invalid.case
index f03f598683..0ff8247068 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-target-yield-invalid.js
+++ b/src/dstr-assignment/array-elem-target-yield-invalid.case
@@ -2,13 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of an
     AssignmentElement and outside of a generator function body, it behaves as
     an IdentifierReference.
+template: syntax
 es6id: 12.14.5.4
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-[ x[yield] ] = [];
+//- elems
+[ x[yield] ]
+//- vals
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-target-yield-valid.js b/src/dstr-assignment/array-elem-target-yield-valid.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/array-elem-target-yield-valid.js
rename to src/dstr-assignment/array-elem-target-yield-valid.case
index 0363d1d3c6..8b3263fabd 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-target-yield-valid.js
+++ b/src/dstr-assignment/array-elem-target-yield-valid.case
@@ -2,20 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of an
     AssignmentElement outside of a generator function body, it behaves as an
     IdentifierReference.
+template: default
 es6id: 12.14.5.4
 flags: [noStrict]
 ---*/
 
-var value = [33];
+//- setup
 var yield = 'prop';
 var x = {};
-var result;
-
-result = [ x[yield] ] = value;
-
-assert.sameValue(result, value);
+//- elems
+[ x[yield] ]
+//- vals
+[33]
+//- body
 assert.sameValue(x.prop, 33);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-abpt.js b/src/dstr-assignment/array-elem-trlg-iter-elision-iter-abpt.case
similarity index 88%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-abpt.js
rename to src/dstr-assignment/array-elem-trlg-iter-elision-iter-abpt.case
index c4624b2c48..9994695515 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-abpt.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-elision-iter-abpt.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: Abrupt completion returned during evaluation of elision
+desc: Abrupt completion returned during evaluation of elision
 info: |
     ArrayAssignmentPattern :
         [ AssignmentElementList , Elisionopt AssignmentRestElementopt ]
@@ -16,10 +16,12 @@ info: |
              IteratorClose(iterator, status).
           ii. Return Completion(status).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -44,9 +46,12 @@ iterable[Symbol.iterator] = function() {
   return iterator;
 };
 
-assert.throws(Test262Error, function() {
-  [ x , , ] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[ x , , ]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 2);
 assert.sameValue(returnCount, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close-err.js b/src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-err.case
similarity index 88%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close-err.js
rename to src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-err.case
index abb0aa22bb..554f0662f8 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close-err.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-err.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: Abrupt completion returned from IteratorClose
+desc: Abrupt completion returned from IteratorClose
 info: |
     ArrayAssignmentPattern :
         [ AssignmentElementList , Elisionopt AssignmentRestElementopt ]
@@ -16,10 +16,12 @@ info: |
     8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator,
        status).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -40,10 +42,12 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [ x , , ] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[ x , , ]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 2);
 assert.sameValue(returnCount, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close-null.js b/src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-null.case
similarity index 94%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close-null.js
rename to src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-null.case
index edb875d5e6..8b67b0f7b7 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close-null.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-null.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose throws a TypeError when `return` returns a non-Object value
 info: |
     ArrayAssignmentPattern :
@@ -26,10 +26,12 @@ info: |
     9. If Type(innerResult.[[value]]) is not Object, throw a TypeError
        exception.
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var iterable = {};
 var x;
 var nextCount = 0;
@@ -47,7 +49,9 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(TypeError, function() {
-  [ x , , ] = iterable;
-});
+//- error
+TypeError
+//- elems
+[ x , , ]
+//- vals
+iterable
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close-skip.js b/src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-skip.case
similarity index 88%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close-skip.js
rename to src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-skip.case
index e1ba46661f..537491d49a 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close-skip.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-skip.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: IteratorClose not invoked when elision exhausts the iterator
+desc: IteratorClose not invoked when elision exhausts the iterator
 info: |
     ArrayAssignmentPattern :
         [ AssignmentElementList , Elisionopt AssignmentRestElementopt ]
@@ -17,10 +17,12 @@ info: |
        status).
     9. Return Completion(status).
 features: [Symbol.iterator]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -38,8 +40,10 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-[ x , , ] = iterable;
-
+//- elems
+[ x , , ]
+//- vals
+iterable
+//- body
 assert.sameValue(nextCount, 2);
 assert.sameValue(returnCount, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close.js b/src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close.case
similarity index 91%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close.js
rename to src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close.case
index b7846bb1ab..9c99e7d2b2 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-elision-iter-nrml-close.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: IteratorClose invoked when elision does not exhaust the iterator
+desc: IteratorClose invoked when elision does not exhaust the iterator
 info: |
     ArrayAssignmentPattern :
         [ AssignmentElementList , Elisionopt AssignmentRestElementopt ]
@@ -22,10 +22,12 @@ info: |
     6. Let innerResult be Call(return, iterator, « »).
     [...]
 features: [Symbol.iterator]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var thisValue = null;
@@ -50,9 +52,11 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-[ x , , ] = iterable;
-
+//- elems
+[ x , , ]
+//- vals
+iterable
+//- body
 assert.sameValue(nextCount, 2);
 assert.sameValue(returnCount, 1);
 assert.sameValue(thisValue, iterator, 'correct `this` value');
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-get-err.js b/src/dstr-assignment/array-elem-trlg-iter-get-err.case
similarity index 80%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-get-err.js
rename to src/dstr-assignment/array-elem-trlg-iter-get-err.case
index 7a3e3a9a3a..b47c3ae4bc 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-get-err.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-get-err.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: Abrupt completion returned from GetIterator
+desc: Abrupt completion returned from GetIterator
 info: |
     ArrayAssignmentPattern :
         [ AssignmentElementList , Elisionopt AssignmentRestElementopt ]
@@ -9,16 +9,20 @@ info: |
     1. Let iterator be GetIterator(value).
     2. ReturnIfAbrupt(iterator).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var iterable = {};
 iterable[Symbol.iterator] = function() {
   throw new Test262Error();
 };
 var x;
-
-assert.throws(Test262Error, function() {
-  [ x , ] = iterable;
-});
+//- error
+Test262Error
+//- elems
+[ x , ]
+//- vals
+iterable
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close-err.js b/src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-err.case
similarity index 89%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close-err.js
rename to src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-err.case
index 491d91e86c..c432ef0334 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close-err.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-err.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: Abrupt completion returned from IteratorClose
+desc: Abrupt completion returned from IteratorClose
 info: |
     ArrayAssignmentPattern :
         [ AssignmentElementList , Elisionopt AssignmentRestElementopt ]
@@ -16,10 +16,12 @@ info: |
           status).
        b. Return Completion(status).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -40,10 +42,12 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [ x , ] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[ x , ]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close-null.js b/src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-null.case
similarity index 94%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close-null.js
rename to src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-null.case
index daa2b227b3..2f2bf8995b 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close-null.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-null.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose throws a TypeError when `return` returns a non-Object value
 info: |
     ArrayAssignmentPattern :
@@ -26,10 +26,12 @@ info: |
     9. If Type(innerResult.[[value]]) is not Object, throw a TypeError
        exception.
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var iterable = {};
 var x;
 var nextCount = 0;
@@ -47,7 +49,9 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(TypeError, function() {
-  [ x , ] = iterable;
-});
+//- error
+TypeError
+//- elems
+[ x , ]
+//- vals
+iterable
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close-skip.js b/src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-skip.case
similarity index 94%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close-skip.js
rename to src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-skip.case
index a7b0f41c06..6ecaf2ebc1 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close-skip.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-skip.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is not invoked when evaluation of AssignmentElementList
     exhausts the iterator
 info: |
@@ -18,10 +18,12 @@ info: |
           status).
        b. Return Completion(status).
 features: [Symbol.iterator]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -41,8 +43,10 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-[ x , ] = iterable;
-
+//- elems
+[ x , ]
+//- vals
+iterable
+//- body
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close.js b/src/dstr-assignment/array-elem-trlg-iter-list-nrml-close.case
similarity index 95%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close.js
rename to src/dstr-assignment/array-elem-trlg-iter-list-nrml-close.case
index 76582ec71b..519f63baa0 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-nrml-close.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-list-nrml-close.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is invoked when evaluation of AssignmentElementList completes
     without exhausting the iterator
 info: |
@@ -24,10 +24,12 @@ info: |
     6. Let innerResult be Call(return, iterator, « »).
     [...]
 features: [Symbol.iterator]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var thisValue = null;
@@ -51,9 +53,11 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-[ x , ] = iterable;
-
+//- elems
+[ x , ]
+//- vals
+iterable
+//- body
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
 assert.sameValue(thisValue, iterator, 'correct `this` value');
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-rtrn-close-err.js b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-err.case
similarity index 93%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-rtrn-close-err.js
rename to src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-err.case
index 7591e15c5e..628e827e4b 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-rtrn-close-err.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-err.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is invoked when evaluation of AssignmentElementList returns
     a "return" completion and the iterator has not been marked as "done"
 info: |
@@ -24,10 +24,12 @@ info: |
     7. If completion.[[type]] is throw, return Completion(completion).
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 features: [Symbol.iterator, generators]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var returnCount = 0;
 var unreachable = 0;
 var iterable = {};
@@ -44,8 +46,13 @@ iterable[Symbol.iterator] = function() {
 };
 
 function* g() {
-  [ {}[yield] , ] = iterable;
-  unreachable += 1;
+//- elems
+[ {}[yield] , ]
+//- vals
+iterable
+//- body
+unreachable += 1;
+//- teardown
 }
 
 iter = g();
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-rtrn-close-null.js b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-null.case
similarity index 94%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-rtrn-close-null.js
rename to src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-null.case
index c635b1b130..8a807a3156 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-rtrn-close-null.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-null.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose throws a TypeError when `return` returns a non-Object value
 info: |
     ArrayAssignmentPattern :
@@ -26,10 +26,12 @@ info: |
     9. If Type(innerResult.[[value]]) is not Object, throw a TypeError
        exception.
 features: [Symbol.iterator, generators]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var iterable = {};
 var iterator = {
   return: function() {
@@ -42,7 +44,11 @@ iterable[Symbol.iterator] = function() {
 };
 
 function* g() {
-  [ {}[yield] , ] = iterable;
+//- elems
+  [ {}[yield] , ]
+//- vals
+iterable
+//- teardown
 }
 
 iter = g();
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-rtrn-close.js b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close.case
similarity index 95%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-rtrn-close.js
rename to src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close.case
index 076dfeacca..c7c10a93cb 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-rtrn-close.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is invoked when evaluation of AssignmentElementList returns
     a "return" completion and the iterator has not been marked as "done"
 info: |
@@ -25,10 +25,12 @@ info: |
     7. If completion.[[type]] is throw, return Completion(completion).
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 features: [Symbol.iterator, generators]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var returnCount = 0;
 var unreachable = 0;
 var thisValue = null;
@@ -49,8 +51,13 @@ iterable[Symbol.iterator] = function() {
 };
 
 function* g() {
-  [ {}[yield] , ] = iterable;
+//- elems
+[ {}[yield] , ]
+//- vals
+iterable
+//- body
   unreachable += 1;
+//- teardown
 };
 
 iter = g();
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-thrw-close-err.js b/src/dstr-assignment/array-elem-trlg-iter-list-thrw-close-err.case
similarity index 92%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-thrw-close-err.js
rename to src/dstr-assignment/array-elem-trlg-iter-list-thrw-close-err.case
index 6580d3f941..683b386b9d 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-thrw-close-err.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-list-thrw-close-err.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is invoked when evaluation of AssignmentElementList returns
     a "throw" completion and the iterator has not been marked as "done"
 info: |
@@ -23,10 +23,12 @@ info: |
     7. If completion.[[type]] is throw, return Completion(completion).
 
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -50,9 +52,13 @@ iterable[Symbol.iterator] = function() {
   return iterator;
 };
 
-assert.throws(Test262Error, function() {
-  [ {}[thrower()] , ] = iterable;
-});
+//- error
+Test262Error
+//- elems
+[ {}[thrower()] , ]
+//- vals
+iterable
+//- teardown
 
 assert.sameValue(nextCount, 0);
 assert.sameValue(returnCount, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-thrw-close-skip.js b/src/dstr-assignment/array-elem-trlg-iter-list-thrw-close-skip.case
similarity index 92%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-thrw-close-skip.js
rename to src/dstr-assignment/array-elem-trlg-iter-list-thrw-close-skip.case
index f07335161d..28d98902f7 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-thrw-close-skip.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-list-thrw-close-skip.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is not invoked when evaluation of AssignmentElementList
     returns an abrupt completion and the iterator has been marked as "done"
 info: |
@@ -18,10 +18,12 @@ info: |
           status).
        b. Return Completion(status).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -41,10 +43,12 @@ iterable[Symbol.iterator] = function() {
   return iterator;
 };
 var x;
-
-assert.throws(Test262Error, function() {
-  [ x , ] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[ x , ]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-thrw-close.js b/src/dstr-assignment/array-elem-trlg-iter-list-thrw-close.case
similarity index 93%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-thrw-close.js
rename to src/dstr-assignment/array-elem-trlg-iter-list-thrw-close.case
index d0b18b6d9d..b55284f19c 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-list-thrw-close.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-list-thrw-close.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is invoked when evaluation of AssignmentElementList returns
     a "throw" completion and the iterator has not been marked as "done"
 info: |
@@ -24,10 +24,12 @@ info: |
     6. Let innerResult be Call(return, iterator, « »).
     [...]
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var thisValue = null;
@@ -50,11 +52,13 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [ {}[thrower()] , ] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[ {}[thrower()] , ]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 0);
 assert.sameValue(returnCount, 1);
 assert.sameValue(thisValue, iterator, 'correct `this` value');
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-nrml-close-skip.js b/src/dstr-assignment/array-elem-trlg-iter-rest-nrml-close-skip.case
similarity index 93%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-nrml-close-skip.js
rename to src/dstr-assignment/array-elem-trlg-iter-rest-nrml-close-skip.case
index 4f4cf16281..5499774223 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-nrml-close-skip.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-rest-nrml-close-skip.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is not called when rest element evaluation has exhausted the
     iterator
 info: |
@@ -17,10 +17,12 @@ info: |
        status).
     9. Return Completion(status).
 features: [Symbol.iterator]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -37,9 +39,11 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-[ x , ...y ] = iterable;
-
+//- elems
+[ x , ...y ]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 2, 'nextCount');
 assert.sameValue(returnCount, 0, 'returnCount');
 assert.sameValue(x, 1, 'x');
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-rtrn-close-err.js b/src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close-err.case
similarity index 94%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-rtrn-close-err.js
rename to src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close-err.case
index ce2189ac37..e2635d742d 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-rtrn-close-err.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close-err.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when AssignmentRestEvaluation produces a "return"
     completion due to reference evaluation
 info: |
@@ -24,10 +24,12 @@ info: |
     7. If completion.[[type]] is throw, return Completion(completion).
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 features: [Symbol.iterator, generators]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var unreachable = 0;
@@ -51,8 +53,13 @@ iterable[Symbol.iterator] = function() {
   return iterator;
 };
 function* g() {
-  [ x , ...{}[yield] ] = iterable;
+//- elems
+[ x , ...{}[yield] ]
+//- vals
+iterable
+//- body
   unreachable += 1;
+//- teardown
 }
 
 iter = g();
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-rtrn-close-null.js b/src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close-null.case
similarity index 94%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-rtrn-close-null.js
rename to src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close-null.case
index f25ec5b79a..d241f14801 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-rtrn-close-null.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close-null.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose throws a TypeError when `return` returns a non-Object value
 info: |
     ArrayAssignmentPattern :
@@ -23,10 +23,12 @@ info: |
     7. If completion.[[type]] is throw, return Completion(completion).
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 features: [Symbol.iterator, generators]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var iterable = {};
 var x;
@@ -47,7 +49,11 @@ iterable[Symbol.iterator] = function() {
 };
 
 function* g() {
-  [ x , ...{}[yield] ] = iterable;
+//- elems
+[ x , ...{}[yield] ]
+//- vals
+iterable
+//- teardown
 }
 
 iter = g();
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-rtrn-close.js b/src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close.case
similarity index 95%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-rtrn-close.js
rename to src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close.case
index da1e805331..c573c53fae 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-rtrn-close.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when AssignmentRestEvaluation produces a "return"
     completion due to reference evaluation
 info: |
@@ -24,10 +24,12 @@ info: |
     7. If completion.[[type]] is throw, return Completion(completion).
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 features: [Symbol.iterator, generators]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var unreachable = 0;
@@ -55,8 +57,13 @@ iterable[Symbol.iterator] = function() {
 };
 
 function* g() {
-  [ x , ...{}[yield] ] = iterable;
+//- elems
+[ x , ...{}[yield] ]
+//- vals
+iterable
+//- body
   unreachable += 1;
+//- teardown
 }
 
 iter = g();
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-thrw-close-err.js b/src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close-err.case
similarity index 92%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-thrw-close-err.js
rename to src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close-err.case
index beea275ccc..79ae32edb1 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-thrw-close-err.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close-err.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when AssignmentRestEvaluation produces a "throw"
     completion due to reference evaluation
 info: |
@@ -22,10 +22,12 @@ info: |
     [...]
     7. If completion.[[type]] is throw, return Completion(completion)
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var x;
@@ -51,10 +53,12 @@ var thrower = function() {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [ x , ...{}[thrower()] ] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[ x , ...{}[thrower()] ]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-thrw-close-skip.js b/src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close-skip.case
similarity index 87%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-thrw-close-skip.js
rename to src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close-skip.case
index 4619bc0738..5d53e48717 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-thrw-close-skip.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close-skip.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: Abrupt completion returned during iteration for rest element
+desc: Abrupt completion returned during iteration for rest element
 info: |
     ArrayAssignmentPattern :
         [ AssignmentElementList , Elisionopt AssignmentRestElementopt ]
@@ -15,10 +15,12 @@ info: |
        status).
     9. Return Completion(status).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -42,10 +44,12 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [ x , ...x ] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[ x , ...x ]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 2);
 assert.sameValue(returnCount, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-thrw-close.js b/src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close.case
similarity index 93%
rename from test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-thrw-close.js
rename to src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close.case
index eefc3e1466..1908579446 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-trlg-iter-rest-thrw-close.js
+++ b/src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when AssignmentRestEvaluation produces a "throw"
     completion due to reference evaluation
 info: |
@@ -23,10 +23,12 @@ info: |
     6. Let innerResult be Call(return, iterator, « »).
     [...]
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var thisValue = null;
@@ -52,11 +54,13 @@ var thrower = function() {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [ x , ...{}[thrower()] ] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[ x , ...{}[thrower()] ]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
 assert.sameValue(thisValue, iterator, 'correct `this` value');
diff --git a/test/language/expressions/assignment/destructuring/array-elision-iter-abpt.js b/src/dstr-assignment/array-elision-iter-abpt.case
similarity index 89%
rename from test/language/expressions/assignment/destructuring/array-elision-iter-abpt.js
rename to src/dstr-assignment/array-elision-iter-abpt.case
index 82d43234bc..3ae10f4790 100644
--- a/test/language/expressions/assignment/destructuring/array-elision-iter-abpt.js
+++ b/src/dstr-assignment/array-elision-iter-abpt.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is not called when iteration produces an abrupt completion
 info: |
     ArrayAssignmentPattern : [ Elision ]
@@ -12,10 +12,12 @@ info: |
        result).
     [...]
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -31,10 +33,12 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [ , ] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[ , ]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-elision-iter-get-err.js b/src/dstr-assignment/array-elision-iter-get-err.case
similarity index 78%
rename from test/language/expressions/assignment/destructuring/array-elision-iter-get-err.js
rename to src/dstr-assignment/array-elision-iter-get-err.case
index 8900065f15..d623ab6907 100644
--- a/test/language/expressions/assignment/destructuring/array-elision-iter-get-err.js
+++ b/src/dstr-assignment/array-elision-iter-get-err.case
@@ -1,22 +1,26 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: Abrupt completion returned from GetIterator
+desc: Abrupt completion returned from GetIterator
 info: |
     ArrayAssignmentPattern : [ Elision ]
 
     1. Let iterator be GetIterator(value).
     2. ReturnIfAbrupt(iterator).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var iterable = {};
 iterable[Symbol.iterator] = function() {
   throw new Test262Error();
 };
-
-assert.throws(Test262Error, function() {
-  [ , ] = iterable;
-});
+//- error
+Test262Error
+//- elems
+[ , ]
+//- vals
+iterable
diff --git a/test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close-err.js b/src/dstr-assignment/array-elision-iter-nrml-close-err.case
similarity index 90%
rename from test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close-err.js
rename to src/dstr-assignment/array-elision-iter-nrml-close-err.case
index ad5fb2da51..e6ea53ee72 100644
--- a/test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close-err.js
+++ b/src/dstr-assignment/array-elision-iter-nrml-close-err.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     Abrupt completion returned from IteratorClose
 info: |
     ArrayAssignmentPattern : [ Elision ]
@@ -12,10 +12,12 @@ info: |
        result).
     6. Return result.
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -34,10 +36,12 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [ , ] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[ , ]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close-null.js b/src/dstr-assignment/array-elision-iter-nrml-close-null.case
similarity index 93%
rename from test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close-null.js
rename to src/dstr-assignment/array-elision-iter-nrml-close-null.case
index 528c0eaf19..e91c29fcf5 100644
--- a/test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close-null.js
+++ b/src/dstr-assignment/array-elision-iter-nrml-close-null.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose throws a TypeError when `return` returns a non-Object value
 info: |
     ArrayAssignmentPattern : [ Elision ]
@@ -21,10 +21,12 @@ info: |
     9. If Type(innerResult.[[value]]) is not Object, throw a TypeError
        exception.
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var iterable = {};
 var nextCount = 0;
 var iterator = {
@@ -41,7 +43,9 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(TypeError, function() {
-  [ , ] = iterable;
-});
+//- error
+TypeError
+//- elems
+[ , ]
+//- vals
+iterable
diff --git a/test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close-skip.js b/src/dstr-assignment/array-elision-iter-nrml-close-skip.case
similarity index 91%
rename from test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close-skip.js
rename to src/dstr-assignment/array-elision-iter-nrml-close-skip.case
index ecff815338..17d7c97baf 100644
--- a/test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close-skip.js
+++ b/src/dstr-assignment/array-elision-iter-nrml-close-skip.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is not called when iteration has exhausted the iterator
 info: |
     ArrayAssignmentPattern : [ Elision ]
@@ -12,10 +12,12 @@ info: |
        result).
     [...]
 features: [Symbol.iterator]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -32,8 +34,10 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-[ , ] = iterable;
-
+//- elems
+[ , ]
+//- vals
+iterable
+//- body
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close.js b/src/dstr-assignment/array-elision-iter-nrml-close.case
similarity index 94%
rename from test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close.js
rename to src/dstr-assignment/array-elision-iter-nrml-close.case
index eba1f3cef4..71c75a2d56 100644
--- a/test/language/expressions/assignment/destructuring/array-elision-iter-nrml-close.js
+++ b/src/dstr-assignment/array-elision-iter-nrml-close.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when assignment evaluation has not exhausted the
     iterator
 info: |
@@ -19,10 +19,12 @@ info: |
     6. Let innerResult be Call(return, iterator, « »).
     [...]
 features: [Symbol.iterator]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var thisValue = null;
@@ -45,9 +47,11 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-[ , ] = iterable;
-
+//- elems
+[ , ]
+//- vals
+iterable
+//- body
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 1);
 assert.sameValue(thisValue, iterator, 'correct `this` value');
diff --git a/src/dstr-assignment/array-elision-val-array.case b/src/dstr-assignment/array-elision-val-array.case
new file mode 100644
index 0000000000..70895eeef6
--- /dev/null
+++ b/src/dstr-assignment/array-elision-val-array.case
@@ -0,0 +1,13 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+desc: >
+    An ArrayAssignmentPattern containing only Elisions requires iterable values
+template: default
+es6id: 12.14.5.2
+---*/
+
+//- elems
+[,]
+//- vals
+[]
diff --git a/src/dstr-assignment/array-elision-val-bool.case b/src/dstr-assignment/array-elision-val-bool.case
new file mode 100644
index 0000000000..e9cbc6dd09
--- /dev/null
+++ b/src/dstr-assignment/array-elision-val-bool.case
@@ -0,0 +1,16 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+desc: >
+    An ArrayAssignmentPattern containing only Elisions requires iterable values
+    and throws for boolean values.
+template: error
+es6id: 12.14.5.2
+---*/
+
+//- error
+TypeError
+//- elems
+[,]
+//- vals
+true
diff --git a/src/dstr-assignment/array-elision-val-null.case b/src/dstr-assignment/array-elision-val-null.case
new file mode 100644
index 0000000000..3f4b644468
--- /dev/null
+++ b/src/dstr-assignment/array-elision-val-null.case
@@ -0,0 +1,16 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+desc: >
+    An ArrayAssignmentPattern containing only Elisions requires iterable values
+    and throws for `null`.
+template: error
+es6id: 12.14.5.2
+---*/
+
+//- error
+TypeError
+//- elems
+[,]
+//- vals
+null
diff --git a/src/dstr-assignment/array-elision-val-num.case b/src/dstr-assignment/array-elision-val-num.case
new file mode 100644
index 0000000000..99f14215d2
--- /dev/null
+++ b/src/dstr-assignment/array-elision-val-num.case
@@ -0,0 +1,16 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+desc: >
+    An ArrayAssignmentPattern containing only Elisions requires iterable values
+    and throws for number values.
+template: error
+es6id: 12.14.5.2
+---*/
+
+//- error
+TypeError
+//- elems
+[,]
+//- vals
+1
diff --git a/src/dstr-assignment/array-elision-val-string.case b/src/dstr-assignment/array-elision-val-string.case
new file mode 100644
index 0000000000..4072011b8c
--- /dev/null
+++ b/src/dstr-assignment/array-elision-val-string.case
@@ -0,0 +1,13 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+desc: >
+    An ArrayAssignmentPattern containing only Elisions requires iterable values
+template: default
+es6id: 12.14.5.2
+---*/
+
+//- elems
+[,]
+//- vals
+'string literal'
diff --git a/src/dstr-assignment/array-elision-val-symbol.case b/src/dstr-assignment/array-elision-val-symbol.case
new file mode 100644
index 0000000000..7b80f19b82
--- /dev/null
+++ b/src/dstr-assignment/array-elision-val-symbol.case
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+desc: >
+    An ArrayAssignmentPattern containing only Elisions requires iterable values
+    and throws for symbol values.
+template: error
+es6id: 12.14.5.2
+features: [Symbol]
+---*/
+
+//- setup
+var s = Symbol();
+//- error
+TypeError
+//- elems
+[,]
+//- vals
+s
diff --git a/src/dstr-assignment/array-elision-val-undef.case b/src/dstr-assignment/array-elision-val-undef.case
new file mode 100644
index 0000000000..4c7bf69fc7
--- /dev/null
+++ b/src/dstr-assignment/array-elision-val-undef.case
@@ -0,0 +1,16 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+desc: >
+    An ArrayAssignmentPattern containing only Elisions requires iterable values
+    and throws for `undefined`.
+template: error
+es6id: 12.14.5.2
+---*/
+
+//- error
+TypeError
+//- elems
+[,]
+//- vals
+undefined
diff --git a/test/language/expressions/assignment/destructuring/array-empty-iter-close-err.js b/src/dstr-assignment/array-empty-iter-close-err.case
similarity index 84%
rename from test/language/expressions/assignment/destructuring/array-empty-iter-close-err.js
rename to src/dstr-assignment/array-empty-iter-close-err.case
index a7e1d225fd..8d33d030d1 100644
--- a/test/language/expressions/assignment/destructuring/array-empty-iter-close-err.js
+++ b/src/dstr-assignment/array-empty-iter-close-err.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: Abrupt completion returned from IteratorClose
+desc: Abrupt completion returned from IteratorClose
 info: |
     ArrayAssignmentPattern : [ ]
 
@@ -9,10 +9,12 @@ info: |
     2. ReturnIfAbrupt(iterator).
     3. Return IteratorClose(iterator, NormalCompletion(empty)).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -29,10 +31,12 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 0);
 assert.sameValue(returnCount, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-empty-iter-close-null.js b/src/dstr-assignment/array-empty-iter-close-null.case
similarity index 92%
rename from test/language/expressions/assignment/destructuring/array-empty-iter-close-null.js
rename to src/dstr-assignment/array-empty-iter-close-null.case
index 1ef76906be..42cef194a3 100644
--- a/test/language/expressions/assignment/destructuring/array-empty-iter-close-null.js
+++ b/src/dstr-assignment/array-empty-iter-close-null.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose throws a TypeError when `return` returns a non-Object value
 info: |
     ArrayAssignmentPattern : [ ]
@@ -19,10 +19,12 @@ info: |
     9. If Type(innerResult.[[value]]) is not Object, throw a TypeError
        exception.
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var iterable = {};
 var iterator = {
   next: function() {
@@ -35,7 +37,9 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(TypeError, function() {
-  [] = iterable;
-});
+//- error
+TypeError
+//- elems
+[]
+//- vals
+iterable
diff --git a/test/language/expressions/assignment/destructuring/array-empty-iter-close.js b/src/dstr-assignment/array-empty-iter-close.case
similarity index 91%
rename from test/language/expressions/assignment/destructuring/array-empty-iter-close.js
rename to src/dstr-assignment/array-empty-iter-close.case
index c9a70d9c9a..abd0f57908 100644
--- a/test/language/expressions/assignment/destructuring/array-empty-iter-close.js
+++ b/src/dstr-assignment/array-empty-iter-close.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: Iterator is closed without iterating
+desc: Iterator is closed without iterating
 info: |
     ArrayAssignmentPattern : [ ]
 
@@ -15,10 +15,12 @@ info: |
     6. Let innerResult be Call(return, iterator, « »).
     [...]
 features: [Symbol.iterator]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var thisValue = null;
@@ -39,9 +41,11 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-[] = iterable;
-
+//- elems
+[]
+//- vals
+iterable
+//- body
 assert.sameValue(nextCount, 0);
 assert.sameValue(returnCount, 1);
 assert.sameValue(thisValue, iterator, 'correct `this` value');
diff --git a/test/language/expressions/assignment/destructuring/array-empty-iter-get-err.js b/src/dstr-assignment/array-empty-iter-get-err.case
similarity index 78%
rename from test/language/expressions/assignment/destructuring/array-empty-iter-get-err.js
rename to src/dstr-assignment/array-empty-iter-get-err.case
index efd5b21d4a..2a66e18b82 100644
--- a/test/language/expressions/assignment/destructuring/array-empty-iter-get-err.js
+++ b/src/dstr-assignment/array-empty-iter-get-err.case
@@ -1,22 +1,26 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: Abrupt completion returned from GetIterator
+desc: Abrupt completion returned from GetIterator
 info: |
     ArrayAssignmentPattern : [ ]
 
     1. Let iterator be GetIterator(value).
     2. ReturnIfAbrupt(iterator).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var iterable = {};
 iterable[Symbol.iterator] = function() {
   throw new Test262Error();
 };
-
-assert.throws(Test262Error, function() {
-  [] = iterable;
-});
+//- error
+Test262Error
+//- elems
+[]
+//- vals
+iterable
diff --git a/src/dstr-assignment/array-empty-val-array.case b/src/dstr-assignment/array-empty-val-array.case
new file mode 100644
index 0000000000..5820b7175b
--- /dev/null
+++ b/src/dstr-assignment/array-empty-val-array.case
@@ -0,0 +1,15 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+    An ArrayAssignmentPattern without an AssignmentElementList requires
+    iterable values.
+template: default
+es6id: 12.14.5.2
+---*/
+
+//- elems
+[]
+//- vals
+[]
diff --git a/src/dstr-assignment/array-empty-val-bool.case b/src/dstr-assignment/array-empty-val-bool.case
new file mode 100644
index 0000000000..327085e164
--- /dev/null
+++ b/src/dstr-assignment/array-empty-val-bool.case
@@ -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.
+
+/*---
+desc: >
+    An ArrayAssignmentPattern without an AssignmentElementList requires
+    iterable values and throws for boolean values
+template: error
+es6id: 12.14.5.2
+---*/
+
+//- error
+TypeError
+//- elems
+[]
+//- vals
+true
diff --git a/src/dstr-assignment/array-empty-val-null.case b/src/dstr-assignment/array-empty-val-null.case
new file mode 100644
index 0000000000..d42b89aca6
--- /dev/null
+++ b/src/dstr-assignment/array-empty-val-null.case
@@ -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.
+
+/*---
+desc: >
+    An ArrayAssignmentPattern without an AssignmentElementList requires
+    iterable values and throws for `null`.
+template: error
+es6id: 12.14.5.2
+---*/
+
+//- error
+TypeError
+//- elems
+[]
+//- vals
+null
diff --git a/src/dstr-assignment/array-empty-val-num.case b/src/dstr-assignment/array-empty-val-num.case
new file mode 100644
index 0000000000..8adbc65262
--- /dev/null
+++ b/src/dstr-assignment/array-empty-val-num.case
@@ -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.
+
+/*---
+desc: >
+    An ArrayAssignmentPattern without an AssignmentElementList requires
+    iterable values and throws for number values.
+template: error
+es6id: 12.14.5.2
+---*/
+
+//- error
+TypeError
+//- elems
+[]
+//- vals
+1
diff --git a/src/dstr-assignment/array-empty-val-string.case b/src/dstr-assignment/array-empty-val-string.case
new file mode 100644
index 0000000000..102c9c37ae
--- /dev/null
+++ b/src/dstr-assignment/array-empty-val-string.case
@@ -0,0 +1,15 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+    An ArrayAssignmentPattern without an AssignmentElementList requires
+    iterable values.
+template: default
+es6id: 12.14.5.2
+---*/
+
+//- elems
+[]
+//- vals
+'string literal'
diff --git a/src/dstr-assignment/array-empty-val-symbol.case b/src/dstr-assignment/array-empty-val-symbol.case
new file mode 100644
index 0000000000..723fc7eed5
--- /dev/null
+++ b/src/dstr-assignment/array-empty-val-symbol.case
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+    An ArrayAssignmentPattern without an AssignmentElementList requires
+    iterable values and throws for Symbol values.
+template: error
+es6id: 12.14.5.2
+---*/
+
+//- setup
+var s = Symbol();
+//- error
+TypeError
+//- elems
+[]
+//- vals
+s
diff --git a/src/dstr-assignment/array-empty-val-undef.case b/src/dstr-assignment/array-empty-val-undef.case
new file mode 100644
index 0000000000..b2af204310
--- /dev/null
+++ b/src/dstr-assignment/array-empty-val-undef.case
@@ -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.
+
+/*---
+desc: >
+    An ArrayAssignmentPattern without an AssignmentElementList requires
+    iterable values and throws for `undefined`.
+template: error
+es6id: 12.14.5.2
+---*/
+
+//- error
+TypeError
+//- elems
+[]
+//- vals
+undefined
diff --git a/src/dstr-assignment/array-iteration.case b/src/dstr-assignment/array-iteration.case
new file mode 100644
index 0000000000..be62fb2729
--- /dev/null
+++ b/src/dstr-assignment/array-iteration.case
@@ -0,0 +1,27 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+    Value iteration only proceeds for the number of elements in the
+    ArrayAssignmentPattern.
+template: default
+es6id: 12.14.5.3
+features: [generators]
+---*/
+
+//- setup
+var count = 0;
+var g = function*() {
+  count += 1;
+  yield;
+  count += 1;
+  yield;
+  count += 1;
+}
+//- elems
+[,,]
+//- vals
+g()
+//- body
+assert.sameValue(count, 2);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-after-element.js b/src/dstr-assignment/array-rest-after-element.case
similarity index 82%
rename from test/language/expressions/assignment/destructuring/array-rest-after-element.js
rename to src/dstr-assignment/array-rest-after-element.case
index 4bfbcb6255..bb80557b08 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-after-element.js
+++ b/src/dstr-assignment/array-rest-after-element.case
@@ -2,16 +2,20 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     An AssignmentRestElement following an AssignmentElement consumes all
     remaining iterable values.
+template: default
 es6id: 12.14.5.3
 ---*/
 
+//- setup
 var x, y;
-
-[x, ...y] = [1, 2, 3];
-
+//- elems
+[x, ...y]
+//- vals
+[1, 2, 3]
+//- body
 assert.sameValue(x, 1);
 assert.sameValue(y.length, 2);
 assert.sameValue(y[0], 2);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-after-elision.js b/src/dstr-assignment/array-rest-after-elision.case
similarity index 81%
rename from test/language/expressions/assignment/destructuring/array-rest-after-elision.js
rename to src/dstr-assignment/array-rest-after-elision.case
index 379683ed0f..48d06d5e14 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-after-elision.js
+++ b/src/dstr-assignment/array-rest-after-elision.case
@@ -2,16 +2,20 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     An AssignmentRestElement following an elision consumes all remaining
     iterable values.
+template: default
 es6id: 12.14.5.3
 ---*/
 
+//- setup
 var x;
-
-[, ...x] = [1, 2, 3];
-
+//- elems
+[, ...x]
+//- vals
+[1, 2, 3]
+//- body
 assert.sameValue(x.length, 2);
 assert.sameValue(x[0], 2);
 assert.sameValue(x[1], 3);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-before-element.js b/src/dstr-assignment/array-rest-before-element.case
similarity index 83%
rename from test/language/expressions/assignment/destructuring/array-rest-before-element.js
rename to src/dstr-assignment/array-rest-before-element.case
index 8c53b9b655..fda8d7721f 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-before-element.js
+++ b/src/dstr-assignment/array-rest-before-element.case
@@ -2,13 +2,15 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     An AssignmentElement may not follow an AssignmentRestElement in an
     AssignmentElementList.
+template: syntax
 es6id: 12.14.5
 negative: SyntaxError
 ---*/
 
-var x, y;
-
-[...x, y] = [];
+//- elems
+[...x, y]
+//- vals
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-rest-before-elision.js b/src/dstr-assignment/array-rest-before-elision.case
similarity index 83%
rename from test/language/expressions/assignment/destructuring/array-rest-before-elision.js
rename to src/dstr-assignment/array-rest-before-elision.case
index 6480747165..501f9ac1e6 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-before-elision.js
+++ b/src/dstr-assignment/array-rest-before-elision.case
@@ -2,13 +2,15 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     An elision may not follow an AssignmentRestElement in an
     AssignmentElementList.
+template: syntax
 es6id: 12.14.5
 negative: SyntaxError
 ---*/
 
-var x;
-
-[...x,] = [];
+//- elems
+[...x,]
+//- vals
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-rest-before-rest.js b/src/dstr-assignment/array-rest-before-rest.case
similarity index 83%
rename from test/language/expressions/assignment/destructuring/array-rest-before-rest.js
rename to src/dstr-assignment/array-rest-before-rest.case
index 207cb39ba8..a86de5f458 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-before-rest.js
+++ b/src/dstr-assignment/array-rest-before-rest.case
@@ -2,13 +2,15 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     An AssignmentRestElement may not follow another AssignmentRestElement in an
     AssignmentElementList.
+template: syntax
 es6id: 12.14.5
 negative: SyntaxError
 ---*/
 
-var x, y;
-
-[...x, ...y] = [];
+//- elems
+[...x, ...y]
+//- vals
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-rest-elision-invalid.js b/src/dstr-assignment/array-rest-elision-invalid.case
similarity index 84%
rename from test/language/expressions/assignment/destructuring/array-rest-elision-invalid.js
rename to src/dstr-assignment/array-rest-elision-invalid.case
index e26ebff599..f002f7169a 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-elision-invalid.js
+++ b/src/dstr-assignment/array-rest-elision-invalid.case
@@ -2,11 +2,15 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     ArrayAssignmentPattern may not include elisions following an
     AssignmentRestElement in a AssignmentElementList.
+template: syntax
 es6id: 12.14.5
 negative: SyntaxError
 ---*/
 
-[...x,] = [];
+//- elems
+[...x,]
+//- vals
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-rest-elision-iter-abpt.js b/src/dstr-assignment/array-rest-elision-iter-abpt.case
similarity index 91%
rename from test/language/expressions/assignment/destructuring/array-rest-elision-iter-abpt.js
rename to src/dstr-assignment/array-rest-elision-iter-abpt.case
index 367cc892fe..a84bab56fd 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-elision-iter-abpt.js
+++ b/src/dstr-assignment/array-rest-elision-iter-abpt.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is not called when assignment evaluation produces an abrupt
     completion
 info: |
@@ -17,10 +17,12 @@ info: |
              IteratorClose(iterator, status).
           ii. Return Completion(status).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -37,10 +39,12 @@ iterable[Symbol.iterator] = function() {
   return iterator;
 };
 var x;
-
-assert.throws(Test262Error, function() {
-  [ , ...x] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[ , ...x]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-elision.js b/src/dstr-assignment/array-rest-elision.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/array-rest-elision.js
rename to src/dstr-assignment/array-rest-elision.case
index 4a0bc1cc61..09a814007e 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-elision.js
+++ b/src/dstr-assignment/array-rest-elision.case
@@ -2,19 +2,20 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     ArrayAssignmentPattern may include elisions at any position preceeding a
     AssignmentRestElement in a AssignmentElementList.
+template: default
 es6id: 12.14.5
 ---*/
 
-var value = [1, 2, 3, 4, 5, 6];
+//- setup
 var x, y;
-var result;
-
-result = [, , x, , ...y] = value;
-
-assert.sameValue(result, value);
+//- elems
+[, , x, , ...y]
+//- vals
+[1, 2, 3, 4, 5, 6]
+//- body
 assert.sameValue(x, 3);
 assert.sameValue(y.length, 2);
 assert.sameValue(y[0], 5);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-init.js b/src/dstr-assignment/array-rest-init.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/array-rest-init.js
rename to src/dstr-assignment/array-rest-init.case
index 2fbe698d94..02c329e209 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-init.js
+++ b/src/dstr-assignment/array-rest-init.case
@@ -2,12 +2,16 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The AssignmentRestElement does not support an initializer.
+template: syntax
 es6id: 12.14.5
 negative: SyntaxError
 ---*/
 
+//- setup
 var x;
-
-[...x = 1] = [];
+//- elems
+[...x = 1]
+//- vals
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-rest-iter-get-err.js b/src/dstr-assignment/array-rest-iter-get-err.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/array-rest-iter-get-err.js
rename to src/dstr-assignment/array-rest-iter-get-err.case
index 6cf2f2d45e..7693c779db 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-iter-get-err.js
+++ b/src/dstr-assignment/array-rest-iter-get-err.case
@@ -1,23 +1,27 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: Abrupt completion returned from GetIterator
+desc: Abrupt completion returned from GetIterator
 info: |
     ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ]
 
     1. Let iterator be GetIterator(value).
     2. ReturnIfAbrupt(iterator).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var iterable = {};
 var x;
 iterable[Symbol.iterator] = function() {
   throw new Test262Error();
 };
-
-assert.throws(Test262Error, function() {
-  [...x] = iterable;
-});
+//- error
+Test262Error
+//- elems
+[...x]
+//- vals
+iterable
diff --git a/test/language/expressions/assignment/destructuring/array-rest-iter-nrml-close-skip.js b/src/dstr-assignment/array-rest-iter-nrml-close-skip.case
similarity index 92%
rename from test/language/expressions/assignment/destructuring/array-rest-iter-nrml-close-skip.js
rename to src/dstr-assignment/array-rest-iter-nrml-close-skip.case
index 5bb22af60b..627731aa60 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-iter-nrml-close-skip.js
+++ b/src/dstr-assignment/array-rest-iter-nrml-close-skip.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is not called when assignment evaluation has exhausted the
     iterator
 info: |
@@ -15,10 +15,12 @@ info: |
        result).
     7. Return result.
 features: [Symbol.iterator]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var x;
@@ -35,8 +37,10 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-[ ...x ] = iterable;
-
+//- elems
+[ ...x ]
+//- vals
+iterable
+//- body
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-iter-rtrn-close-err.js b/src/dstr-assignment/array-rest-iter-rtrn-close-err.case
similarity index 93%
rename from test/language/expressions/assignment/destructuring/array-rest-iter-rtrn-close-err.js
rename to src/dstr-assignment/array-rest-iter-rtrn-close-err.case
index b86607956f..aaeb47a8dd 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-iter-rtrn-close-err.js
+++ b/src/dstr-assignment/array-rest-iter-rtrn-close-err.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when reference evaluation produces a "return"
     completion
 info: |
@@ -28,10 +28,12 @@ info: |
     7. If completion.[[type]] is throw, return Completion(completion).
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 features: [Symbol.iterator, generators]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var returnCount = 0;
 var unreachable = 0;
 function ReturnError() {}
@@ -49,8 +51,13 @@ iterable[Symbol.iterator] = function() {
 };
 
 function* g() {
-  [...{}[yield]] = iterable;
-  unreachable += 1;
+//- elems
+[...{}[yield]]
+//- vals
+iterable
+//- body
+unreachable += 1;
+//- teardown
 }
 
 iter = g();
diff --git a/test/language/expressions/assignment/destructuring/array-rest-iter-rtrn-close-null.js b/src/dstr-assignment/array-rest-iter-rtrn-close-null.case
similarity index 94%
rename from test/language/expressions/assignment/destructuring/array-rest-iter-rtrn-close-null.js
rename to src/dstr-assignment/array-rest-iter-rtrn-close-null.case
index 4b37e9f599..f911aea3f8 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-iter-rtrn-close-null.js
+++ b/src/dstr-assignment/array-rest-iter-rtrn-close-null.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose throws a TypeError when `return` returns a non-Object value
 info: |
     ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ]
@@ -33,10 +33,12 @@ info: |
     7. If completion.[[type]] is throw, return Completion(completion).
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 features: [Symbol.iterator, generators]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var iterable = {};
 var iterator = {
   return: function() {
@@ -49,7 +51,11 @@ iterable[Symbol.iterator] = function() {
 };
 
 function* g() {
-  [...{}[yield]] = iterable;
+//- elems
+[...{}[yield]]
+//- vals
+iterable
+//- teardown
 }
 
 iter = g();
diff --git a/test/language/expressions/assignment/destructuring/array-rest-iter-rtrn-close.js b/src/dstr-assignment/array-rest-iter-rtrn-close.case
similarity index 94%
rename from test/language/expressions/assignment/destructuring/array-rest-iter-rtrn-close.js
rename to src/dstr-assignment/array-rest-iter-rtrn-close.case
index da30120406..35366c2aa2 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-iter-rtrn-close.js
+++ b/src/dstr-assignment/array-rest-iter-rtrn-close.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when reference evaluation produces a "return"
     completion
 info: |
@@ -34,10 +34,12 @@ info: |
     7. If completion.[[type]] is throw, return Completion(completion).
     8. If innerResult.[[type]] is throw, return Completion(innerResult).
 features: [Symbol.iterator, generators]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var returnCount = 0;
 var unreachable = 0;
 var thisValue = null;
@@ -57,8 +59,13 @@ iterable[Symbol.iterator] = function() {
 };
 
 function* g() {
-  [...{}[yield]] = iterable;
-  unreachable += 1;
+//- elems
+[...{}[yield]]
+//- vals
+iterable
+//- body
+unreachable += 1;
+//- teardown
 }
 
 iter = g();
diff --git a/test/language/expressions/assignment/destructuring/array-rest-iter-thrw-close-err.js b/src/dstr-assignment/array-rest-iter-thrw-close-err.case
similarity index 93%
rename from test/language/expressions/assignment/destructuring/array-rest-iter-thrw-close-err.js
rename to src/dstr-assignment/array-rest-iter-thrw-close-err.case
index f39a146523..4c98fb20f5 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-iter-thrw-close-err.js
+++ b/src/dstr-assignment/array-rest-iter-thrw-close-err.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when reference evaluation produces a "throw"
     completion
 info: |
@@ -21,10 +21,12 @@ info: |
        a. Let lref be the result of evaluating DestructuringAssignmentTarget.
        b. ReturnIfAbrupt(lref).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var x;
@@ -51,9 +53,12 @@ iterable[Symbol.iterator] = function() {
   return iterator;
 };
 
-assert.throws(Test262Error, function() {
-  [...{}[thrower()]] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[...{}[thrower()]]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 0);
 assert.sameValue(returnCount, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-iter-thrw-close-skip.js b/src/dstr-assignment/array-rest-iter-thrw-close-skip.case
similarity index 90%
rename from test/language/expressions/assignment/destructuring/array-rest-iter-thrw-close-skip.js
rename to src/dstr-assignment/array-rest-iter-thrw-close-skip.case
index 84a4cac820..d95493775c 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-iter-thrw-close-skip.js
+++ b/src/dstr-assignment/array-rest-iter-thrw-close-skip.case
@@ -1,6 +1,6 @@
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is not called when iteration produces an abrupt completion
 info: |
     ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ]
@@ -12,10 +12,12 @@ info: |
     6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator,
        result).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var x;
@@ -32,10 +34,12 @@ var iterator = {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [...x] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[...x]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-iter-thrw-close.js b/src/dstr-assignment/array-rest-iter-thrw-close.case
similarity index 94%
rename from test/language/expressions/assignment/destructuring/array-rest-iter-thrw-close.js
rename to src/dstr-assignment/array-rest-iter-thrw-close.case
index 8e5b4e634c..3028c1afe0 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-iter-thrw-close.js
+++ b/src/dstr-assignment/array-rest-iter-thrw-close.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when reference evaluation produces a "throw"
     completion
 info: |
@@ -27,10 +27,12 @@ info: |
     6. Let innerResult be Call(return, iterator, « »).
     [...]
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var thisValue = null;
@@ -56,11 +58,13 @@ var thrower = function() {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [...{}[thrower()]] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[...{}[thrower()]]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 0);
 assert.sameValue(returnCount, 1);
 assert.sameValue(thisValue, iterator, 'correct `this` value');
diff --git a/test/language/expressions/assignment/destructuring/array-rest-iteration.js b/src/dstr-assignment/array-rest-iteration.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/array-rest-iteration.js
rename to src/dstr-assignment/array-rest-iteration.case
index 735ee9914e..8f1a8d2d30 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-iteration.js
+++ b/src/dstr-assignment/array-rest-iteration.case
@@ -2,13 +2,15 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     In the presense of an AssignmentRestElement, value iteration exhausts the
     iterable value;
+template: default
 es6id: 12.14.5.3
 features: [generators]
 ---*/
 
+//- setup
 var count = 0;
 var g = function*() {
   count += 1;
@@ -17,10 +19,10 @@ var g = function*() {
   yield;
   count += 1;
 }
-var iter, result, x;
-
-iter = g();
-result = [...x] = iter;
-
-assert.sameValue(result, iter);
+var x;
+//- elems
+[...x]
+//- vals
+g()
+//- body
 assert.sameValue(count, 3);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-lref-err.js b/src/dstr-assignment/array-rest-lref-err.case
similarity index 92%
rename from test/language/expressions/assignment/destructuring/array-rest-lref-err.js
rename to src/dstr-assignment/array-rest-lref-err.case
index 2a083bdcee..56f4712052 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-lref-err.js
+++ b/src/dstr-assignment/array-rest-lref-err.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is called when reference evaluation produces an abrupt
     completion
 info: |
@@ -21,10 +21,12 @@ info: |
        a. Let lref be the result of evaluating DestructuringAssignmentTarget.
        b. ReturnIfAbrupt(lref).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -43,10 +45,12 @@ var thrower = function() {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [...{}[thrower()]] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[...{}[thrower()]]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 0);
 assert.sameValue(returnCount, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-lref.js b/src/dstr-assignment/array-rest-lref.case
similarity index 90%
rename from test/language/expressions/assignment/destructuring/array-rest-lref.js
rename to src/dstr-assignment/array-rest-lref.case
index 68161c48e8..b16315041c 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-lref.js
+++ b/src/dstr-assignment/array-rest-lref.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: Reference is evaluated during assignment
+desc: Reference is evaluated during assignment
 info: |
     ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ]
 
@@ -20,10 +20,12 @@ info: |
        b. ReturnIfAbrupt(lref).
     [...]
 features: [Symbol.iterator]
+template: default
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -40,9 +42,11 @@ var obj = {};
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-[...obj['a' + 'b']] = iterable;
-
+//- elems
+[...obj['a' + 'b']]
+//- vals
+iterable
+//- body
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 0);
 assert(!!obj.ab);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-invalid.js b/src/dstr-assignment/array-rest-nested-array-invalid.case
similarity index 87%
rename from test/language/expressions/assignment/destructuring/array-elem-nested-obj-invalid.js
rename to src/dstr-assignment/array-rest-nested-array-invalid.case
index 1f771e07ad..08eff54e22 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-nested-obj-invalid.js
+++ b/src/dstr-assignment/array-rest-nested-array-invalid.case
@@ -2,13 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral
     or an ArrayLiteral and if the lexical token sequence matched by
     LeftHandSideExpression cannot be parsed with no tokens left over using
     AssignmentPattern as the goal symbol.
+template: syntax
 es6id: 12.14.5.1
 negative: SyntaxError
 ---*/
 
-[{ get x() {} }] = [{}];
+//- elems
+[...[(x, y)]]
+//- vals
+[[]]
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-array-iter-thrw-close-skip.js b/src/dstr-assignment/array-rest-nested-array-iter-thrw-close-skip.case
similarity index 92%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-array-iter-thrw-close-skip.js
rename to src/dstr-assignment/array-rest-nested-array-iter-thrw-close-skip.case
index 8d5749624b..c569539803 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-array-iter-thrw-close-skip.js
+++ b/src/dstr-assignment/array-rest-nested-array-iter-thrw-close-skip.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is not called when nested array pattern evaluation produces
     an abrupt completion
 info: |
@@ -24,10 +24,12 @@ info: |
     7. Return the result of performing DestructuringAssignmentEvaluation of
        nestedAssignmentPattern with A as the argument.
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -46,10 +48,12 @@ var thrower = function() {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-
-assert.throws(Test262Error, function() {
-  [...[...{}[thrower()]]] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[...[...{}[thrower()]]]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-array-null.js b/src/dstr-assignment/array-rest-nested-array-null.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-array-null.js
rename to src/dstr-assignment/array-rest-nested-array-null.case
index 73e2a81420..9b68c38f65 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-array-null.js
+++ b/src/dstr-assignment/array-rest-nested-array-null.case
@@ -2,18 +2,20 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal and the iterable
     emits `null` as the only value, an array with a single `null` element
     should be used as the value of the nested DestructuringAssignment.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [null];
-var result, x, y;
-
-result = [...[x, y]] = value;
-
-assert.sameValue(result, value);
+//- setup
+var x, y;
+//- elems
+[...[x, y]]
+//- vals
+[null]
+//- body
 assert.sameValue(x, null);
 assert.sameValue(y, undefined);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-array-undefined-hole.js b/src/dstr-assignment/array-rest-nested-array-undefined-hole.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-array-undefined-hole.js
rename to src/dstr-assignment/array-rest-nested-array-undefined-hole.case
index a01b0b84eb..0b4566e8b4 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-array-undefined-hole.js
+++ b/src/dstr-assignment/array-rest-nested-array-undefined-hole.case
@@ -2,17 +2,19 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal and the iterable is
     an array with a "hole", an array with a single `undefined` element should
     be used as the value of the nested DestructuringAssignment.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [ , ];
-var result, x;
-
-result = [...[x]] = value;
-
-assert.sameValue(result, value);
+//- setup
+var x = null;
+//- elems
+[...[x]]
+//- vals
+[ , ]
+//- body
 assert.sameValue(x, undefined);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-array-undefined-own.js b/src/dstr-assignment/array-rest-nested-array-undefined-own.case
similarity index 78%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-array-undefined-own.js
rename to src/dstr-assignment/array-rest-nested-array-undefined-own.case
index 1ba0a502fb..5da0f9982f 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-array-undefined-own.js
+++ b/src/dstr-assignment/array-rest-nested-array-undefined-own.case
@@ -2,17 +2,19 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal and the iterable
     emits `undefined` as the only value, an array with a single `undefined`
     element should be used as the value of the nested DestructuringAssignment.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [undefined];
-var result, x;
-
-result = [...[x]] = value;
-
-assert.sameValue(result, value);
+//- setup
+var x = null;
+//- elems
+[...[x]]
+//- vals
+[undefined]
+//- body
 assert.sameValue(x, undefined);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-array-undefined.js b/src/dstr-assignment/array-rest-nested-array-undefined.case
similarity index 78%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-array-undefined.js
rename to src/dstr-assignment/array-rest-nested-array-undefined.case
index d8c743a03b..b4662b2b43 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-array-undefined.js
+++ b/src/dstr-assignment/array-rest-nested-array-undefined.case
@@ -2,17 +2,19 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal and the iterable is
     emits no values, an empty array should be used as the value of the nested
     DestructuringAssignment.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [];
-var result, x;
-
-result = [...[x]] = value;
-
-assert.sameValue(result, value);
+//- setup
+var x = null;
+//- elems
+[...[x]]
+//- vals
+[]
+//- body
 assert.sameValue(x, undefined);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-array-yield-expr.js b/src/dstr-assignment/array-rest-nested-array-yield-expr.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-array-yield-expr.js
rename to src/dstr-assignment/array-rest-nested-array-yield-expr.case
index 89578a84a5..75b97caf06 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-array-yield-expr.js
+++ b/src/dstr-assignment/array-rest-nested-array-yield-expr.case
@@ -2,32 +2,36 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of a
     nested destructuring assignment and within a generator function body, it
     should behave as a YieldExpression.
+template: default
 es6id: 12.14.5.3
 features: [generators]
 ---*/
 
+//- setup
 var value = [86];
 var x = {};
-var assignmentResult, iterationResult, iter;
+var iterationResult, iter;
 
 iter = (function*() {
-  assignmentResult = [...[x[yield]]] = value;
+//- elems
+[...[x[yield]]]
+//- vals
+[86]
+//- teardown
 }());
 
 iterationResult = iter.next();
 
-assert.sameValue(assignmentResult, undefined);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, false);
 assert.sameValue(x.prop, undefined);
 
 iterationResult = iter.next('prop');
 
-assert.sameValue(assignmentResult, value);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, true);
 assert.sameValue(x.prop, 86);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-array-yield-ident-invalid.js b/src/dstr-assignment/array-rest-nested-array-yield-ident-invalid.case
similarity index 86%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-array-yield-ident-invalid.js
rename to src/dstr-assignment/array-rest-nested-array-yield-ident-invalid.case
index dc34b696e8..995a7f9ff3 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-array-yield-ident-invalid.js
+++ b/src/dstr-assignment/array-rest-nested-array-yield-ident-invalid.case
@@ -2,14 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of a
     nested destructuring assignment and outside of a generator function body,
     it should behave as an IdentifierExpression.
+template: syntax
 es6id: 12.14.5.3
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-var x;
-[...[x[yield]]] = [];
+//- elems
+[...[x[yield]]]
+//- vals
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-array-yield-ident-valid.js b/src/dstr-assignment/array-rest-nested-array-yield-ident-valid.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-array-yield-ident-valid.js
rename to src/dstr-assignment/array-rest-nested-array-yield-ident-valid.case
index d60b4ccd11..fd5eff61d8 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-array-yield-ident-valid.js
+++ b/src/dstr-assignment/array-rest-nested-array-yield-ident-valid.case
@@ -2,20 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of a
     nested destructuring assignment and outside of a generator function body,
     it should behave as an IdentifierExpression.
+template: default
 es6id: 12.14.5.3
 flags: [noStrict]
 ---*/
 
-var value = [86];
+//- setup
 var yield = 'prop';
 var x = {};
-var result;
-
-result = [...[x[yield]]] = value;
-
-assert.sameValue(result, value);
+//- elems
+[...[x[yield]]]
+//- vals
+[86]
+//- body
 assert.sameValue(x.prop, 86);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-array.js b/src/dstr-assignment/array-rest-nested-array.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-array.js
rename to src/dstr-assignment/array-rest-nested-array.case
index fd77214f42..7f6f6562ac 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-array.js
+++ b/src/dstr-assignment/array-rest-nested-array.case
@@ -2,17 +2,19 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal, it should be parsed
     parsed as a DestructuringAssignmentPattern and evaluated as a destructuring
     assignment.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [1, 2, 3];
-var x, result;
-
-result = [...[x]] = value;
-
-assert.sameValue(result, value);
+//- setup
+var x;
+//- elems
+[...[x]]
+//- vals
+[1, 2, 3]
+//- body
 assert.sameValue(x, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-invalid.js b/src/dstr-assignment/array-rest-nested-obj-invalid.case
similarity index 86%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-obj-invalid.js
rename to src/dstr-assignment/array-rest-nested-obj-invalid.case
index 35d467839d..ee38be20ea 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-invalid.js
+++ b/src/dstr-assignment/array-rest-nested-obj-invalid.case
@@ -2,13 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral
     or an ArrayLiteral and if the lexical token sequence matched by
     LeftHandSideExpression cannot be parsed with no tokens left over using
     AssignmentPattern as the goal symbol.
+template: syntax
 es6id: 12.14.5.1
 negative: SyntaxError
 ---*/
 
-[...{ get x() {} }] = [[]];
+//- elems
+[...{ get x() {} }]
+//- vals
+[[]]
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-null.js b/src/dstr-assignment/array-rest-nested-obj-null.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-obj-null.js
rename to src/dstr-assignment/array-rest-nested-obj-null.case
index b5efac41ca..4c4eb45c20 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-null.js
+++ b/src/dstr-assignment/array-rest-nested-obj-null.case
@@ -2,18 +2,20 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an object literal and the iterable
     emits `null` as the only value, an array with a single `null` element
     should be used as the value of the nested DestructuringAssignment.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [null];
-var result, x, length;
-
-result = [...{ 0: x, length }] = value;
-
-assert.sameValue(result, value);
+//- setup
+var x, length;
+//- elems
+[...{ 0: x, length }]
+//- vals
+[null]
+//- body
 assert.sameValue(x, null);
 assert.sameValue(length, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-undefined-hole.js b/src/dstr-assignment/array-rest-nested-obj-undefined-hole.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-obj-undefined-hole.js
rename to src/dstr-assignment/array-rest-nested-obj-undefined-hole.case
index e01715a39e..54b078e8ca 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-undefined-hole.js
+++ b/src/dstr-assignment/array-rest-nested-obj-undefined-hole.case
@@ -2,18 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal and the iterable is
     an array with a "hole", an array with a single `undefined` element should
     be used as the value of the nested DestructuringAssignment.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [ , ];
-var result, x, length;
-
-result = [...{ 0: x, length }] = value;
-
-assert.sameValue(result, value);
+//- setup
+var x = null;
+var length;
+//- elems
+[...{ 0: x, length }]
+//- vals
+[ , ]
+//- body
 assert.sameValue(x, undefined);
 assert.sameValue(length, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-undefined-own.js b/src/dstr-assignment/array-rest-nested-obj-undefined-own.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-obj-undefined-own.js
rename to src/dstr-assignment/array-rest-nested-obj-undefined-own.case
index 70735f34ff..2a6aa15f00 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-undefined-own.js
+++ b/src/dstr-assignment/array-rest-nested-obj-undefined-own.case
@@ -2,18 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal and the iterable
     emits `undefined` as the only value, an array with a single `undefined`
     element should be used as the value of the nested DestructuringAssignment.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [undefined];
-var result, x, length;
-
-result = [...{ 0: x, length }] = value;
-
-assert.sameValue(result, value);
+//- setup
+var x = null;
+var length;
+//- elems
+[...{ 0: x, length }]
+//- vals
+[undefined]
+//- body
 assert.sameValue(x, undefined);
 assert.sameValue(length, 1);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-undefined.js b/src/dstr-assignment/array-rest-nested-obj-undefined.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-obj-undefined.js
rename to src/dstr-assignment/array-rest-nested-obj-undefined.case
index 53425d44f8..200ab543d6 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-undefined.js
+++ b/src/dstr-assignment/array-rest-nested-obj-undefined.case
@@ -2,18 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an obect literal and the iterable is
     emits no values, an empty array should be used as the value of the nested
     DestructuringAssignment.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [];
-var result, x, length;
-
-result = [...{ 0: x, length }] = value;
-
-assert.sameValue(result, value);
+//- setup
+var x = null;
+var length;
+//- elems
+[...{ 0: x, length }]
+//- vals
+[]
+//- body
 assert.sameValue(x, undefined);
 assert.sameValue(length, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-yield-expr.js b/src/dstr-assignment/array-rest-nested-obj-yield-expr.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-obj-yield-expr.js
rename to src/dstr-assignment/array-rest-nested-obj-yield-expr.case
index 0daf86e0c2..c867b58cc3 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-yield-expr.js
+++ b/src/dstr-assignment/array-rest-nested-obj-yield-expr.case
@@ -2,31 +2,34 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of a nested
     destructuring assignment and within a generator function body, it should
     behave as a YieldExpression.
+template: default
 es6id: 12.14.5.3
 features: [generators]
 ---*/
 
-var value = [{}];
-var assignmentResult, iterationResult, iter, x;
+//- setup
+var iterationResult, iter, x;
 
 iter = (function*() {
-  assignmentResult = [...{ x = yield }] = value;
+//- elems
+[...{ x = yield }]
+//- vals
+[{}]
+//- teardown
 }());
 
 iterationResult = iter.next();
 
-assert.sameValue(assignmentResult, undefined);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, false);
 assert.sameValue(x, undefined);
 
 iterationResult = iter.next(4);
 
-assert.sameValue(assignmentResult, value);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, true);
 assert.sameValue(x, 4);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-yield-ident-invalid.js b/src/dstr-assignment/array-rest-nested-obj-yield-ident-invalid.case
similarity index 85%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-obj-yield-ident-invalid.js
rename to src/dstr-assignment/array-rest-nested-obj-yield-ident-invalid.case
index ebb79b4314..9759c626ca 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-yield-ident-invalid.js
+++ b/src/dstr-assignment/array-rest-nested-obj-yield-ident-invalid.case
@@ -2,14 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of a nested
     destructuring assignment and outside of a generator function body, it
     should behave as an IdentifierExpression.
+template: syntax
 es6id: 12.14.5.3
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-var value = [{}];
-[...{ x = yield }] = value;
+//- elems
+[...{ x = yield }]
+//- vals
+[{}]
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-yield-ident-valid.js b/src/dstr-assignment/array-rest-nested-obj-yield-ident-valid.case
similarity index 74%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-obj-yield-ident-valid.js
rename to src/dstr-assignment/array-rest-nested-obj-yield-ident-valid.case
index b220b0dd54..2d67dd4514 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-obj-yield-ident-valid.js
+++ b/src/dstr-assignment/array-rest-nested-obj-yield-ident-valid.case
@@ -2,19 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of a nested
     destructuring assignment and outside of a generator function body, it
     should behave as an IdentifierExpression.
+template: default
 es6id: 12.14.5.3
 flags: [noStrict]
 ---*/
 
-var value = [{}];
+//- setup
 var yield = 2;
-var result, iterationResult, iter, x;
-
-result = [...{ x = yield }] = value;
-
-assert.sameValue(result, value);
+var x;
+//- elems
+[...{ x = yield }]
+//- vals
+[{}]
+//- body
 assert.sameValue(x, 2);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-nested-obj.js b/src/dstr-assignment/array-rest-nested-obj.case
similarity index 75%
rename from test/language/expressions/assignment/destructuring/array-rest-nested-obj.js
rename to src/dstr-assignment/array-rest-nested-obj.case
index f5812ba5f0..f3ac3e7ab9 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-nested-obj.js
+++ b/src/dstr-assignment/array-rest-nested-obj.case
@@ -2,17 +2,19 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an object literal, it should be
     parsed as a DestructuringAssignmentPattern and evaluated as a destructuring
     assignment.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [1, 2, 3];
-var result, x;
-
-result = [...{ 1: x }] = value;
-
-assert.sameValue(result, value);
+//- setup
+var x;
+//- elems
+[...{ 1: x }]
+//- vals
+[1, 2, 3]
+//- body
 assert.sameValue(x, 2);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-put-const.js b/src/dstr-assignment/array-rest-put-const.case
similarity index 75%
rename from test/language/expressions/assignment/destructuring/array-rest-put-const.js
rename to src/dstr-assignment/array-rest-put-const.case
index 96bf0d9e8a..67eb6eda54 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-put-const.js
+++ b/src/dstr-assignment/array-rest-put-const.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The assignment target should obey `const` semantics.
+template: error
 es6id: 12.14.5.3
 features: [const]
 ---*/
 
+//- setup
 const c = null;
-
-assert.throws(TypeError, function() {
-  [ ...c ] = [1];
-});
+//- error
+TypeError
+//- elems
+[ ...c ]
+//- vals
+[1]
diff --git a/test/language/expressions/assignment/destructuring/array-elem-put-let.js b/src/dstr-assignment/array-rest-put-let.case
similarity index 70%
rename from test/language/expressions/assignment/destructuring/array-elem-put-let.js
rename to src/dstr-assignment/array-rest-put-let.case
index 018d8b1a6e..9cc0cff482 100644
--- a/test/language/expressions/assignment/destructuring/array-elem-put-let.js
+++ b/src/dstr-assignment/array-rest-put-let.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The assignment target should obey `let` semantics.
+template: error
 es6id: 12.14.5.3
 features: [let]
 ---*/
 
-assert.throws(ReferenceError, function() {
-  'use strict';
-  [ x ] = [];
-  let x;
-});
+//- error
+ReferenceError
+//- elems
+[ ...x ]
+//- vals
+[]
+//- teardown
+let x;
diff --git a/test/language/expressions/assignment/destructuring/array-rest-put-prop-ref-no-get.js b/src/dstr-assignment/array-rest-put-prop-ref-no-get.case
similarity index 80%
rename from test/language/expressions/assignment/destructuring/array-rest-put-prop-ref-no-get.js
rename to src/dstr-assignment/array-rest-put-prop-ref-no-get.case
index d57bf425f3..1adb2c2e07 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-put-prop-ref-no-get.js
+++ b/src/dstr-assignment/array-rest-put-prop-ref-no-get.case
@@ -2,15 +2,16 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     If the DestructuringAssignmentTarget of an AssignmentElement is a
     PropertyReference, it should not be evaluated.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [23, 45, 99];
-var x, setValue, result;
-x = {
+//- setup
+var setValue;
+var x = {
   get y() {
     $ERROR('The property should not be accessed.');
   },
@@ -18,10 +19,11 @@ x = {
     setValue = val;
   }
 };
-
-result = [...x.y] = value;
-
-assert.sameValue(result, value);
+//- elems
+[...x.y]
+//- vals
+[23, 45, 99]
+//- body
 assert.sameValue(setValue.length, 3);
 assert.sameValue(setValue[0], 23);
 assert.sameValue(setValue[1], 45);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-put-prop-ref-user-err-iter-close-skip.js b/src/dstr-assignment/array-rest-put-prop-ref-user-err-iter-close-skip.case
similarity index 92%
rename from test/language/expressions/assignment/destructuring/array-rest-put-prop-ref-user-err-iter-close-skip.js
rename to src/dstr-assignment/array-rest-put-prop-ref-user-err-iter-close-skip.case
index 513f433032..b82be99fe1 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-put-prop-ref-user-err-iter-close-skip.js
+++ b/src/dstr-assignment/array-rest-put-prop-ref-user-err-iter-close-skip.case
@@ -1,7 +1,7 @@
 // Copyright (C) 2016 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
-description: >
+desc: >
     IteratorClose is not called when value assignment produces an abrupt
     completion.
 info: |
@@ -25,10 +25,12 @@ info: |
        ArrayLiteral, then
        a. Return PutValue(lref, A).
 features: [Symbol.iterator]
+template: error
 es6id: 12.14.5.2
 esid: sec-runtime-semantics-destructuringassignmentevaluation
 ---*/
 
+//- setup
 var nextCount = 0;
 var returnCount = 0;
 var iterable = {};
@@ -49,9 +51,12 @@ var obj = Object.defineProperty({}, 'poisoned', {
 iterable[Symbol.iterator] = function() {
   return iterator;
 };
-assert.throws(Test262Error, function() {
-  [...obj.poisoned] = iterable;
-});
-
+//- error
+Test262Error
+//- elems
+[...obj.poisoned]
+//- vals
+iterable
+//- teardown
 assert.sameValue(nextCount, 1);
 assert.sameValue(returnCount, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-put-prop-ref-user-err.js b/src/dstr-assignment/array-rest-put-prop-ref-user-err.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/array-rest-put-prop-ref-user-err.js
rename to src/dstr-assignment/array-rest-put-prop-ref-user-err.case
index 1b03ef780e..0f4cc41d6c 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-put-prop-ref-user-err.js
+++ b/src/dstr-assignment/array-rest-put-prop-ref-user-err.case
@@ -2,19 +2,22 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Any error raised as a result of setting the value should be forwarded to
     the runtime.
+template: error
 es6id: 12.14.5.3
 ---*/
 
-var value = [23];
+//- setup
 var x = {
   set y(val) {
     throw new Test262Error();
   }
 };
-
-assert.throws(Test262Error, function() {
-  [...x.y] = value;
-});
+//- error
+Test262Error
+//- elems
+[...x.y]
+//- vals
+[23]
diff --git a/test/language/expressions/assignment/destructuring/array-rest-put-prop-ref.js b/src/dstr-assignment/array-rest-put-prop-ref.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/array-rest-put-prop-ref.js
rename to src/dstr-assignment/array-rest-put-prop-ref.case
index bdc04a8200..fda1af6dc0 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-put-prop-ref.js
+++ b/src/dstr-assignment/array-rest-put-prop-ref.case
@@ -2,19 +2,20 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The DestructuringAssignmentTarget of an AssignmentElement may be a
     PropertyReference.
+template: default
 es6id: 12.14.5.3
 ---*/
 
-var value = [4, 3, 2];
+//- setup
 var x = {};
-var result;
-
-result = [...x.y] = value;
-
-assert.sameValue(result, value);
+//- elems
+[...x.y]
+//- vals
+[4, 3, 2]
+//- body
 assert.sameValue(x.y.length, 3);
 assert.sameValue(x.y[0], 4);
 assert.sameValue(x.y[1], 3);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-put-unresolvable-no-strict.js b/src/dstr-assignment/array-rest-put-unresolvable-no-strict.case
similarity index 81%
rename from test/language/expressions/assignment/destructuring/array-rest-put-unresolvable-no-strict.js
rename to src/dstr-assignment/array-rest-put-unresolvable-no-strict.case
index d904f55f2a..9c95a9b9d1 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-put-unresolvable-no-strict.js
+++ b/src/dstr-assignment/array-rest-put-unresolvable-no-strict.case
@@ -2,15 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Outside of strict mode, if the the assignment target is an unresolvable
     reference, a new `var` binding should be created in the environment record.
+template: default
 es6id: 12.14.5.3
 flags: [noStrict]
 ---*/
 
+//- setup
 {
-  [ ...unresolvable ] = [];
+//- elems
+[ ...unresolvable ]
+//- vals
+[]
+//- teardown
 }
 
 assert.sameValue(unresolvable.length, 0);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-put-unresolvable-strict.js b/src/dstr-assignment/array-rest-put-unresolvable-strict.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/array-rest-put-unresolvable-strict.js
rename to src/dstr-assignment/array-rest-put-unresolvable-strict.case
index 43bad4b253..52cc2305a4 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-put-unresolvable-strict.js
+++ b/src/dstr-assignment/array-rest-put-unresolvable-strict.case
@@ -2,13 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     In strict mode, if the the assignment target is an unresolvable reference,
     a ReferenceError should be thrown.
+template: error
 es6id: 12.14.5.3
 flags: [onlyStrict]
 ---*/
 
-assert.throws(ReferenceError, function() {
-  [ ...unresolvable ] = [];
-});
+//- error
+ReferenceError
+//- elems
+[ ...unresolvable ]
+//- vals
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-rest-yield-expr.js b/src/dstr-assignment/array-rest-yield-expr.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/array-rest-yield-expr.js
rename to src/dstr-assignment/array-rest-yield-expr.case
index e373478de8..533800254b 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-yield-expr.js
+++ b/src/dstr-assignment/array-rest-yield-expr.case
@@ -2,32 +2,35 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of
     an AssignmentRestElement and within the body of a generator function, it
     should behave as a YieldExpression.
+template: default
 es6id: 12.14.5
 features: [generators]
 ---*/
 
-var value = [33, 44, 55];
+//- setup
 var x = {};
-var assignmentResult, iterationResult, iter;
+var iterationResult, iter;
 
 iter = (function*() {
-  assignmentResult = [...x[yield]] = value;
+//- elems
+[...x[yield]]
+//- vals
+[33, 44, 55]
+//- teardown
 }());
 
 iterationResult = iter.next();
 
-assert.sameValue(assignmentResult, undefined);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, false);
 assert.sameValue(x.prop, undefined);
 
 iterationResult = iter.next('prop');
 
-assert.sameValue(assignmentResult, value);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, true);
 assert.sameValue(x.prop.length, 3);
diff --git a/test/language/expressions/assignment/destructuring/array-rest-yield-ident-invalid.js b/src/dstr-assignment/array-rest-yield-ident-invalid.case
similarity index 85%
rename from test/language/expressions/assignment/destructuring/array-rest-yield-ident-invalid.js
rename to src/dstr-assignment/array-rest-yield-ident-invalid.case
index 427fe68038..d635a7c5a6 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-yield-ident-invalid.js
+++ b/src/dstr-assignment/array-rest-yield-ident-invalid.case
@@ -2,14 +2,19 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of an
     AssignmentRestElement and outside of a generator function body, it should
     behave as an IdentifierReference.
+template: syntax
 es6id: 12.14.5
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
+//- setup
 var x = {};
-[...x[yield]] = [];
+//- elems
+[...x[yield]]
+//- vals
+[]
diff --git a/test/language/expressions/assignment/destructuring/array-rest-yield-ident-valid.js b/src/dstr-assignment/array-rest-yield-ident-valid.case
similarity index 82%
rename from test/language/expressions/assignment/destructuring/array-rest-yield-ident-valid.js
rename to src/dstr-assignment/array-rest-yield-ident-valid.case
index 4f56b9abe8..8168c4e81d 100644
--- a/test/language/expressions/assignment/destructuring/array-rest-yield-ident-valid.js
+++ b/src/dstr-assignment/array-rest-yield-ident-valid.case
@@ -2,22 +2,23 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of an
     AssignmentRestElement and outside of a generator function body, it should
     behave as an IdentifierReference.
+template: default
 es6id: 12.14.5
 flags: [noStrict]
 ---*/
 
-var value = [33, 44, 55];
+//- setup
 var yield = 'prop';
 var x = {};
-var result;
-
-result = [...x[yield]] = value;
-
-assert.sameValue(result, value);
+//- elems
+[...x[yield]]
+//- vals
+[33, 44, 55]
+//- body
 assert.sameValue(x.prop.length, 3);
 assert.sameValue(x.prop[0], 33);
 assert.sameValue(x.prop[1], 44);
diff --git a/src/dstr-assignment/default/assignment-expr.template b/src/dstr-assignment/default/assignment-expr.template
new file mode 100644
index 0000000000..17c6a03870
--- /dev/null
+++ b/src/dstr-assignment/default/assignment-expr.template
@@ -0,0 +1,27 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+path: language/expressions/assignment/dstr-
+name: >
+    AssignmentExpression
+esid: sec-variable-statement-runtime-semantics-evaluation
+es6id: 13.3.2.4
+features: [destructuring-binding]
+info: |
+    VariableDeclaration : BindingPattern Initializer
+
+    1. Let rhs be the result of evaluating Initializer.
+    2. Let rval be GetValue(rhs).
+    3. ReturnIfAbrupt(rval).
+    4. Return the result of performing BindingInitialization for
+       BindingPattern passing rval and undefined as arguments.
+---*/
+
+var result;
+var vals = /*{ vals }*/;
+
+result = /*{ elems }*/ = vals;
+
+/*{ body }*/
+
+assert.sameValue(result, vals);
diff --git a/src/dstr-assignment/default/for-of.template b/src/dstr-assignment/default/for-of.template
new file mode 100644
index 0000000000..36446c0af3
--- /dev/null
+++ b/src/dstr-assignment/default/for-of.template
@@ -0,0 +1,36 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+path: language/statements/for-of/dstr-
+name: >
+    For..of statement
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+es6id: 13.7.5.11
+features: [destructuring-binding]
+info: |
+  IterationStatement :
+    for ( LeftHandSideExpression of AssignmentExpression ) Statement
+
+  1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« »,
+     AssignmentExpression, iterate).
+  2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement,
+     keyResult, assignment, labelSet).
+
+  13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+  [...]
+  4. If destructuring is true and if lhsKind is assignment, then
+     a. Assert: lhs is a LeftHandSideExpression.
+     b. Let assignmentPattern be the parse of the source text corresponding to
+        lhs using AssignmentPattern as the goal symbol.
+  [...]
+---*/
+
+var counter = 0;
+
+for (/*{ elems }*/ of [/*{ vals }*/]) {
+  /*{ body }*/
+  counter += 1;
+}
+
+assert.sameValue(counter, 1);
diff --git a/src/dstr-assignment/error/assignment-expr.template b/src/dstr-assignment/error/assignment-expr.template
new file mode 100644
index 0000000000..4d9ece3757
--- /dev/null
+++ b/src/dstr-assignment/error/assignment-expr.template
@@ -0,0 +1,22 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+path: language/expressions/assignment/dstr-
+name: >
+    AssignmentExpression
+esid: sec-variable-statement-runtime-semantics-evaluation
+es6id: 13.3.2.4
+features: [destructuring-binding]
+info: |
+    VariableDeclaration : BindingPattern Initializer
+
+    1. Let rhs be the result of evaluating Initializer.
+    2. Let rval be GetValue(rhs).
+    3. ReturnIfAbrupt(rval).
+    4. Return the result of performing BindingInitialization for
+       BindingPattern passing rval and undefined as arguments.
+---*/
+
+assert.throws(/*{ error }*/, function() {
+  0, /*{ elems }*/ = /*{ vals }*/;
+});
diff --git a/src/dstr-assignment/error/for-of.template b/src/dstr-assignment/error/for-of.template
new file mode 100644
index 0000000000..8484d87135
--- /dev/null
+++ b/src/dstr-assignment/error/for-of.template
@@ -0,0 +1,38 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+path: language/statements/for-of/dstr-
+name: >
+    For..of statement
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+es6id: 13.7.5.11
+features: [destructuring-binding]
+info: |
+  IterationStatement :
+    for ( LeftHandSideExpression of AssignmentExpression ) Statement
+
+  1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« »,
+     AssignmentExpression, iterate).
+  2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement,
+     keyResult, assignment, labelSet).
+
+  13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+  [...]
+  4. If destructuring is true and if lhsKind is assignment, then
+     a. Assert: lhs is a LeftHandSideExpression.
+     b. Let assignmentPattern be the parse of the source text corresponding to
+        lhs using AssignmentPattern as the goal symbol.
+  [...]
+---*/
+
+var counter = 0;
+
+assert.throws(/*{ error }*/, function() {
+  for (/*{ elems }*/ of [/*{ vals }*/]) {
+    counter += 1;
+  }
+  counter += 1;
+});
+
+assert.sameValue(counter, 0);
diff --git a/src/dstr-assignment/obj-empty-bool.case b/src/dstr-assignment/obj-empty-bool.case
new file mode 100644
index 0000000000..5e10c238a9
--- /dev/null
+++ b/src/dstr-assignment/obj-empty-bool.case
@@ -0,0 +1,15 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  An ObjectAssignmentPattern without an AssignmentPropertyList requires an
+  object-coercible value (boolean value)
+template: default
+es6id: 12.14.5.2
+---*/
+
+//- elems
+{}
+//- vals
+false
diff --git a/src/dstr-assignment/obj-empty-null.case b/src/dstr-assignment/obj-empty-null.case
new file mode 100644
index 0000000000..0d0c6dd2e5
--- /dev/null
+++ b/src/dstr-assignment/obj-empty-null.case
@@ -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.
+
+/*---
+desc: >
+  An ObjectAssignmentPattern without an AssignmentPropertyList requires an
+  object-coercible value (null value)
+template: error
+es6id: 12.14.5.2
+---*/
+
+//- error
+TypeError
+//- elems
+{}
+//- vals
+null
diff --git a/src/dstr-assignment/obj-empty-num.case b/src/dstr-assignment/obj-empty-num.case
new file mode 100644
index 0000000000..582044a4a5
--- /dev/null
+++ b/src/dstr-assignment/obj-empty-num.case
@@ -0,0 +1,15 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  An ObjectAssignmentPattern without an AssignmentPropertyList requires an
+  object-coercible value (number value)
+template: default
+es6id: 12.14.5.2
+---*/
+
+//- elems
+{}
+//- vals
+0
diff --git a/src/dstr-assignment/obj-empty-obj.case b/src/dstr-assignment/obj-empty-obj.case
new file mode 100644
index 0000000000..f4fae61480
--- /dev/null
+++ b/src/dstr-assignment/obj-empty-obj.case
@@ -0,0 +1,15 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  An ObjectAssignmentPattern without an AssignmentPropertyList requires an
+  object-coercible value (object value)
+template: default
+es6id: 12.14.5.2
+---*/
+
+//- elems
+{}
+//- vals
+{}
diff --git a/src/dstr-assignment/obj-empty-string.case b/src/dstr-assignment/obj-empty-string.case
new file mode 100644
index 0000000000..97542fe7ee
--- /dev/null
+++ b/src/dstr-assignment/obj-empty-string.case
@@ -0,0 +1,15 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  An ObjectAssignmentPattern without an AssignmentPropertyList requires an
+  object-coercible value (string value)
+template: default
+es6id: 12.14.5.2
+---*/
+
+//- elems
+{}
+//- vals
+''
diff --git a/src/dstr-assignment/obj-empty-symbol.case b/src/dstr-assignment/obj-empty-symbol.case
new file mode 100644
index 0000000000..4297589407
--- /dev/null
+++ b/src/dstr-assignment/obj-empty-symbol.case
@@ -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.
+
+/*---
+desc: >
+  An ObjectAssignmentPattern without an AssignmentPropertyList requires an
+  object-coercible value (symbol value)
+template: default
+es6id: 12.14.5.2
+features: [Symbol]
+---*/
+
+//- setup
+var s = Symbol();
+//- elems
+{}
+//- vals
+s
diff --git a/src/dstr-assignment/obj-empty-undef.case b/src/dstr-assignment/obj-empty-undef.case
new file mode 100644
index 0000000000..7c35e66be7
--- /dev/null
+++ b/src/dstr-assignment/obj-empty-undef.case
@@ -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.
+
+/*---
+desc: >
+  An ObjectAssignmentPattern without an AssignmentPropertyList requires an
+  object-coercible value (undefined value)
+template: error
+es6id: 12.14.5.2
+---*/
+
+//- error
+TypeError
+//- elems
+{}
+//- vals
+undefined
diff --git a/src/dstr-assignment/obj-id-identifier-resolution-first.case b/src/dstr-assignment/obj-id-identifier-resolution-first.case
new file mode 100644
index 0000000000..c4398ae47c
--- /dev/null
+++ b/src/dstr-assignment/obj-id-identifier-resolution-first.case
@@ -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.
+/*---
+desc: >
+  Evaluation of DestructuringAssignmentTarget (first of many)
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x = null;
+var y;
+//- elems
+{ x, y }
+//- vals
+{ x: 3 }
+//- body
+assert.sameValue(x, 3);
diff --git a/src/dstr-assignment/obj-id-identifier-resolution-last.case b/src/dstr-assignment/obj-id-identifier-resolution-last.case
new file mode 100644
index 0000000000..0997e5411f
--- /dev/null
+++ b/src/dstr-assignment/obj-id-identifier-resolution-last.case
@@ -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.
+/*---
+desc: >
+  Evaluation of DestructuringAssignmentTarget (last of many)
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x = null;
+var w;
+//- elems
+{ w, x }
+//- vals
+{ x: 4 }
+//- body
+assert.sameValue(x, 4);
diff --git a/src/dstr-assignment/obj-id-identifier-resolution-lone.case b/src/dstr-assignment/obj-id-identifier-resolution-lone.case
new file mode 100644
index 0000000000..80e684f057
--- /dev/null
+++ b/src/dstr-assignment/obj-id-identifier-resolution-lone.case
@@ -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.
+/*---
+desc: >
+  Evaluation of DestructuringAssignmentTarget (lone identifier)
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x = null;
+//- elems
+{ x, }
+//- vals
+{ x: 2 }
+//- body
+assert.sameValue(x, 2);
diff --git a/src/dstr-assignment/obj-id-identifier-resolution-middle.case b/src/dstr-assignment/obj-id-identifier-resolution-middle.case
new file mode 100644
index 0000000000..8dece135d6
--- /dev/null
+++ b/src/dstr-assignment/obj-id-identifier-resolution-middle.case
@@ -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.
+/*---
+desc: >
+  Evaluation of DestructuringAssignmentTarget (within many)
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x = null;
+var w, y;
+//- elems
+{ w, x, y }
+//- vals
+{ x: 5 }
+//- body
+assert.sameValue(x, 5);
diff --git a/src/dstr-assignment/obj-id-identifier-resolution-trlng.case b/src/dstr-assignment/obj-id-identifier-resolution-trlng.case
new file mode 100644
index 0000000000..ed959bbd9c
--- /dev/null
+++ b/src/dstr-assignment/obj-id-identifier-resolution-trlng.case
@@ -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.
+/*---
+desc: >
+  Evaluation of DestructuringAssignmentTarget (lone identifier with trailing
+  comma)
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x = null;
+//- elems
+{ x }
+//- vals
+{ x: 1 }
+//- body
+assert.sameValue(x, 1);
diff --git a/test/language/expressions/assignment/destructuring/obj-id-identifier-yield-expr.js b/src/dstr-assignment/obj-id-identifier-yield-expr.case
similarity index 57%
rename from test/language/expressions/assignment/destructuring/obj-id-identifier-yield-expr.js
rename to src/dstr-assignment/obj-id-identifier-yield-expr.case
index 3ec7986c31..8dc18230f5 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-identifier-yield-expr.js
+++ b/src/dstr-assignment/obj-id-identifier-yield-expr.case
@@ -2,15 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
-    `yield` is not a valid IdentifierReference in an AssignmentProperty within
-    generator function bodies.
+desc: >
+  yield is not a valid IdentifierReference in an AssignmentProperty within
+  generator function bodies.
+template: syntax
 es6id: 12.14.5
 flags: [noStrict]
 features: [generators]
 negative: SyntaxError
 ---*/
 
+//- setup
 (function*() {
-  { yield } = {};
+//- elems
+{ yield }
+//- vals
+{}
+//- teardown
 });
diff --git a/test/language/expressions/assignment/destructuring/obj-id-identifier-yield-ident-invalid.js b/src/dstr-assignment/obj-id-identifier-yield-ident-invalid.case
similarity index 57%
rename from test/language/expressions/assignment/destructuring/obj-id-identifier-yield-ident-invalid.js
rename to src/dstr-assignment/obj-id-identifier-yield-ident-invalid.case
index c5846e5bb3..83c135da48 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-identifier-yield-ident-invalid.js
+++ b/src/dstr-assignment/obj-id-identifier-yield-ident-invalid.case
@@ -2,12 +2,16 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
-    `yield` is not a valid IdentifierReference in an AssignmentProperty within
-    strict mode code.
+desc: >
+  yield is not a valid IdentifierReference in an AssignmentProperty within
+  strict mode code.
+template: syntax
 es6id: 12.14.5
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-var { yield } = {};
+//- elems
+{ yield }
+//- vals
+{}
diff --git a/src/dstr-assignment/obj-id-identifier-yield-ident-valid.case b/src/dstr-assignment/obj-id-identifier-yield-ident-valid.case
new file mode 100644
index 0000000000..fb7ce1808c
--- /dev/null
+++ b/src/dstr-assignment/obj-id-identifier-yield-ident-valid.case
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  yield is a valid IdentifierReference in an AssignmentProperty outside of
+  strict mode and generator functions.
+template: default
+es6id: 12.14.5
+flags: [noStrict]
+---*/
+
+//- setup
+var yield;
+//- elems
+{ yield }
+//- vals
+{ yield: 3 }
+//- body
+assert.sameValue(yield, 3);
diff --git a/src/dstr-assignment/obj-id-init-assignment-missing.case b/src/dstr-assignment/obj-id-init-assignment-missing.case
new file mode 100644
index 0000000000..7ef57ff0f6
--- /dev/null
+++ b/src/dstr-assignment/obj-id-init-assignment-missing.case
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  If the Initializer is present and v is undefined, the Initializer should be
+  evaluated and the result assigned to the target reference (no corresponding
+  property defined).
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x;
+//- elems
+{ x = 1 }
+//- vals
+{}
+//- body
+assert.sameValue(x, 1);
diff --git a/src/dstr-assignment/obj-id-init-assignment-null.case b/src/dstr-assignment/obj-id-init-assignment-null.case
new file mode 100644
index 0000000000..698a2377fc
--- /dev/null
+++ b/src/dstr-assignment/obj-id-init-assignment-null.case
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  If the Initializer is present and v is undefined, the Initializer should be
+  evaluated and the result assigned to the target reference (null property
+  value defined).
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x;
+//- elems
+{ x = 1 }
+//- vals
+{ x: null }
+//- body
+assert.sameValue(x, null);
diff --git a/src/dstr-assignment/obj-id-init-assignment-truthy.case b/src/dstr-assignment/obj-id-init-assignment-truthy.case
new file mode 100644
index 0000000000..9ee34246c4
--- /dev/null
+++ b/src/dstr-assignment/obj-id-init-assignment-truthy.case
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  If the Initializer is present and v is undefined, the Initializer should be
+  evaluated and the result assigned to the target reference (truthy property
+  value defined).
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x;
+//- elems
+{ x = 1 }
+//- vals
+{ x: 2 }
+//- body
+assert.sameValue(x, 2);
diff --git a/src/dstr-assignment/obj-id-init-assignment-undef.case b/src/dstr-assignment/obj-id-init-assignment-undef.case
new file mode 100644
index 0000000000..beb088f126
--- /dev/null
+++ b/src/dstr-assignment/obj-id-init-assignment-undef.case
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  If the Initializer is present and v is undefined, the Initializer should be
+  evaluated and the result assigned to the target reference ("undefined"
+  property value defined).
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x;
+//- elems
+{ x = 1 }
+//- vals
+{ x: undefined }
+//- body
+assert.sameValue(x, 1);
diff --git a/src/dstr-assignment/obj-id-init-evaluation.case b/src/dstr-assignment/obj-id-init-evaluation.case
new file mode 100644
index 0000000000..c5892ff536
--- /dev/null
+++ b/src/dstr-assignment/obj-id-init-evaluation.case
@@ -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.
+
+/*---
+desc: >
+    The Initializer should only be evaluated if v is undefined.
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var flag1 = false;
+var flag2 = false;
+var x, y;
+//- elems
+{ x = flag1 = true, y = flag2 = true }
+//- vals
+{ y: 1 }
+//- body
+assert.sameValue(flag1, true);
+assert.sameValue(flag2, false);
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-fn-name-arrow.js b/src/dstr-assignment/obj-id-init-fn-name-arrow.case
similarity index 84%
rename from test/language/expressions/assignment/destructuring/obj-id-init-fn-name-arrow.js
rename to src/dstr-assignment/obj-id-init-fn-name-arrow.case
index 53075d76e6..ba923bacb7 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-init-fn-name-arrow.js
+++ b/src/dstr-assignment/obj-id-init-fn-name-arrow.case
@@ -2,7 +2,8 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: Assignment of function `name` attribute (ArrowFunction)
+desc: Assignment of function `name` attribute (ArrowFunction)
+template: default
 es6id: 12.14.5.2
 info: >
     AssignmentProperty : IdentifierReference Initializeropt
@@ -17,10 +18,13 @@ info: >
 includes: [propertyHelper.js]
 ---*/
 
+//- setup
 var arrow;
-
-({ arrow = () => {} } = {});
-
+//- elems
+{ arrow = () => {} }
+//- vals
+{}
+//- body
 assert.sameValue(arrow.name, 'arrow');
 verifyNotEnumerable(arrow, 'name');
 verifyNotWritable(arrow, 'name');
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-fn-name-class.js b/src/dstr-assignment/obj-id-init-fn-name-class.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/obj-id-init-fn-name-class.js
rename to src/dstr-assignment/obj-id-init-fn-name-class.case
index 3c20598cb5..69598a6754 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-init-fn-name-class.js
+++ b/src/dstr-assignment/obj-id-init-fn-name-class.case
@@ -2,7 +2,8 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: Assignment of function `name` attribute (ClassExpression)
+desc: Assignment of function `name` attribute (ClassExpression)
+template: default
 es6id: 12.14.5.2
 info: >
     AssignmentProperty : IdentifierReference Initializeropt
@@ -18,12 +19,14 @@ includes: [propertyHelper.js]
 features: [class]
 ---*/
 
+//- setup
 var xCls, cls;
-
-({ xCls = class x {} } = {});
-({ cls = class {} } = {});
-
-assert(xCls.name !== 'xCls');
+//- elems
+{ xCls = class x {}, cls = class {} }
+//- vals
+{}
+//- body
+assert.notSameValue(xCls.name, 'xCls');
 
 assert.sameValue(cls.name, 'cls');
 verifyNotEnumerable(cls, 'name');
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-fn-name-cover.js b/src/dstr-assignment/obj-id-init-fn-name-cover.case
similarity index 83%
rename from test/language/expressions/assignment/destructuring/obj-id-init-fn-name-cover.js
rename to src/dstr-assignment/obj-id-init-fn-name-cover.case
index c220f37408..b0d92b229f 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-init-fn-name-cover.js
+++ b/src/dstr-assignment/obj-id-init-fn-name-cover.case
@@ -2,8 +2,9 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Assignment of function `name` attribute (CoverParenthesizedExpression)
+template: default
 es6id: 12.14.5.2
 info: >
     AssignmentProperty : IdentifierReference Initializeropt
@@ -18,12 +19,14 @@ info: >
 includes: [propertyHelper.js]
 ---*/
 
+//- setup
 var xCover, cover;
-
-({ xCover = (0, function() {}) } = {});
-({ cover = (function() {}) } = {});
-
-assert(xCover.name !== 'xCover');
+//- elems
+{ xCover = (0, function() {}), cover = (function() {}) }
+//- vals
+{}
+//- body
+assert.notSameValue(xCover.name, 'xCover');
 
 assert.sameValue(cover.name, 'cover');
 verifyNotEnumerable(cover, 'name');
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-fn-name-fn.js b/src/dstr-assignment/obj-id-init-fn-name-fn.case
similarity index 78%
rename from test/language/expressions/assignment/destructuring/obj-id-init-fn-name-fn.js
rename to src/dstr-assignment/obj-id-init-fn-name-fn.case
index 269960e3bb..28729746ac 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-init-fn-name-fn.js
+++ b/src/dstr-assignment/obj-id-init-fn-name-fn.case
@@ -2,7 +2,8 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: Assignment of function `name` attribute (FunctionExpression)
+desc: Assignment of function `name` attribute (FunctionExpression)
+template: default
 es6id: 12.14.5.2
 info: >
     AssignmentProperty : IdentifierReference Initializeropt
@@ -17,12 +18,14 @@ info: >
 includes: [propertyHelper.js]
 ---*/
 
+//- setup
 var xFn, fn;
-
-({ xFn = function x() {} } = {});
-({ fn = function() {} } = {});
-
-assert(xFn.name !== 'xFn');
+//- elems
+{ xFn = function x() {}, fn = function() {} }
+//- vals
+{}
+//- body
+assert.notSameValue(xFn.name, 'xFn');
 
 assert.sameValue(fn.name, 'fn');
 verifyNotEnumerable(fn, 'name');
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-fn-name-gen.js b/src/dstr-assignment/obj-id-init-fn-name-gen.case
similarity index 78%
rename from test/language/expressions/assignment/destructuring/obj-id-init-fn-name-gen.js
rename to src/dstr-assignment/obj-id-init-fn-name-gen.case
index 9ae0f31a76..712672024b 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-init-fn-name-gen.js
+++ b/src/dstr-assignment/obj-id-init-fn-name-gen.case
@@ -2,7 +2,8 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: Assignment of function `name` attribute (GeneratorExpression)
+desc: Assignment of function `name` attribute (GeneratorExpression)
+template: default
 es6id: 12.14.5.2
 info: >
     AssignmentProperty : IdentifierReference Initializeropt
@@ -18,12 +19,14 @@ includes: [propertyHelper.js]
 features: [generators]
 ---*/
 
+//- setup
 var xGen, gen;
-
-({ xGen = function* x() {} } = {});
-({ gen = function*() {} } = {});
-
-assert(xGen.name !== 'xGen');
+//- elems
+{ xGen = function* x() {}, gen = function*() {} }
+//- vals
+{}
+//- body
+assert.notSameValue(xGen.name, 'xGen');
 
 assert.sameValue(gen.name, 'gen');
 verifyNotEnumerable(gen, 'name');
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-in.js b/src/dstr-assignment/obj-id-init-in.case
similarity index 68%
rename from test/language/expressions/assignment/destructuring/obj-id-init-in.js
rename to src/dstr-assignment/obj-id-init-in.case
index 5626c44b3a..fd5f36c78b 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-init-in.js
+++ b/src/dstr-assignment/obj-id-init-in.case
@@ -2,15 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The Initializer in an AssignmentProperty may be an `in` expression.
+template: default
 es6id: 12.14.5
 ---*/
 
-var value = {};
-var result, prop;
-
-result = { prop = 'x' in {} } = value;
-
-assert.sameValue(result, value);
+//- setup
+var prop;
+//- elems
+{ prop = 'x' in {} }
+//- vals
+{}
+//- body
 assert.sameValue(prop, false);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-let.js b/src/dstr-assignment/obj-id-init-let.case
similarity index 69%
rename from test/language/expressions/assignment/destructuring/obj-prop-elem-init-let.js
rename to src/dstr-assignment/obj-id-init-let.case
index 492454ba16..8581905f16 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-let.js
+++ b/src/dstr-assignment/obj-id-init-let.case
@@ -2,15 +2,20 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Value retrieval of Initializer obeys `let` semantics.
+template: error
 es6id: 12.14.5.4
 features: [let]
 ---*/
 
+//- setup
 var x;
-
-assert.throws(ReferenceError, function() {
-  ({ x: x = y } = {});
-  let y;
-});
+//- error
+ReferenceError
+//- elems
+{ x = y }
+//- vals
+{}
+//- teardown
+let y;
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-order.js b/src/dstr-assignment/obj-id-init-order.case
similarity index 71%
rename from test/language/expressions/assignment/destructuring/obj-id-init-order.js
rename to src/dstr-assignment/obj-id-init-order.case
index cdec7decf0..a65a566512 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-init-order.js
+++ b/src/dstr-assignment/obj-id-init-order.case
@@ -2,18 +2,20 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Initializer values should be assigned in left-to-right order.
+template: default
 es6id: 12.14.5.4
 ---*/
 
-var value = {};
+//- setup
 var x = 0;
-var a, b, result;
-
-result = { a = x += 1, b = x *= 2 } = value;
-
-assert.sameValue(result, value);
+var a, b;
+//- elems
+{ a = x += 1, b = x *= 2 }
+//- vals
+{}
+//- body
 assert.sameValue(a, 1);
 assert.sameValue(b, 2);
 assert.sameValue(x, 2);
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-simple-no-strict.js b/src/dstr-assignment/obj-id-init-simple-no-strict.case
similarity index 67%
rename from test/language/expressions/assignment/destructuring/obj-id-init-simple-no-strict.js
rename to src/dstr-assignment/obj-id-init-simple-no-strict.case
index 79b976fad4..b44e5bd094 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-init-simple-no-strict.js
+++ b/src/dstr-assignment/obj-id-init-simple-no-strict.case
@@ -2,17 +2,19 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Evaluation of DestructuringAssignmentTarget.
+template: default
 es6id: 12.14.5.4
 flags: [noStrict]
 ---*/
 
-var value = {};
-var eval, arguments, result;
-
-result = { eval = 3, arguments = 4 } = value;
-
-assert.sameValue(result, value);
+//- setup
+var eval, arguments;
+//- elems
+{ eval = 3, arguments = 4 }
+//- vals
+{}
+//- body
 assert.sameValue(eval, 3);
 assert.sameValue(arguments, 4);
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-simple-strict.js b/src/dstr-assignment/obj-id-init-simple-strict.case
similarity index 83%
rename from test/language/expressions/assignment/destructuring/obj-id-init-simple-strict.js
rename to src/dstr-assignment/obj-id-init-simple-strict.case
index da9c5f017e..b2faabe699 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-init-simple-strict.js
+++ b/src/dstr-assignment/obj-id-init-simple-strict.case
@@ -2,12 +2,16 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     It is a Syntax Error if IsValidSimpleAssignmentTarget of
     IdentifierReference is false.
+template: syntax
 es6id: 12.14.5.1
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-({ eval = 0 } = {});
+//- elems
+{ eval = 0 }
+//- vals
+{}
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-yield-expr.js b/src/dstr-assignment/obj-id-init-yield-expr.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/obj-id-init-yield-expr.js
rename to src/dstr-assignment/obj-id-init-yield-expr.case
index 2991a435e9..38e44e7e7f 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-init-yield-expr.js
+++ b/src/dstr-assignment/obj-id-init-yield-expr.case
@@ -2,19 +2,24 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of an
     AssignmentProperty and within a generator function body, it should behave
     as a YieldExpression.
+template: default
 es6id: 12.14.5
 features: [generators]
 ---*/
 
-var value = {};
-var assignmentResult, iterationResult, x, iter;
+//- setup
+var iterationResult, x, iter;
 
 iter = (function*() {
-  assignmentResult = { x = yield } = value;
+//- elems
+{ x = yield }
+//- vals
+{}
+//- teardown
 }());
 
 iterationResult = iter.next();
@@ -22,11 +27,9 @@ iterationResult = iter.next();
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, false);
 assert.sameValue(x, undefined);
-assert.sameValue(assignmentResult, undefined);
 
 iterationResult = iter.next(3);
 
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, true);
 assert.sameValue(x, 3);
-assert.sameValue(assignmentResult, value);
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-yield-ident-invalid.js b/src/dstr-assignment/obj-id-init-yield-ident-invalid.case
similarity index 86%
rename from test/language/expressions/assignment/destructuring/obj-id-init-yield-ident-invalid.js
rename to src/dstr-assignment/obj-id-init-yield-ident-invalid.case
index 3edd831389..3d8d12f933 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-init-yield-ident-invalid.js
+++ b/src/dstr-assignment/obj-id-init-yield-ident-invalid.case
@@ -2,14 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of an
     AssignmentProperty and outside of a generator function body, it should
     behave as an IdentifierReference.
+template: syntax
 es6id: 12.14.5
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-var x;
-0, { x = yield } = {};
+//- elems
+{ x = yield }
+//- vals
+{}
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-yield-ident-valid.js b/src/dstr-assignment/obj-id-init-yield-ident-valid.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/obj-id-init-yield-ident-valid.js
rename to src/dstr-assignment/obj-id-init-yield-ident-valid.case
index 4759be1e29..93c9bc6af8 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-init-yield-ident-valid.js
+++ b/src/dstr-assignment/obj-id-init-yield-ident-valid.case
@@ -2,19 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of an
     AssignmentProperty and outside of a generator function body, it should
     behave as an IdentifierReference.
+template: default
 es6id: 12.14.5
 flags: [noStrict]
 ---*/
 
-var value = {};
+//- setup
 var yield = 3;
-var result, x;
-
-result = { x = yield } = value;
-
-assert.sameValue(result, value);
+var x;
+//- elems
+{ x = yield }
+//- vals
+{}
+//- body
 assert.sameValue(x, 3);
diff --git a/test/language/expressions/assignment/destructuring/obj-id-put-const.js b/src/dstr-assignment/obj-id-put-const.case
similarity index 74%
rename from test/language/expressions/assignment/destructuring/obj-id-put-const.js
rename to src/dstr-assignment/obj-id-put-const.case
index 79c801d261..a6905afde8 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-put-const.js
+++ b/src/dstr-assignment/obj-id-put-const.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The assignment target should obey `const` semantics.
+template: error
 es6id: 12.14.5.4
 features: [const]
 ---*/
 
+//- setup
 const c = null;
-
-assert.throws(TypeError, function() {
-  ({ c } = { c: 1 });
-});
+//- error
+TypeError
+//- elems
+{ c }
+//- vals
+{ c: 1 }
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-put-let.js b/src/dstr-assignment/obj-id-put-let.case
similarity index 71%
rename from test/language/expressions/assignment/destructuring/obj-prop-put-let.js
rename to src/dstr-assignment/obj-id-put-let.case
index 98080dced9..751878afe6 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-put-let.js
+++ b/src/dstr-assignment/obj-id-put-let.case
@@ -2,13 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The assignment target should obey `let` semantics.
+template: error
 es6id: 12.14.5.4
 features: [let]
 ---*/
 
-assert.throws(ReferenceError, function() {
-  ({ a: x } = {});
-  let x;
-});
+//- error
+ReferenceError
+//- elems
+{ x }
+//- vals
+{}
+//- teardown
+let x;
diff --git a/test/language/expressions/assignment/destructuring/obj-id-put-unresolvable-no-strict.js b/src/dstr-assignment/obj-id-put-unresolvable-no-strict.case
similarity index 81%
rename from test/language/expressions/assignment/destructuring/obj-id-put-unresolvable-no-strict.js
rename to src/dstr-assignment/obj-id-put-unresolvable-no-strict.case
index e98a59f6f2..250d500a52 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-put-unresolvable-no-strict.js
+++ b/src/dstr-assignment/obj-id-put-unresolvable-no-strict.case
@@ -2,15 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Outside of strict mode, if the the assignment target is an unresolvable
     reference, a new `var` binding should be created in the environment record.
+template: default
 es6id: 12.14.5.4
 flags: [noStrict]
 ---*/
 
+//- setup
 {
-  ({ unresolvable } = {});
+//- elems
+{ unresolvable }
+//- vals
+{}
+//- teardown
 }
 
 assert.sameValue(unresolvable, undefined);
diff --git a/test/language/expressions/assignment/destructuring/obj-id-put-unresolvable-strict.js b/src/dstr-assignment/obj-id-put-unresolvable-strict.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/obj-id-put-unresolvable-strict.js
rename to src/dstr-assignment/obj-id-put-unresolvable-strict.case
index d205e5f035..6dd866725c 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-put-unresolvable-strict.js
+++ b/src/dstr-assignment/obj-id-put-unresolvable-strict.case
@@ -2,13 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     In strict mode, if the the assignment target is an unresolvable reference,
     a ReferenceError should be thrown.
+template: error
 es6id: 12.14.5.4
 flags: [onlyStrict]
 ---*/
 
-assert.throws(ReferenceError, function() {
-  ({ unresolvable } = {});
-});
+//- error
+ReferenceError
+//- elems
+{ unresolvable }
+//- vals
+{}
diff --git a/test/language/expressions/assignment/destructuring/obj-id-simple-no-strict.js b/src/dstr-assignment/obj-id-simple-no-strict.case
similarity index 65%
rename from test/language/expressions/assignment/destructuring/obj-id-simple-no-strict.js
rename to src/dstr-assignment/obj-id-simple-no-strict.case
index f2e924ab47..a191f22533 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-simple-no-strict.js
+++ b/src/dstr-assignment/obj-id-simple-no-strict.case
@@ -2,17 +2,19 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Evaluation of DestructuringAssignmentTarget.
+template: default
 es6id: 12.14.5.4
 flags: [noStrict]
 ---*/
 
-var value = { eval: 1, arguments: 2 };
-var eval, arguments, result;
-
-result = { eval, arguments } = value;
-
-assert.sameValue(result, value);
+//- setup
+var eval, arguments;
+//- elems
+{ eval, arguments }
+//- vals
+{ eval: 1, arguments: 2 }
+//- teardown
 assert.sameValue(eval, 1);
 assert.sameValue(arguments, 2);
diff --git a/test/language/expressions/assignment/destructuring/obj-id-simple-strict.js b/src/dstr-assignment/obj-id-simple-strict.case
similarity index 84%
rename from test/language/expressions/assignment/destructuring/obj-id-simple-strict.js
rename to src/dstr-assignment/obj-id-simple-strict.case
index af7d5a1eeb..19e92bb621 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-simple-strict.js
+++ b/src/dstr-assignment/obj-id-simple-strict.case
@@ -2,12 +2,16 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     It is a Syntax Error if IsValidSimpleAssignmentTarget of
     IdentifierReference is false.
+template: syntax
 es6id: 12.14.5.1
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-({ eval } = {});
+//- elems
+{ eval }
+//- vals
+{}
diff --git a/src/dstr-assignment/obj-prop-elem-init-assignment-missing.case b/src/dstr-assignment/obj-prop-elem-init-assignment-missing.case
new file mode 100644
index 0000000000..36b99b38d9
--- /dev/null
+++ b/src/dstr-assignment/obj-prop-elem-init-assignment-missing.case
@@ -0,0 +1,20 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  If the Initializer is present and v is undefined, the Initializer should be
+  evaluated and the result assigned to the target reference (non-existent
+  property)
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x;
+//- elems
+{ y: x = 1 }
+//- vals
+{}
+//- body
+assert.sameValue(x, 1);
diff --git a/src/dstr-assignment/obj-prop-elem-init-assignment-null.case b/src/dstr-assignment/obj-prop-elem-init-assignment-null.case
new file mode 100644
index 0000000000..aac88b6d00
--- /dev/null
+++ b/src/dstr-assignment/obj-prop-elem-init-assignment-null.case
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  If the Initializer is present and v is not undefined, the Initializer should
+  be evaluated and the result assigned to the target reference (null value)
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x;
+//- elems
+{ y: x = 1 }
+//- vals
+{ y: null }
+//- body
+assert.sameValue(x, null);
diff --git a/src/dstr-assignment/obj-prop-elem-init-assignment-truthy.case b/src/dstr-assignment/obj-prop-elem-init-assignment-truthy.case
new file mode 100644
index 0000000000..668c0a0b6f
--- /dev/null
+++ b/src/dstr-assignment/obj-prop-elem-init-assignment-truthy.case
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  If the Initializer is present and v is not undefined, the Initializer should
+  be evaluated and the result assigned to the target reference (truthy value)
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x;
+//- elems
+{ y: x = 1 }
+//- vals
+{ y: 2 }
+//- body
+assert.sameValue(x, 2);
diff --git a/src/dstr-assignment/obj-prop-elem-init-assignment-undef.case b/src/dstr-assignment/obj-prop-elem-init-assignment-undef.case
new file mode 100644
index 0000000000..abf1f527bc
--- /dev/null
+++ b/src/dstr-assignment/obj-prop-elem-init-assignment-undef.case
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  If the Initializer is present and v is undefined, the Initializer should be
+  evaluated and the result assigned to the target reference (undefined value)
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x;
+//- elems
+{ y: x = 1 }
+//- vals
+{ y: undefined }
+//- body
+assert.sameValue(x, 1);
diff --git a/src/dstr-assignment/obj-prop-elem-init-evaluation.case b/src/dstr-assignment/obj-prop-elem-init-evaluation.case
new file mode 100644
index 0000000000..47430121d2
--- /dev/null
+++ b/src/dstr-assignment/obj-prop-elem-init-evaluation.case
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+    The Initializer should only be evaluated if v is undefined.
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var flag1 = false;
+var flag2 = false;
+var x, y;
+//- elems
+{ x: x = flag1 = true, y: y = flag2 = true }
+//- vals
+{ y: 1 }
+//- body
+assert.sameValue(x, true, 'value of `x`');
+assert.sameValue(flag1, true, 'value of `flag1`');
+assert.sameValue(y, 1, 'value of `y`');
+assert.sameValue(flag2, false, 'value of `flag2`');
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-arrow.js b/src/dstr-assignment/obj-prop-elem-init-fn-name-arrow.case
similarity index 85%
rename from test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-arrow.js
rename to src/dstr-assignment/obj-prop-elem-init-fn-name-arrow.case
index a089de2b73..3cfff7b2a5 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-arrow.js
+++ b/src/dstr-assignment/obj-prop-elem-init-fn-name-arrow.case
@@ -2,7 +2,8 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: Assignment of function `name` attribute (ArrowFunction)
+desc: Assignment of function `name` attribute (ArrowFunction)
+template: default
 es6id: 12.14.5.4
 info: >
     AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt
@@ -18,10 +19,13 @@ info: >
 includes: [propertyHelper.js]
 ---*/
 
+//- setup
 var arrow;
-
-({ x: arrow = () => {} } = {});
-
+//- elems
+{ x: arrow = () => {} }
+//- vals
+{}
+//- body
 assert.sameValue(arrow.name, 'arrow');
 verifyNotEnumerable(arrow, 'name');
 verifyNotWritable(arrow, 'name');
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-class.js b/src/dstr-assignment/obj-prop-elem-init-fn-name-class.case
similarity index 80%
rename from test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-class.js
rename to src/dstr-assignment/obj-prop-elem-init-fn-name-class.case
index 43b0ddafb7..5652358615 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-class.js
+++ b/src/dstr-assignment/obj-prop-elem-init-fn-name-class.case
@@ -2,7 +2,8 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: Assignment of function `name` attribute (ClassExpression)
+desc: Assignment of function `name` attribute (ClassExpression)
+template: default
 es6id: 12.14.5.4
 info: >
     AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt
@@ -19,12 +20,14 @@ includes: [propertyHelper.js]
 features: [class]
 ---*/
 
+//- setup
 var xCls, cls;
-
-({ x: xCls = class x {} } = {});
-({ x: cls = class {} } = {});
-
-assert(xCls.name !== 'xCls');
+//- elems
+{ x: xCls = class x {}, x: cls = class {} }
+//- vals
+{}
+//- body
+assert.notSameValue(xCls.name, 'xCls');
 
 assert.sameValue(cls.name, 'cls');
 verifyNotEnumerable(cls, 'name');
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-cover.js b/src/dstr-assignment/obj-prop-elem-init-fn-name-cover.case
similarity index 84%
rename from test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-cover.js
rename to src/dstr-assignment/obj-prop-elem-init-fn-name-cover.case
index 5e4f473426..6e6afc4898 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-cover.js
+++ b/src/dstr-assignment/obj-prop-elem-init-fn-name-cover.case
@@ -2,8 +2,9 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Assignment of function `name` attribute (CoverParenthesizedExpression)
+template: default
 es6id: 12.14.5.4
 info: >
     AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt
@@ -19,12 +20,14 @@ info: >
 includes: [propertyHelper.js]
 ---*/
 
+//- setup
 var xCover, cover;
-
-({ x: xCover = (0, function() {}) } = {});
-({ x: cover = (function() {}) } = {});
-
-assert(xCover.name !== 'xCover');
+//- elems
+{ x: xCover = (0, function() {}), x: cover = (function() {}) }
+//- vals
+{}
+//- body
+assert.notSameValue(xCover.name, 'xCover');
 
 assert.sameValue(cover.name, 'cover');
 verifyNotEnumerable(cover, 'name');
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-fn.js b/src/dstr-assignment/obj-prop-elem-init-fn-name-fn.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-fn.js
rename to src/dstr-assignment/obj-prop-elem-init-fn-name-fn.case
index 79111de8ca..7a2290ac60 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-fn.js
+++ b/src/dstr-assignment/obj-prop-elem-init-fn-name-fn.case
@@ -2,7 +2,8 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: Assignment of function `name` attribute (FunctionExpression)
+desc: Assignment of function `name` attribute (FunctionExpression)
+template: default
 es6id: 12.14.5.4
 info: >
     AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt
@@ -18,12 +19,14 @@ info: >
 includes: [propertyHelper.js]
 ---*/
 
+//- setup
 var xFn, fn;
-
-({ x: xFn = function x() {} } = {});
-({ x: fn = function() {} } = {});
-
-assert(xFn.name !== 'xFn');
+//- elems
+{ x: xFn = function x() {}, x: fn = function() {} }
+//- vals
+{}
+//- body
+assert.notSameValue(xFn.name, 'xFn');
 
 assert.sameValue(fn.name, 'fn');
 verifyNotEnumerable(fn, 'name');
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-gen.js b/src/dstr-assignment/obj-prop-elem-init-fn-name-gen.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-gen.js
rename to src/dstr-assignment/obj-prop-elem-init-fn-name-gen.case
index c65a81683c..292e8c615d 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-gen.js
+++ b/src/dstr-assignment/obj-prop-elem-init-fn-name-gen.case
@@ -2,7 +2,8 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: Assignment of function `name` attribute (GeneratorExpression)
+desc: Assignment of function `name` attribute (GeneratorExpression)
+template: default
 es6id: 12.14.5.4
 info: >
     AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt
@@ -19,12 +20,14 @@ includes: [propertyHelper.js]
 features: [generators]
 ---*/
 
+//- setup
 var xGen, gen;
-
-({ x: xGen = function* x() {} } = {});
-({ x: gen = function*() {} } = {});
-
-assert(xGen.name !== 'xGen');
+//- elems
+{ x: xGen = function* x() {}, x: gen = function*() {} }
+//- vals
+{}
+//- body
+assert.notSameValue(xGen.name, 'xGen');
 
 assert.sameValue(gen.name, 'gen');
 verifyNotEnumerable(gen, 'name');
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-in.js b/src/dstr-assignment/obj-prop-elem-init-in.case
similarity index 68%
rename from test/language/expressions/assignment/destructuring/obj-prop-elem-init-in.js
rename to src/dstr-assignment/obj-prop-elem-init-in.case
index c8d724717d..c55ce6a828 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-in.js
+++ b/src/dstr-assignment/obj-prop-elem-init-in.case
@@ -2,15 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The Initializer in an AssignmentElement may be an `in` expression.
+template: default
 es6id: 12.14.5
 ---*/
 
-var value = {};
-var result, prop;
-
-result = { x: prop = 'x' in {} } = value;
-
-assert.sameValue(result, value);
+//- setup
+var prop;
+//- elems
+{ x: prop = 'x' in {} }
+//- vals
+{}
+//- body
 assert.sameValue(prop, false);
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-let.js b/src/dstr-assignment/obj-prop-elem-init-let.case
similarity index 68%
rename from test/language/expressions/assignment/destructuring/obj-id-init-let.js
rename to src/dstr-assignment/obj-prop-elem-init-let.case
index 0cae52ea93..75186a9f5f 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-init-let.js
+++ b/src/dstr-assignment/obj-prop-elem-init-let.case
@@ -2,15 +2,20 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Value retrieval of Initializer obeys `let` semantics.
+template: error
 es6id: 12.14.5.4
 features: [let]
 ---*/
 
+//- setup
 var x;
-
-assert.throws(ReferenceError, function() {
-  ({ x = y } = {});
-  let y;
-});
+//- error
+ReferenceError
+//- elems
+{ x: x = y }
+//- vals
+{}
+//- teardown
+let y;
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-yield-expr.js b/src/dstr-assignment/obj-prop-elem-init-yield-expr.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/obj-prop-elem-init-yield-expr.js
rename to src/dstr-assignment/obj-prop-elem-init-yield-expr.case
index df69c2a2ad..9295443bcb 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-yield-expr.js
+++ b/src/dstr-assignment/obj-prop-elem-init-yield-expr.case
@@ -2,31 +2,33 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of an AssignmentElement
     and within a generator function body, it should behave as a
     YieldExpression.
+template: default
 es6id: 12.14.5.4
 features: [generators]
 ---*/
 
-var value = {};
-var assignmentResult, iterationResult, iter, x;
-
+//- setup
+var iterationResult, iter, x;
 iter = (function*() {
-  assignmentResult = { x: x = yield } = value;
+//- elems
+{ x: x = yield }
+//- vals
+{}
+//- teardown
 }());
 
 iterationResult = iter.next();
 
-assert.sameValue(assignmentResult, undefined);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, false);
 assert.sameValue(x, undefined);
 
 iterationResult = iter.next(86);
 
-assert.sameValue(assignmentResult, value);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, true);
 assert.sameValue(x, 86);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-yield-ident-invalid.js b/src/dstr-assignment/obj-prop-elem-init-yield-ident-invalid.case
similarity index 85%
rename from test/language/expressions/assignment/destructuring/obj-prop-elem-init-yield-ident-invalid.js
rename to src/dstr-assignment/obj-prop-elem-init-yield-ident-invalid.case
index 51f730df26..9c127af0ee 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-yield-ident-invalid.js
+++ b/src/dstr-assignment/obj-prop-elem-init-yield-ident-invalid.case
@@ -2,14 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of an AssignmentElement
     and outside of a generator function body, it should behave as an
     IdentifierReference.
+template: syntax
 es6id: 12.14.5.4
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-var x;
-0, { x: x = yield } = {};
+//- elems
+{ x: x = yield }
+//- vals
+{}
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-yield-ident-valid.js b/src/dstr-assignment/obj-prop-elem-init-yield-ident-valid.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/obj-prop-elem-init-yield-ident-valid.js
rename to src/dstr-assignment/obj-prop-elem-init-yield-ident-valid.case
index a197faea09..6ebaf3718f 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-yield-ident-valid.js
+++ b/src/dstr-assignment/obj-prop-elem-init-yield-ident-valid.case
@@ -2,19 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of an AssignmentElement
     and outside of a generator function body, it should behave as an
     IdentifierReference.
+template: default
 es6id: 12.14.5.4
 flags: [noStrict]
 ---*/
 
-var value = {};
+//- setup
 var yield = 4;
 var x;
-
-assignmentResult = { x: x = yield } = value;
-
-assert.sameValue(assignmentResult, value);
+//- elems
+{ x: x = yield }
+//- vals
+{}
+//- body
 assert.sameValue(x, 4);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-target-yield-expr.js b/src/dstr-assignment/obj-prop-elem-target-yield-expr.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/obj-prop-elem-target-yield-expr.js
rename to src/dstr-assignment/obj-prop-elem-target-yield-expr.case
index 644634311c..2cc4cc9e33 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-target-yield-expr.js
+++ b/src/dstr-assignment/obj-prop-elem-target-yield-expr.case
@@ -2,32 +2,35 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of an
     AssignmentElement and within a generator function body, it should behave as
     a YieldExpression.
+template: default
 es6id: 12.14.5.4
 features: [generators]
 ---*/
 
-var value = { x: 23 };
+//- setup
 var x = {};
-var assignmentResult, iterationResult, iter;
+var iterationResult, iter;
 
 iter = (function*() {
-  assignmentResult = { x: x[yield] } = value;
+//- elems
+{ x: x[yield] }
+//- vals
+{ x: 23 }
+//- teardown
 }());
 
 iterationResult = iter.next();
 
-assert.sameValue(assignmentResult, undefined);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, false);
 assert.sameValue(x.prop, undefined);
 
 iterationResult = iter.next('prop');
 
-assert.sameValue(assignmentResult, value);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, true);
 assert.sameValue(x.prop, 23);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-target-yield-ident-invalid.js b/src/dstr-assignment/obj-prop-elem-target-yield-ident-invalid.case
similarity index 86%
rename from test/language/expressions/assignment/destructuring/obj-prop-elem-target-yield-ident-invalid.js
rename to src/dstr-assignment/obj-prop-elem-target-yield-ident-invalid.case
index c48c1289a7..75503db0e8 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-target-yield-ident-invalid.js
+++ b/src/dstr-assignment/obj-prop-elem-target-yield-ident-invalid.case
@@ -2,14 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of an
     AssignmentElement and outside of a generator function body, it should
     behave as an IdentifierReference.
+template: syntax
 es6id: 12.14.5.4
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-var x = {};
-0, { x: x[yield] } = {};
+//- elems
+{ x: x[yield] }
+//- vals
+{}
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-target-yield-ident-valid.js b/src/dstr-assignment/obj-prop-elem-target-yield-ident-valid.case
similarity index 78%
rename from test/language/expressions/assignment/destructuring/obj-prop-elem-target-yield-ident-valid.js
rename to src/dstr-assignment/obj-prop-elem-target-yield-ident-valid.case
index fe0d3aeb6f..597769a9f4 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-target-yield-ident-valid.js
+++ b/src/dstr-assignment/obj-prop-elem-target-yield-ident-valid.case
@@ -2,20 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the DestructuringAssignmentTarget of an
     AssignmentElement and outside of a generator function body, it should
     behave as an IdentifierReference.
+template: default
 es6id: 12.14.5.4
 flags: [noStrict]
 ---*/
 
-var value = { x: 23 };
+//- setup
 var yield = 'prop';
 var x = {};
-var result;
-
-result = { x: x[yield] } = value;
-
-assert.sameValue(result, value);
+//- elems
+{ x: x[yield] }
+//- vals
+{ x: 23 }
+//- body
 assert.sameValue(x.prop, 23);
diff --git a/src/dstr-assignment/obj-prop-identifier-resolution-first.case b/src/dstr-assignment/obj-prop-identifier-resolution-first.case
new file mode 100644
index 0000000000..267b49e16b
--- /dev/null
+++ b/src/dstr-assignment/obj-prop-identifier-resolution-first.case
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  Evaluation of DestructuringAssignmentTarget (first of many).
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x = null;
+var y;
+//- elems
+{ a: x, y }
+//- vals
+{ a: 3 }
+//- body
+assert.sameValue(x, 3);
diff --git a/src/dstr-assignment/obj-prop-identifier-resolution-last.case b/src/dstr-assignment/obj-prop-identifier-resolution-last.case
new file mode 100644
index 0000000000..4209cdfbd3
--- /dev/null
+++ b/src/dstr-assignment/obj-prop-identifier-resolution-last.case
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  Evaluation of DestructuringAssignmentTarget (last of many).
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x = null;
+var w;
+//- elems
+{ w, a: x }
+//- vals
+{ a: 4 }
+//- body
+assert.sameValue(x, 4);
diff --git a/src/dstr-assignment/obj-prop-identifier-resolution-lone.case b/src/dstr-assignment/obj-prop-identifier-resolution-lone.case
new file mode 100644
index 0000000000..ba2142a3d7
--- /dev/null
+++ b/src/dstr-assignment/obj-prop-identifier-resolution-lone.case
@@ -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.
+
+/*---
+desc: >
+  Evaluation of DestructuringAssignmentTarget (lone element).
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x = null;
+//- elems
+{ a: x }
+//- vals
+{ a: 1 }
+//- body
+assert.sameValue(x, 1);
diff --git a/src/dstr-assignment/obj-prop-identifier-resolution-middle.case b/src/dstr-assignment/obj-prop-identifier-resolution-middle.case
new file mode 100644
index 0000000000..651969b1b7
--- /dev/null
+++ b/src/dstr-assignment/obj-prop-identifier-resolution-middle.case
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  Evaluation of DestructuringAssignmentTarget (within many).
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x = null;
+var w, y;
+//- elems
+{ w, a: x, y }
+//- vals
+{ a: 5 }
+//- body
+assert.sameValue(x, 5);
diff --git a/src/dstr-assignment/obj-prop-identifier-resolution-trlng.case b/src/dstr-assignment/obj-prop-identifier-resolution-trlng.case
new file mode 100644
index 0000000000..6cf90f42ba
--- /dev/null
+++ b/src/dstr-assignment/obj-prop-identifier-resolution-trlng.case
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+desc: >
+  Evaluation of DestructuringAssignmentTarget (lone element with trailing
+  comma).
+template: default
+es6id: 12.14.5.4
+---*/
+
+//- setup
+var x = null;
+//- elems
+{ a: x, }
+//- vals
+{ a: 2 }
+//- body
+assert.sameValue(x, 2);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-name-evaluation-error.js b/src/dstr-assignment/obj-prop-name-evaluation-error.case
similarity index 75%
rename from test/language/expressions/assignment/destructuring/obj-prop-name-evaluation-error.js
rename to src/dstr-assignment/obj-prop-name-evaluation-error.case
index 854c6b9c59..16861461ba 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-name-evaluation-error.js
+++ b/src/dstr-assignment/obj-prop-name-evaluation-error.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Any error raised as a result of evaluating PropertyName should be forwarded
     to the runtime.
+template: error
 es6id: 12.14.5.2
 ---*/
 
+//- setup
 var a, x;
-
-assert.throws(TypeError, function() {
-  ({ [a.b]: x } = {});
-});
+//- error
+TypeError
+//- elems
+{ [a.b]: x }
+//- vals
+{}
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-name-evaluation.js b/src/dstr-assignment/obj-prop-name-evaluation.case
similarity index 69%
rename from test/language/expressions/assignment/destructuring/obj-prop-name-evaluation.js
rename to src/dstr-assignment/obj-prop-name-evaluation.case
index 52d4b6ef69..2316d6d09c 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-name-evaluation.js
+++ b/src/dstr-assignment/obj-prop-name-evaluation.case
@@ -2,17 +2,19 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     PropertyName of an AssignmentProperty may be a ComputedPropertyName.
+template: default
 es6id: 12.14.5.2
 ---*/
 
-var value = { x: 1, xy: 23, y: 2 };
-var result, x, y, xy;
-
-result = { ['x' + 'y']: x } = value;
-
-assert.sameValue(result, value);
+//- setup
+var x, y, xy;
+//- elems
+{ ['x' + 'y']: x }
+//- vals
+{ x: 1, xy: 23, y: 2 }
+//- body
 assert.sameValue(x, 23);
 assert.sameValue(y, undefined);
 assert.sameValue(xy, undefined);
diff --git a/src/dstr-assignment/obj-prop-nested-array-invalid.case b/src/dstr-assignment/obj-prop-nested-array-invalid.case
new file mode 100644
index 0000000000..b4321822d3
--- /dev/null
+++ b/src/dstr-assignment/obj-prop-nested-array-invalid.case
@@ -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.
+
+/*---
+desc: >
+    It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral
+    or an ArrayLiteral and if the lexical token sequence matched by
+    LeftHandSideExpression cannot be parsed with no tokens left over using
+    AssignmentPattern as the goal symbol.
+template: syntax
+es6id: 12.14.5.1
+negative: SyntaxError
+---*/
+
+//- elems
+{ x: [(x, y)] }
+//- vals
+{ x: [] }
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-array-null.js b/src/dstr-assignment/obj-prop-nested-array-null.case
similarity index 75%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-array-null.js
rename to src/dstr-assignment/obj-prop-nested-array-null.case
index 7a40d1fb78..e893e8aa05 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-array-null.js
+++ b/src/dstr-assignment/obj-prop-nested-array-null.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal and the value is
     `null`, a TypeError should be thrown.
+template: error
 es6id: 12.14.5.4
 ---*/
 
+//- setup
 var x;
-
-assert.throws(TypeError, function() {
-  ({ x: [ x ] } = { x: null });
-});
+//- error
+TypeError
+//- elems
+{ x: [ x ] }
+//- vals
+{ x: null }
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-array-undefined-own.js b/src/dstr-assignment/obj-prop-nested-array-undefined-own.case
similarity index 74%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-array-undefined-own.js
rename to src/dstr-assignment/obj-prop-nested-array-undefined-own.case
index e1f0dd63c7..415c4d9997 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-array-undefined-own.js
+++ b/src/dstr-assignment/obj-prop-nested-array-undefined-own.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal and the value is
     `undefined`, a TypeError should be thrown.
+template: error
 es6id: 12.14.5.4
 ---*/
 
+//- setup
 var x;
-
-assert.throws(TypeError, function() {
-  ({ x: [ x ] } = { x: undefined });
-});
+//- error
+TypeError
+//- elems
+{ x: [ x ] }
+//- vals
+{ x: undefined }
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-array-undefined.js b/src/dstr-assignment/obj-prop-nested-array-undefined.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-array-undefined.js
rename to src/dstr-assignment/obj-prop-nested-array-undefined.case
index 95554b9165..1e4230ae53 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-array-undefined.js
+++ b/src/dstr-assignment/obj-prop-nested-array-undefined.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal and the value is not
     defined, a TypeError should be thrown.
+template: error
 es6id: 12.14.5.4
 ---*/
 
+//- setup
 var x;
-
-assert.throws(TypeError, function() {
-  ({ x: [ x ] } = {});
-});
+//- error
+TypeError
+//- elems
+{ x: [ x ] }
+//- vals
+{}
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-array-yield-expr.js b/src/dstr-assignment/obj-prop-nested-array-yield-expr.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-array-yield-expr.js
rename to src/dstr-assignment/obj-prop-nested-array-yield-expr.case
index 4e1e142e23..fba8a40ada 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-array-yield-expr.js
+++ b/src/dstr-assignment/obj-prop-nested-array-yield-expr.case
@@ -2,31 +2,34 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of a nested
     destructuring assignment and within a generator function body, it should
     behave as a YieldExpression.
+template: default
 es6id: 12.14.5.4
 features: [generators]
 ---*/
 
-var value = { x: [] };
-var assignmentResult, iterationResult, iter, x;
+//- setup
+var iterationResult, iter, x;
 
 iter = (function*() {
-  assignmentResult = { x: [x = yield] } = value;
+//- elems
+{ x: [x = yield] }
+//- vals
+{ x: [] }
+//- teardown
 }());
 
 iterationResult = iter.next();
 
-assert.sameValue(assignmentResult = undefined);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, false);
 assert.sameValue(x, undefined);
 
 iterationResult = iter.next(24601);
 
-assert.sameValue(assignmentResult, value);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, true);
 assert.sameValue(x, 24601);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-array-yield-ident-invalid.js b/src/dstr-assignment/obj-prop-nested-array-yield-ident-invalid.case
similarity index 84%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-array-yield-ident-invalid.js
rename to src/dstr-assignment/obj-prop-nested-array-yield-ident-invalid.case
index 29a8e9c6c4..addafc3b40 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-array-yield-ident-invalid.js
+++ b/src/dstr-assignment/obj-prop-nested-array-yield-ident-invalid.case
@@ -2,14 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of a nested
     destructuring assignment and outside of a generator function body, it
     should behave as an IdentifierReference.
+template: syntax
 es6id: 12.14.5.4
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-var x;
-0, { x: [x = yield] } = { x: [] };
+//- elems
+{ x: [x = yield] }
+//- vals
+{ x: [] }
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-array-yield-ident-valid.js b/src/dstr-assignment/obj-prop-nested-array-yield-ident-valid.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-array-yield-ident-valid.js
rename to src/dstr-assignment/obj-prop-nested-array-yield-ident-valid.case
index 83df76722c..19b82bbe5a 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-array-yield-ident-valid.js
+++ b/src/dstr-assignment/obj-prop-nested-array-yield-ident-valid.case
@@ -2,19 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of a nested
     destructuring assignment and outside of a generator function body, it
     should behave as an IdentifierReference.
+template: default
 es6id: 12.14.5.4
 flags: [noStrict]
 ---*/
 
-var value = { x: [] };
+//- setup
 var yield = 22;
-var result, x;
-
-result = { x: [x = yield] } = value;
-
-assert.sameValue(result, value);
+var x;
+//- elems
+{ x: [x = yield] }
+//- vals
+{ x: [] }
+//- body
 assert.sameValue(x, 22);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-array.js b/src/dstr-assignment/obj-prop-nested-array.case
similarity index 75%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-array.js
rename to src/dstr-assignment/obj-prop-nested-array.case
index a28cc299c8..3aabe634cc 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-array.js
+++ b/src/dstr-assignment/obj-prop-nested-array.case
@@ -2,17 +2,19 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an array literal, it should be parsed
     parsed as a DestructuringAssignmentPattern and evaluated as a destructuring
     assignment.
+template: default
 es6id: 12.14.5.4
 ---*/
 
-var value = { x: [321] };
-var result, y;
-
-result = { x: [y] } = value;
-
-assert.sameValue(result, value);
+//- setup
+var y;
+//- elems
+{ x: [y] }
+//- vals
+{ x: [321] }
+//- body
 assert.sameValue(y, 321);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj-invalid.js b/src/dstr-assignment/obj-prop-nested-obj-invalid.case
similarity index 85%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-obj-invalid.js
rename to src/dstr-assignment/obj-prop-nested-obj-invalid.case
index e1388ff867..9bf46e92cd 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj-invalid.js
+++ b/src/dstr-assignment/obj-prop-nested-obj-invalid.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     It is a Syntax Error if LeftHandSideExpression is either
     an ObjectLiteral or an ArrayLiteral and if the lexical
     token sequence matched by LeftHandSideExpression cannot be
     parsed with no tokens left over using AssignmentPattern as
     the goal symbol.
+template: syntax
 es6id: 12.14.5.1
 negative: SyntaxError
 ---*/
 
-({ x: { get x() {} } } = { x: {} });
+//- elems
+{ x: { get x() {} } }
+//- vals
+{ x: {} }
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj-null.js b/src/dstr-assignment/obj-prop-nested-obj-null.case
similarity index 75%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-obj-null.js
rename to src/dstr-assignment/obj-prop-nested-obj-null.case
index 7806305a64..d0f88aad7e 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj-null.js
+++ b/src/dstr-assignment/obj-prop-nested-obj-null.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an object literal and the value is
     `null`, a TypeError should be thrown.
+template: error
 es6id: 12.14.5.4
 ---*/
 
+//- setup
 var x;
-
-assert.throws(TypeError, function() {
-  ({ x: { x } } = { x: null });
-});
+//- error
+TypeError
+//- elems
+{ x: { x } }
+//- vals
+{ x: null }
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj-undefined-own.js b/src/dstr-assignment/obj-prop-nested-obj-undefined-own.case
similarity index 74%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-obj-undefined-own.js
rename to src/dstr-assignment/obj-prop-nested-obj-undefined-own.case
index 771e90e4ec..506879addd 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj-undefined-own.js
+++ b/src/dstr-assignment/obj-prop-nested-obj-undefined-own.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an object literal and the value is
     `undefined`, a TypeError should be thrown.
+template: error
 es6id: 12.14.5.4
 ---*/
 
+//- setup
 var x;
-
-assert.throws(TypeError, function() {
-  ({ x: { x } } = { x: undefined });
-});
+//- error
+TypeError
+//- elems
+{ x: { x } }
+//- vals
+{ x: undefined }
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj-undefined.js b/src/dstr-assignment/obj-prop-nested-obj-undefined.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-obj-undefined.js
rename to src/dstr-assignment/obj-prop-nested-obj-undefined.case
index ac0ff673a0..742d2d99d9 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj-undefined.js
+++ b/src/dstr-assignment/obj-prop-nested-obj-undefined.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an object literal and the value is
     not defined, a TypeError should be thrown.
+template: error
 es6id: 12.14.5.4
 ---*/
 
+//- setup
 var x;
-
-assert.throws(TypeError, function() {
-  ({ x: { x } } = {});
-});
+//- error
+TypeError
+//- elems
+{ x: { x } }
+//- vals
+{}
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj-yield-expr.js b/src/dstr-assignment/obj-prop-nested-obj-yield-expr.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-obj-yield-expr.js
rename to src/dstr-assignment/obj-prop-nested-obj-yield-expr.case
index 3d89a89736..34bb01f8cc 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj-yield-expr.js
+++ b/src/dstr-assignment/obj-prop-nested-obj-yield-expr.case
@@ -2,31 +2,34 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of a nested
     destructuring assignment and within a generator function body, it should
     behave as a YieldExpression.
+template: default
 es6id: 12.14.5.4
 features: [generators]
 ---*/
 
-var value = { x: {} };
-var assignmentResult, iterationResult, iter, x;
+//- setup
+var iterationResult, iter, x = undefined;
 
 iter = (function*() {
-  assignmentResult = { x: { x = yield } } = value;
+//- elems
+{ x: { x = yield } }
+//- vals
+{ x: {} }
+//- teardown
 }());
 
 iterationResult = iter.next();
 
-assert.sameValue(assignmentResult, undefined);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, false);
 assert.sameValue(x, undefined);
 
 iterationResult = iter.next(4);
 
-assert.sameValue(assignmentResult, value);
 assert.sameValue(iterationResult.value, undefined);
 assert.sameValue(iterationResult.done, true);
 assert.sameValue(x, 4);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj-yield-ident-invalid.js b/src/dstr-assignment/obj-prop-nested-obj-yield-ident-invalid.case
similarity index 84%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-obj-yield-ident-invalid.js
rename to src/dstr-assignment/obj-prop-nested-obj-yield-ident-invalid.case
index 3a4b44df7d..c37458e46d 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj-yield-ident-invalid.js
+++ b/src/dstr-assignment/obj-prop-nested-obj-yield-ident-invalid.case
@@ -2,14 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of a nested
     destructuring assignment and outside of a generator function body, it
     should behave as an IdentifierReference.
+template: syntax
 es6id: 12.14.5.4
 flags: [onlyStrict]
 negative: SyntaxError
 ---*/
 
-var x;
-0, { x: { x = yield } } = { x: {} };
+//- elems
+{ x: { x = yield } }
+//- vals
+{ x: {} }
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj-yield-ident-valid.js b/src/dstr-assignment/obj-prop-nested-obj-yield-ident-valid.case
similarity index 79%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-obj-yield-ident-valid.js
rename to src/dstr-assignment/obj-prop-nested-obj-yield-ident-valid.case
index 7261d722e1..5e30d0cb26 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj-yield-ident-valid.js
+++ b/src/dstr-assignment/obj-prop-nested-obj-yield-ident-valid.case
@@ -2,19 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When a `yield` token appears within the Initializer of a nested
     destructuring assignment and outside of a generator function body, it
     should behave as an IdentifierReference.
+template: default
 es6id: 12.14.5.4
 flags: [noStrict]
 ---*/
 
-var value = { x: {} };
+//- setup
 var yield = 2;
 var result, x;
-
-result = { x: { x = yield } } = value;
-
-assert.sameValue(result, value);
+//- elems
+{ x: { x = yield } }
+//- vals
+{ x: {} }
+//- body
 assert.sameValue(x, 2);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj.js b/src/dstr-assignment/obj-prop-nested-obj.case
similarity index 77%
rename from test/language/expressions/assignment/destructuring/obj-prop-nested-obj.js
rename to src/dstr-assignment/obj-prop-nested-obj.case
index a47fdaccb2..2391e49b38 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-obj.js
+++ b/src/dstr-assignment/obj-prop-nested-obj.case
@@ -2,17 +2,19 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     When DestructuringAssignmentTarget is an object literal, it should be
     parsed as a DestructuringAssignmentPattern and evaluated as a destructuring
     assignment.
+template: default
 es6id: 12.14.5.4
 ---*/
 
-var value = { x: { y: 2 } };
+//- setup
 var result, y;
-
-result = { x: { y } } = value;
-
-assert.sameValue(result, value);
+//- elems
+{ x: { y } }
+//- vals
+{ x: { y: 2 } }
+//- body
 assert.sameValue(y, 2);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-put-const.js b/src/dstr-assignment/obj-prop-put-const.case
similarity index 73%
rename from test/language/expressions/assignment/destructuring/obj-prop-put-const.js
rename to src/dstr-assignment/obj-prop-put-const.case
index d17289a0ac..fd34765933 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-put-const.js
+++ b/src/dstr-assignment/obj-prop-put-const.case
@@ -2,14 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The assignment target should obey `const` semantics.
+template: error
 es6id: 12.14.5.4
 features: [const]
 ---*/
 
+//- setup
 const c = 1;
-
-assert.throws(TypeError, function() {
-  ({ a: c } = { a: 2 });
-});
+//- error
+TypeError
+//- elems
+{ a: c }
+//- vals
+{ a: 2 }
diff --git a/test/language/expressions/assignment/destructuring/obj-id-put-let.js b/src/dstr-assignment/obj-prop-put-let.case
similarity index 70%
rename from test/language/expressions/assignment/destructuring/obj-id-put-let.js
rename to src/dstr-assignment/obj-prop-put-let.case
index 28c1145de0..358c9d0055 100644
--- a/test/language/expressions/assignment/destructuring/obj-id-put-let.js
+++ b/src/dstr-assignment/obj-prop-put-let.case
@@ -2,13 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The assignment target should obey `let` semantics.
+template: error
 es6id: 12.14.5.4
 features: [let]
 ---*/
 
-assert.throws(ReferenceError, function() {
-  ({ x } = {});
-  let x;
-});
+//- error
+ReferenceError
+//- elems
+{ a: x }
+//- vals
+{}
+//- teardown
+let x;
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-put-order.js b/src/dstr-assignment/obj-prop-put-order.case
similarity index 69%
rename from test/language/expressions/assignment/destructuring/obj-prop-put-order.js
rename to src/dstr-assignment/obj-prop-put-order.case
index e6e360f878..6f4ca4faf6 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-put-order.js
+++ b/src/dstr-assignment/obj-prop-put-order.case
@@ -2,16 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The AssignmentElements in an AssignmentElementList are evaluated in left-
     to-right order.
+template: default
 es6id: 12.14.5.4
 ---*/
 
-var value = { a: 2, z: 1 };
-var x, result;
-
-result = { z: x, a: x } = value;
-
-assert.sameValue(result, value);
+//- setup
+var x;
+//- elems
+{ z: x, a: x }
+//- vals
+{ a: 2, z: 1 }
+//- body
 assert.sameValue(x, 2);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-put-prop-ref-no-get.js b/src/dstr-assignment/obj-prop-put-prop-ref-no-get.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/obj-prop-put-prop-ref-no-get.js
rename to src/dstr-assignment/obj-prop-put-prop-ref-no-get.case
index 9f036e6c7d..2b5b83ec5f 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-put-prop-ref-no-get.js
+++ b/src/dstr-assignment/obj-prop-put-prop-ref-no-get.case
@@ -2,15 +2,16 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     If the DestructuringAssignmentTarget of an AssignmentElement is a
     PropertyReference, it should not be evaluated.
+template: default
 es6id: 12.14.5.4
 ---*/
 
-var value = { a: 23 };
-var x, setValue, result;
-x = {
+//- setup
+var setValue;
+var x = {
   get y() {
     $ERROR('The property should not be accessed.');
   },
@@ -18,8 +19,9 @@ x = {
     setValue = val;
   }
 };
-
-result = { a: x.y } = value;
-
-assert.sameValue(result, value);
+//- elems
+{ a: x.y }
+//- vals
+{ a: 23 }
+//- body
 assert.sameValue(setValue, 23);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-put-prop-ref-user-err.js b/src/dstr-assignment/obj-prop-put-prop-ref-user-err.case
similarity index 75%
rename from test/language/expressions/assignment/destructuring/obj-prop-put-prop-ref-user-err.js
rename to src/dstr-assignment/obj-prop-put-prop-ref-user-err.case
index dafa8026c0..1e119134f7 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-put-prop-ref-user-err.js
+++ b/src/dstr-assignment/obj-prop-put-prop-ref-user-err.case
@@ -2,19 +2,22 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Any error raised as a result of setting the value should be forwarded to
     the runtime.
+template: error
 es6id: 12.14.5.4
 ---*/
 
-var value = { a: 23 };
+//- setup
 var x = {
   set y(val) {
     throw new Test262Error();
   }
 };
-
-assert.throws(Test262Error, function() {
-  ({ a: x.y } = value);
-});
+//- error
+Test262Error
+//- elems
+{ a: x.y }
+//- vals
+{ a: 23 }
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-put-prop-ref.js b/src/dstr-assignment/obj-prop-put-prop-ref.case
similarity index 72%
rename from test/language/expressions/assignment/destructuring/obj-prop-put-prop-ref.js
rename to src/dstr-assignment/obj-prop-put-prop-ref.case
index 163cc9ff8c..6a78d80ff8 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-put-prop-ref.js
+++ b/src/dstr-assignment/obj-prop-put-prop-ref.case
@@ -2,17 +2,18 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     The DestructuringAssignmentTarget of an AssignmentElement may be a
     PropertyReference.
+template: default
 es6id: 12.14.5.4
 ---*/
 
-var value = { xy: 4 };
+//- setup
 var x = {};
-var result;
-
-result = { xy: x.y } = value;
-
-assert.sameValue(result, value);
+//- elems
+{ xy: x.y }
+//- vals
+{ xy: 4 }
+//- body
 assert.sameValue(x.y, 4);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-put-unresolvable-no-strict.js b/src/dstr-assignment/obj-prop-put-unresolvable-no-strict.case
similarity index 81%
rename from test/language/expressions/assignment/destructuring/obj-prop-put-unresolvable-no-strict.js
rename to src/dstr-assignment/obj-prop-put-unresolvable-no-strict.case
index 0ed8651228..c2dff5c904 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-put-unresolvable-no-strict.js
+++ b/src/dstr-assignment/obj-prop-put-unresolvable-no-strict.case
@@ -2,15 +2,21 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     Outside of strict mode, if the the assignment target is an unresolvable
     reference, a new `var` binding should be created in the environment record.
+template: default
 es6id: 12.14.5.4
 flags: [noStrict]
 ---*/
 
+//- setup
 {
-  ({ x: unresolvable } = {});
+//- elems
+{ x: unresolvable }
+//- vals
+{}
+//- teardown
 }
 
 assert.sameValue(unresolvable, undefined);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-put-unresolvable-strict.js b/src/dstr-assignment/obj-prop-put-unresolvable-strict.case
similarity index 76%
rename from test/language/expressions/assignment/destructuring/obj-prop-put-unresolvable-strict.js
rename to src/dstr-assignment/obj-prop-put-unresolvable-strict.case
index f75a6927c5..52cbdd565d 100644
--- a/test/language/expressions/assignment/destructuring/obj-prop-put-unresolvable-strict.js
+++ b/src/dstr-assignment/obj-prop-put-unresolvable-strict.case
@@ -2,13 +2,17 @@
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
-description: >
+desc: >
     In strict mode, if the the assignment target is an unresolvable reference,
     a ReferenceError should be thrown.
+template: error
 es6id: 12.14.5.4
 flags: [onlyStrict]
 ---*/
 
-assert.throws(ReferenceError, function() {
-  ({ x: unresolvable } = {});
-});
+//- error
+ReferenceError
+//- elems
+{ x: unresolvable }
+//- vals
+{}
diff --git a/src/dstr-assignment/syntax/assignment-expr.template b/src/dstr-assignment/syntax/assignment-expr.template
new file mode 100644
index 0000000000..a93edd3e64
--- /dev/null
+++ b/src/dstr-assignment/syntax/assignment-expr.template
@@ -0,0 +1,20 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+path: language/expressions/assignment/dstr-
+name: >
+    AssignmentExpression
+esid: sec-variable-statement-runtime-semantics-evaluation
+es6id: 13.3.2.4
+features: [destructuring-binding]
+info: |
+    VariableDeclaration : BindingPattern Initializer
+
+    1. Let rhs be the result of evaluating Initializer.
+    2. Let rval be GetValue(rhs).
+    3. ReturnIfAbrupt(rval).
+    4. Return the result of performing BindingInitialization for
+       BindingPattern passing rval and undefined as arguments.
+---*/
+
+0, /*{ elems }*/ = /*{ vals }*/;
diff --git a/src/dstr-assignment/syntax/for-in.template b/src/dstr-assignment/syntax/for-in.template
new file mode 100644
index 0000000000..279b319960
--- /dev/null
+++ b/src/dstr-assignment/syntax/for-in.template
@@ -0,0 +1,29 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+path: language/statements/for-in/dstr-
+name: >
+    For..in statement
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+es6id: 13.7.5.11
+features: [destructuring-binding]
+info: |
+  IterationStatement :
+    for ( LeftHandSideExpression of AssignmentExpression ) Statement
+
+  1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« »,
+     AssignmentExpression, iterate).
+  2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement,
+     keyResult, assignment, labelSet).
+
+  13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+  [...]
+  4. If destructuring is true and if lhsKind is assignment, then
+     a. Assert: lhs is a LeftHandSideExpression.
+     b. Let assignmentPattern be the parse of the source text corresponding to
+        lhs using AssignmentPattern as the goal symbol.
+  [...]
+---*/
+
+for (/*{ elems }*/ in [/*{ vals }*/]) ;
diff --git a/src/dstr-assignment/syntax/for-of.template b/src/dstr-assignment/syntax/for-of.template
new file mode 100644
index 0000000000..430550dd3c
--- /dev/null
+++ b/src/dstr-assignment/syntax/for-of.template
@@ -0,0 +1,29 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+path: language/statements/for-of/dstr-
+name: >
+    For..of statement
+esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
+es6id: 13.7.5.11
+features: [destructuring-binding]
+info: |
+  IterationStatement :
+    for ( LeftHandSideExpression of AssignmentExpression ) Statement
+
+  1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« »,
+     AssignmentExpression, iterate).
+  2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement,
+     keyResult, assignment, labelSet).
+
+  13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
+
+  [...]
+  4. If destructuring is true and if lhsKind is assignment, then
+     a. Assert: lhs is a LeftHandSideExpression.
+     b. Let assignmentPattern be the parse of the source text corresponding to
+        lhs using AssignmentPattern as the goal symbol.
+  [...]
+---*/
+
+for (/*{ elems }*/ of [/*{ vals }*/]) ;
diff --git a/test/language/expressions/assignment/destructuring/array-elem-elision.js b/test/language/expressions/assignment/destructuring/array-elem-elision.js
deleted file mode 100644
index dd7c6dd612..0000000000
--- a/test/language/expressions/assignment/destructuring/array-elem-elision.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    ArrayAssignmentPattern may include elisions at any position in a
-    AssignmentElementList that does not contain an AssignmentRestElement.
-es6id: 12.14.5
----*/
-
-var value = [1, 2, 3, 4, 5, 6];
-var x, y;
-var result;
-
-result = [, x, , y, ,] = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 2);
-assert.sameValue(y, 4);
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-assignment.js b/test/language/expressions/assignment/destructuring/array-elem-init-assignment.js
deleted file mode 100644
index 3eea1f6863..0000000000
--- a/test/language/expressions/assignment/destructuring/array-elem-init-assignment.js
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    If the Initializer is present and v is undefined, the Initializer should be
-    evaluated and the result assigned to the target reference.
-es6id: 12.14.5.3
----*/
-
-var result, value, x;
-
-value = [];
-result = [ x = 10 ] = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 10, 'no element at index');
-
-value = [2];
-result = [ x = 11 ] = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 2, 'element at index (truthy value)');
-
-value = [ null ];
-result = [ x = 12 ] = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, null, 'element at index (`null`)');
-
-value = [ undefined ];
-result = [ x = 13 ] = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 13, 'element at index (`undefined`)');
-
-value = [ , ];
-result = [ x = 14 ] = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 14, 'element at index (sparse array)');
diff --git a/test/language/expressions/assignment/destructuring/array-elem-init-evaluation.js b/test/language/expressions/assignment/destructuring/array-elem-init-evaluation.js
deleted file mode 100644
index 0e5198eeac..0000000000
--- a/test/language/expressions/assignment/destructuring/array-elem-init-evaluation.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    The Initializer should only be evaluated if v is undefined.
-es6id: 12.14.5.3
----*/
-
-var result, value, x, flag;
-
-value = [];
-flag = false;
-result = [ x = flag = true ] = value;
-assert.sameValue(result, value);
-assert.sameValue(x, true);
-assert.sameValue(flag, true);
-
-value = [14];
-flag = false;
-result = [ x = flag = true ] = value;
-assert.sameValue(result, value);
-assert.sameValue(x, 14);
-assert.sameValue(flag, false);
diff --git a/test/language/expressions/assignment/destructuring/array-elision.js b/test/language/expressions/assignment/destructuring/array-elision.js
deleted file mode 100644
index 8933cb5a14..0000000000
--- a/test/language/expressions/assignment/destructuring/array-elision.js
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    An ArrayAssignmentPattern containing only Elisions requires iterable values
-    and throws for other values.
-es6id: 12.14.5.2
----*/
-
-var value, result;
-
-assert.throws(TypeError, function() {
-  [,] = undefined;
-});
-
-assert.throws(TypeError, function() {
-  [,] = null;
-});
-
-assert.throws(TypeError, function() {
-  [,] = true;
-});
-
-assert.throws(TypeError, function() {
-  [,] = 1;
-});
-
-result = [,] = 'string literal';
-
-assert.sameValue(result, 'string literal');
-
-assert.throws(TypeError, function() {
-  [,] = Symbol('s');
-});
-
-value = [];
-result = [,] = value;
-
-assert.sameValue(result, value);
diff --git a/test/language/expressions/assignment/destructuring/array-empty.js b/test/language/expressions/assignment/destructuring/array-empty.js
deleted file mode 100644
index 524f73f8fd..0000000000
--- a/test/language/expressions/assignment/destructuring/array-empty.js
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    An ArrayAssignmentPattern without an AssignmentElementList requires
-    iterable values and throws for other values.
-es6id: 12.14.5.2
----*/
-
-var value, result;
-
-assert.throws(TypeError, function() {
-  [] = undefined;
-});
-
-assert.throws(TypeError, function() {
-  [] = null;
-});
-
-assert.throws(TypeError, function() {
-  [] = true;
-});
-
-assert.throws(TypeError, function() {
-  [] = 1;
-});
-
-result = [] = 'string literal';
-
-assert.sameValue(result, 'string literal');
-
-assert.throws(TypeError, function() {
-  [] = Symbol('s');
-});
-
-value = [];
-result = [] = value;
-
-assert.sameValue(result, value);
diff --git a/test/language/expressions/assignment/destructuring/array-iteration.js b/test/language/expressions/assignment/destructuring/array-iteration.js
deleted file mode 100644
index bbaa568a87..0000000000
--- a/test/language/expressions/assignment/destructuring/array-iteration.js
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    Value iteration only proceeds for the number of elements in the
-    ArrayAssignmentPattern.
-es6id: 12.14.5.3
-features: [generators]
----*/
-
-var count, iter, result;
-var g = function*() {
-  count += 1;
-  yield;
-  count += 1;
-  yield;
-  count += 1;
-}
-
-count = 0;
-iter = g();
-result = [] = iter;
-
-assert.sameValue(result, iter);
-assert.sameValue(count, 0);
-
-iter = g();
-result = [,] = iter;
-
-assert.sameValue(result, iter);
-assert.sameValue(count, 1);
-
-count = 0;
-iter = g();
-result = [,,] = iter;
-
-assert.sameValue(result, iter);
-assert.sameValue(count, 2);
-
-count = 0;
-iter = g();
-result = [,,,] = iter;
-
-assert.sameValue(result, iter);
-assert.sameValue(count, 3);
-
-count = 0;
-iter = g();
-result = [,,,,] = iter;
-
-assert.sameValue(result, iter);
-assert.sameValue(count, 3);
diff --git a/test/language/expressions/assignment/destructuring/obj-id-identifier-resolution.js b/test/language/expressions/assignment/destructuring/obj-id-identifier-resolution.js
deleted file mode 100644
index ff3dd5a201..0000000000
--- a/test/language/expressions/assignment/destructuring/obj-id-identifier-resolution.js
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    Evaluation of DestructuringAssignmentTarget.
-es6id: 12.14.5.4
----*/
-
-var result, value, w, x, y;
-
-x = null;
-value = { x: 1 };
-result = { x } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 1);
-
-x = null;
-value = { x: 2 };
-result = { x, } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 2);
-
-x = null;
-value = { x: 3 };
-result = { x, y } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 3);
-
-x = null;
-value = { x: 4 };
-result = { w, x } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 4);
-
-x = null;
-value = { x: 5 };
-result = { w, x, y } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 5);
diff --git a/test/language/expressions/assignment/destructuring/obj-id-identifier-yield-ident-valid.js b/test/language/expressions/assignment/destructuring/obj-id-identifier-yield-ident-valid.js
deleted file mode 100644
index 4d4b5c8363..0000000000
--- a/test/language/expressions/assignment/destructuring/obj-id-identifier-yield-ident-valid.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    `yield` is a valid IdentifierReference in an AssignmentProperty outside of
-    strict mode and generator functions.
-es6id: 12.14.5
-flags: [noStrict]
----*/
-
-var value = { yield: 3 };
-var result, yield;
-
-result = { yield } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(yield, 3);
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-assignment.js b/test/language/expressions/assignment/destructuring/obj-id-init-assignment.js
deleted file mode 100644
index 5e9da802e4..0000000000
--- a/test/language/expressions/assignment/destructuring/obj-id-init-assignment.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    If the Initializer is present and v is undefined, the Initializer should be
-    evaluated and the result assigned to the target reference.
-es6id: 12.14.5.4
----*/
-
-var result, value, x;
-
-value = {};
-result = { x = 1 } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 1, 'no property defined');
-
-value = { x: 2 };
-result = { x = 1 } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 2, 'own property defined (truthy value)');
-
-value = { x: null };
-result = { x = 1 } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, null, 'own property defined (`null`)');
-
-value = { x: undefined };
-result = { x = 1 } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 1, 'own property defined (`undefined`)');
diff --git a/test/language/expressions/assignment/destructuring/obj-id-init-evaluation.js b/test/language/expressions/assignment/destructuring/obj-id-init-evaluation.js
deleted file mode 100644
index af03125bd2..0000000000
--- a/test/language/expressions/assignment/destructuring/obj-id-init-evaluation.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    The Initializer should only be evaluated if v is undefined.
-es6id: 12.14.5.4
----*/
-
-var result, value, x, flag;
-
-value = {};
-flag = false;
-result = { x = flag = true } = value;
-assert.sameValue(result, value);
-assert.sameValue(x, true);
-assert.sameValue(flag, true);
-
-value = { x: 1 };
-flag = false;
-result = { x = flag = true } = value;
-assert.sameValue(result, value);
-assert.sameValue(x, 1);
-assert.sameValue(flag, false);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-assignment.js b/test/language/expressions/assignment/destructuring/obj-prop-elem-init-assignment.js
deleted file mode 100644
index 85c013feae..0000000000
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-assignment.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    If the Initializer is present and v is undefined, the Initializer should be
-    evaluated and the result assigned to the target reference.
-es6id: 12.14.5.4
----*/
-
-var result, value, x;
-
-value = {};
-result = { y: x = 1 } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 1, 'no property defined');
-
-value = { y: 2 };
-result = { y: x = 1 } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 2, 'own property defined (truthy value)');
-
-value = { y: null };
-result = { y: x = 1 } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, null, 'own property defined (`null`)');
-
-value = { y: undefined };
-result = { y: x = 1 } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 1, 'own property defined (`undefined`)');
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-evaluation.js b/test/language/expressions/assignment/destructuring/obj-prop-elem-init-evaluation.js
deleted file mode 100644
index efd1237e31..0000000000
--- a/test/language/expressions/assignment/destructuring/obj-prop-elem-init-evaluation.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    The Initializer should only be evaluated if v is undefined.
-es6id: 12.14.5.4
----*/
-
-var result, value, x, flag;
-
-value = {};
-flag = false;
-result = { x: x = flag = true } = value;
-assert.sameValue(result, value);
-assert.sameValue(x, true);
-assert.sameValue(flag, true);
-
-value = { y: 1 };
-flag = false;
-result = { y: x = flag = true } = value;
-assert.sameValue(result, value);
-assert.sameValue(x, 1);
-assert.sameValue(flag, false);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-identifier-resolution.js b/test/language/expressions/assignment/destructuring/obj-prop-identifier-resolution.js
deleted file mode 100644
index 2798828162..0000000000
--- a/test/language/expressions/assignment/destructuring/obj-prop-identifier-resolution.js
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    Evaluation of DestructuringAssignmentTarget.
-es6id: 12.14.5.4
----*/
-
-var result, value, w, x, y;
-
-x = null;
-value = { a: 1 };
-result = { a: x } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 1);
-
-x = null;
-value = { a: 2 };
-result = { a: x, } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 2);
-
-x = null;
-value = { a: 3 };
-result = { a: x, y } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 3);
-
-x = null;
-value = { a: 4 };
-result = { w, a: x } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 4);
-
-x = null;
-value = { a: 5 };
-result = { w, a: x, y } = value;
-
-assert.sameValue(result, value);
-assert.sameValue(x, 5);
diff --git a/test/language/expressions/assignment/destructuring/obj-prop-nested-array-invalid.js b/test/language/expressions/assignment/destructuring/obj-prop-nested-array-invalid.js
deleted file mode 100644
index 011b8291df..0000000000
--- a/test/language/expressions/assignment/destructuring/obj-prop-nested-array-invalid.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral
-    or an ArrayLiteral and if the lexical token sequence matched by
-    LeftHandSideExpression cannot be parsed with no tokens left over using
-    AssignmentPattern as the goal symbol.
-es6id: 12.14.5.1
-negative: SyntaxError
----*/
-
-var x, y;
-
-({ x: [(x, y)] } = { x: [] });
diff --git a/test/language/expressions/assignment/destructuring/object-empty.js b/test/language/expressions/assignment/destructuring/object-empty.js
deleted file mode 100644
index 9658156eb7..0000000000
--- a/test/language/expressions/assignment/destructuring/object-empty.js
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (C) 2015 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-    An ObjectAssignmentPattern without an AssignmentPropertyList requires
-    object-coercible values and throws for other values.
-es6id: 12.14.5.2
----*/
-
-var value, result;
-
-assert.throws(TypeError, function() {
-  0, {} = undefined;
-});
-
-assert.throws(TypeError, function() {
-  0, {} = null;
-});
-
-result = {} = true;
-
-assert.sameValue(result, true);
-
-result = {} = 1;
-
-assert.sameValue(result, 1);
-
-result = {} = 'string literal';
-
-assert.sameValue(result, 'string literal');
-
-value = Symbol('s');
-result = {} = value;
-
-assert.sameValue(result, value);
-
-value = {};
-result = {} = value;
-
-assert.sameValue(result, value);
-- 
GitLab