From 0ceb428ec93cda5c63f470c0f9d5552441bbc32d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Bargull?= <andre.bargull@gmail.com>
Date: Mon, 8 Sep 2014 21:23:39 +0200
Subject: [PATCH] Add test coverage for identifier resolution in dynamic scopes

Identifier resolution in dynamic scope context is missing test coverage, resolves https://bugs.ecmascript.org/show_bug.cgi?id=1751 .
---
 .../expressions/assignment/S11.13.1_A5_T1.js  | 30 +++++++++++++++
 .../expressions/assignment/S11.13.1_A5_T2.js  | 27 ++++++++++++++
 .../expressions/assignment/S11.13.1_A5_T3.js  | 29 +++++++++++++++
 .../expressions/assignment/S11.13.1_A5_T4.js  | 27 ++++++++++++++
 .../expressions/assignment/S11.13.1_A5_T5.js  | 29 +++++++++++++++
 .../expressions/assignment/S11.13.1_A6_T1.js  | 28 ++++++++++++++
 .../expressions/assignment/S11.13.1_A6_T2.js  | 28 ++++++++++++++
 .../expressions/assignment/S11.13.1_A6_T3.js  | 29 +++++++++++++++
 .../compound-assignment/S11.13.2_A5.10_T1.js  | 36 ++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.10_T2.js  | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.10_T3.js  | 37 +++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.10_T4.js  | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.10_T5.js  | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.11_T1.js  | 36 ++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.11_T2.js  | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.11_T3.js  | 37 +++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.11_T4.js  | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.11_T5.js  | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.1_T1.js   | 36 ++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.1_T2.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.1_T3.js   | 37 +++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.1_T4.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.1_T5.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.2_T1.js   | 36 ++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.2_T2.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.2_T3.js   | 37 +++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.2_T4.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.2_T5.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.3_T1.js   | 36 ++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.3_T2.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.3_T3.js   | 37 +++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.3_T4.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.3_T5.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.4_T1.js   | 36 ++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.4_T2.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.4_T3.js   | 37 +++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.4_T4.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.4_T5.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.5_T1.js   | 36 ++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.5_T2.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.5_T3.js   | 37 +++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.5_T4.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.5_T5.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.6_T1.js   | 36 ++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.6_T2.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.6_T3.js   | 37 +++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.6_T4.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.6_T5.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.7_T1.js   | 36 ++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.7_T2.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.7_T3.js   | 37 +++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.7_T4.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.7_T5.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.8_T1.js   | 36 ++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.8_T2.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.8_T3.js   | 37 +++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.8_T4.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.8_T5.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.9_T1.js   | 36 ++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.9_T2.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.9_T3.js   | 37 +++++++++++++++++++
 .../compound-assignment/S11.13.2_A5.9_T4.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A5.9_T5.js   | 33 +++++++++++++++++
 .../compound-assignment/S11.13.2_A6.10_T1.js  | 29 +++++++++++++++
 .../compound-assignment/S11.13.2_A6.11_T1.js  | 29 +++++++++++++++
 .../compound-assignment/S11.13.2_A6.1_T1.js   | 29 +++++++++++++++
 .../compound-assignment/S11.13.2_A6.2_T1.js   | 29 +++++++++++++++
 .../compound-assignment/S11.13.2_A6.3_T1.js   | 29 +++++++++++++++
 .../compound-assignment/S11.13.2_A6.4_T1.js   | 29 +++++++++++++++
 .../compound-assignment/S11.13.2_A6.5_T1.js   | 29 +++++++++++++++
 .../compound-assignment/S11.13.2_A6.6_T1.js   | 29 +++++++++++++++
 .../compound-assignment/S11.13.2_A6.7_T1.js   | 29 +++++++++++++++
 .../compound-assignment/S11.13.2_A6.8_T1.js   | 29 +++++++++++++++
 .../compound-assignment/S11.13.2_A6.9_T1.js   | 29 +++++++++++++++
 .../postfix-decrement/S11.3.2_A5_T1.js        | 35 ++++++++++++++++++
 .../postfix-decrement/S11.3.2_A5_T2.js        | 32 ++++++++++++++++
 .../postfix-decrement/S11.3.2_A5_T3.js        | 36 ++++++++++++++++++
 .../postfix-decrement/S11.3.2_A5_T4.js        | 32 ++++++++++++++++
 .../postfix-decrement/S11.3.2_A5_T5.js        | 32 ++++++++++++++++
 .../postfix-increment/S11.3.1_A5_T1.js        | 35 ++++++++++++++++++
 .../postfix-increment/S11.3.1_A5_T2.js        | 32 ++++++++++++++++
 .../postfix-increment/S11.3.1_A5_T3.js        | 36 ++++++++++++++++++
 .../postfix-increment/S11.3.1_A5_T4.js        | 32 ++++++++++++++++
 .../postfix-increment/S11.3.1_A5_T5.js        | 32 ++++++++++++++++
 .../prefix-decrement/S11.4.5_A5_T1.js         | 35 ++++++++++++++++++
 .../prefix-decrement/S11.4.5_A5_T2.js         | 32 ++++++++++++++++
 .../prefix-decrement/S11.4.5_A5_T3.js         | 36 ++++++++++++++++++
 .../prefix-decrement/S11.4.5_A5_T4.js         | 32 ++++++++++++++++
 .../prefix-decrement/S11.4.5_A5_T5.js         | 32 ++++++++++++++++
 .../prefix-increment/S11.4.4_A5_T1.js         | 35 ++++++++++++++++++
 .../prefix-increment/S11.4.4_A5_T2.js         | 32 ++++++++++++++++
 .../prefix-increment/S11.4.4_A5_T3.js         | 36 ++++++++++++++++++
 .../prefix-increment/S11.4.4_A5_T4.js         | 32 ++++++++++++++++
 .../prefix-increment/S11.4.4_A5_T5.js         | 32 ++++++++++++++++
 94 files changed, 3106 insertions(+)
 create mode 100755 test/language/expressions/assignment/S11.13.1_A5_T1.js
 create mode 100755 test/language/expressions/assignment/S11.13.1_A5_T2.js
 create mode 100755 test/language/expressions/assignment/S11.13.1_A5_T3.js
 create mode 100755 test/language/expressions/assignment/S11.13.1_A5_T4.js
 create mode 100755 test/language/expressions/assignment/S11.13.1_A5_T5.js
 create mode 100755 test/language/expressions/assignment/S11.13.1_A6_T1.js
 create mode 100755 test/language/expressions/assignment/S11.13.1_A6_T2.js
 create mode 100755 test/language/expressions/assignment/S11.13.1_A6_T3.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.10_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.10_T2.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.10_T3.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.10_T4.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.10_T5.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.11_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.11_T2.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.11_T3.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.11_T4.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.11_T5.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.1_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.1_T2.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.1_T3.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.1_T4.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.1_T5.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.2_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.2_T2.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.2_T3.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.2_T4.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.2_T5.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.3_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.3_T2.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.3_T3.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.3_T4.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.3_T5.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.4_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.4_T2.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.4_T3.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.4_T4.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.4_T5.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.5_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.5_T2.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.5_T3.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.5_T4.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.5_T5.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.6_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.6_T2.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.6_T3.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.6_T4.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.6_T5.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.7_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.7_T2.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.7_T3.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.7_T4.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.7_T5.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.8_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.8_T2.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.8_T3.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.8_T4.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.8_T5.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.9_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.9_T2.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.9_T3.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.9_T4.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A5.9_T5.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A6.10_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A6.11_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A6.1_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A6.2_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A6.3_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A6.4_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A6.5_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A6.6_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A6.7_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A6.8_T1.js
 create mode 100755 test/language/expressions/compound-assignment/S11.13.2_A6.9_T1.js
 create mode 100755 test/language/expressions/postfix-decrement/S11.3.2_A5_T1.js
 create mode 100755 test/language/expressions/postfix-decrement/S11.3.2_A5_T2.js
 create mode 100755 test/language/expressions/postfix-decrement/S11.3.2_A5_T3.js
 create mode 100755 test/language/expressions/postfix-decrement/S11.3.2_A5_T4.js
 create mode 100755 test/language/expressions/postfix-decrement/S11.3.2_A5_T5.js
 create mode 100755 test/language/expressions/postfix-increment/S11.3.1_A5_T1.js
 create mode 100755 test/language/expressions/postfix-increment/S11.3.1_A5_T2.js
 create mode 100755 test/language/expressions/postfix-increment/S11.3.1_A5_T3.js
 create mode 100755 test/language/expressions/postfix-increment/S11.3.1_A5_T4.js
 create mode 100755 test/language/expressions/postfix-increment/S11.3.1_A5_T5.js
 create mode 100755 test/language/expressions/prefix-decrement/S11.4.5_A5_T1.js
 create mode 100755 test/language/expressions/prefix-decrement/S11.4.5_A5_T2.js
 create mode 100755 test/language/expressions/prefix-decrement/S11.4.5_A5_T3.js
 create mode 100755 test/language/expressions/prefix-decrement/S11.4.5_A5_T4.js
 create mode 100755 test/language/expressions/prefix-decrement/S11.4.5_A5_T5.js
 create mode 100755 test/language/expressions/prefix-increment/S11.4.4_A5_T1.js
 create mode 100755 test/language/expressions/prefix-increment/S11.4.4_A5_T2.js
 create mode 100755 test/language/expressions/prefix-increment/S11.4.4_A5_T3.js
 create mode 100755 test/language/expressions/prefix-increment/S11.4.4_A5_T4.js
 create mode 100755 test/language/expressions/prefix-increment/S11.4.4_A5_T5.js

