"use strict";

const prettier = require("prettier/local");
const runPrettier = require("../runPrettier");
const snapshotDiff = require("snapshot-diff");

describe("API getSupportInfo()", () => {
  const testVersions = [
    "0.0.0",
    "1.0.0",
    "1.4.0",
    "1.5.0",
    "1.7.1",
    "1.8.0",
    "1.8.2",
    "1.16.0",
    undefined
  ];

  testVersions.forEach((version, index) => {
    const info = getCoreInfo(version);
    if (index === 0) {
      test(`with version ${version}`, () => {
        expect(info).toMatchSnapshot();
      });
    } else {
      const previousVersion = testVersions[index - 1];
      const previousInfo = getCoreInfo(previousVersion);
      test(`with version ${previousVersion} -> ${version}`, () => {
        expect(snapshotDiff(previousInfo, info)).toMatchSnapshot();
      });
    }
  });
});

describe("CLI --support-info", () => {
  runPrettier("cli", "--support-info").test({ status: 0 });
});

function getCoreInfo(version) {
  const supportInfo = prettier.getSupportInfo(version);
  const languages = supportInfo.languages.reduce(
    (obj, language) =>
      Object.assign({ [language.name]: language.parsers }, obj),
    {}
  );
  const options = supportInfo.options.reduce(
    (obj, option) =>
      Object.assign(
        {
          [option.name]: Object.assign(
            {
              type: option.type,
              default: option.default
            },
            option.type === "int"
              ? { range: option.range }
              : option.type === "choice"
              ? { choices: option.choices.map(choice => choice.value) }
              : null
          )
        },
        obj
      ),
    {}
  );
  return { languages, options };
}
