// Copyright (c) 2017, 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';

class AsyncTracker {
  int runningAsyncs = 0;
  List expectedEvents;
  final List actualEvents = [];

  AsyncTracker() {
    asyncStart();
  }

  void start(String event) {
    actualEvents.add("start $event");
    runningAsyncs++;
  }

  void stop(String event) {
    actualEvents.add("stop $event");
    if (--runningAsyncs == 0) {
      Expect.listEquals(expectedEvents, actualEvents);
      asyncEnd();
    }
  }

  void add(e) {
    actualEvents.add(e);
  }
}

void test1() {
  var tracker = new AsyncTracker();

  Future foo() async {
    tracker.add("error-foo");
    throw "foo";
  }

  tracker.start("micro1");
  scheduleMicrotask(() {
    tracker.start("micro2");
    scheduleMicrotask(() {
      tracker.stop("micro2");
    });
    tracker.stop("micro1");
  });

  tracker.start("foo");
  foo().catchError((e) {
    tracker.stop("foo");
  });
  tracker.start("micro3");
  scheduleMicrotask(() {
    tracker.stop("micro3");
  });

  tracker.expectedEvents = [
    "start micro1",
    "start foo",
    "error-foo",
    "start micro3",
    "start micro2",
    "stop micro1",
    "stop foo",
    "stop micro3",
    "stop micro2",
  ];
}

void test2() {
  var tracker = new AsyncTracker();

  Future bar() async {
    tracker.add("await null");
    await null;
    tracker.add("error-bar");
    throw "bar";
  }

  tracker.start("micro1");
  scheduleMicrotask(() {
    tracker.start("micro2");
    scheduleMicrotask(() {
      tracker.start("micro3");
      scheduleMicrotask(() {
        tracker.stop("micro3");
      });
      tracker.stop("micro2");
    });
    tracker.stop("micro1");
  });

  tracker.start("bar");
  bar().catchError((e) {
    tracker.stop("bar");
  });
  tracker.start("micro4");
  scheduleMicrotask(() {
    tracker.start("micro5");
    scheduleMicrotask(() {
      tracker.stop("micro5");
    });
    tracker.stop("micro4");
  });

  tracker.expectedEvents = [
    "start micro1",
    "start bar",
    "await null",
    "start micro4",
    "start micro2",
    "stop micro1",
    "error-bar",
    "stop bar",
    "start micro5",
    "stop micro4",
    "start micro3",
    "stop micro2",
    "stop micro5",
    "stop micro3",
  ];
}

void test3() {
  var tracker = new AsyncTracker();

  Future gee() async {
    tracker.add("error-gee");
    return new Future.error("gee");
  }

  tracker.start("micro1");
  scheduleMicrotask(() {
    tracker.start("micro2");
    scheduleMicrotask(() {
      tracker.stop("micro2");
    });
    tracker.stop("micro1");
  });

  tracker.start("gee");
  gee().catchError((e) {
    tracker.stop("gee");
  });
  tracker.start("micro3");
  scheduleMicrotask(() {
    tracker.stop("micro3");
  });

  tracker.expectedEvents = [
    "start micro1",
    "start gee",
    "error-gee",
    "start micro3",
    "start micro2",
    "stop micro1",
    "stop gee",
    "stop micro3",
    "stop micro2",
  ];
}

void test4() {
  var tracker = new AsyncTracker();

  Future toto() async {
    tracker.add("await null");
    await null;
    tracker.add("error-toto");
    return new Future.error("toto");
  }

  tracker.start("micro1");
  scheduleMicrotask(() {
    tracker.start("micro2");
    scheduleMicrotask(() {
      tracker.start("micro3");
      scheduleMicrotask(() {
        tracker.stop("micro3");
      });
      tracker.stop("micro2");
    });
    tracker.stop("micro1");
  });

  tracker.start("toto");
  toto().catchError((e) {
    tracker.stop("toto");
  });
  tracker.start("micro4");
  scheduleMicrotask(() {
    tracker.start("micro5");
    scheduleMicrotask(() {
      tracker.stop("micro5");
    });
    tracker.stop("micro4");
  });

  tracker.expectedEvents = [
    "start micro1",
    "start toto",
    "await null",
    "start micro4",
    "start micro2",
    "stop micro1",
    "error-toto",
    "start micro5",
    "stop micro4",
    "start micro3",
    "stop micro2",
    "stop toto",
    "stop micro5",
    "stop micro3",
  ];
}

void test5() {
  var tracker = new AsyncTracker();

  Future foo() async {
    tracker.add("throw");
    throw "foo";
  }

  bar() async {
    tracker.start('micro');
    scheduleMicrotask(() {
      tracker.stop('micro');
    });
    try {
      tracker.start('foo');
      await foo();
    } catch (e) {
      tracker.stop('foo');
    }
    tracker.stop("bar");
  }

  tracker.start('bar');

  tracker.expectedEvents = [
    "start bar",
    "start micro",
    "start foo",
    "throw",
    "stop micro",
    "stop foo",
    "stop bar",
  ];
}

main() {
  asyncStart();
  test1();
  test2();
  test3();
  test4();
  asyncEnd();
}
