// 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 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();
  });
}
