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

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;
  late Stream stream;
  // Test that streams live in the zone they have been listened too.
  // It doesn't matter how many zone-boundaries the stream traverses. What
  // counts is the zone where `listen` was invoked.
  catchErrors(() {
    catchErrors(() {
      controller = new StreamController();

      // Assignment to "global" `stream`.
      stream = controller.stream.map((x) {
        events.add("map $x");
        return x + 100;
      }).asBroadcastStream();

      // Consume stream in the nested zone.
      stream.transform(
          new StreamTransformer.fromHandlers(handleError: (e, st, sink) {
        sink.add("error $e");
      })).listen((x) {
        events.add("stream $x");
      });

      // Feed the controller in the nested zone.
      scheduleMicrotask(() {
        controller.add(1);
        controller.addError(2);
        controller.close();
        new Future.error("done");
      });
    })
        .listen((x) {
          events.add("listen: $x");
          if (x == "done") done.complete(true);
        })
        .asFuture()
        .then((_) {
          Expect.fail("Unexpected callback");
        });

    // Listen to stream in outer zone.
    stream.listen((x) {
      events.add("stream2 $x");
    });
  }).listen((x) {
    events.add("outer: $x");
  }, 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 2",
        "listen: done",
        "outer: 2",
      ], events);
      asyncEnd();
    });
  });
}
