/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */
/* eslint-disable no-shadow, max-nested-callbacks */

"use strict";

const { formatCommand } = require("devtools/server/actors/webconsole/commands.js");

const testcases = [
  { input: ":help", expectedOutput: "help()" },
  {
    input: ":screenshot  --fullscreen",
    expectedOutput: "screenshot({\"fullscreen\":true})",
  },
  {
    input: ":screenshot  --fullscreen true",
    expectedOutput: "screenshot({\"fullscreen\":true})",
  },
  { input: ":screenshot  ", expectedOutput: "screenshot()" },
  {
    input: ":screenshot --dpr 0.5 --fullpage --chrome",
    expectedOutput: "screenshot({\"dpr\":0.5,\"fullpage\":true,\"chrome\":true})",
  },
  {
    input: ":screenshot 'filename'",
    expectedOutput: "screenshot({\"filename\":\"filename\"})",
  },
  {
    input: ":screenshot filename",
    expectedOutput: "screenshot({\"filename\":\"filename\"})",
  },
  {
    input: ":screenshot --name 'filename' --name `filename` --name \"filename\"",
    expectedOutput: "screenshot({\"name\":[\"filename\",\"filename\",\"filename\"]})",
  },
  {
    input: ":screenshot 'filename1' 'filename2' 'filename3'",
    expectedOutput: "screenshot({\"filename\":\"filename1\"})",
  },
  {
    input: ":screenshot --chrome --chrome",
    expectedOutput: "screenshot({\"chrome\":true})",
  },
  {
    input: ":screenshot \"file name with spaces\"",
    expectedOutput: "screenshot({\"filename\":\"file name with spaces\"})",
  },
  {
    input: ":screenshot 'filename1' --name 'filename2'",
    expectedOutput: "screenshot({\"filename\":\"filename1\",\"name\":\"filename2\"})",
  },
  {
    input: ":screenshot --name 'filename1' 'filename2'",
    expectedOutput: "screenshot({\"name\":\"filename1\",\"filename\":\"filename2\"})",
  },
  {
    input: ":screenshot \"fo\\\"o bar\"",
    expectedOutput: "screenshot({\"filename\":\"fo\\\\\\\"o bar\"})",
  },
  {
    input: ":screenshot \"foo b\\\"ar\"",
    expectedOutput: "screenshot({\"filename\":\"foo b\\\\\\\"ar\"})",
  },
];

const edgecases = [
  { input: ":", expectedError: /'' is not a valid command/ },
  { input: ":invalid", expectedError: /'invalid' is not a valid command/ },
  { input: ":screenshot :help", expectedError: /Invalid command/ },
  { input: ":screenshot --", expectedError: /invalid flag/ },
  {
    input: ":screenshot \"fo\"o bar",
    expectedError:
      /String has unescaped `"` in \["fo"o\.\.\.\], may miss a space between arguments/,
  },
  {
    input: ":screenshot \"foo b\"ar",
    expectedError:
      // eslint-disable-next-line max-len
      /String has unescaped `"` in \["foo b"ar\.\.\.\], may miss a space between arguments/,
  },
  { input: ": screenshot", expectedError: /'' is not a valid command/ },
  { input: ":screenshot \"file name", expectedError: /String does not terminate/ },
  {
    input: ":screenshot \"file name --clipboard",
    expectedError: /String does not terminate before flag "clipboard"/,
  },
  { input: "::screenshot", expectedError: /':screenshot' is not a valid command/ },
];

function run_test() {
  testcases.forEach(testcase => {
    Assert.equal(formatCommand(testcase.input), testcase.expectedOutput);
  });

  edgecases.forEach(testcase => {
    Assert.throws(() => formatCommand(testcase.input), testcase.expectedError,
      `"${testcase.input}" should throw expected error`);
  });
}
