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