import { afterAll, beforeAll, describe, expect, it } from "vitest";
import {
  atLeastVersion,
  isDevVersion,
} from "../../../src/common/config/version";

const testTruthyData = [
  { version: "2021.1.1", major: 2021, minor: 1, patch: 1 },
  { version: "2021.1.1", major: 2021, minor: 1 },
  { version: "2021.1.1", major: 2020, minor: 12, patch: 1 },
  { version: "2021.1.1", major: 2020, minor: 12 },
  { version: "2021.2.0", major: 2021, minor: 2, patch: 0 },
  { version: "2021.2.1", major: 2021, minor: 2 },

  { version: "2021.2.4", major: 0, minor: 113, patch: 0 },
  { version: "2021.2.4", major: 0, minor: 113 },

  { version: "0.114.0", major: 0, minor: 113, patch: 0 },
  { version: "0.114.0", major: 0, minor: 113 },

  { version: "2021.2.0dev.2323", major: 2021, minor: 1, patch: 0 },
  { version: "2021.2.0dev.2323", major: 2021, minor: 2 },
];

const testFalsyData = [
  { version: "0.114.0", major: 0, minor: 115 },
  { version: "2021.2.0dev.2323", major: 2021, minor: 2, patch: 0 },
];

describe("atLeastVersion - Truthy", () => {
  testTruthyData.forEach((test) =>
    it(`'${test.version}' >= ${test.major},${test.minor},${test.patch}`, () => {
      expect(
        atLeastVersion(test.version, test.major, test.minor, test.patch)
      ).toBe(true);
    })
  );
});

describe("atLeastVersion - Falsy", () => {
  testFalsyData.forEach((test) =>
    it(`'${test.version}' >= ${test.major},${test.minor},${test.patch}`, () => {
      expect(
        atLeastVersion(test.version, test.major, test.minor, test.patch)
      ).toBe(false);
    })
  );
});

describe("atLeastVersion - DEMO", () => {
  beforeAll(() => {
    // eslint-disable-next-line no-global-assign
    __DEMO__ = true;
  });
  afterAll(() => {
    // eslint-disable-next-line no-global-assign
    __DEMO__ = false;
  });

  testFalsyData.forEach((test) =>
    it(`'${test.version}' >= ${test.major},${test.minor},${test.patch}`, () => {
      expect(atLeastVersion("2021.1.1", 2021, 1)).toBe(true);
    })
  );
});

describe("isDevVersion", () => {
  it("should return false for demo version", () => {
    // eslint-disable-next-line no-global-assign
    __DEMO__ = true;
    expect(isDevVersion("2021.1.1dev.123")).toBe(false);
    // eslint-disable-next-line no-global-assign
    __DEMO__ = false;
  });

  it("should return true for dev version", () => {
    expect(isDevVersion("2021.1.1dev.1231")).toBe(true);
  });

  it("should return false for non-dev version", () => {
    expect(isDevVersion("2021.1.1")).toBe(false);
  });
});
