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

import 'package:async_helper/async_helper.dart';
import "package:expect/expect.dart";
import 'dart:async';
import 'catch_errors.dart';

main() {
  asyncStart();
  Completer done = new Completer();

  var events = [];
  StreamController controller;
  Stream stream;
  // Test that errors are not traversing zone boundaries.
  // Note that the first listener of `asBroadcastStream` determines in which
  // zone the subscription lives.
  catchErrors(() {
    catchErrors(() {
      controller = new StreamController();

      // Assign to "global" `stream`.
      stream = controller.stream.map((x) {
        events.add("map $x");
        return x + 100;
      }).transform(
          new StreamTransformer.fromHandlers(handleError: (e, st, sink) {
        sink.add("error $e");
      })).asBroadcastStream();

      // Listen to `stream` in the inner zone.
      stream.listen((x) {
        events.add("stream $x");
      });
    })
        .listen((x) {
          events.add(x);
        })
        .asFuture()
        .then((_) {
          Expect.fail("Unexpected callback");
        });

    // Listen to `stream` in the outer zone.
    stream.listen((x) {
      events.add("stream2 $x");
    });

    // Feed the controller from the outer zone.
    controller.add(1);
    // `addError` does not count as zone-traversal. It should be caught by
    // the inner error handler.
    controller.addError("inner error");
    new Future.error("caught by outer");
    controller.close();
  }).listen((x) {
    events.add("outer: $x");
    if (x == "caught by outer") done.complete(true);
  }, onDone: () {
    Expect.fail("Unexpected callback");
  });

  done.future.whenComplete(() {
    // Give handlers time to run.
    Timer.run(() {
      Expect.listEquals([
        "map 1",
        "stream 101",
        "stream2 101",
        "stream error inner error",
        "stream2 error inner error",
        "outer: caught by outer",
      ], events);
      asyncEnd();
    });
  });
}
