summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/expressions/short-circuit-compound-assignment-const.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/non262/expressions/short-circuit-compound-assignment-const.js')
-rw-r--r--js/src/tests/non262/expressions/short-circuit-compound-assignment-const.js90
1 files changed, 90 insertions, 0 deletions
diff --git a/js/src/tests/non262/expressions/short-circuit-compound-assignment-const.js b/js/src/tests/non262/expressions/short-circuit-compound-assignment-const.js
new file mode 100644
index 0000000000..8499e2fb74
--- /dev/null
+++ b/js/src/tests/non262/expressions/short-circuit-compound-assignment-const.js
@@ -0,0 +1,90 @@
+// Test assignment to const and function name bindings. The latter is kind of a
+// const binding, but only throws in strict mode.
+
+function notEvaluated() {
+ throw new Error("should not be evaluated");
+}
+
+// AndAssignExpr with const lexical binding.
+{
+ const a = false;
+ a &&= notEvaluated();
+ assertEq(a, false);
+
+ const b = true;
+ assertThrowsInstanceOf(() => { b &&= 1; }, TypeError);
+ assertEq(b, true);
+}
+
+// AndAssignExpr with function name binding.
+{
+ let f = function fn() {
+ fn &&= true;
+ assertEq(fn, f);
+ };
+ f();
+
+ let g = function fn() {
+ "use strict";
+ assertThrowsInstanceOf(() => { fn &&= 1; }, TypeError);
+ assertEq(fn, g);
+ };
+ g();
+}
+
+// OrAssignExpr with const lexical binding.
+{
+ const a = true;
+ a ||= notEvaluated();
+ assertEq(a, true);
+
+ const b = false;
+ assertThrowsInstanceOf(() => { b ||= 0; }, TypeError);
+ assertEq(b, false);
+}
+
+// OrAssignExpr with function name binding.
+{
+ let f = function fn() {
+ fn ||= notEvaluated();
+ assertEq(fn, f);
+ };
+ f();
+
+ let g = function fn() {
+ "use strict";
+ fn ||= notEvaluated();
+ assertEq(fn, g);
+ };
+ g();
+}
+
+// CoalesceAssignExpr with const lexical binding.
+{
+ const a = true;
+ a ??= notEvaluated();
+ assertEq(a, true);
+
+ const b = null;
+ assertThrowsInstanceOf(() => { b ??= 0; }, TypeError);
+ assertEq(b, null);
+}
+
+// CoalesceAssignExpr with function name binding.
+{
+ let f = function fn() {
+ fn ??= notEvaluated();
+ assertEq(fn, f);
+ };
+ f();
+
+ let g = function fn() {
+ "use strict";
+ fn ??= notEvaluated();
+ assertEq(fn, g);
+ };
+ g();
+}
+
+if (typeof reportCompare === "function")
+ reportCompare(0, 0);