// 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 '../../pkg/unittest/lib/unittest.dart';

const int TIMEOUT1 = 1000;
const int TIMEOUT2 = 2000;
const int TIMEOUT3 = 500;
const int TIMEOUT4 = 1500;

main() {
  test("multiple timer test", () {
    int _startTime1;
    int _startTime2;
    int _startTime3;
    int _startTime4;
    List<int> _order;
    int _message;

    void timeoutHandler1(Timer timer) {
      int endTime = (new DateTime.now()).millisecondsSinceEpoch;
      expect(endTime - _startTime1, greaterThanOrEqualTo(TIMEOUT1));
      expect(_order[_message], 0);
      _message++;
    }

    void timeoutHandler2(Timer timer) {
      int endTime  = (new DateTime.now()).millisecondsSinceEpoch;
      expect(endTime - _startTime2, greaterThanOrEqualTo(TIMEOUT2));
      expect(_order[_message], 1);
      _message++;
    }

    void timeoutHandler3(Timer timer) {
      int endTime = (new DateTime.now()).millisecondsSinceEpoch;
      expect(endTime - _startTime3, greaterThanOrEqualTo(TIMEOUT3));
      expect(_order[_message], 2);
      _message++;
    }

    void timeoutHandler4(Timer timer) {
      int endTime  = (new DateTime.now()).millisecondsSinceEpoch;
      expect(endTime - _startTime4, greaterThanOrEqualTo(TIMEOUT4));
      expect(_order[_message], 3);
      _message++;
    }

    _order = new List<int>.fixedLength(4);
    _order[0] = 2;
    _order[1] = 0;
    _order[2] = 3;
    _order[3] = 1;
    _message = 0;

    _startTime1 = (new DateTime.now()).millisecondsSinceEpoch;
    new Timer(TIMEOUT1, expectAsync1(timeoutHandler1));
    _startTime2 = (new DateTime.now()).millisecondsSinceEpoch;
    new Timer(TIMEOUT2, expectAsync1(timeoutHandler2));
    _startTime3 = (new DateTime.now()).millisecondsSinceEpoch;
    new Timer(TIMEOUT3, expectAsync1(timeoutHandler3));
    _startTime4 = (new DateTime.now()).millisecondsSinceEpoch;
    new Timer(TIMEOUT4, expectAsync1(timeoutHandler4));
  });
}
