// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

let lf = new Intl.ListFormat("en");

// Test normal array
assertDoesNotThrow(() => lf.format(['a','b','c']));
assertThrows("lf.format(['a','b',3])",  TypeError, "Iterable yielded 3 which is not a string");

// Test sparse array
let sparse = ['a','b'];
sparse[10] = 'c';
assertThrows("lf.format(sparse)",  TypeError, "Iterable yielded undefined which is not a string");

// Test iterable of all String
let iterable_of_strings = {
  [Symbol.iterator]() {
    return this;
  },
  count: 0,
  next() {
    if (this.count++ < 4) {
      return {done: false, value: String(this.count)};
    }
    return {done:true}
  }
};
assertDoesNotThrow(() => lf.format(iterable_of_strings));

// Test iterable of none String throw TypeError
let iterable_of_strings_and_number = {
  [Symbol.iterator]() {
    return this;
  },
  count: 0,
  next() {
    this.count++;
    if (this.count ==  3) {
      return {done:false, value: 3};
    }
    if (this.count < 5) {
      return {done: false, value: String(this.count)};
    }
    return {done:true}
  }
};
assertThrows("lf.format(iterable_of_strings_and_number)",
    TypeError, "Iterable yielded 3 which is not a string");
assertEquals(3, iterable_of_strings_and_number.count);