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

// Test merging streams.
library dart.test.stream_from_iterable;

import 'dart:async';

import 'package:expect/expect.dart';
import 'package:unittest/unittest.dart';

import 'event_helper.dart';

class IterableTest<T> {
  static int counter = 0;
  Iterable<T> iterable;
  IterableTest(this.iterable);
  void run() {
    test("stream from iterable ${counter++}", () {
      Events expected = new Events.fromIterable(iterable);
      Stream<T> stream = new Stream<T>.fromIterable(iterable);
      Events actual = new Events.capture(stream);
      actual.onDone(expectAsync(() {
        Expect.listEquals(expected.events, actual.events);
      }));
    });
  }
}

main() {
  new IterableTest([]).run();
  new IterableTest([1]).run();
  new IterableTest([1, "two", true, null]).run();
  new IterableTest<int>([1, 2, 3, 4]).run();
  new IterableTest<String>(["one", "two", "three", "four"]).run();
  new IterableTest<int>(new Iterable<int>.generate(1000, (i) => i)).run();
  new IterableTest<String>(
      new Iterable<int>.generate(1000, (i) => i).map((i) => "$i")).run();

  Iterable<int> iter = new Iterable.generate(25, (i) => i * 2);

  test("iterable-toList", () {
    new Stream.fromIterable(iter).toList().then(expectAsync((actual) {
      List expected = iter.toList();
      Expect.equals(25, expected.length);
      Expect.listEquals(expected, actual);
    }));
  });

  test("iterable-mapped-toList", () {
    new Stream.fromIterable(iter)
        .map((i) => i * 3)
        .toList()
        .then(expectAsync((actual) {
      List expected = iter.map((i) => i * 3).toList();
      Expect.listEquals(expected, actual);
    }));
  });

  test("iterable-paused", () {
    var stream = new Stream<int>.fromIterable(iter);
    Events actual = new Events();
    StreamSubscription subscription;
    subscription = stream.listen((int value) {
      actual.add(value);
      // Do a 10 ms pause during the playback of the iterable.
      Duration duration = const Duration(milliseconds: 10);
      if (value == 20) {
        subscription.pause(new Future.delayed(duration, () {}));
      }
    }, onDone: expectAsync(() {
      actual.close();
      Events expected = new Events.fromIterable(iter);
      Expect.listEquals(expected.events, actual.events);
    }));
  });

  test("iterable-single-subscription", () {
    Stream stream = new Stream.fromIterable(iter);
    stream.listen((x) {});
    Expect.throwsStateError(() => stream.listen((x) {}));
  });

  test("regression-14332", () {
    // Regression test for http://dartbug.com/14332.
    // This should succeede.
    var from = new Stream.fromIterable([1, 2, 3, 4, 5]);

    var c = new StreamController();
    var sink = c.sink;

    var done = expectAsync(() {}, count: 2);

    // if this goes first, test failed (hanged). Swapping addStream and toList
    // made failure go away.
    sink.addStream(from).then((_) {
      c.close();
      done();
    });

    c.stream.toList().then((x) {
      Expect.listEquals([1, 2, 3, 4, 5], x);
      done();
    });
  });

  test("regression-14334-b", () {
    var from = new Stream.fromIterable([1, 2, 3, 4, 5]);

    // odd numbers as data events, even numbers as error events
    from = from.map((x) => x.isOdd ? x : throw x);

    var c = new StreamController();

    var done = expectAsync(() {}, count: 2);

    var data = [], errors = [];
    c.stream.listen(data.add, onError: errors.add, onDone: () {
      Expect.listEquals([1, 3, 5], data);
      Expect.listEquals([2, 4], errors);
      done();
    });
    c.addStream(from).then((_) {
      c.close();
      done();
    });
  });
}
