| // Copyright (c) 2013, 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/async_helper.dart'; | |
| import 'package:expect/expect.dart'; | |
| Future testOneScheduleMicrotask() { | |
| var completer = new Completer(); | |
| Timer.run(() { | |
| scheduleMicrotask(completer.complete); | |
| }); | |
| return completer.future; | |
| } | |
| Future testMultipleScheduleMicrotask() { | |
| var completer = new Completer(); | |
| Timer.run(() { | |
| const TOTAL = 10; | |
| int done = 0; | |
| for (int i = 0; i < TOTAL; i++) { | |
| scheduleMicrotask(() { | |
| done++; | |
| if (done == TOTAL) completer.complete(); | |
| ; | |
| }); | |
| } | |
| }); | |
| return completer.future; | |
| } | |
| Future testScheduleMicrotaskThenTimer() { | |
| var completer = new Completer(); | |
| Timer.run(() { | |
| bool scheduleMicrotaskDone = false; | |
| scheduleMicrotask(() { | |
| Expect.isFalse(scheduleMicrotaskDone); | |
| scheduleMicrotaskDone = true; | |
| }); | |
| Timer.run(() { | |
| Expect.isTrue(scheduleMicrotaskDone); | |
| completer.complete(); | |
| }); | |
| }); | |
| return completer.future; | |
| } | |
| Future testTimerThenScheduleMicrotask() { | |
| var completer = new Completer(); | |
| Timer.run(() { | |
| bool scheduleMicrotaskDone = false; | |
| Timer.run(() { | |
| Expect.isTrue(scheduleMicrotaskDone); | |
| completer.complete(); | |
| }); | |
| scheduleMicrotask(() { | |
| Expect.isFalse(scheduleMicrotaskDone); | |
| scheduleMicrotaskDone = true; | |
| }); | |
| }); | |
| return completer.future; | |
| } | |
| Future testTimerThenScheduleMicrotaskChain() { | |
| var completer = new Completer(); | |
| Timer.run(() { | |
| const TOTAL = 10; | |
| int scheduleMicrotaskDone = 0; | |
| Timer.run(() { | |
| Expect.equals(TOTAL, scheduleMicrotaskDone); | |
| completer.complete(); | |
| }); | |
| void scheduleMicrotaskCallback() { | |
| scheduleMicrotaskDone++; | |
| if (scheduleMicrotaskDone != TOTAL) { | |
| scheduleMicrotask(scheduleMicrotaskCallback); | |
| } | |
| } | |
| scheduleMicrotask(scheduleMicrotaskCallback); | |
| }); | |
| return completer.future; | |
| } | |
| main() { | |
| asyncStart(); | |
| testOneScheduleMicrotask() | |
| .then((_) => testMultipleScheduleMicrotask()) | |
| .then((_) => testScheduleMicrotaskThenTimer()) | |
| .then((_) => testTimerThenScheduleMicrotask()) | |
| .then((_) => testTimerThenScheduleMicrotaskChain()) | |
| .then((_) => asyncEnd()); | |
| } |