// Copyright (c) 2011, 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 StreamSubscription<T> listen(void onData(T event),
 *   {Function onError, void onDone(), bool cancelOnError})
 * If cancelOnError is true, the subscription is ended when the first error is
 * reported. The default is false.
 * @description Checks that if cancelOnError is true, the subscription is ended
 * when the first error is reported.
 * @issue #25967
 * @author kaigorodov
 * @author a.semenov@unipro.ru
 */
library listen_A04_t01;
import "dart:async";
import "../../../Utils/expect.dart";

void check<T>(Stream<T> s, List<T> data, List errors) {
  List<T> dataSink = [];
  List errorSink = [];
  asyncStart();
  s.listen(
      (T event) {
        dataSink.add(event);
      },
      onError: (Object error) {
        errorSink.add(error);
        // wait for possible additional error
        new Future.delayed(durationMs(500), (){
          Expect.listEquals(data, dataSink);
          Expect.listEquals(errors, errorSink);
          asyncEnd();
        });
      },
      onDone: () {
        // onDone is only called if there were no errors
        Expect.listEquals(data, dataSink);
        Expect.listEquals(errors, errorSink);
        asyncEnd();
      },
      cancelOnError: true
  );
}

void test(CreateStreamWithErrorsFunction create) {
  check(create([], defVal: 42), [], []);
  check(create([1, 2, 3, 4], isError:(x) => false, defVal: 42), [1, 2, 3, 4], []);
  check(create([1, 2, 3, 4], isError:(x) => true, defVal: 42), [], [1]);
  check<int>(create([1, 2, 3, 4], isError:(x) => x.isOdd, defVal: 42), [], [1]);
  check<int>(create([1, 2, 3, 4], isError:(x) => x.isEven, defVal: 42), [1], [2]);
  check(
      create([null, "2", -3, 4.0, []], isError:(x) => x is num, defVal: 42),
      [null, "2"],
      [-3]
  );
}
