Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(491)

Unified Diff: test/mjsunit/harmony/destructuring-assignment.js

Issue 1309813007: [es6] implement destructuring assignment (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase*** oops Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « test/cctest/test-parsing.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/mjsunit/harmony/destructuring-assignment.js
diff --git a/test/mjsunit/harmony/destructuring-assignment.js b/test/mjsunit/harmony/destructuring-assignment.js
new file mode 100644
index 0000000000000000000000000000000000000000..d5ba9eef7cd1b6d48efe56108f7df962cd6a9ac4
--- /dev/null
+++ b/test/mjsunit/harmony/destructuring-assignment.js
@@ -0,0 +1,430 @@
+// Copyright 2015 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-destructuring-assignment --harmony-destructuring-bind
+
+// script-level tests
+var ox, oy = {}, oz;
+({
+ x: ox,
+ y: oy.value,
+ y2: oy["value2"],
+ z: ({ set v(val) { oz = val; } }).v
+} = {
+ x: "value of x",
+ y: "value of y1",
+ y2: "value of y2",
+ z: "value of z"
+});
+assertEquals("value of x", ox);
+assertEquals("value of y1", oy.value);
+assertEquals("value of y2", oy.value2);
+assertEquals("value of z", oz);
+
+[ox, oy.value, oy["value2"], ...{ set v(val) { oz = val; } }.v] = [
+ 1007,
+ 798432,
+ 555,
+ 1, 2, 3, 4, 5
+];
+assertEquals(ox, 1007);
+assertEquals(oy.value, 798432);
+assertEquals(oy.value2, 555);
+assertEquals(oz, [1, 2, 3, 4, 5]);
+
+
+(function testInFunction() {
+ var x, y = {}, z;
+ ({
+ x: x,
+ y: y.value,
+ y2: y["value2"],
+ z: ({ set v(val) { z = val; } }).v
+ } = {
+ x: "value of x",
+ y: "value of y1",
+ y2: "value of y2",
+ z: "value of z"
+ });
+ assertEquals("value of x", x);
+ assertEquals("value of y1", y.value);
+ assertEquals("value of y2", y.value2);
+ assertEquals("value of z", z);
+
+ [x, y.value, y["value2"], ...{ set v(val) { z = val; } }.v] = [
+ 1007,
+ 798432,
+ 555,
+ 1, 2, 3, 4, 5
+ ];
+ assertEquals(x, 1007);
+ assertEquals(y.value, 798432);
+ assertEquals(y.value2, 555);
+ assertEquals(z, [1, 2, 3, 4, 5]);
+})();
+
+
+(function testArrowFunctionInitializers() {
+ var fn = (config = {
+ value: defaults.value,
+ nada: { nada: defaults.nada } = { nada: "nothing" }
+ } = { value: "BLAH" }) => config;
+ var defaults = {};
+ assertEquals({ value: "BLAH" }, fn());
+ assertEquals("BLAH", defaults.value);
+ assertEquals("nothing", defaults.nada);
+})();
+
+
+(function testArrowFunctionInitializers2() {
+ var fn = (config = [
+ defaults.value,
+ { nada: defaults.nada } = { nada: "nothing" }
+ ] = ["BLAH"]) => config;
+ var defaults = {};
+ assertEquals(["BLAH"], fn());
+ assertEquals("BLAH", defaults.value);
+ assertEquals("nothing", defaults.nada);
+})();
+
+
+(function testFunctionInitializers() {
+ function fn(config = {
+ value: defaults.value,
+ nada: { nada: defaults.nada } = { nada: "nothing" }
+ } = { value: "BLAH" }) {
+ return config;
+ }
+ var defaults = {};
+ assertEquals({ value: "BLAH" }, fn());
+ assertEquals("BLAH", defaults.value);
+ assertEquals("nothing", defaults.nada);
+})();
+
+
+(function testFunctionInitializers2() {
+ function fn(config = [
+ defaults.value,
+ { nada: defaults.nada } = { nada: "nothing" }
+ ] = ["BLAH"]) { return config; }
+ var defaults = {};
+ assertEquals(["BLAH"], fn());
+ assertEquals("BLAH", defaults.value);
+ assertEquals("nothing", defaults.nada);
+})();
+
+
+(function testDeclarationInitializers() {
+ var defaults = {};
+ var { value } = { value: defaults.value } = { value: "BLAH" };
+ assertEquals("BLAH", value);
+ assertEquals("BLAH", defaults.value);
+})();
+
+
+(function testDeclarationInitializers2() {
+ var defaults = {};
+ var [value] = [defaults.value] = ["BLAH"];
+ assertEquals("BLAH", value);
+ assertEquals("BLAH", defaults.value);
+})();
+
+
+(function testObjectLiteralProperty() {
+ var ext = {};
+ var obj = {
+ a: { b: ext.b, c: ext["c"], d: { set v(val) { ext.d = val; } }.v } = {
+ b: "b", c: "c", d: "d" }
+ };
+ assertEquals({ b: "b", c: "c", d: "d" }, ext);
+ assertEquals({ a: { b: "b", c: "c", d: "d" } }, obj);
+})();
+
+
+(function testArrayLiteralProperty() {
+ var ext = {};
+ var obj = [
+ ...[ ext.b, ext["c"], { set v(val) { ext.d = val; } }.v ] = [
+ "b", "c", "d" ]
+ ];
+ assertEquals({ b: "b", c: "c", d: "d" }, ext);
+ assertEquals([ "b", "c", "d" ], obj);
+})();
+
+
+// TODO(caitp): add similar test for ArrayPatterns, once Proxies support
+// delegating symbol-keyed get/set.
+(function testObjectPatternOperationOrder() {
+ var steps = [];
+ var store = {};
+ function computePropertyName(name) {
+ steps.push("compute name: " + name);
+ return name;
+ }
+ function loadValue(descr, value) {
+ steps.push("load: " + descr + " > " + value);
+ return value;
+ }
+ function storeValue(descr, name, value) {
+ steps.push("store: " + descr + " = " + value);
+ store[name] = value;
+ }
+ var result = {
+ get a() { assertUnreachable(); },
+ set a(value) { storeValue("result.a", "a", value); },
+ get b() { assertUnreachable(); },
+ set b(value) { storeValue("result.b", "b", value); }
+ };
+
+ ({
+ obj: {
+ x: result.a = 10,
+ [computePropertyName("y")]: result.b = false,
+ } = {}
+ } = { obj: {
+ get x() { return loadValue(".temp.obj.x", undefined); },
+ set x(value) { assertUnreachable(); },
+ get y() { return loadValue(".temp.obj.y", undefined); },
+ set y(value) { assertUnreachable(); }
+ }});
+
+ assertPropertiesEqual({
+ a: 10,
+ b: false
+ }, store);
+
+ assertArrayEquals([
+ "load: .temp.obj.x > undefined",
+ "store: result.a = 10",
+
+ "compute name: y",
+ "load: .temp.obj.y > undefined",
+ "store: result.b = false"
+ ], steps);
+
+ steps = [];
+
+ ({
+ obj: {
+ x: result.a = 50,
+ [computePropertyName("y")]: result.b = "hello",
+ } = {}
+ } = { obj: {
+ get x() { return loadValue(".temp.obj.x", 20); },
+ set x(value) { assertUnreachable(); },
+ get y() { return loadValue(".temp.obj.y", true); },
+ set y(value) { assertUnreachable(); }
+ }});
+
+ assertPropertiesEqual({
+ a: 20,
+ b: true
+ }, store);
+
+ assertArrayEquals([
+ "load: .temp.obj.x > 20",
+ "store: result.a = 20",
+ "compute name: y",
+ "load: .temp.obj.y > true",
+ "store: result.b = true",
+ ], steps);
+})();
+
+// Credit to Mike Pennisi and other Test262 contributors for originally writing
+// the testse the following are based on.
+(function testArrayElision() {
+ var value = [1, 2, 3, 4, 5, 6, 7, 8, 9];
+ var a, obj = {};
+ var result = [, a, , obj.b, , ...obj["rest"]] = value;
+
+ assertEquals(result, value);
+ assertEquals(2, a);
+ assertEquals(4, obj.b);
+ assertArrayEquals([6, 7, 8, 9], obj.rest);
+})();
+
+(function testArrayElementInitializer() {
+ function test(value, initializer, expected) {
+ var a, obj = {};
+ var initialized = false;
+ var shouldBeInitialized = value[0] === undefined;
+ assertEquals(value, [ a = (initialized = true, initializer) ] = value);
+ assertEquals(expected, a);
+ assertEquals(shouldBeInitialized, initialized);
+
+ var initialized2 = false;
+ assertEquals(value, [ obj.a = (initialized2 = true, initializer) ] = value);
+ assertEquals(expected, obj.a);
+ assertEquals(shouldBeInitialized, initialized2);
+ }
+
+ test([], "BAM!", "BAM!");
+ test([], "BOOP!", "BOOP!");
+ test([null], 123, null);
+ test([undefined], 456, 456);
+ test([,], "PUPPIES", "PUPPIES");
+
+ (function accept_IN() {
+ var value = [], x;
+ assertEquals(value, [ x = 'x' in {} ] = value);
+ assertEquals(false, x);
+ })();
+
+ (function ordering() {
+ var x = 0, a, b, value = [];
+ assertEquals(value, [ a = x += 1, b = x *= 2 ] = value);
+ assertEquals(1, a);
+ assertEquals(2, b);
+ assertEquals(2, x);
+ })();
+
+ (function yieldExpression() {
+ var value = [], it, result, x;
+ it = (function*() {
+ result = [ x = yield ] = value;
+ })();
+ var next = it.next();
+
+ assertEquals(undefined, result);
+ assertEquals(undefined, next.value);
+ assertEquals(false, next.done);
+ assertEquals(undefined, x);
+
+ next = it.next(86);
+
+ assertEquals(value, result);
+ assertEquals(undefined, next.value);
+ assertEquals(true, next.done);
+ assertEquals(86, x);
+ })();
+
+ (function yieldIdentifier() {
+ var value = [], yield = "BOOP!", x;
+ assertEquals(value, [ x = yield ] = value);
+ assertEquals("BOOP!", x);
+ })();
+
+ assertThrows(function let_TDZ() {
+ "use strict";
+ var x;
+ [ x = y ] = [];
+ let y;
+ }, ReferenceError);
+})();
+
+
+(function testArrayElementNestedPattern() {
+ assertThrows(function nestedArrayRequireObjectCoercibleNull() {
+ var x; [ [ x ] ] = [ null ];
+ }, TypeError);
+
+ assertThrows(function nestedArrayRequireObjectCoercibleUndefined() {
+ var x; [ [ x ] ] = [ undefined ];
+ }, TypeError);
+
+ assertThrows(function nestedArrayRequireObjectCoercibleUndefined2() {
+ var x; [ [ x ] ] = [ ];
+ }, TypeError);
+
+ assertThrows(function nestedArrayRequireObjectCoercibleUndefined3() {
+ var x; [ [ x ] ] = [ , ];
+ }, TypeError);
+
+ assertThrows(function nestedObjectRequireObjectCoercibleNull() {
+ var x; [ { x } ] = [ null ];
+ }, TypeError);
+
+ assertThrows(function nestedObjectRequireObjectCoercibleUndefined() {
+ var x; [ { x } ] = [ undefined ];
+ }, TypeError);
+
+ assertThrows(function nestedObjectRequireObjectCoercibleUndefined2() {
+ var x; [ { x } ] = [ ];
+ }, TypeError);
+
+ assertThrows(function nestedObjectRequireObjectCoercibleUndefined3() {
+ var x; [ { x } ] = [ , ];
+ }, TypeError);
+
+ (function nestedArray() {
+ var x, value = [ [ "zap", "blonk" ] ];
+ assertEquals(value, [ [ , x ] ] = value);
+ assertEquals("blonk", x);
+ })();
+
+ (function nestedObject() {
+ var x, value = [ { a: "zap", b: "blonk" } ];
+ assertEquals(value, [ { b: x } ] = value);
+ assertEquals("blonk", x);
+ })();
+})();
+
+(function testArrayRestElement() {
+ (function testBasic() {
+ var x, rest, array = [1, 2, 3];
+ assertEquals(array, [x, ...rest] = array);
+ assertEquals(1, x);
+ assertEquals([2, 3], rest);
+
+ array = [4, 5, 6];
+ assertEquals(array, [, ...rest] = array);
+ assertEquals([5, 6], rest);
+
+ })();
+
+ (function testNestedRestObject() {
+ var value = [1, 2, 3], x;
+ assertEquals(value, [...{ 1: x }] = value);
+ assertEquals(2, x);
+ })();
+
+ (function iterable() {
+ var count = 0;
+ var x, y, z;
+ function* g() {
+ count++;
+ yield;
+ count++;
+ yield;
+ count++;
+ yield;
+ }
+ var it = g();
+ assertEquals(it, [...x] = it);
+ assertEquals([undefined, undefined, undefined], x);
+ assertEquals(3, count);
+
+ it = [g()];
+ assertEquals(it, [ [...y] ] = it);
+ assertEquals([undefined, undefined, undefined], y);
+ assertEquals(6, count);
+
+ it = { a: g() };
+ assertEquals(it, { a: [...z] } = it);
+ assertEquals([undefined, undefined, undefined], z);
+ assertEquals(9, count);
+ })();
+})();
+
+(function testRequireObjectCoercible() {
+ assertThrows(() => ({} = undefined), TypeError);
+ assertThrows(() => ({} = null), TypeError);
+ assertThrows(() => [] = undefined, TypeError);
+ assertThrows(() => [] = null, TypeError);
+ assertEquals("test", ({} = "test"));
+ assertEquals("test", [] = "test");
+ assertEquals(123, ({} = 123));
+})();
+
+(function testConstReassignment() {
+ "use strict";
+ const c = "untouchable";
+ assertThrows(() => { [ c ] = [ "nope!" ]; }, TypeError);
+ assertThrows(() => { [ [ c ] ] = [ [ "nope!" ] ]; }, TypeError);
+ assertThrows(() => { [ { c } ] = [ { c: "nope!" } ]; }, TypeError);
+ assertThrows(() => { ({ c } = { c: "nope!" }); }, TypeError);
+ assertThrows(() => { ({ a: { c } } = { a: { c: "nope!" } }); }, TypeError);
+ assertThrows(() => { ({ a: [ c ] } = { a: [ "nope!" ] }); }, TypeError);
+ assertEquals("untouchable", c);
+})();
« no previous file with comments | « test/cctest/test-parsing.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698