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

// @dart = 2.9

/// @assertion factory StreamTransformer.fromHandlers({void handleData(S data,
///   EventSink<T> sink), void handleError(Object error, StackTrace stackTrace,
///   EventSink<T> sink), void handleDone(EventSink<T> sink)})
/// Creates a StreamTransformer that delegates events to the given functions.
///
/// @description Checks that handleError() is called on error events and
/// transformed stream gets errors that are written to sink.
/// handleData is not provided, so data events are unchanged.
/// @author ilya

import "dart:async";
import "../../../Utils/expect.dart";

main() {
  Stream<int> s = new Stream.fromIterable([1, 2, 3, 4, 5]);

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

  List stackTraces = [];
  StreamTransformer<int, dynamic> tr =
      new StreamTransformer.fromHandlers(handleError: (x, st, sink) {
    stackTraces.add(st);
    sink.addError((x as int) + 10, st);
  });

  int data = 1;
  int error = 12;
  int error_count = 0;

  asyncStart();
  s.transform(tr).listen((x) {
    Expect.equals(data, x);
    data += 2;
  }, onError: (x, st) {
    Expect.equals(error, x);
    Expect.equals(stackTraces[error_count++], st);
    error += 2;
  }, onDone: () {
    asyncEnd();
  });
}
