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

import 'dart:async';

import 'package:expect/legacy/async_minitest.dart'; // ignore: deprecated_member_use

main() {
  test("timer isActive test", () {
    late Timer t;

    t = new Timer(
      const Duration(seconds: 1),
      expectAsync0(() => expect(t.isActive, equals(false))),
    );
    expect(t.isActive, equals(true));
  });

  test("periodic timer cancel test", () {
    late Timer t;

    int i = 0;
    void checkActive(Timer timer) {
      expect(t.isActive, equals(true));
      if (i == 2) {
        t.cancel();
        expect(t.isActive, equals(false));
      }
      i++;
    }

    t = new Timer.periodic(
      new Duration(milliseconds: 1),
      expectAsync1(checkActive, count: 3),
    );
    expect(t.isActive, equals(true));
  });

  test("timer cancel test", () {
    Timer timer = new Timer(
      const Duration(seconds: 15),
      () => fail("Should not be reached."),
    );
    Timer.run(
      expectAsync0(() {
        expect(timer.isActive, equals(true));
        timer.cancel();
        expect(timer.isActive, equals(false));
      }),
    );
  });
}
