<!doctype html>
<meta charset=utf-8>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../resources/testcommon.js"></script>
<style>
@keyframes anim {
  from { margin-left: 100px; }
  to { margin-left: 200px; }
}
</style>
<body>
<div id="log"></div>
<script>

'use strict';

const ANIM_PROP_VAL = 'anim 100s';
const ANIM_DURATION = 100000; // ms

test(function(t) {
  var div = addDiv(t);
  div.style.animation = ANIM_PROP_VAL;
  div.style.animationIterationCount = 'infinite';
  var animation = div.getAnimations()[0];

  var threw = false;
  try {
    animation.finish();
  } catch (e) {
    threw = true;
    assert_equals(e.name, 'InvalidStateError',
                  'Exception should be an InvalidStateError exception when ' +
                  'trying to finish an infinite animation');
  }
  assert_true(threw,
              'Expect InvalidStateError exception trying to finish an ' +
              'infinite animation');
}, 'Test exceptions when finishing infinite animation');

async_test(function(t) {
  var div = addDiv(t);
  div.style.animation = ANIM_PROP_VAL + ' paused';
  var animation = div.getAnimations()[0];

  animation.ready.then(t.step_func(function() {
    animation.finish();
    assert_equals(animation.playState, 'finished',
                  'The play state of a paused animation should become ' +
                  '"finished" after finish() is called');
    assert_times_equal(animation.startTime,
                       animation.timeline.currentTime - ANIM_DURATION,
                       'The start time of a paused animation should be set ' +
                       'after calling finish()');
    t.done();
  }));
}, 'Test finish() while paused');

test(function(t) {
  var div = addDiv(t);
  div.style.animation = ANIM_PROP_VAL + ' paused';
  var animation = div.getAnimations()[0];

  // Update playbackRate so we can test that the calculated startTime
  // respects it
  animation.playbackRate = 2;

  // While animation is still pause-pending call finish()
  animation.finish();

  assert_equals(animation.playState, 'finished',
                'The play state of a pause-pending animation should become ' +
                '"finished" after finish() is called');
  assert_times_equal(animation.startTime,
                     animation.timeline.currentTime - ANIM_DURATION / 2,
                     'The start time of a pause-pending animation should ' +
                     'be set after calling finish()');
}, 'Test finish() while pause-pending with positive playbackRate');

test(function(t) {
  var div = addDiv(t);
  div.style.animation = ANIM_PROP_VAL + ' paused';
  var animation = div.getAnimations()[0];

  animation.playbackRate = -2;
  animation.finish();

  assert_equals(animation.playState, 'finished',
                'The play state of a pause-pending animation should become ' +
                '"finished" after finish() is called');
  assert_equals(animation.startTime, animation.timeline.currentTime,
                'The start time of a pause-pending animation should be ' +
                'set after calling finish()');
}, 'Test finish() while pause-pending with negative playbackRate');

</script>
</body>
