1// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Check that @@isConcatSpreadable is checked when set on Object.prototype
6
7"use strict"
8
9var array = [1, 2, 3];
10var object = {length: 1, '0': 'a'};
11
12function testConcatDefaults() {
13  assertEquals(array, [].concat(array));
14  assertEquals(array, array.concat([]));
15  assertEquals([1, 2, 3, 1, 2, 3], array.concat(array));
16  assertEquals([object], [].concat(object));
17  assertEquals([1, 2, 3, object], array.concat(object));
18  assertEquals([object], Array.prototype.concat.call(object,[]));
19  assertEquals([object, 1, 2, 3], Array.prototype.concat.call(object, array));
20  assertEquals([object, object], Array.prototype.concat.call(object, object));
21}
22
23testConcatDefaults();
24
25var concatSpreadable = false;
26Object.defineProperty(Array.prototype, Symbol.isConcatSpreadable, {
27    get() { return concatSpreadable },
28    configurable: true
29});
30
31assertEquals([[], array], [].concat(array));
32assertEquals([array, []], array.concat([]));
33assertEquals([array, array], array.concat(array));
34assertEquals([[], object], [].concat(object));
35assertEquals([array, object], array.concat(object));
36assertEquals([object, []], Array.prototype.concat.call(object,[]));
37assertEquals([object, array], Array.prototype.concat.call(object, array));
38assertEquals([object, object], Array.prototype.concat.call(object, object));
39
40concatSpreadable = true;
41
42assertEquals(array, [].concat(array));
43assertEquals(array, array.concat([]));
44assertEquals([1, 2, 3, 1, 2, 3], array.concat(array));
45assertEquals([object], [].concat(object));
46assertEquals([1, 2, 3, object], array.concat(object));
47assertEquals([object], Array.prototype.concat.call(object,[]));
48assertEquals([object, 1, 2, 3], Array.prototype.concat.call(object, array));
49assertEquals([object, object], Array.prototype.concat.call(object, object));
50
51
52delete Array.prototype[Symbol.isConcatSpreadable];
53testConcatDefaults();
54