// 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();
  });
}
