import { describe, expect, it } from "vitest"; import { Template } from "./template"; import { compareParsed, parseExisting } from "./existingVersion"; describe("parseExisting", () => { it("从 version_number 模板反向解析 version 和 mc_version", () => { const tmpl = new Template("${version}-mc${mc_version}"); expect(parseExisting(tmpl, "1.2.3-mc1.21")).toEqual({ version: "1.2.3", mc_version: "1.21", }); }); it("从 filename_format 模板反向解析(含字面量前缀)", () => { const tmpl = new Template("modname-${version}-mc${mc_version}.jar"); expect(parseExisting(tmpl, "modname-0.9.0-mc1.20.1.jar")).toEqual({ version: "0.9.0", mc_version: "1.20.1", }); }); it("不匹配模板时返回 null", () => { const tmpl = new Template("${version}-mc${mc_version}"); expect(parseExisting(tmpl, "random-string")).toEqual({ version: null, mc_version: null, }); }); it("捕获段不是合法 SemVer 时返回 null", () => { const tmpl = new Template("${version}-mc${mc_version}"); expect(parseExisting(tmpl, "abc-mc1.21")).toEqual({ version: null, mc_version: null, }); }); }); describe("compareParsed", () => { const p = (version: string | null, mc_version: string | null = null) => ({ version, mc_version, }); it("mod_version 降序优先", () => { const list = [p("1.0.0"), p("1.2.0"), p("0.9.0")]; list.sort(compareParsed); expect(list.map((x) => x.version)).toEqual(["1.2.0", "1.0.0", "0.9.0"]); }); it("同 mod_version 时 mc_version 降序", () => { const list = [ p("1.0.0", "1.20"), p("1.0.0", "1.21"), p("1.0.0", "1.19.4"), ]; list.sort(compareParsed); expect(list.map((x) => x.mc_version)).toEqual(["1.21", "1.20", "1.19.4"]); }); it("无法解析的排最后", () => { const list = [p(null), p("1.0.0", "1.21"), p("0.9.0", "1.20")]; list.sort(compareParsed); expect(list[0]!.version).toBe("1.0.0"); expect(list[1]!.version).toBe("0.9.0"); expect(list[2]!.version).toBeNull(); }); });