106 lines
2.8 KiB
TypeScript
106 lines
2.8 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import { compareVersions, parseVersion, sortVersionsDesc } from "./version";
|
|
|
|
describe("parseVersion", () => {
|
|
it("parses simple version", () => {
|
|
const v = parseVersion("1.2.3");
|
|
expect(v.segments).toEqual([1, 2, 3]);
|
|
expect(v.raw).toBe("1.2.3");
|
|
});
|
|
|
|
it("strips v prefix", () => {
|
|
expect(parseVersion("v1.2").segments).toEqual([1, 2]);
|
|
});
|
|
|
|
it("handles single segment", () => {
|
|
expect(parseVersion("3").segments).toEqual([3]);
|
|
});
|
|
|
|
it("handles two segments", () => {
|
|
expect(parseVersion("v0.9").segments).toEqual([0, 9]);
|
|
});
|
|
|
|
it("returns empty segments for non-numeric input", () => {
|
|
expect(parseVersion("latest").segments).toEqual([]);
|
|
});
|
|
|
|
it("returns empty segments for partially numeric input", () => {
|
|
expect(parseVersion("1.2.beta").segments).toEqual([]);
|
|
});
|
|
});
|
|
|
|
describe("compareVersions", () => {
|
|
it("returns 0 for equal versions", () => {
|
|
expect(compareVersions("1.0.0", "1.0.0")).toBe(0);
|
|
});
|
|
|
|
it("returns 1 when a > b (patch)", () => {
|
|
expect(compareVersions("1.0.1", "1.0.0")).toBe(1);
|
|
});
|
|
|
|
it("returns -1 when a < b (patch)", () => {
|
|
expect(compareVersions("1.0.0", "1.0.1")).toBe(-1);
|
|
});
|
|
|
|
it("returns 1 when a > b (minor)", () => {
|
|
expect(compareVersions("1.1.0", "1.0.0")).toBe(1);
|
|
});
|
|
|
|
it("returns 1 when a > b (major)", () => {
|
|
expect(compareVersions("2.0.0", "1.9.9")).toBe(1);
|
|
});
|
|
|
|
it("strips v prefix", () => {
|
|
expect(compareVersions("v1.2.0", "1.2.0")).toBe(0);
|
|
});
|
|
|
|
it("strips v prefix on both sides", () => {
|
|
expect(compareVersions("v2.0.0", "v1.0.0")).toBe(1);
|
|
});
|
|
|
|
it("treats missing segments as 0", () => {
|
|
expect(compareVersions("1.0", "1.0.0")).toBe(0);
|
|
});
|
|
|
|
it("compares different length versions", () => {
|
|
expect(compareVersions("1.0.1", "1.0")).toBe(1);
|
|
});
|
|
|
|
it("handles single-segment versions", () => {
|
|
expect(compareVersions("2", "1")).toBe(1);
|
|
});
|
|
|
|
it("handles single vs multi-segment", () => {
|
|
expect(compareVersions("1", "1.0.0")).toBe(0);
|
|
});
|
|
});
|
|
|
|
describe("sortVersionsDesc", () => {
|
|
it("sorts versions newest first", () => {
|
|
expect(sortVersionsDesc(["v0.1", "v1.2", "v0.9"])).toEqual(["v1.2", "v0.9", "v0.1"]);
|
|
});
|
|
|
|
it("sorts major versions correctly", () => {
|
|
expect(sortVersionsDesc(["v1.9", "v2.0"])).toEqual(["v2.0", "v1.9"]);
|
|
});
|
|
|
|
it("sorts numerically not lexicographically", () => {
|
|
expect(sortVersionsDesc(["v1.9", "v1.10", "v1.2"])).toEqual(["v1.10", "v1.9", "v1.2"]);
|
|
});
|
|
|
|
it("handles single element", () => {
|
|
expect(sortVersionsDesc(["v1.0"])).toEqual(["v1.0"]);
|
|
});
|
|
|
|
it("handles empty array", () => {
|
|
expect(sortVersionsDesc([])).toEqual([]);
|
|
});
|
|
|
|
it("does not mutate the original array", () => {
|
|
const input = ["v0.2", "v0.1"];
|
|
sortVersionsDesc(input);
|
|
expect(input).toEqual(["v0.2", "v0.1"]);
|
|
});
|
|
});
|