<!doctype html>
<meta charset=utf-8>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../resources/testcommon.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';

async_test(function(t) {
  var div = addDiv(t);

  // FIXME: This test does too many things. It should be split up.

  // Add a couple of transitions
  div.style.left = '0px';
  div.style.top = '0px';
  getComputedStyle(div).transitionProperty;

  div.style.transition = 'all 100s';
  div.style.left = '100px';
  div.style.top = '100px';

  var animations = div.getAnimations();
  assert_equals(animations.length, 2,
    'getAnimations() returns one Animation per transitioning property');
  waitForAllAnimations(animations).then(t.step_func(function() {
    var startTime = animations[0].startTime;
    assert_true(startTime > 0 && startTime <= document.timeline.currentTime,
                'CSS transitions have sensible start times');
    assert_equals(animations[0].startTime, animations[1].startTime,
      'CSS transitions started together have the same start time');
    // Wait a moment then add a third transition
    return waitForFrame();
  })).then(t.step_func(function() {
    div.style.backgroundColor = 'green';
    animations = div.getAnimations();
    assert_equals(animations.length, 3,
      'getAnimations returns Animations for all running CSS Transitions');
    return waitForAllAnimations(animations);
  })).then(t.step_func(function() {
    assert_less_than(animations[1].startTime, animations[2].startTime,
      'Animation for additional CSS transition starts after the original'
      + ' transitions and appears later in the list');
    t.done();
  }));
}, 'getAnimations for CSS Transitions');

test(function(t) {
  var div = addDiv(t, { style: 'left: 0px; transition: all 100s' });

  flushComputedStyle(div);
  div.style.left = '100px';

  assert_class_string(div.getAnimations()[0], 'CSSTransition',
                      'Interface of returned animation is CSSTransition');
}, 'getAnimations returns CSSTransition objects for CSS Transitions');

async_test(function(t) {
  var div = addDiv(t);

  // Set up event listener
  div.addEventListener('transitionend', t.step_func(function() {
    assert_equals(div.getAnimations().length, 0,
      'getAnimations does not return finished CSS Transitions');
    t.done();
  }));

  // Add a very short transition
  div.style.left = '0px';
  getComputedStyle(div).left;

  div.style.transition = 'all 0.01s';
  div.style.left = '100px';
  getComputedStyle(div).left;
}, 'getAnimations for CSS Transitions that have finished');

test(function(t) {
  var div = addDiv(t);

  // Try to transition non-animatable property animation-duration
  div.style.animationDuration = '10s';
  getComputedStyle(div).animationDuration;

  div.style.transition = 'all 100s';
  div.style.animationDuration = '100s';

  assert_equals(div.getAnimations().length, 0,
    'getAnimations returns an empty sequence for a transition'
    + ' of a non-animatable property');
}, 'getAnimations for transition on non-animatable property');

test(function(t) {
  var div = addDiv(t);

  div.style.setProperty('-vendor-unsupported', '0px', '');
  getComputedStyle(div).transitionProperty;
  div.style.transition = 'all 100s';
  div.style.setProperty('-vendor-unsupported', '100px', '');

  assert_equals(div.getAnimations().length, 0,
    'getAnimations returns an empty sequence for a transition'
    + ' of an unsupported property');
}, 'getAnimations for transition on unsupported property');

test(function(t) {
  var div = addDiv(t, { style: 'transform: translate(0px); ' +
                               'opacity: 0; ' +
                               'border-width: 0px; ' + // Shorthand
                               'border-style: solid' });
  getComputedStyle(div).transform;

  div.style.transition = 'all 100s';
  div.style.transform = 'translate(100px)';
  div.style.opacity = '1';
  div.style.borderWidth = '1px';

  var animations = div.getAnimations();
  assert_equals(animations.length, 6,
                'Generated expected number of transitions');
  assert_equals(animations[0].transitionProperty, 'border-bottom-width');
  assert_equals(animations[1].transitionProperty, 'border-left-width');
  assert_equals(animations[2].transitionProperty, 'border-right-width');
  assert_equals(animations[3].transitionProperty, 'border-top-width');
  assert_equals(animations[4].transitionProperty, 'opacity');
  assert_equals(animations[5].transitionProperty, 'transform');
}, 'getAnimations sorts simultaneous transitions by name');

test(function(t) {
  var div = addDiv(t, { style: 'transform: translate(0px); ' +
                               'opacity: 0' });
  getComputedStyle(div).transform;

  div.style.transition = 'all 100s';
  div.style.transform = 'translate(100px)';
  assert_equals(div.getAnimations().length, 1,
                'Initially there is only one (transform) transition');
  div.style.opacity = '1';
  assert_equals(div.getAnimations().length, 2,
                'Then a second (opacity) transition is added');

  var animations = div.getAnimations();
  assert_equals(animations[0].transitionProperty, 'transform');
  assert_equals(animations[1].transitionProperty, 'opacity');
}, 'getAnimations sorts transitions by when they were generated');

</script>
</body>
