Home | History | Annotate | Download | only in harmony
      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