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

"use strict";

// Unit test for math behind conversion of units for font-size. A reference element is
// needed for converting to and from relative units (rem, em, %). A controlled viewport
// is needed (iframe) for converting to and from viewport units (vh, vw, vmax, vmin).

const TEST_URI = URL_ROOT + "doc_browser_fontinspector_iframe.html";

add_task(async function () {
  const { inspector, view } = await openFontInspectorForURL(TEST_URI);
  const viewDoc = view.document;
  const property = "font-size";
  const selector = ".viewport-size";
  const UNITS = {
    px: 50,
    vw: 10,
    vh: 20,
    vmin: 20,
    vmax: 10,
    em: 1.389,
    rem: 3.125,
    "%": 138.889,
    pt: 37.5,
    pc: 3.125,
    mm: 13.229,
    cm: 1.323,
    in: 0.521,
  };

  await selectNodeInFrames(["#frame", selector], inspector);

  info("Check that font editor shows font-size value in original units");
  const fontSize = getPropertyValue(viewDoc, property);
  is(fontSize.unit, "vw", "Original unit for font size is vw");
  is(fontSize.value + fontSize.unit, "10vw", "Original font size is 10vw");

  // Starting value and unit for conversion.
  let prevValue = fontSize.value;
  let prevUnit = fontSize.unit;

  for (const unit in UNITS) {
    const value = UNITS[unit];

    info(`Convert font-size from ${prevValue}${prevUnit} to ${unit}`);
    const convertedValue = await view.convertUnits(
      property,
      prevValue,
      prevUnit,
      unit
    );
    is(
      parseFloat(convertedValue),
      parseFloat(value),
      `Converting to ${unit} returns transformed value.`
    );

    // Store current unit and value to use in conversion on the next iteration.
    prevUnit = unit;
    prevValue = value;
  }

  info(`Check that conversion from fake unit returns 1-to-1 mapping.`);
  const valueFromFakeUnit = await view.convertUnits(property, 1, "fake", "px");
  is(valueFromFakeUnit, 1, `Converting from fake unit returns same value.`);

  info(`Check that conversion to fake unit returns 1-to-1 mapping`);
  const valueToFakeUnit = await view.convertUnits(property, 1, "px", "fake");
  is(valueToFakeUnit, 1, `Converting to fake unit returns same value.`);

  info(`Check that conversion between fake units returns 1-to-1 mapping.`);
  const valueBetweenFakeUnit = await view.convertUnits(
    property,
    1,
    "bogus",
    "fake"
  );
  is(
    valueBetweenFakeUnit,
    1,
    `Converting between fake units returns same value.`
  );
});
