// Copyright (c) 2016, 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 "dart:async";
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";

var events = [];

var timer;
ticker(period) async* {
  var sc;
  sc = new StreamController(onListen: () {
    events.add("listen");
    timer = new Timer.periodic(period, (_) {
      sc.add(null);
    });
  }, onCancel: () {
    events.add("cancel");
    timer.cancel();
  });

  try {
    var counter = 0;
    await for (var tick in sc.stream) {
      counter++;
    }
  } finally {
    events.add("finally");
  }
}

void main() {
  asyncStart();
  events.add("main");
  final subscription =
      ticker(const Duration(milliseconds: 20)).listen((val) {});

  bool cancelFinished = false;
  new Timer(const Duration(milliseconds: 100), () async {
    // Despite the cancel call below, the stream doesn't stop.
    // The async* function is not blocked at any await (since the inner timer
    // continuously ticks), but since there/ is no yield-point in the function
    // it won't cancel.
    new Timer(const Duration(milliseconds: 30), () {
      Expect.isFalse(cancelFinished);
      Expect.listEquals(["main", "listen", "invoke cancel"], events);
      timer.cancel();
      asyncEnd();
    });

    events.add("invoke cancel");
    await subscription.cancel();
    // This line should never be reached, since the cancel-future doesn't
    // complete.
    cancelFinished = true;
  });
}
