/*
Unit tests for semver covering parseSemver; compareSemver; ltSemver. It also guards the documented public contract and regression-sensitive edge cases.
- Not a contract source of truth — the module under test owns the authoritative behavior; fixtures are minimal scaffolding only.
- Fixtures stay inline and minimal so each case states its own setup.
- RFC-1311: Compass header sweep — declares the semver suite's contract for test-file scaffold coverage.
*/
// @ai-invariant fixtures must not couple to kernel internals beyond the public surface under test
import { test, expect, describe } from "vitest";
import {
parseSemver,
compareSemver,
ltSemver,
gtSemver,
eqSemver,
inOpenClosedRange,
} from "../semver.ts";
describe("parseSemver", () => {
test("parses valid x.y.z", () => {
expect(parseSemver("1.2.3")).toEqual([1, 2, 3]);
});
test("parses zero version", () => {
expect(parseSemver("0.0.0")).toEqual([0, 0, 0]);
});
test("throws for invalid version", () => {
expect(() => parseSemver("1.2")).toThrow();
});
test("throws for non-numeric", () => {
expect(() => parseSemver("a.b.c")).toThrow();
});
test("trims whitespace", () => {
expect(parseSemver(" 1.2.3 ")).toEqual([1, 2, 3]);
});
});
describe("compareSemver", () => {
test("returns 0 for equal versions", () => {
expect(compareSemver("1.2.3", "1.2.3")).toBe(0);
});
test("returns -1 when a < b (minor)", () => {
expect(compareSemver("1.1.0", "1.2.0")).toBe(-1);
});
test("returns 1 when a > b (major)", () => {
expect(compareSemver("2.0.0", "1.9.9")).toBe(1);
});
test("returns -1 when a < b (patch)", () => {
expect(compareSemver("1.0.0", "1.0.1")).toBe(-1);
});
});
describe("ltSemver", () => {
test("true when a < b", () => {
expect(ltSemver("1.0.0", "1.0.1")).toBe(true);
});
test("false when a >= b", () => {
expect(ltSemver("1.0.1", "1.0.0")).toBe(false);
expect(ltSemver("1.0.0", "1.0.0")).toBe(false);
});
});
describe("gtSemver", () => {
test("true when a > b", () => {
expect(gtSemver("1.0.1", "1.0.0")).toBe(true);
});
test("false when a <= b", () => {
expect(gtSemver("1.0.0", "1.0.1")).toBe(false);
expect(gtSemver("1.0.0", "1.0.0")).toBe(false);
});
});
describe("eqSemver", () => {
test("true when equal", () => {
expect(eqSemver("1.2.3", "1.2.3")).toBe(true);
});
test("false when not equal", () => {
expect(eqSemver("1.2.3", "1.2.4")).toBe(false);
});
});
describe("inOpenClosedRange", () => {
test("true when from < v <= to", () => {
expect(inOpenClosedRange("1.0.1", "1.0.0", "1.0.2")).toBe(true);
expect(inOpenClosedRange("1.0.2", "1.0.0", "1.0.2")).toBe(true);
});
test("false when v == from (open)", () => {
expect(inOpenClosedRange("1.0.0", "1.0.0", "1.0.2")).toBe(false);
});
test("false when v > to", () => {
expect(inOpenClosedRange("1.0.3", "1.0.0", "1.0.2")).toBe(false);
});
});