/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

"use strict";

// Make sure that the CSS shapes highlighters have the correct attributes.

const TEST_URL = URL_ROOT + "doc_inspector_highlighter_cssshapes.html";
const { TYPES } = ChromeUtils.importESModule(
  "resource://devtools/shared/highlighters.mjs"
);
const HIGHLIGHTER_TYPE = TYPES.SHAPES;

add_task(async function () {
  const { inspector, highlighterTestFront } =
    await openInspectorForURL(TEST_URL);
  const front = inspector.inspectorFront;
  const highlighter = await front.getHighlighterByType(HIGHLIGHTER_TYPE);

  await polygonHasCorrectAttrs(highlighterTestFront, inspector, highlighter);
  await circleHasCorrectAttrs(highlighterTestFront, inspector, highlighter);
  await ellipseHasCorrectAttrs(highlighterTestFront, inspector, highlighter);
  await insetHasCorrectAttrs(highlighterTestFront, inspector, highlighter);

  await highlighter.finalize();
});

async function polygonHasCorrectAttrs(
  highlighterTestFront,
  inspector,
  highlighterFront
) {
  info("Checking polygon highlighter has correct points");

  const polygonNode = await getNodeFront("#polygon", inspector);
  await highlighterFront.show(polygonNode, { mode: "cssClipPath" });

  const points = await highlighterTestFront.getHighlighterNodeAttribute(
    "shapes-polygon",
    "points",
    highlighterFront
  );
  const realPoints =
    "0,0 12.5,50 25,0 37.5,50 50,0 62.5,50 " +
    "75,0 87.5,50 100,0 90,100 50,60 10,100";
  is(points, realPoints, "Polygon highlighter has correct points");
}

async function circleHasCorrectAttrs(
  highlighterTestFront,
  inspector,
  highlighterFront
) {
  info("Checking circle highlighter has correct attributes");

  const circleNode = await getNodeFront("#circle", inspector);
  await highlighterFront.show(circleNode, { mode: "cssClipPath" });

  const rx = await highlighterTestFront.getHighlighterNodeAttribute(
    "shapes-ellipse",
    "rx",
    highlighterFront
  );
  const ry = await highlighterTestFront.getHighlighterNodeAttribute(
    "shapes-ellipse",
    "ry",
    highlighterFront
  );
  const cx = await highlighterTestFront.getHighlighterNodeAttribute(
    "shapes-ellipse",
    "cx",
    highlighterFront
  );
  const cy = await highlighterTestFront.getHighlighterNodeAttribute(
    "shapes-ellipse",
    "cy",
    highlighterFront
  );

  is(rx, "25", "Circle highlighter has correct rx");
  is(ry, "25", "Circle highlighter has correct ry");
  is(cx, "30", "Circle highlighter has correct cx");
  is(cy, "40", "Circle highlighter has correct cy");
}

async function ellipseHasCorrectAttrs(
  highlighterTestFront,
  inspector,
  highlighterFront
) {
  info("Checking ellipse highlighter has correct attributes");

  const ellipseNode = await getNodeFront("#ellipse", inspector);
  await highlighterFront.show(ellipseNode, { mode: "cssClipPath" });

  const rx = await highlighterTestFront.getHighlighterNodeAttribute(
    "shapes-ellipse",
    "rx",
    highlighterFront
  );
  const ry = await highlighterTestFront.getHighlighterNodeAttribute(
    "shapes-ellipse",
    "ry",
    highlighterFront
  );
  const cx = await highlighterTestFront.getHighlighterNodeAttribute(
    "shapes-ellipse",
    "cx",
    highlighterFront
  );
  const cy = await highlighterTestFront.getHighlighterNodeAttribute(
    "shapes-ellipse",
    "cy",
    highlighterFront
  );

  is(rx, "40", "Ellipse highlighter has correct rx");
  is(ry, "30", "Ellipse highlighter has correct ry");
  is(cx, "25", "Ellipse highlighter has correct cx");
  is(cy, "30", "Ellipse highlighter has correct cy");
}

async function insetHasCorrectAttrs(
  highlighterTestFront,
  inspector,
  highlighterFront
) {
  info("Checking rect highlighter has correct attributes");

  const insetNode = await getNodeFront("#inset", inspector);
  await highlighterFront.show(insetNode, { mode: "cssClipPath" });

  const x = await highlighterTestFront.getHighlighterNodeAttribute(
    "shapes-rect",
    "x",
    highlighterFront
  );
  const y = await highlighterTestFront.getHighlighterNodeAttribute(
    "shapes-rect",
    "y",
    highlighterFront
  );
  const width = await highlighterTestFront.getHighlighterNodeAttribute(
    "shapes-rect",
    "width",
    highlighterFront
  );
  const height = await highlighterTestFront.getHighlighterNodeAttribute(
    "shapes-rect",
    "height",
    highlighterFront
  );

  is(x, "15", "Rect highlighter has correct x");
  is(y, "25", "Rect highlighter has correct y");
  is(width, "72.5", "Rect highlighter has correct width");
  is(height, "45", "Rect highlighter has correct height");
}
