<!DOCTYPE html>
<meta charset=utf-8>
<title>KeyframeEffect copy constructor</title>
<link rel="help"
      href="https://drafts.csswg.org/web-animations/#dom-keyframeeffect-keyframeeffect-source">
<link rel="help"
      href="https://drafts.csswg.org/web-animations/#dom-keyframeeffectreadonly-keyframeeffectreadonly-source">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../testcommon.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';

test(t => {
  const effect = new KeyframeEffect(createDiv(t), null);
  const copiedEffect = new KeyframeEffect(effect);
  assert_equals(copiedEffect.target, effect.target, 'same target');
}, 'Copied KeyframeEffect has the same target');

test(t => {
  const effect =
    new KeyframeEffect(null,
                       [ { marginLeft: '0px' },
                         { marginLeft: '-20px', easing: 'ease-in',
                           offset: 0.1 },
                         { marginLeft: '100px', easing: 'ease-out' },
                         { marginLeft: '50px' } ]);

  const copiedEffect = new KeyframeEffect(effect);
  const keyframesA = effect.getKeyframes();
  const keyframesB = copiedEffect.getKeyframes();
  assert_equals(keyframesA.length, keyframesB.length, 'same keyframes length');

  for (let i = 0; i < keyframesA.length; ++i) {
    assert_equals(keyframesA[i].offset, keyframesB[i].offset,
                  `Keyframe ${i} has the same offset`);
    assert_equals(keyframesA[i].computedOffset, keyframesB[i].computedOffset,
                  `Keyframe ${i} has the same computedOffset`);
    assert_equals(keyframesA[i].easing, keyframesB[i].easing,
                  `Keyframe ${i} has the same easing`);
    assert_equals(keyframesA[i].composite, keyframesB[i].composite,
                  `Keyframe ${i} has the same composite`);

    assert_true(!!keyframesA[i].marginLeft,
                `Original keyframe ${i} has a valid property value`);
    assert_true(!!keyframesB[i].marginLeft,
                `New keyframe ${i} has a valid property value`);
    assert_equals(keyframesA[i].marginLeft, keyframesB[i].marginLeft,
                  `Keyframe ${i} has the same property value pair`);
  }
}, 'Copied KeyframeEffect has the same keyframes');

test(t => {
  const effect =
    new KeyframeEffect(null, null, { iterationComposite: 'accumulate' });

  const copiedEffect = new KeyframeEffect(effect);
  assert_equals(copiedEffect.iterationComposite, effect.iterationComposite,
                'same iterationCompositeOperation');
  assert_equals(copiedEffect.composite, effect.composite,
                'same compositeOperation');
}, 'Copied KeyframeEffect has the same KeyframeEffectOptions');

test(t => {
  const effect = new KeyframeEffect(null, null,
                                    { duration: 100 * MS_PER_SEC,
                                      delay: -1 * MS_PER_SEC,
                                      endDelay: 2 * MS_PER_SEC,
                                      fill: 'forwards',
                                      iterationStart: 2,
                                      iterations: 20,
                                      easing: 'ease-out',
                                      direction: 'alternate' } );

  const copiedEffect = new KeyframeEffect(effect);
  const timingA = effect.getTiming();
  const timingB = copiedEffect.getTiming();
  assert_not_equals(timingA, timingB, 'different timing objects');
  assert_equals(timingA.delay, timingB.delay, 'same delay');
  assert_equals(timingA.endDelay, timingB.endDelay, 'same endDelay');
  assert_equals(timingA.fill, timingB.fill, 'same fill');
  assert_equals(timingA.iterationStart, timingB.iterationStart,
                'same iterationStart');
  assert_equals(timingA.iterations, timingB.iterations, 'same iterations');
  assert_equals(timingA.duration, timingB.duration, 'same duration');
  assert_equals(timingA.direction, timingB.direction, 'same direction');
  assert_equals(timingA.easing, timingB.easing, 'same easing');
}, 'Copied KeyframeEffect has the same timing content');

</script>
</body>
