Index: test/mjsunit/harmony/object-rest-basic.js |
diff --git a/test/mjsunit/harmony/object-rest-basic.js b/test/mjsunit/harmony/object-rest-basic.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4c9b564ca7c0ac7d9072261adc8f6f034e47bcef |
--- /dev/null |
+++ b/test/mjsunit/harmony/object-rest-basic.js |
@@ -0,0 +1,122 @@ |
+// // Copyright 2016 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-object-rest-spread |
+var { ...x } = { a: 1 }; |
+assertEquals({ a: 1 }, x); |
+ |
+var { ...x } = { a: 1, b: 1 }; |
+assertEquals({ a: 1, b: 1 }, x); |
+ |
+var { x, ...x } = { a: 1, b: 1 }; |
+assertEquals({ a: 1, b: 1 }, x); |
+ |
+var { x = {}, ...x } = { a: 1, b: 1 }; |
+assertEquals({ a: 1, b: 1 }, x); |
+ |
+var { y, ...x } = { y: 1, a: 1 }; |
+assertEquals({ a: 1 }, x); |
+assertEquals(1, y); |
+ |
+var { z, y, ...x } = { z:1, y: 1, a: 1, b: 1 }; |
+assertEquals({ a: 1, b:1 }, x); |
+assertEquals(1, y); |
+assertEquals(1, z); |
+ |
+({ a, ...b } = { a: 1, b: 2 }); |
+assertEquals(1, a); |
+assertEquals({ b: 2 }, b); |
+ |
+var { ...x } = {}; |
+assertEquals({}, x); |
+ |
+var key = "b"; |
+var { [key]: y, ...x } = { b: 1, a: 1 }; |
+assertEquals({ a: 1 }, x); |
+assertEquals(1, y); |
+ |
+var key = 1; |
+var { [key++]: y, ...x } = { 1: 1, a: 1 }; |
+assertEquals({ a: 1 }, x); |
+assertEquals(key, 2); |
+assertEquals(1, y); |
+ |
+function example({a, ...rest}, { b = rest }) { |
+ assertEquals(1, a); |
+ assertEquals({ b: 2, c: 3}, rest); |
+ assertEquals({ b: 2, c: 3}, b); |
+}; |
+example({ a: 1, b: 2, c: 3}, { b: undefined }); |
+ |
+var x = { a: 3 }; |
+var y = { |
+ set a(val) { assertUnreachable(); }, |
+ ...x, |
+}; |
+assertEquals(y.a, 3); |
+ |
+var x = { |
+ get a() { throw new Error(); }, |
+}; |
+assertThrows(() => { var { ...y } = x }); |
+ |
+var p = new Proxy({}, { |
+ ownKeys() { throw new Error(); } |
+}); |
+assertThrows(() => { var { ...y } = p }); |
+ |
+var p = new Proxy({}, { |
+ ownKeys() { [1]; }, |
+ get() { throw new Error(); } |
+}); |
+assertThrows(() => { var { ...y } = p }); |
+ |
+var p = new Proxy({}, { |
+ ownKeys() { [1]; }, |
+ getOwnPropertyDescriptor() { throw new Error(); } |
+}); |
+assertThrows(() => { var { ...y } = p }); |
+ |
+var z = { b: 1} |
+var p = new Proxy(z, { |
+ ownKeys() { return Object.keys(z); }, |
+ get(_, prop) { return z[prop]; }, |
+ getOwnPropertyDescriptor(_, prop) { |
+ return Object.getOwnPropertyDescriptor(z, prop); |
+ }, |
+}); |
+var { ...y } = p ; |
+assertEquals(z, y); |
+ |
+var z = { b: 1} |
+var { ...y } = { ...z} ; |
+assertEquals(z, y); |
+ |
+var count = 0; |
+class Foo { |
+ constructor(x) { this.x = x; } |
+ toString() { count++; return this.x.toString(); } |
+} |
+var f = new Foo(1); |
+var { [f] : x, ...y } = { 1: 1, 2: 2} |
+assertEquals(1, count); |
+assertEquals({2: 2}, y); |
+ |
+var { 1: x, 2: y, ...z } = { 1: 1, 2: 2, 3:3 }; |
+assertEquals(1, x); |
+assertEquals(2, y); |
+assertEquals({ 3: 3 }, z); |
+ |
+var { 1.5: x, 2: y, ...z } = { 1.5: 1, 2: 2, 3:3 }; |
+assertEquals(1, x); |
+assertEquals(2, y); |
+assertEquals({ 3: 3 }, z); |
+ |
+(({x, ...z}) => { assertEquals({y: 1}, z); })({ x: 1, y: 1}); |
+ |
+var [...{...z}] = [{ x: 1}]; |
+assertEquals({ 0: { x: 1} }, z); |
+ |
+var {...{x}} = { x: 1}; |
+assertEquals(1, x); |