// 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})
/// On errors from this stream, the onError handler is given a object describing
/// the error.
/// @description Checks that the onError handler is given an object describing the
/// error.
/// @author kaigorodov

library listen_A03_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);
  }, onDone: () {
    Expect.listEquals(data, dataSink);
    Expect.listEquals(errors, errorSink);
    asyncEnd();
  });
}

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, 2, 3, 4]);
  check<int>(create([1, 2, 3, 4], isError: (x) => x.isOdd, defVal: 42), [2, 4],
      [1, 3]);
  check(create([null, "2", -3, 4.0, []], isError: (x) => x is num, defVal: 42),
      [null, "2", []], [-3, 4.0]);
}
