|  | // 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 RequestAnimationFrameTest; | 
|  |  | 
|  | import 'dart:async'; | 
|  | import 'dart:html'; | 
|  |  | 
|  | import 'package:expect/async_helper.dart'; | 
|  | import 'package:expect/expect.dart'; | 
|  |  | 
|  | Future testOneShot() async { | 
|  | final done = new Completer(); | 
|  | window.requestAnimationFrame(done.complete); | 
|  | await done.future; | 
|  | } | 
|  |  | 
|  | Future testTwoShot() async { | 
|  | final done = new Completer(); | 
|  | window.requestAnimationFrame((timestamp1) { | 
|  | window.requestAnimationFrame((timestamp2) { | 
|  | // Not monotonic on Safari and IE. | 
|  | // expect(timestamp2, greaterThan(timestamp1), | 
|  | //    reason: 'timestamps ordered'); | 
|  | done.complete(); | 
|  | }); | 
|  | }); | 
|  | await done.future; | 
|  | } | 
|  |  | 
|  | // How do we test that a callback is never called?  We can't wrap the uncalled | 
|  | // callback with 'expectAsync'.  Will request several frames and try | 
|  | // cancelling the one that is not the last. | 
|  | Future testCancel1() async { | 
|  | final done = new Completer(); | 
|  | var frame1 = window.requestAnimationFrame((timestamp1) { | 
|  | Expect.fail('Should have been cancelled'); | 
|  | }); | 
|  | window.requestAnimationFrame(done.complete); | 
|  | window.cancelAnimationFrame(frame1); | 
|  | await done.future; | 
|  | } | 
|  |  | 
|  | Future testCancel2() async { | 
|  | final done1 = new Completer(); | 
|  | final done2 = new Completer(); | 
|  | window.requestAnimationFrame(done1.complete); | 
|  | var frame2 = window.requestAnimationFrame((timestamp2) { | 
|  | Expect.fail('Should have been cancelled'); | 
|  | }); | 
|  | window.requestAnimationFrame(done2.complete); | 
|  | window.cancelAnimationFrame(frame2); | 
|  | await Future.wait([done1.future, done2.future]); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | asyncTest(() async { | 
|  | await testOneShot(); | 
|  | await testTwoShot(); | 
|  | await testCancel1(); | 
|  | await testCancel2(); | 
|  | }); | 
|  | } |