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

library multiple_timer_test;

import 'dart:async';

import 'package:expect/async_helper.dart';
import 'package:expect/expect.dart';

const Duration TIMEOUT1 = const Duration(seconds: 1);
const Duration TIMEOUT2 = const Duration(seconds: 2);
const Duration TIMEOUT3 = const Duration(milliseconds: 500);
const Duration TIMEOUT4 = const Duration(milliseconds: 1500);

// The stopwatch is more precise than the Timer.
// Some browsers (Firefox and IE so far) can trigger too early. So we add more
// margin. We use identical(1, 1.0) as an easy way to know if the test is
// running on the web.
int get safetyMargin => identical(1, 1.0) ? 100 : 0;

main() {
  Stopwatch _stopwatch1 = new Stopwatch();
  Stopwatch _stopwatch2 = new Stopwatch();
  Stopwatch _stopwatch3 = new Stopwatch();
  Stopwatch _stopwatch4 = new Stopwatch();
  late List<int> _order;
  late int _message;

  void timeoutHandler1() {
    Expect.isTrue(
      (_stopwatch1.elapsedMilliseconds + safetyMargin) >=
          TIMEOUT1.inMilliseconds,
    );
    Expect.equals(_order[_message], 0);
    _message++;
    asyncEnd();
  }

  void timeoutHandler2() {
    Expect.isTrue(
      (_stopwatch2.elapsedMilliseconds + safetyMargin) >=
          TIMEOUT2.inMilliseconds,
    );
    Expect.equals(_order[_message], 1);
    _message++;
    asyncEnd();
  }

  void timeoutHandler3() {
    Expect.isTrue(
      (_stopwatch3.elapsedMilliseconds + safetyMargin) >=
          TIMEOUT3.inMilliseconds,
    );
    Expect.equals(_order[_message], 2);
    _message++;
    asyncEnd();
  }

  void timeoutHandler4() {
    Expect.isTrue(
      (_stopwatch4.elapsedMilliseconds + safetyMargin) >=
          TIMEOUT4.inMilliseconds,
    );
    Expect.equals(_order[_message], 3);
    _message++;
    asyncEnd();
  }

  _order = [2, 0, 3, 1];
  _message = 0;

  asyncStart();
  _stopwatch1.start();
  new Timer(TIMEOUT1, timeoutHandler1);
  asyncStart();
  _stopwatch2.start();
  new Timer(TIMEOUT2, timeoutHandler2);
  asyncStart();
  _stopwatch3.start();
  new Timer(TIMEOUT3, timeoutHandler3);
  asyncStart();
  _stopwatch4.start();
  new Timer(TIMEOUT4, timeoutHandler4);
}
