// 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.

import "package:expect/expect.dart";

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());
}
