// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-array.prototype.concat
description: >
    The `Symbol.isConcatSpreadable` property is defined and coerces to `false`
info: |
    1. Let O be ToObject(this value).
    2. ReturnIfAbrupt(O).
    3. Let A be ArraySpeciesCreate(O, 0).
    4. ReturnIfAbrupt(A).
    5. Let n be 0.
    6. Let items be a List whose first element is O and whose subsequent
       elements are, in left to right order, the arguments that were passed to
       this function invocation.
    7. Repeat, while items is not empty
      a. Remove the first element from items and let E be the value of the element.
      b. Let spreadable be IsConcatSpreadable(E).
      c. ReturnIfAbrupt(spreadable).
      d. If spreadable is true, then
         [...]
      e. Else E is added as a single item rather than spread,
         [...]

    ES6 22.1.3.1.1: Runtime Semantics: IsConcatSpreadable ( O )

    1. If Type(O) is not Object, return false.
    2. Let spreadable be Get(O, @@isConcatSpreadable).
    3. ReturnIfAbrupt(spreadable).
    4. If spreadable is not undefined, return ToBoolean(spreadable).
features: [Symbol.isConcatSpreadable]
---*/

var item = [1, 2];
var result;

item[Symbol.isConcatSpreadable] = null;
result = [].concat(item);
assert.sameValue(result.length, 1);
assert.sameValue(result[0], item);

item[Symbol.isConcatSpreadable] = false;
result = [].concat(item);
assert.sameValue(result.length, 1);
assert.sameValue(result[0], item);

item[Symbol.isConcatSpreadable] = 0;
result = [].concat(item);
assert.sameValue(result.length, 1);
assert.sameValue(result[0], item);

item[Symbol.isConcatSpreadable] = NaN;
result = [].concat(item);
assert.sameValue(result.length, 1);
assert.sameValue(result[0], item);
