/**
 * Common infrastructure for manifest tests.
 **/
"use strict";
const { ManifestProcessor } = SpecialPowers.ChromeUtils.importESModule(
  "resource://gre/modules/ManifestProcessor.sys.mjs"
);
const processor = ManifestProcessor;
const manifestURL = new URL(document.location.origin + "/manifest.json");
const docURL = document.location;
const seperators =
  "\u2028\u2029\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000";
const lineTerminators = "\u000D\u000A\u2028\u2029";
const whiteSpace = `${seperators}${lineTerminators}`;
const typeTests = [1, null, {}, [], false];
const data = {
  jsonText: "{}",
  manifestURL,
  docURL,
};

const validThemeColors = [
  ["maroon", "#800000ff"],
  ["#f00", "#ff0000ff"],
  ["#ff0000", "#ff0000ff"],
  ["rgb(255,0,0)", "#ff0000ff"],
  ["rgb(255,0,0,1)", "#ff0000ff"],
  ["rgb(255,0,0,1.0)", "#ff0000ff"],
  ["rgb(255,0,0,100%)", "#ff0000ff"],
  ["rgb(255 0 0)", "#ff0000ff"],
  ["rgb(255 0 0 / 1)", "#ff0000ff"],
  ["rgb(255 0 0 / 1.0)", "#ff0000ff"],
  ["rgb(255 0 0 / 100%)", "#ff0000ff"],
  ["rgb(100%, 0%, 0%)", "#ff0000ff"],
  ["rgb(100%, 0%, 0%, 1)", "#ff0000ff"],
  ["rgb(100%, 0%, 0%, 1.0)", "#ff0000ff"],
  ["rgb(100%, 0%, 0%, 100%)", "#ff0000ff"],
  ["rgb(100% 0% 0%)", "#ff0000ff"],
  ["rgb(100% 0% 0% / 1)", "#ff0000ff"],
  ["rgb(100%, 0%, 0%, 1.0)", "#ff0000ff"],
  ["rgb(100%, 0%, 0%, 100%)", "#ff0000ff"],
  ["rgb(300,0,0)", "#ff0000ff"],
  ["rgb(300 0 0)", "#ff0000ff"],
  ["rgb(255,-10,0)", "#ff0000ff"],
  ["rgb(110%, 0%, 0%)", "#ff0000ff"],
  ["rgba(255,0,0)", "#ff0000ff"],
  ["rgba(255,0,0,1)", "#ff0000ff"],
  ["rgba(255 0 0 / 1)", "#ff0000ff"],
  ["rgba(100%,0%,0%,1)", "#ff0000ff"],
  ["rgba(0,0,255,0.5)", "#0000ff80"],
  ["rgba(100%, 50%, 0%, 0.1)", "#ff80001a"],
  ["hsl(120, 100%, 50%)", "#00ff00ff"],
  ["hsl(120 100% 50%)", "#00ff00ff"],
  ["hsl(120, 100%, 50%, 1.0)", "#00ff00ff"],
  ["hsl(120 100% 50% / 1.0)", "#00ff00ff"],
  ["hsla(120, 100%, 50%)", "#00ff00ff"],
  ["hsla(120 100% 50%)", "#00ff00ff"],
  ["hsla(120, 100%, 50%, 1.0)", "#00ff00ff"],
  ["hsla(120 100% 50% / 1.0)", "#00ff00ff"],
  ["hsl(120deg, 100%, 50%)", "#00ff00ff"],
  ["hsl(133.33333333grad, 100%, 50%)", "#00ff00ff"],
  ["hsl(2.0943951024rad, 100%, 50%)", "#00ff00ff"],
  ["hsl(0.3333333333turn, 100%, 50%)", "#00ff00ff"],
];

function setupManifest(key, value) {
  const manifest = {};
  manifest[key] = value;
  data.jsonText = JSON.stringify(manifest);
}

function testValidColors(key) {
  validThemeColors.forEach(item => {
    const [manifest_color, parsed_color] = item;
    setupManifest(key, manifest_color);
    const result = processor.process(data);

    is(
      result[key],
      parsed_color,
      `Expect ${key} to be returned for ${manifest_color}`
    );
  });

  // Trim tests
  validThemeColors.forEach(item => {
    const [manifest_color, parsed_color] = item;
    const expandedThemeColor = `${seperators}${lineTerminators}${manifest_color}${lineTerminators}${seperators}`;
    setupManifest(key, expandedThemeColor);
    const result = processor.process(data);

    is(
      result[key],
      parsed_color,
      `Expect trimmed ${key} to be returned for ${manifest_color}`
    );
  });
}

const invalidThemeColors = [
  "marooon",
  "f000000",
  "#ff00000",
  "rgb(100, 0%, 0%)",
  "rgb(255,0)",
  "rbg(255,-10,0)",
  "rgb(110, 0%, 0%)",
  "(255,0,0) }",
  "rgba(255)",
  " rgb(100%,0%,0%) }",
  "hsl(120, 100%, 50)",
  "hsl(120, 100%, 50.0)",
  "hsl 120, 100%, 50%",
  "hsla{120, 100%, 50%, 1}",
];

function testInvalidColors(key) {
  typeTests.forEach(type => {
    setupManifest(key, type);
    const result = processor.process(data);

    is(
      result[key],
      undefined,
      `Expect non-string ${key} to be undefined: ${typeof type}.`
    );
  });

  invalidThemeColors.forEach(manifest_color => {
    setupManifest(key, manifest_color);
    const result = processor.process(data);

    is(
      result[key],
      undefined,
      `Expect ${key} to be undefined: ${manifest_color}.`
    );
  });
}
