From 87e259c6e50c0021b097b680ec0f5f54ee102362 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Bargull?= <andre.bargull@gmail.com>
Date: Sat, 16 Sep 2017 17:00:56 +0200
Subject: [PATCH] Add replacement tests for destructuring evaluation order with
 property reference as target

---
 ...perty-reference-target-evaluation-order.js | 80 +++++++++++++++++++
 ...perty-reference-target-evaluation-order.js | 75 +++++++++++++++++
 2 files changed, 155 insertions(+)
 create mode 100644 test/language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js
 create mode 100644 test/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js

diff --git a/test/language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js b/test/language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js
new file mode 100644
index 0000000000..f5ada21f42
--- /dev/null
+++ b/test/language/expressions/assignment/destructuring/iterator-destructuring-property-reference-target-evaluation-order.js
@@ -0,0 +1,80 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-runtime-semantics-iteratordestructuringassignmentevaluation
+description: >
+    Ensure correct evaluation order when destructuring target is property reference.
+info: |
+    12.15.5.3 Runtime Semantics: IteratorDestructuringAssignmentEvaluation
+
+    AssignmentElement : DestructuringAssignmentTarget Initializer
+
+    1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an ArrayLiteral, then
+        a. Let lref be the result of evaluating DestructuringAssignmentTarget.
+        b. ReturnIfAbrupt(lref).
+    2. If iteratorRecord.[[Done]] is false, then
+        a. Let next be IteratorStep(iteratorRecord.[[Iterator]]).
+        ...
+    3. If iteratorRecord.[[Done]] is true, let value be undefined.
+    ...
+    5. Else, let v be value.
+    ...
+    8. Return ? PutValue(lref, v).
+features: [Symbol.iterator]
+includes: [compareArray.js]
+---*/
+
+
+var log = [];
+
+function source() {
+    log.push("source");
+    var iterator = {
+        next: function() {
+            log.push("iterator-step");
+            return {
+                get done() {
+                    log.push("iterator-done");
+                    return true;
+                },
+                get value() {
+                    // Note: This getter shouldn't be called.
+                    log.push("iterator-value");
+                }
+            };
+        }
+    };
+    var source = {};
+    source[Symbol.iterator] = function() {
+        log.push("iterator");
+        return iterator;
+    };
+    return source;
+}
+function target() {
+    log.push("target");
+    return target = {
+        set q(v) {
+            log.push("set");
+        }
+    };
+}
+function targetKey() {
+    log.push("target-key");
+    return {
+        toString: function() {
+            log.push("target-key-tostring");
+            return "q";
+        }
+    };
+}
+
+([target()[targetKey()]] = source());
+
+assert.compareArray(log, [
+    "source", "iterator",
+    "target", "target-key", "target-key-tostring",
+    "iterator-step", "iterator-done",
+    "set",
+]);
diff --git a/test/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js b/test/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js
new file mode 100644
index 0000000000..81d8a6a728
--- /dev/null
+++ b/test/language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order.js
@@ -0,0 +1,75 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-runtime-semantics-keyeddestructuringassignmentevaluation
+description: >
+    Ensure correct evaluation order when destructuring target is property reference.
+info: |
+    12.15.5.2 Runtime Semantics: DestructuringAssignmentEvaluation
+
+    AssignmentProperty : PropertyName : AssignmentElement
+
+    1. Let name be the result of evaluating PropertyName.
+    2. ReturnIfAbrupt(name).
+    3. Return the result of performing KeyedDestructuringAssignmentEvaluation of
+       AssignmentElement with value and name as the arguments. 
+
+    12.15.5.4 Runtime Semantics: KeyedDestructuringAssignmentEvaluation
+
+    1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an ArrayLiteral, then
+        a. Let lref be the result of evaluating DestructuringAssignmentTarget.
+        b. ReturnIfAbrupt(lref).
+    2. Let v be ? GetV(value, propertyName).
+    ...
+    4. Else, let rhsValue be v.
+    ...
+    7. Return ? PutValue(lref, rhsValue).
+includes: [compareArray.js]
+---*/
+
+
+var log = [];
+
+function source() {
+    log.push("source");
+    return {
+        get p() {
+            log.push("get");
+        }
+    };
+}
+function target() {
+    log.push("target");
+    return {
+        set q(v) {
+            log.push("set");
+        }
+    };
+}
+function sourceKey() {
+    log.push("source-key");
+    return {
+        toString: function() {
+            log.push("source-key-tostring");
+            return "p";
+        }
+    };
+}
+function targetKey() {
+    log.push("target-key");
+    return {
+        toString: function() {
+            log.push("target-key-tostring");
+            return "q";
+        }
+    };
+}
+
+({[sourceKey()]: target()[targetKey()]} = source());
+
+assert.compareArray(log, [
+    "source", "source-key", "source-key-tostring",
+    "target", "target-key", "target-key-tostring",
+    "get", "set",
+]);
-- 
GitLab