// Copyright 2018 Igalia, S.L. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-Intl.ListFormat.prototype.formatToParts
description: Checks the behavior of Intl.ListFormat.prototype.formatToParts() in English.
features: [Intl.ListFormat]
locale: [en-US]
---*/

function verifyFormatParts(actual, expected, message) {
  assert.sameValue(actual.length, expected.length, `${message}: length`);

  for (let i = 0; i < actual.length; ++i) {
    assert.sameValue(actual[i].type, expected[i].type, `${message}: parts[${i}].type`);
    assert.sameValue(actual[i].value, expected[i].value, `${message}: parts[${i}].value`);
  }
}

function CustomIterator(array) {
  this.i = 0;
  this.array = array;
}

CustomIterator.prototype[Symbol.iterator] = function() {
  return this;
}

CustomIterator.prototype.next = function() {
  if (this.i >= this.array.length) {
    return {
      "done": true,
    };
  }

  return {
    "value": this.array[this.i++],
    "done": false,
  };
}

const transforms = [
  a => a,
  a => a[Symbol.iterator](),
  a => new CustomIterator(a),
];

const lf = new Intl.ListFormat("en-US", { "type": "disjunction", });

assert.sameValue(typeof lf.formatToParts, "function", "formatToParts should be supported");

for (const f of transforms) {
  verifyFormatParts(lf.formatToParts(f([])), []);
  verifyFormatParts(lf.formatToParts(f(["foo"])), [
    { "type": "element", "value": "foo" },
  ]);
  verifyFormatParts(lf.formatToParts(f(["foo", "bar"])), [
    { "type": "element", "value": "foo" },
    { "type": "literal", "value": " or " },
    { "type": "element", "value": "bar" },
  ]);
  verifyFormatParts(lf.formatToParts(f(["foo", "bar", "baz"])), [
    { "type": "element", "value": "foo" },
    { "type": "literal", "value": ", " },
    { "type": "element", "value": "bar" },
    { "type": "literal", "value": ", or " },
    { "type": "element", "value": "baz" },
  ]);
  verifyFormatParts(lf.formatToParts(f(["foo", "bar", "baz", "quux"])), [
    { "type": "element", "value": "foo" },
    { "type": "literal", "value": ", " },
    { "type": "element", "value": "bar" },
    { "type": "literal", "value": ", " },
    { "type": "element", "value": "baz" },
    { "type": "literal", "value": ", or " },
    { "type": "element", "value": "quux" },
  ]);
}

verifyFormatParts(lf.formatToParts("foo"), [
  { "type": "element", "value": "f" },
  { "type": "literal", "value": ", " },
  { "type": "element", "value": "o" },
  { "type": "literal", "value": ", or " },
  { "type": "element", "value": "o" },
]);
