| // 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. |
| |
| 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 }); |