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 9 var array = [1, 2, 3]; 10 var object = {length: 1, '0': 'a'}; 11 12 function 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 23 testConcatDefaults(); 24 25 var concatSpreadable = false; 26 Object.defineProperty(Array.prototype, Symbol.isConcatSpreadable, { 27 get() { return concatSpreadable }, 28 configurable: true 29 }); 30 31 assertEquals([[], array], [].concat(array)); 32 assertEquals([array, []], array.concat([])); 33 assertEquals([array, array], array.concat(array)); 34 assertEquals([[], object], [].concat(object)); 35 assertEquals([array, object], array.concat(object)); 36 assertEquals([object, []], Array.prototype.concat.call(object,[])); 37 assertEquals([object, array], Array.prototype.concat.call(object, array)); 38 assertEquals([object, object], Array.prototype.concat.call(object, object)); 39 40 concatSpreadable = true; 41 42 assertEquals(array, [].concat(array)); 43 assertEquals(array, array.concat([])); 44 assertEquals([1, 2, 3, 1, 2, 3], array.concat(array)); 45 assertEquals([object], [].concat(object)); 46 assertEquals([1, 2, 3, object], array.concat(object)); 47 assertEquals([object], Array.prototype.concat.call(object,[])); 48 assertEquals([object, 1, 2, 3], Array.prototype.concat.call(object, array)); 49 assertEquals([object, object], Array.prototype.concat.call(object, object)); 50 51 52 delete Array.prototype[Symbol.isConcatSpreadable]; 53 testConcatDefaults(); 54