/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

// Test for following mutations:
// * add animation
// * remove animation
// * modify animation

add_task(async function () {
  await addTab(URL_ROOT + "doc_simple_animation.html");
  await removeAnimatedElementsExcept([
    ".compositor-all",
    ".compositor-notall",
    ".no-compositor",
    ".still",
  ]);
  const { animationInspector, inspector, panel } =
    await openAnimationInspector();

  info("Checking the mutation for add an animation");
  const originalAnimationCount = animationInspector.state.animations.length;
  await setClassAttribute(animationInspector, ".still", "ball no-compositor");
  await waitUntil(
    () =>
      animationInspector.state.animations.length === originalAnimationCount + 1
  );
  ok(true, "Count of animation should be plus one to original count");

  info(
    "Checking added animation existence even the animation name is duplicated"
  );
  is(
    getAnimationNameCount(panel, "no-compositor"),
    2,
    "Count of animation should be plus one to original count"
  );

  info("Checking the mutation for remove an animation");
  await setClassAttribute(
    animationInspector,
    ".compositor-notall",
    "ball still"
  );
  await waitUntil(
    () => animationInspector.state.animations.length === originalAnimationCount
  );
  ok(
    true,
    "Count of animation should be same to original count since we remove an animation"
  );

  info("Checking the mutation for modify an animation");
  await selectNode(".compositor-all", inspector);
  await setStyle(
    animationInspector,
    ".compositor-all",
    "animationDuration",
    "100s"
  );
  await setStyle(
    animationInspector,
    ".compositor-all",
    "animationIterationCount",
    1
  );
  const summaryGraphPathEl = getSummaryGraphPathElement(
    panel,
    "compositor-all"
  );
  await waitUntil(() => summaryGraphPathEl.viewBox.baseVal.width === 100000);
  ok(
    true,
    "Width of summary graph path should be 100000 " +
      "after modifing the duration and iteration count"
  );
  await setStyle(
    animationInspector,
    ".compositor-all",
    "animationDelay",
    "100s"
  );
  await waitUntil(() => summaryGraphPathEl.viewBox.baseVal.width === 200000);
  ok(
    true,
    "Width of summary graph path should be 200000 after modifing the delay"
  );
  ok(
    summaryGraphPathEl.parentElement.querySelector(".animation-delay-sign"),
    "Delay sign element shoud exist"
  );
});

function getAnimationNameCount(panel, animationName) {
  return [...panel.querySelectorAll(".animation-name")].reduce(
    (count, element) =>
      element.textContent === animationName ? count + 1 : count,
    0
  );
}

function getSummaryGraphPathElement(panel, animationName) {
  for (const animationNameEl of panel.querySelectorAll(".animation-name")) {
    if (animationNameEl.textContent === animationName) {
      return animationNameEl
        .closest(".animation-summary-graph")
        .querySelector(".animation-summary-graph-path");
    }
  }

  return null;
}
