// Copyright (c) 2016, 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.

/**
 * @assertion Stream timeout(Duration timeLimit,
 *                           {void onTimeout(EventSink sink)})
 * Creates a new stream with the same events as this stream.
 *
 * Whenever more than timeLimit passes between two events from this stream, the
 * onTimeout function is called.
 *
 * The onTimeout function is called with one argument: an EventSink that allows
 * putting events into the returned stream. This EventSink is only valid during
 * the call to onTimeout.
 *
 * @description Check that if more than timeLimit passes between two events
 * from this stream, the onTimeout function is called with one argument: an
 * EventSink that allows putting events into the returned stream.
 * @author ngl@unipro.ru
 */
import "dart:async";
import "../../../Utils/expect.dart";

List<Completer> cl = [new Completer(), new Completer(), new Completer()];
List<int> cv = [1, 2, 3];
int i = 0;

void ontimeout(EventSink sink) {
  sink.add(cv[1]);
}

main() {
  Stream s1 = new Stream.fromIterable(
      [cl[0].future, cl[1].future, cl[2].future]);
  Stream s2 = s1.asyncMap((var event) => event);
  Stream s3 = s2.timeout(new Duration(microseconds: 1),
      onTimeout: ontimeout);

  asyncStart();
  s3.listen((var event) {
    Expect.isTrue(i < 2);
    Expect.equals(cv[i++], event);
    if (i == 2) {
      asyncEnd();
    }
  }, onError: (error) {
    Expect.fail("onError($error) called unexpectedly");
  }, onDone: () {
    Expect.fail("Listen was ended on timeout");
  });

  cl[0].complete(cv[0]);
  cl[2].complete(cv[2]);
}