diff --git a/test/language/expressions/assignment/S11.13.1_A5_T1.js b/test/language/expressions/assignment/S11.13.1_A5_T1.js
new file mode 100755
index 0000000000..9f32fe4e1f
--- /dev/null
+++ b/test/language/expressions/assignment/S11.13.1_A5_T1.js
@@ -0,0 +1,30 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Assignment Operator calls PutValue(lref, rval)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, rval) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {x: 1};
+
+  with (scope) {
+    x = (delete scope.x, 2);
+  }
+
+  if (scope.x !== 2) {
+    $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/assignment/S11.13.1_A5_T2.js b/test/language/expressions/assignment/S11.13.1_A5_T2.js
new file mode 100755
index 0000000000..4850d96810
--- /dev/null
+++ b/test/language/expressions/assignment/S11.13.1_A5_T2.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Assignment Operator calls PutValue(lref, rval)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, rval) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {x: 1};
+
+with (scope) {
+  x = (delete scope.x, 2);
+}
+
+if (scope.x !== 2) {
+  $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/assignment/S11.13.1_A5_T3.js b/test/language/expressions/assignment/S11.13.1_A5_T3.js
new file mode 100755
index 0000000000..874579c684
--- /dev/null
+++ b/test/language/expressions/assignment/S11.13.1_A5_T3.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Assignment Operator calls PutValue(lref, rval)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, rval) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+flags: [noStrict]
+---*/
+
+var outerScope = {x: 0};
+var innerScope = {x: 1};
+
+with (outerScope) {
+  with (innerScope) {
+    x = (delete innerScope.x, 2);
+  }
+}
+
+if (innerScope.x !== 2) {
+  $ERROR('#1: innerScope.x === 2. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/assignment/S11.13.1_A5_T4.js b/test/language/expressions/assignment/S11.13.1_A5_T4.js
new file mode 100755
index 0000000000..74924f150f
--- /dev/null
+++ b/test/language/expressions/assignment/S11.13.1_A5_T4.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Assignment Operator calls PutValue(lref, rval)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, rval) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when assignment is in strict-mode code and the
+    original binding is no longer present.
+flags: [noStrict]
+---*/
+
+var scope = {x: 1};
+
+with (scope) {
+  (function() {
+    "use strict";
+    x = (delete scope.x, 2);
+  })();
+}
+
+if (scope.x !== 2) {
+  $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/assignment/S11.13.1_A5_T5.js b/test/language/expressions/assignment/S11.13.1_A5_T5.js
new file mode 100755
index 0000000000..b6a3393614
--- /dev/null
+++ b/test/language/expressions/assignment/S11.13.1_A5_T5.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Assignment Operator calls PutValue(lref, rval)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, rval) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when assignment is in strict-mode code and the
+    original binding is no longer present.
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  value: 1
+});
+
+(function() {
+  "use strict";
+  x = (delete fnGlobalObject().x, 2);
+})();
+
+if (fnGlobalObject().x !== 2) {
+  $ERROR('#1: fnGlobalObject().x === 2. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/assignment/S11.13.1_A6_T1.js b/test/language/expressions/assignment/S11.13.1_A6_T1.js
new file mode 100755
index 0000000000..e1fc3f7313
--- /dev/null
+++ b/test/language/expressions/assignment/S11.13.1_A6_T1.js
@@ -0,0 +1,28 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Assignment Operator calls PutValue(lref, rval)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    declarative environment record. PutValue(lref, rval) uses the initially
+    created Reference even if a more local binding is available.
+flags: [noStrict]
+---*/
+
+function testAssignment() {
+  var x = 0;
+  var innerX = (function() {
+    x = (eval("var x;"), 1);
+    return x;
+  })();
+
+  if (innerX !== undefined) {
+    $ERROR('#1: innerX === undefined. Actual: ' + (innerX));
+  }
+  if (x !== 1) {
+    $ERROR('#2: x === 1. Actual: ' + (x));
+  }
+}
+testAssignment();
diff --git a/test/language/expressions/assignment/S11.13.1_A6_T2.js b/test/language/expressions/assignment/S11.13.1_A6_T2.js
new file mode 100755
index 0000000000..2c244ac6ea
--- /dev/null
+++ b/test/language/expressions/assignment/S11.13.1_A6_T2.js
@@ -0,0 +1,28 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Assignment Operator calls PutValue(lref, rval)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    declarative environment record. PutValue(lref, rval) uses the initially
+    created Reference even if a more local binding is available.
+flags: [noStrict]
+---*/
+
+function testAssignment() {
+  var x = 0;
+  var innerX = (function() {
+    x = (eval("var x = 2;"), 1);
+    return x;
+  })();
+
+  if (innerX !== 2) {
+    $ERROR('#1: innerX === 2. Actual: ' + (innerX));
+  }
+  if (x !== 1) {
+    $ERROR('#2: x === 1. Actual: ' + (x));
+  }
+}
+testAssignment();
diff --git a/test/language/expressions/assignment/S11.13.1_A6_T3.js b/test/language/expressions/assignment/S11.13.1_A6_T3.js
new file mode 100755
index 0000000000..3717918a48
--- /dev/null
+++ b/test/language/expressions/assignment/S11.13.1_A6_T3.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Assignment Operator calls PutValue(lref, rval)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    declarative environment record. PutValue(lref, rval) uses the initially
+    created Reference even if a more local binding is available.
+flags: [noStrict]
+---*/
+
+function testAssignment() {
+  var x = 0;
+  var scope = {};
+
+  with (scope) {
+    x = (scope.x = 2, 1);
+  }
+
+  if (scope.x !== 2) {
+    $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+  }
+  if (x !== 1) {
+    $ERROR('#2: x === 1. Actual: ' + (x));
+  }
+}
+testAssignment();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.10_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A5.10_T1.js
new file mode 100755
index 0000000000..cafb27cf36
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.10_T1.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+    Check operator is "x ^= y".
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 2;
+    }
+  };
+
+  with (scope) {
+    x ^= 3;
+  }
+
+  if (scope.x !== 1) {
+    $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.10_T2.js b/test/language/expressions/compound-assignment/S11.13.2_A5.10_T2.js
new file mode 100755
index 0000000000..2822744526
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.10_T2.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+    Check operator is "x ^= y".
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  x ^= 3;
+}
+
+if (scope.x !== 1) {
+  $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.10_T3.js b/test/language/expressions/compound-assignment/S11.13.2_A5.10_T3.js
new file mode 100755
index 0000000000..7c93934362
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.10_T3.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+    Check operator is "x ^= y".
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    x ^= 3;
+  }
+}
+
+if (innerScope.x !== 1) {
+  $ERROR('#1: innerScope.x === 1. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.10_T4.js b/test/language/expressions/compound-assignment/S11.13.2_A5.10_T4.js
new file mode 100755
index 0000000000..7860a32a19
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.10_T4.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x ^= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x ^= y".
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    x ^= 3;
+  })();
+}
+
+if (scope.x !== 1) {
+  $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.10_T5.js b/test/language/expressions/compound-assignment/S11.13.2_A5.10_T5.js
new file mode 100755
index 0000000000..2e44feabc0
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.10_T5.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x ^= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x ^= y".
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 2;
+  }
+});
+
+(function() {
+  "use strict";
+  x ^= 3;
+})();
+
+if (fnGlobalObject().x !== 1) {
+  $ERROR('#1: fnGlobalObject().x === 1. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.11_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A5.11_T1.js
new file mode 100755
index 0000000000..84bdc34fd4
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.11_T1.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+    Check operator is "x |= y".
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 2;
+    }
+  };
+
+  with (scope) {
+    x |= 4;
+  }
+
+  if (scope.x !== 6) {
+    $ERROR('#1: scope.x === 6. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.11_T2.js b/test/language/expressions/compound-assignment/S11.13.2_A5.11_T2.js
new file mode 100755
index 0000000000..2d9af20b7c
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.11_T2.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+    Check operator is "x |= y".
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  x |= 4;
+}
+
+if (scope.x !== 6) {
+  $ERROR('#1: scope.x === 6. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.11_T3.js b/test/language/expressions/compound-assignment/S11.13.2_A5.11_T3.js
new file mode 100755
index 0000000000..82a1831c2f
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.11_T3.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+    Check operator is "x |= y".
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    x |= 4;
+  }
+}
+
+if (innerScope.x !== 6) {
+  $ERROR('#1: innerScope.x === 6. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.11_T4.js b/test/language/expressions/compound-assignment/S11.13.2_A5.11_T4.js
new file mode 100755
index 0000000000..25edd063f7
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.11_T4.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x |= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x |= y".
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    x |= 4;
+  })();
+}
+
+if (scope.x !== 6) {
+  $ERROR('#1: scope.x === 6. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.11_T5.js b/test/language/expressions/compound-assignment/S11.13.2_A5.11_T5.js
new file mode 100755
index 0000000000..37ff88d695
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.11_T5.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x |= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x |= y".
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 2;
+  }
+});
+
+(function() {
+  "use strict";
+  x |= 4;
+})();
+
+if (fnGlobalObject().x !== 6) {
+  $ERROR('#1: fnGlobalObject().x === 6. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.1_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A5.1_T1.js
new file mode 100755
index 0000000000..b84848127c
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.1_T1.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+    Check operator is "x *= y".
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 2;
+    }
+  };
+
+  with (scope) {
+    x *= 3;
+  }
+
+  if (scope.x !== 6) {
+    $ERROR('#1: scope.x === 6. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.1_T2.js b/test/language/expressions/compound-assignment/S11.13.2_A5.1_T2.js
new file mode 100755
index 0000000000..dc36113412
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.1_T2.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+    Check operator is "x *= y".
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  x *= 3;
+}
+
+if (scope.x !== 6) {
+  $ERROR('#1: scope.x === 6. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.1_T3.js b/test/language/expressions/compound-assignment/S11.13.2_A5.1_T3.js
new file mode 100755
index 0000000000..3828108946
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.1_T3.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+    Check operator is "x *= y".
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    x *= 3;
+  }
+}
+
+if (innerScope.x !== 6) {
+  $ERROR('#1: innerScope.x === 6. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.1_T4.js b/test/language/expressions/compound-assignment/S11.13.2_A5.1_T4.js
new file mode 100755
index 0000000000..6271b1f05d
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.1_T4.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x *= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x *= y".
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    x *= 3;
+  })();
+}
+
+if (scope.x !== 6) {
+  $ERROR('#1: scope.x === 6. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.1_T5.js b/test/language/expressions/compound-assignment/S11.13.2_A5.1_T5.js
new file mode 100755
index 0000000000..1e78dd1a35
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.1_T5.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x *= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x *= y".
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 2;
+  }
+});
+
+(function() {
+  "use strict";
+  x *= 3;
+})();
+
+if (fnGlobalObject().x !== 6) {
+  $ERROR('#1: fnGlobalObject().x === 6. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.2_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A5.2_T1.js
new file mode 100755
index 0000000000..b0601e9a58
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.2_T1.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+    Check operator is "x /= y".
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 6;
+    }
+  };
+
+  with (scope) {
+    x /= 3;
+  }
+
+  if (scope.x !== 2) {
+    $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.2_T2.js b/test/language/expressions/compound-assignment/S11.13.2_A5.2_T2.js
new file mode 100755
index 0000000000..452f06fcb1
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.2_T2.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+    Check operator is "x /= y".
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 6;
+  }
+};
+
+with (scope) {
+  x /= 3;
+}
+
+if (scope.x !== 2) {
+  $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.2_T3.js b/test/language/expressions/compound-assignment/S11.13.2_A5.2_T3.js
new file mode 100755
index 0000000000..d31665890d
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.2_T3.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+    Check operator is "x /= y".
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 6;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    x /= 3;
+  }
+}
+
+if (innerScope.x !== 2) {
+  $ERROR('#1: innerScope.x === 2. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.2_T4.js b/test/language/expressions/compound-assignment/S11.13.2_A5.2_T4.js
new file mode 100755
index 0000000000..e860d2a456
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.2_T4.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x /= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x /= y".
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 6;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    x /= 3;
+  })();
+}
+
+if (scope.x !== 2) {
+  $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.2_T5.js b/test/language/expressions/compound-assignment/S11.13.2_A5.2_T5.js
new file mode 100755
index 0000000000..8b255af103
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.2_T5.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x /= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x /= y".
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 6;
+  }
+});
+
+(function() {
+  "use strict";
+  x /= 3;
+})();
+
+if (fnGlobalObject().x !== 2) {
+  $ERROR('#1: fnGlobalObject().x === 2. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.3_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A5.3_T1.js
new file mode 100755
index 0000000000..176689d687
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.3_T1.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+    Check operator is "x %= y".
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 5;
+    }
+  };
+
+  with (scope) {
+    x %= 3;
+  }
+
+  if (scope.x !== 2) {
+    $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.3_T2.js b/test/language/expressions/compound-assignment/S11.13.2_A5.3_T2.js
new file mode 100755
index 0000000000..f969c365d5
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.3_T2.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+    Check operator is "x %= y".
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 5;
+  }
+};
+
+with (scope) {
+  x %= 3;
+}
+
+if (scope.x !== 2) {
+  $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.3_T3.js b/test/language/expressions/compound-assignment/S11.13.2_A5.3_T3.js
new file mode 100755
index 0000000000..153c8d5e4e
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.3_T3.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+    Check operator is "x %= y".
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 5;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    x %= 3;
+  }
+}
+
+if (innerScope.x !== 2) {
+  $ERROR('#1: innerScope.x === 2. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.3_T4.js b/test/language/expressions/compound-assignment/S11.13.2_A5.3_T4.js
new file mode 100755
index 0000000000..f2f918bd19
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.3_T4.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x %= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x %= y".
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 5;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    x %= 3;
+  })();
+}
+
+if (scope.x !== 2) {
+  $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.3_T5.js b/test/language/expressions/compound-assignment/S11.13.2_A5.3_T5.js
new file mode 100755
index 0000000000..f7b844e8bb
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.3_T5.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x %= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x %= y".
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 5;
+  }
+});
+
+(function() {
+  "use strict";
+  x %= 3;
+})();
+
+if (fnGlobalObject().x !== 2) {
+  $ERROR('#1: fnGlobalObject().x === 2. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.4_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A5.4_T1.js
new file mode 100755
index 0000000000..844c3b07ca
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.4_T1.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+    Check operator is "x += y".
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 2;
+    }
+  };
+
+  with (scope) {
+    x += 1;
+  }
+
+  if (scope.x !== 3) {
+    $ERROR('#1: scope.x === 3. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.4_T2.js b/test/language/expressions/compound-assignment/S11.13.2_A5.4_T2.js
new file mode 100755
index 0000000000..255288bd2d
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.4_T2.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+    Check operator is "x += y".
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  x += 1;
+}
+
+if (scope.x !== 3) {
+  $ERROR('#1: scope.x === 3. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.4_T3.js b/test/language/expressions/compound-assignment/S11.13.2_A5.4_T3.js
new file mode 100755
index 0000000000..54755f96d4
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.4_T3.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+    Check operator is "x += y".
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    x += 1;
+  }
+}
+
+if (innerScope.x !== 3) {
+  $ERROR('#1: innerScope.x === 3. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.4_T4.js b/test/language/expressions/compound-assignment/S11.13.2_A5.4_T4.js
new file mode 100755
index 0000000000..22165d9055
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.4_T4.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x += y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x += y".
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    x += 1;
+  })();
+}
+
+if (scope.x !== 3) {
+  $ERROR('#1: scope.x === 3. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.4_T5.js b/test/language/expressions/compound-assignment/S11.13.2_A5.4_T5.js
new file mode 100755
index 0000000000..3002cc9ebf
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.4_T5.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x += y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x += y".
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 2;
+  }
+});
+
+(function() {
+  "use strict";
+  x += 1;
+})();
+
+if (fnGlobalObject().x !== 3) {
+  $ERROR('#1: fnGlobalObject().x === 3. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.5_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A5.5_T1.js
new file mode 100755
index 0000000000..93c7b9314d
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.5_T1.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+    Check operator is "x -= y".
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 2;
+    }
+  };
+
+  with (scope) {
+    x -= 1;
+  }
+
+  if (scope.x !== 1) {
+    $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.5_T2.js b/test/language/expressions/compound-assignment/S11.13.2_A5.5_T2.js
new file mode 100755
index 0000000000..dbdccdb303
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.5_T2.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+    Check operator is "x -= y".
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  x -= 1;
+}
+
+if (scope.x !== 1) {
+  $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.5_T3.js b/test/language/expressions/compound-assignment/S11.13.2_A5.5_T3.js
new file mode 100755
index 0000000000..de7874b087
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.5_T3.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+    Check operator is "x -= y".
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    x -= 1;
+  }
+}
+
+if (innerScope.x !== 1) {
+  $ERROR('#1: innerScope.x === 1. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.5_T4.js b/test/language/expressions/compound-assignment/S11.13.2_A5.5_T4.js
new file mode 100755
index 0000000000..295e6e2a8d
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.5_T4.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x -= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x -= y".
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    x -= 1;
+  })();
+}
+
+if (scope.x !== 1) {
+  $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.5_T5.js b/test/language/expressions/compound-assignment/S11.13.2_A5.5_T5.js
new file mode 100755
index 0000000000..993cb3ea2e
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.5_T5.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x -= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x -= y".
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 2;
+  }
+});
+
+(function() {
+  "use strict";
+  x -= 1;
+})();
+
+if (fnGlobalObject().x !== 1) {
+  $ERROR('#1: fnGlobalObject().x === 1. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.6_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A5.6_T1.js
new file mode 100755
index 0000000000..71aeb004f0
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.6_T1.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+    Check operator is "x <<= y".
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 2;
+    }
+  };
+
+  with (scope) {
+    x <<= 3;
+  }
+
+  if (scope.x !== 16) {
+    $ERROR('#1: scope.x === 16. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.6_T2.js b/test/language/expressions/compound-assignment/S11.13.2_A5.6_T2.js
new file mode 100755
index 0000000000..fe3b3276e6
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.6_T2.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+    Check operator is "x <<= y".
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  x <<= 3;
+}
+
+if (scope.x !== 16) {
+  $ERROR('#1: scope.x === 16. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.6_T3.js b/test/language/expressions/compound-assignment/S11.13.2_A5.6_T3.js
new file mode 100755
index 0000000000..0e7f0d5498
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.6_T3.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+    Check operator is "x <<= y".
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    x <<= 3;
+  }
+}
+
+if (innerScope.x !== 16) {
+  $ERROR('#1: innerScope.x === 16. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.6_T4.js b/test/language/expressions/compound-assignment/S11.13.2_A5.6_T4.js
new file mode 100755
index 0000000000..f09709a3b2
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.6_T4.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x <<= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x <<= y".
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    x <<= 3;
+  })();
+}
+
+if (scope.x !== 16) {
+  $ERROR('#1: scope.x === 16. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.6_T5.js b/test/language/expressions/compound-assignment/S11.13.2_A5.6_T5.js
new file mode 100755
index 0000000000..4097e36d53
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.6_T5.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x <<= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x <<= y".
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 2;
+  }
+});
+
+(function() {
+  "use strict";
+  x <<= 3;
+})();
+
+if (fnGlobalObject().x !== 16) {
+  $ERROR('#1: fnGlobalObject().x === 16. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.7_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A5.7_T1.js
new file mode 100755
index 0000000000..08be817e5d
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.7_T1.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+    Check operator is "x >>= y".
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 16;
+    }
+  };
+
+  with (scope) {
+    x >>= 3;
+  }
+
+  if (scope.x !== 2) {
+    $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.7_T2.js b/test/language/expressions/compound-assignment/S11.13.2_A5.7_T2.js
new file mode 100755
index 0000000000..4cdb34e475
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.7_T2.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+    Check operator is "x >>= y".
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 16;
+  }
+};
+
+with (scope) {
+  x >>= 3;
+}
+
+if (scope.x !== 2) {
+  $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.7_T3.js b/test/language/expressions/compound-assignment/S11.13.2_A5.7_T3.js
new file mode 100755
index 0000000000..ae5880b76a
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.7_T3.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+    Check operator is "x >>= y".
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 16;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    x >>= 3;
+  }
+}
+
+if (innerScope.x !== 2) {
+  $ERROR('#1: innerScope.x === 2. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.7_T4.js b/test/language/expressions/compound-assignment/S11.13.2_A5.7_T4.js
new file mode 100755
index 0000000000..3a77770860
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.7_T4.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x >>= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x >>= y".
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 16;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    x >>= 3;
+  })();
+}
+
+if (scope.x !== 2) {
+  $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.7_T5.js b/test/language/expressions/compound-assignment/S11.13.2_A5.7_T5.js
new file mode 100755
index 0000000000..400adb4543
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.7_T5.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x >>= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x >>= y".
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 16;
+  }
+});
+
+(function() {
+  "use strict";
+  x >>= 3;
+})();
+
+if (fnGlobalObject().x !== 2) {
+  $ERROR('#1: fnGlobalObject().x === 2. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.8_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A5.8_T1.js
new file mode 100755
index 0000000000..5f2f35bb0b
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.8_T1.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+    Check operator is "x >>>= y".
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 16;
+    }
+  };
+
+  with (scope) {
+    x >>>= 3;
+  }
+
+  if (scope.x !== 2) {
+    $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.8_T2.js b/test/language/expressions/compound-assignment/S11.13.2_A5.8_T2.js
new file mode 100755
index 0000000000..bcc8cfec5f
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.8_T2.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+    Check operator is "x >>>= y".
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 16;
+  }
+};
+
+with (scope) {
+  x >>>= 3;
+}
+
+if (scope.x !== 2) {
+  $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.8_T3.js b/test/language/expressions/compound-assignment/S11.13.2_A5.8_T3.js
new file mode 100755
index 0000000000..8dee0779c0
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.8_T3.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+    Check operator is "x >>>= y".
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 16;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    x >>>= 3;
+  }
+}
+
+if (innerScope.x !== 2) {
+  $ERROR('#1: innerScope.x === 2. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.8_T4.js b/test/language/expressions/compound-assignment/S11.13.2_A5.8_T4.js
new file mode 100755
index 0000000000..67e2de3a63
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.8_T4.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x >>>= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x >>>= y".
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 16;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    x >>>= 3;
+  })();
+}
+
+if (scope.x !== 2) {
+  $ERROR('#1: scope.x === 2. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.8_T5.js b/test/language/expressions/compound-assignment/S11.13.2_A5.8_T5.js
new file mode 100755
index 0000000000..3982a1d6d3
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.8_T5.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x >>>= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x >>>= y".
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 16;
+  }
+});
+
+(function() {
+  "use strict";
+  x >>>= 3;
+})();
+
+if (fnGlobalObject().x !== 2) {
+  $ERROR('#1: fnGlobalObject().x === 2. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.9_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A5.9_T1.js
new file mode 100755
index 0000000000..be6ee5e30e
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.9_T1.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+    Check operator is "x &= y".
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 5;
+    }
+  };
+
+  with (scope) {
+    x &= 3;
+  }
+
+  if (scope.x !== 1) {
+    $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.9_T2.js b/test/language/expressions/compound-assignment/S11.13.2_A5.9_T2.js
new file mode 100755
index 0000000000..01f7fd6239
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.9_T2.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+    Check operator is "x &= y".
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 5;
+  }
+};
+
+with (scope) {
+  x &= 3;
+}
+
+if (scope.x !== 1) {
+  $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.9_T3.js b/test/language/expressions/compound-assignment/S11.13.2_A5.9_T3.js
new file mode 100755
index 0000000000..3ef60424c5
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.9_T3.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+    Check operator is "x &= y".
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 5;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    x &= 3;
+  }
+}
+
+if (innerScope.x !== 1) {
+  $ERROR('#1: innerScope.x === 1. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.9_T4.js b/test/language/expressions/compound-assignment/S11.13.2_A5.9_T4.js
new file mode 100755
index 0000000000..eaedb8c7de
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.9_T4.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x &= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x &= y".
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 5;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    x &= 3;
+  })();
+}
+
+if (scope.x !== 1) {
+  $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A5.9_T5.js b/test/language/expressions/compound-assignment/S11.13.2_A5.9_T5.js
new file mode 100755
index 0000000000..dd0465397f
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A5.9_T5.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lref, v) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x &= y' is in strict-mode code and the
+    original binding is no longer present.
+    Check operator is "x &= y".
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 5;
+  }
+});
+
+(function() {
+  "use strict";
+  x &= 3;
+})();
+
+if (fnGlobalObject().x !== 1) {
+  $ERROR('#1: fnGlobalObject().x === 1. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A6.10_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A6.10_T1.js
new file mode 100755
index 0000000000..6806d2ea46
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A6.10_T1.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    declarative environment record. PutValue(lref, v) uses the initially
+    created Reference even if a more local binding is available.
+    Check operator is "x ^= y".
+flags: [noStrict]
+---*/
+
+function testCompoundAssignment() {
+  var x = 1;
+  var innerX = (function() {
+    x ^= (eval("var x = 2;"), 4);
+    return x;
+  })();
+
+  if (innerX !== 2) {
+    $ERROR('#1: innerX === 2. Actual: ' + (innerX));
+  }
+  if (x !== 5) {
+    $ERROR('#2: x === 5. Actual: ' + (x));
+  }
+}
+testCompoundAssignment();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A6.11_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A6.11_T1.js
new file mode 100755
index 0000000000..64920b83c9
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A6.11_T1.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    declarative environment record. PutValue(lref, v) uses the initially
+    created Reference even if a more local binding is available.
+    Check operator is "x |= y".
+flags: [noStrict]
+---*/
+
+function testCompoundAssignment() {
+  var x = 1;
+  var innerX = (function() {
+    x |= (eval("var x = 2;"), 4);
+    return x;
+  })();
+
+  if (innerX !== 2) {
+    $ERROR('#1: innerX === 2. Actual: ' + (innerX));
+  }
+  if (x !== 5) {
+    $ERROR('#2: x === 5. Actual: ' + (x));
+  }
+}
+testCompoundAssignment();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A6.1_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A6.1_T1.js
new file mode 100755
index 0000000000..bc0814916f
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A6.1_T1.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    declarative environment record. PutValue(lref, v) uses the initially
+    created Reference even if a more local binding is available.
+    Check operator is "x *= y".
+flags: [noStrict]
+---*/
+
+function testCompoundAssignment() {
+  var x = 3;
+  var innerX = (function() {
+    x *= (eval("var x = 2;"), 4);
+    return x;
+  })();
+
+  if (innerX !== 2) {
+    $ERROR('#1: innerX === 2. Actual: ' + (innerX));
+  }
+  if (x !== 12) {
+    $ERROR('#2: x === 12. Actual: ' + (x));
+  }
+}
+testCompoundAssignment();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A6.2_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A6.2_T1.js
new file mode 100755
index 0000000000..fbb90b8454
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A6.2_T1.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    declarative environment record. PutValue(lref, v) uses the initially
+    created Reference even if a more local binding is available.
+    Check operator is "x /= y".
+flags: [noStrict]
+---*/
+
+function testCompoundAssignment() {
+  var x = 15;
+  var innerX = (function() {
+    x /= (eval("var x = 2;"), 3);
+    return x;
+  })();
+
+  if (innerX !== 2) {
+    $ERROR('#1: innerX === 2. Actual: ' + (innerX));
+  }
+  if (x !== 5) {
+    $ERROR('#2: x === 5. Actual: ' + (x));
+  }
+}
+testCompoundAssignment();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A6.3_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A6.3_T1.js
new file mode 100755
index 0000000000..d8fc7146f6
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A6.3_T1.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    declarative environment record. PutValue(lref, v) uses the initially
+    created Reference even if a more local binding is available.
+    Check operator is "x %= y".
+flags: [noStrict]
+---*/
+
+function testCompoundAssignment() {
+  var x = 7;
+  var innerX = (function() {
+    x %= (eval("var x = 2;"), 4);
+    return x;
+  })();
+
+  if (innerX !== 2) {
+    $ERROR('#1: innerX === 2. Actual: ' + (innerX));
+  }
+  if (x !== 3) {
+    $ERROR('#2: x === 3. Actual: ' + (x));
+  }
+}
+testCompoundAssignment();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A6.4_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A6.4_T1.js
new file mode 100755
index 0000000000..3bb0664ffc
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A6.4_T1.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    declarative environment record. PutValue(lref, v) uses the initially
+    created Reference even if a more local binding is available.
+    Check operator is "x += y".
+flags: [noStrict]
+---*/
+
+function testCompoundAssignment() {
+  var x = 3;
+  var innerX = (function() {
+    x += (eval("var x = 2;"), 1);
+    return x;
+  })();
+
+  if (innerX !== 2) {
+    $ERROR('#1: innerX === 2. Actual: ' + (innerX));
+  }
+  if (x !== 4) {
+    $ERROR('#2: x === 4. Actual: ' + (x));
+  }
+}
+testCompoundAssignment();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A6.5_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A6.5_T1.js
new file mode 100755
index 0000000000..0d1b98117f
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A6.5_T1.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    declarative environment record. PutValue(lref, v) uses the initially
+    created Reference even if a more local binding is available.
+    Check operator is "x -= y".
+flags: [noStrict]
+---*/
+
+function testCompoundAssignment() {
+  var x = 5;
+  var innerX = (function() {
+    x -= (eval("var x = 2;"), 1);
+    return x;
+  })();
+
+  if (innerX !== 2) {
+    $ERROR('#1: innerX === 2. Actual: ' + (innerX));
+  }
+  if (x !== 4) {
+    $ERROR('#2: x === 4. Actual: ' + (x));
+  }
+}
+testCompoundAssignment();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A6.6_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A6.6_T1.js
new file mode 100755
index 0000000000..0e39ce6799
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A6.6_T1.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    declarative environment record. PutValue(lref, v) uses the initially
+    created Reference even if a more local binding is available.
+    Check operator is "x <<= y".
+flags: [noStrict]
+---*/
+
+function testCompoundAssignment() {
+  var x = 1;
+  var innerX = (function() {
+    x <<= (eval("var x = 2;"), 3);
+    return x;
+  })();
+
+  if (innerX !== 2) {
+    $ERROR('#1: innerX === 2. Actual: ' + (innerX));
+  }
+  if (x !== 8) {
+    $ERROR('#2: x === 8. Actual: ' + (x));
+  }
+}
+testCompoundAssignment();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A6.7_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A6.7_T1.js
new file mode 100755
index 0000000000..9e24083772
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A6.7_T1.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    declarative environment record. PutValue(lref, v) uses the initially
+    created Reference even if a more local binding is available.
+    Check operator is "x >>= y".
+flags: [noStrict]
+---*/
+
+function testCompoundAssignment() {
+  var x = 8;
+  var innerX = (function() {
+    x >>= (eval("var x = 2;"), 1);
+    return x;
+  })();
+
+  if (innerX !== 2) {
+    $ERROR('#1: innerX === 2. Actual: ' + (innerX));
+  }
+  if (x !== 4) {
+    $ERROR('#2: x === 4. Actual: ' + (x));
+  }
+}
+testCompoundAssignment();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A6.8_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A6.8_T1.js
new file mode 100755
index 0000000000..f5be57cdda
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A6.8_T1.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    declarative environment record. PutValue(lref, v) uses the initially
+    created Reference even if a more local binding is available.
+    Check operator is "x >>>= y".
+flags: [noStrict]
+---*/
+
+function testCompoundAssignment() {
+  var x = 8;
+  var innerX = (function() {
+    x >>>= (eval("var x = 2;"), 1);
+    return x;
+  })();
+
+  if (innerX !== 2) {
+    $ERROR('#1: innerX === 2. Actual: ' + (innerX));
+  }
+  if (x !== 4) {
+    $ERROR('#2: x === 4. Actual: ' + (x));
+  }
+}
+testCompoundAssignment();
diff --git a/test/language/expressions/compound-assignment/S11.13.2_A6.9_T1.js b/test/language/expressions/compound-assignment/S11.13.2_A6.9_T1.js
new file mode 100755
index 0000000000..df40895a80
--- /dev/null
+++ b/test/language/expressions/compound-assignment/S11.13.2_A6.9_T1.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Compound Assignment Operator calls PutValue(lref, v)
+description: >
+    Evaluating LeftHandSideExpression lref returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    declarative environment record. PutValue(lref, v) uses the initially
+    created Reference even if a more local binding is available.
+    Check operator is "x &= y".
+flags: [noStrict]
+---*/
+
+function testCompoundAssignment() {
+  var x = 5;
+  var innerX = (function() {
+    x &= (eval("var x = 2;"), 3);
+    return x;
+  })();
+
+  if (innerX !== 2) {
+    $ERROR('#1: innerX === 2. Actual: ' + (innerX));
+  }
+  if (x !== 1) {
+    $ERROR('#2: x === 1. Actual: ' + (x));
+  }
+}
+testCompoundAssignment();
diff --git a/test/language/expressions/postfix-decrement/S11.3.2_A5_T1.js b/test/language/expressions/postfix-decrement/S11.3.2_A5_T1.js
new file mode 100755
index 0000000000..fb43d87f16
--- /dev/null
+++ b/test/language/expressions/postfix-decrement/S11.3.2_A5_T1.js
@@ -0,0 +1,35 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator x-- calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 2;
+    }
+  };
+
+  with (scope) {
+    x--;
+  }
+
+  if (scope.x !== 1) {
+    $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/postfix-decrement/S11.3.2_A5_T2.js b/test/language/expressions/postfix-decrement/S11.3.2_A5_T2.js
new file mode 100755
index 0000000000..26f96a3855
--- /dev/null
+++ b/test/language/expressions/postfix-decrement/S11.3.2_A5_T2.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator x-- calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  x--;
+}
+
+if (scope.x !== 1) {
+  $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/postfix-decrement/S11.3.2_A5_T3.js b/test/language/expressions/postfix-decrement/S11.3.2_A5_T3.js
new file mode 100755
index 0000000000..6446e87287
--- /dev/null
+++ b/test/language/expressions/postfix-decrement/S11.3.2_A5_T3.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator x-- calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    x--;
+  }
+}
+
+if (innerScope.x !== 1) {
+  $ERROR('#1: innerScope.x === 1. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/postfix-decrement/S11.3.2_A5_T4.js b/test/language/expressions/postfix-decrement/S11.3.2_A5_T4.js
new file mode 100755
index 0000000000..aa01013595
--- /dev/null
+++ b/test/language/expressions/postfix-decrement/S11.3.2_A5_T4.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator x-- calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x--' is in strict-mode code and the
+    original binding is no longer present.
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    x--;
+  })();
+}
+
+if (scope.x !== 1) {
+  $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/postfix-decrement/S11.3.2_A5_T5.js b/test/language/expressions/postfix-decrement/S11.3.2_A5_T5.js
new file mode 100755
index 0000000000..6a6c183222
--- /dev/null
+++ b/test/language/expressions/postfix-decrement/S11.3.2_A5_T5.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator x-- calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x--' is in strict-mode code and the
+    original binding is no longer present.
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 2;
+  }
+});
+
+(function() {
+  "use strict";
+  x--;
+})();
+
+if (fnGlobalObject().x !== 1) {
+  $ERROR('#1: fnGlobalObject().x === 1. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/postfix-increment/S11.3.1_A5_T1.js b/test/language/expressions/postfix-increment/S11.3.1_A5_T1.js
new file mode 100755
index 0000000000..2b4bcd0532
--- /dev/null
+++ b/test/language/expressions/postfix-increment/S11.3.1_A5_T1.js
@@ -0,0 +1,35 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator x++ calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 2;
+    }
+  };
+
+  with (scope) {
+    x++;
+  }
+
+  if (scope.x !== 3) {
+    $ERROR('#1: scope.x === 3. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/postfix-increment/S11.3.1_A5_T2.js b/test/language/expressions/postfix-increment/S11.3.1_A5_T2.js
new file mode 100755
index 0000000000..ade4a0a9b0
--- /dev/null
+++ b/test/language/expressions/postfix-increment/S11.3.1_A5_T2.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator x++ calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  x++;
+}
+
+if (scope.x !== 3) {
+  $ERROR('#1: scope.x === 3. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/postfix-increment/S11.3.1_A5_T3.js b/test/language/expressions/postfix-increment/S11.3.1_A5_T3.js
new file mode 100755
index 0000000000..6e3c717193
--- /dev/null
+++ b/test/language/expressions/postfix-increment/S11.3.1_A5_T3.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator x++ calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    x++;
+  }
+}
+
+if (innerScope.x !== 3) {
+  $ERROR('#1: innerScope.x === 3. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/postfix-increment/S11.3.1_A5_T4.js b/test/language/expressions/postfix-increment/S11.3.1_A5_T4.js
new file mode 100755
index 0000000000..41468ff553
--- /dev/null
+++ b/test/language/expressions/postfix-increment/S11.3.1_A5_T4.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator x++ calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x++' is in strict-mode code and the
+    original binding is no longer present.
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    x++;
+  })();
+}
+
+if (scope.x !== 3) {
+  $ERROR('#1: scope.x === 3. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/postfix-increment/S11.3.1_A5_T5.js b/test/language/expressions/postfix-increment/S11.3.1_A5_T5.js
new file mode 100755
index 0000000000..a078046187
--- /dev/null
+++ b/test/language/expressions/postfix-increment/S11.3.1_A5_T5.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator x++ calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when 'x++' is in strict-mode code and the
+    original binding is no longer present.
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 2;
+  }
+});
+
+(function() {
+  "use strict";
+  x++;
+})();
+
+if (fnGlobalObject().x !== 3) {
+  $ERROR('#1: fnGlobalObject().x === 3. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/prefix-decrement/S11.4.5_A5_T1.js b/test/language/expressions/prefix-decrement/S11.4.5_A5_T1.js
new file mode 100755
index 0000000000..a868280068
--- /dev/null
+++ b/test/language/expressions/prefix-decrement/S11.4.5_A5_T1.js
@@ -0,0 +1,35 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator --x calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 2;
+    }
+  };
+
+  with (scope) {
+    --x;
+  }
+
+  if (scope.x !== 1) {
+    $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/prefix-decrement/S11.4.5_A5_T2.js b/test/language/expressions/prefix-decrement/S11.4.5_A5_T2.js
new file mode 100755
index 0000000000..a501cb6308
--- /dev/null
+++ b/test/language/expressions/prefix-decrement/S11.4.5_A5_T2.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator --x calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  --x;
+}
+
+if (scope.x !== 1) {
+  $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/prefix-decrement/S11.4.5_A5_T3.js b/test/language/expressions/prefix-decrement/S11.4.5_A5_T3.js
new file mode 100755
index 0000000000..0925e780dc
--- /dev/null
+++ b/test/language/expressions/prefix-decrement/S11.4.5_A5_T3.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator --x calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    --x;
+  }
+}
+
+if (innerScope.x !== 1) {
+  $ERROR('#1: innerScope.x === 1. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/prefix-decrement/S11.4.5_A5_T4.js b/test/language/expressions/prefix-decrement/S11.4.5_A5_T4.js
new file mode 100755
index 0000000000..58476799a3
--- /dev/null
+++ b/test/language/expressions/prefix-decrement/S11.4.5_A5_T4.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator --x calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when '--x' is in strict-mode code and the
+    original binding is no longer present.
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    --x;
+  })();
+}
+
+if (scope.x !== 1) {
+  $ERROR('#1: scope.x === 1. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/prefix-decrement/S11.4.5_A5_T5.js b/test/language/expressions/prefix-decrement/S11.4.5_A5_T5.js
new file mode 100755
index 0000000000..2bfe66d606
--- /dev/null
+++ b/test/language/expressions/prefix-decrement/S11.4.5_A5_T5.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator --x calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when '--x' is in strict-mode code and the
+    original binding is no longer present.
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 2;
+  }
+});
+
+(function() {
+  "use strict";
+  --x;
+})();
+
+if (fnGlobalObject().x !== 1) {
+  $ERROR('#1: fnGlobalObject().x === 1. Actual: ' + (fnGlobalObject().x));
+}
diff --git a/test/language/expressions/prefix-increment/S11.4.4_A5_T1.js b/test/language/expressions/prefix-increment/S11.4.4_A5_T1.js
new file mode 100755
index 0000000000..f01ee32aba
--- /dev/null
+++ b/test/language/expressions/prefix-increment/S11.4.4_A5_T1.js
@@ -0,0 +1,35 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator ++x calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding function environment record is not changed.
+flags: [noStrict]
+---*/
+
+function testFunction() {
+  var x = 0;
+  var scope = {
+    get x() {
+      delete this.x;
+      return 2;
+    }
+  };
+
+  with (scope) {
+    ++x;
+  }
+
+  if (scope.x !== 3) {
+    $ERROR('#1: scope.x === 3. Actual: ' + (scope.x));
+  }
+  if (x !== 0) {
+    $ERROR('#2: x === 0. Actual: ' + (x));
+  }
+}
+testFunction();
diff --git a/test/language/expressions/prefix-increment/S11.4.4_A5_T2.js b/test/language/expressions/prefix-increment/S11.4.4_A5_T2.js
new file mode 100755
index 0000000000..09f0d48a43
--- /dev/null
+++ b/test/language/expressions/prefix-increment/S11.4.4_A5_T2.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator ++x calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding global environment record is not changed.
+flags: [noStrict]
+---*/
+
+var x = 0;
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  ++x;
+}
+
+if (scope.x !== 3) {
+  $ERROR('#1: scope.x === 3. Actual: ' + (scope.x));
+}
+if (x !== 0) {
+  $ERROR('#2: x === 0. Actual: ' + (x));
+}
diff --git a/test/language/expressions/prefix-increment/S11.4.4_A5_T3.js b/test/language/expressions/prefix-increment/S11.4.4_A5_T3.js
new file mode 100755
index 0000000000..f9cf3cebed
--- /dev/null
+++ b/test/language/expressions/prefix-increment/S11.4.4_A5_T3.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator ++x calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    Binding in surrounding object environment record is not changed.
+flags: [noStrict]
+---*/
+
+var outerScope = {
+  x: 0
+};
+var innerScope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (outerScope) {
+  with (innerScope) {
+    ++x;
+  }
+}
+
+if (innerScope.x !== 3) {
+  $ERROR('#1: innerScope.x === 3. Actual: ' + (innerScope.x));
+}
+if (outerScope.x !== 0) {
+  $ERROR('#2: outerScope.x === 0. Actual: ' + (outerScope.x));
+}
diff --git a/test/language/expressions/prefix-increment/S11.4.4_A5_T4.js b/test/language/expressions/prefix-increment/S11.4.4_A5_T4.js
new file mode 100755
index 0000000000..12178597b8
--- /dev/null
+++ b/test/language/expressions/prefix-increment/S11.4.4_A5_T4.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator ++x calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when '++x' is in strict-mode code and the
+    original binding is no longer present.
+flags: [noStrict]
+---*/
+
+var scope = {
+  get x() {
+    delete this.x;
+    return 2;
+  }
+};
+
+with (scope) {
+  (function() {
+    "use strict";
+    ++x;
+  })();
+}
+
+if (scope.x !== 3) {
+  $ERROR('#1: scope.x === 3. Actual: ' + (scope.x));
+}
diff --git a/test/language/expressions/prefix-increment/S11.4.4_A5_T5.js b/test/language/expressions/prefix-increment/S11.4.4_A5_T5.js
new file mode 100755
index 0000000000..8702266b9b
--- /dev/null
+++ b/test/language/expressions/prefix-increment/S11.4.4_A5_T5.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2014 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Operator ++x calls PutValue(lhs, newValue)
+description: >
+    Evaluating LeftHandSideExpression lhs returns Reference type; Reference
+    base value is an environment record and environment record kind is
+    object environment record. PutValue(lhs, newValue) uses the initially
+    created Reference even if the environment binding is no longer present.
+    No ReferenceError is thrown when '++x' is in strict-mode code and the
+    original binding is no longer present.
+includes:
+    - fnGlobalObject.js
+---*/
+
+Object.defineProperty(fnGlobalObject(), "x", {
+  configurable: true,
+  get: function() {
+    delete this.x;
+    return 2;
+  }
+});
+
+(function() {
+  "use strict";
+  ++x;
+})();
+
+if (fnGlobalObject().x !== 3) {
+  $ERROR('#1: fnGlobalObject().x === 3. Actual: ' + (fnGlobalObject().x));
+}
-- 
GitLab