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

"use strict";

/**
 * Test the suggestion-picker helper methods.
 */

const {
  findMostRelevantIndex,
  findMostRelevantCssPropertyIndex,
} = require("resource://devtools/client/shared/suggestion-picker.js");

/**
 * Run all tests defined below.
 */
function run_test() {
  ensureMostRelevantIndexProvidedByHelperFunction();
  ensureMostRelevantIndexProvidedByClassMethod();
  ensureErrorThrownWithInvalidArguments();
}

/**
 * Generic test data.
 */
const TEST_DATA = [
  {
    // Match in sortedItems array.
    items: ["chrome", "edge", "firefox"],
    sortedItems: ["firefox", "chrome", "edge"],
    expectedIndex: 2,
  },
  {
    // No match in sortedItems array.
    items: ["apple", "oranges", "banana"],
    sortedItems: ["kiwi", "pear", "peach"],
    expectedIndex: 0,
  },
  {
    // Empty items array.
    items: [],
    sortedItems: ["empty", "arrays", "can't", "have", "relevant", "indexes"],
    expectedIndex: -1,
  },
];

function ensureMostRelevantIndexProvidedByHelperFunction() {
  info("Running ensureMostRelevantIndexProvidedByHelperFunction()");

  for (const testData of TEST_DATA) {
    const { items, sortedItems, expectedIndex } = testData;
    const mostRelevantIndex = findMostRelevantIndex(items, sortedItems);
    strictEqual(mostRelevantIndex, expectedIndex);
  }
}

/**
 * CSS properties test data.
 */
const CSS_TEST_DATA = [
  {
    items: [
      "backface-visibility",
      "background",
      "background-attachment",
      "background-blend-mode",
      "background-clip",
      "background-color",
      "background-image",
      "background-origin",
      "background-position",
      "background-repeat",
    ],
    expectedIndex: 1,
  },
  {
    items: [
      "caption-side",
      "clear",
      "clip",
      "clip-path",
      "clip-rule",
      "color",
      "color-interpolation",
      "color-interpolation-filters",
      "content",
      "counter-increment",
    ],
    expectedIndex: 5,
  },
  {
    items: ["direction", "display", "dominant-baseline"],
    expectedIndex: 1,
  },
  {
    items: [
      "object-fit",
      "object-position",
      "offset-block-end",
      "offset-block-start",
      "offset-inline-end",
      "offset-inline-start",
      "opacity",
      "order",
      "orphans",
      "outline",
    ],
    expectedIndex: 6,
  },
  {
    items: [
      "white-space",
      "widows",
      "width",
      "will-change",
      "word-break",
      "word-spacing",
      "word-wrap",
      "writing-mode",
    ],
    expectedIndex: 2,
  },
];

function ensureMostRelevantIndexProvidedByClassMethod() {
  info("Running ensureMostRelevantIndexProvidedByClassMethod()");

  for (const testData of CSS_TEST_DATA) {
    const { items, expectedIndex } = testData;
    const mostRelevantIndex = findMostRelevantCssPropertyIndex(items);
    strictEqual(mostRelevantIndex, expectedIndex);
  }
}

function ensureErrorThrownWithInvalidArguments() {
  info("Running ensureErrorThrownWithInvalidTypeArgument()");

  const expectedError = /Please provide valid items and sortedItems arrays\./;
  // No arguments passed.
  Assert.throws(() => findMostRelevantIndex(), expectedError);
  // Invalid arguments passed.
  Assert.throws(() => findMostRelevantIndex([]), expectedError);
  Assert.throws(() => findMostRelevantIndex(null, []), expectedError);
  Assert.throws(() => findMostRelevantIndex([], "string"), expectedError);
  Assert.throws(() => findMostRelevantIndex("string", []), expectedError);
}
