// 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 timer_repeat_test; import 'dart:async'; import 'package:unittest/unittest.dart'; const Duration TIMEOUT = const Duration(milliseconds: 500); const int ITERATIONS = 5; Timer timer; Stopwatch stopwatch = new Stopwatch(); int iteration; // Some browsers (Firefox and IE so far) can trigger too early. Add a safety // margin. We use identical(1, 1.0) as an easy way to know if the test is // compiled by dart2js. int get safetyMargin => identical(1, 1.0) ? 100 : 0; void timeoutHandler(Timer timer) { iteration++; expect(iteration, lessThanOrEqualTo(ITERATIONS)); if (iteration == ITERATIONS) { // When we are done with all of the iterations, we expect a // certain amount of time to have passed. Checking the time on // each iteration doesn't work because the timeoutHandler runs // concurrently with the periodic timer. expect(stopwatch.elapsedMilliseconds + safetyMargin, greaterThanOrEqualTo(ITERATIONS * TIMEOUT.inMilliseconds)); timer.cancel(); } } main() { test("timer_repeat", () { iteration = 0; stopwatch.start(); timer = new Timer.periodic( TIMEOUT, expectAsync(timeoutHandler, count: ITERATIONS)); }); }