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