// 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:expect/expect.dart'; const Duration TIMEOUT = const Duration(milliseconds: 500); const int ITERATIONS = 5; late Timer timer; Stopwatch stopwatch = new Stopwatch(); int iteration = 0; // 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; var completer = new Completer(); void timeoutHandler(Timer timer) { iteration++; Expect.isTrue(iteration <= 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.isTrue( stopwatch.elapsedMilliseconds + safetyMargin >= ITERATIONS * TIMEOUT.inMilliseconds, ); timer.cancel(); completer.complete(); } } main() { stopwatch.start(); timer = new Timer.periodic(TIMEOUT, timeoutHandler); return completer.future; }