Index: test/mjsunit/harmony/object-spread-basic.js |
diff --git a/test/mjsunit/harmony/object-spread-basic.js b/test/mjsunit/harmony/object-spread-basic.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..de19805d30f8da03f743bf2d3b6ed511efeffad2 |
--- /dev/null |
+++ b/test/mjsunit/harmony/object-spread-basic.js |
@@ -0,0 +1,111 @@ |
+// 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-spread |
+ |
+var x = {a: 1}; |
+var y = { ...x}; |
+assertEquals(x, y); |
+ |
+assertEquals({}, y = { ...{} } ); |
+assertEquals({}, y = { ...undefined }); |
+assertEquals({}, y = { ...null }); |
+ |
+assertEquals({}, y = { ...1 }); |
+assertEquals({0: 'f', 1: 'o', 2: 'o'}, y = { ...'foo' }); |
+assertEquals({0: 0, 1: 1}, y = { ...[0, 1] }); |
+assertEquals({}, { ...new Proxy({}, {}) }); |
+ |
+assertEquals({a: 2}, y = { ...x, a: 2 }); |
+assertEquals({a: 1, b: 1}, y = { ...x, b: 1 }); |
+assertEquals({a: 1}, y = { a: 2, ...x }); |
+assertEquals({a: 1, b: 1}, y = { a:2, ...x, b: 1 }); |
+assertEquals({a: 3}, y = { a: 2, ...x, a: 3 }); |
+ |
+var z = { b: 1} |
+assertEquals({a: 1, b: 1}, y = { ...x, ...z }); |
+assertEquals({a: 1, b: 1}, y = { a: 2, ...x, ...z }); |
+assertEquals({a: 1, b: 1}, y = { b: 2, ...z, ...x }); |
+assertEquals({a: 1, b: 1}, y = { a: 1, ...x, b: 2, ...z }); |
+assertEquals({a: 1, b: 2}, y = { a: 1, ...x, ...z, b: 2 }); |
+assertEquals({a: 2, b: 2}, y = { ...x, ...z, a:2, b: 2 }); |
+ |
+var x = {} |
+Object.defineProperty(x, 'a', { |
+ enumerable: false, |
+ configurable: false, |
+ writable: false, |
+ value: 1 |
+}); |
+assertEquals({}, { ...x }); |
+ |
+var x = {} |
+Object.defineProperty(x, 'a', { |
+ enumerable: true, |
+ configurable: false, |
+ writable: false, |
+ value: 1 |
+}); |
+var y = { ...x }; |
+var prop = Object.getOwnPropertyDescriptor(y, 'a'); |
+assertEquals(prop.value, 1); |
+assertTrue(prop.enumerable); |
+assertTrue(prop.configurable); |
+assertTrue(prop.writable); |
+ |
+var x = { __proto__: z } |
+assertEquals({}, { ...x }); |
+ |
+var x = { |
+ get a() { return 1; }, |
+ set a(_) { assertUnreachable("setter called"); }, |
+}; |
+assertEquals({ a: 1 }, y = { ...x }); |
+ |
+var x = { |
+ method() { return 1; }, |
+}; |
+assertEquals(x, y = { ...x }); |
+ |
+var x = { |
+ *gen() { return {value: 1, done: true} ; }, |
+}; |
+assertEquals(x, y = { ...x }); |
+ |
+var x = { |
+ get a() { throw new Error(); }, |
+}; |
+assertThrows(() => { y = { ...x } }); |
+ |
+var p = new Proxy({}, { |
+ ownKeys() { throw new Error(); } |
+}); |
+assertThrows(() => { y = { ...p } }); |
+ |
+var p = new Proxy({}, { |
+ ownKeys() { [1]; }, |
+ get() { throw new Error(); } |
+}); |
+assertThrows(() => { y = { ...p } }); |
+ |
+var p = new Proxy({}, { |
+ ownKeys() { [1]; }, |
+ getOwnPropertyDescriptor() { throw new Error(); } |
+}); |
+assertThrows(() => { y = { ...p } }); |
+ |
+var p = new Proxy(z, { |
+ ownKeys() { return Object.keys(z); }, |
+ get(_, prop) { return z[prop]; }, |
+ getOwnPropertyDescriptor(_, prop) { |
+ return Object.getOwnPropertyDescriptor(z, prop); |
+ }, |
+}); |
+assertEquals(z, y = { ...p }); |
+ |
+var x = { a:1 }; |
+assertEquals(x, y = { set a(_) { throw new Error(); }, ...x }); |
+ |
+var x = { a:1 }; |
+assertEquals(x, y = { get a() { throw new Error(); }, ...x }); |