// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

main() {
  test(expectation, iterable) {
    Expect.listEquals(expectation, iterable.toList());
  }

  // Function not called on empty iterable.
  test([], [].expand((x) { throw "not called"; }));

  // Creating the iterable doesn't call the function.
  [1].expand((x) { throw "not called"; });

  test([1], [1].expand((x) => [x]));
  test([1, 2, 3], [1, 2, 3].expand((x) => [x]));

  test([], [1].expand((x) => []));
  test([], [1, 2, 3].expand((x) => []));
  test([2], [1, 2, 3].expand((x) => x == 2 ? [2] : []));

  test([1, 1, 2, 2, 3, 3], [1, 2, 3].expand((x) => [x, x]));
  test([1, 1, 2], [1, 2, 3].expand((x) => [x, x, x].skip(x)));

  // if function throws, iteration is stopped.
  Iterable iterable = [1, 2, 3].expand((x) {
    if (x == 2) throw "FAIL";
    return [x, x];
  });
  Iterator it = iterable.iterator;
  Expect.isTrue(it.moveNext());
  Expect.equals(1, it.current);
  Expect.isTrue(it.moveNext());
  Expect.equals(1, it.current);
  Expect.throws(it.moveNext, (e) => e == "FAIL");
  // After throwing, iteration is ended.
  Expect.equals(null, it.current);
  Expect.isFalse(it.moveNext());
}
