import { expect, test } from "vitest" import { isHashIncludes, isHashLooseEqual, isHashLooseIncludes, isHashStrictEqual, isHashStrictIncludes, hashObjectToHashString, hashStringToHashObject, neatenHash, toHashObject, toHashString, } from "#Source/route/index.ts" test("neatenHash ensures the hash string starts with a hash sign", () => { expect(neatenHash("a=1&b=2&c=3")).toBe("#a=1&b=2&c=3") expect(neatenHash("#a=1&b=2&c=3")).toBe("#a=1&b=2&c=3") }) test("hashStringToHashObject decodes keys and values and preserves later equals signs", () => { expect(hashStringToHashObject("#na%20me=mobius%20model&formula=a%3Db&empty=")).toEqual({ "na me": "mobius model", formula: "a=b", empty: "", }) expect(hashStringToHashObject("#a=1&b=2&c=3")).toEqual({ a: "1", b: "2", c: "3" }) expect(hashStringToHashObject("#")).toEqual({}) }) test("hashObjectToHashString encodes keys and values into a hash string", () => { expect(hashObjectToHashString({ "na me": "mobius model", formula: "a=b" })).toBe( "#na%20me=mobius%20model&formula=a%3Db", ) expect(hashObjectToHashString({ a: "1", b: "2", c: "3" })).toBe("#a=1&b=2&c=3") expect(hashObjectToHashString({})).toBe("#") }) test("toHashString returns hash format for both strings and objects", () => { expect(toHashString("#a=1&b=2&c=3")).toBe("#a=1&b=2&c=3") expect(toHashString({ a: "1", b: "2", c: "3" })).toBe("#a=1&b=2&c=3") expect(toHashString({})).toBe("#") }) test("toHashObject returns parsed hash objects for both strings and objects", () => { const hashObject = { a: "1", b: "2", c: "3" } expect(toHashObject("#a=1&b=2&c=3")).toEqual({ a: "1", b: "2", c: "3" }) expect(toHashObject(hashObject)).toBe(hashObject) expect(toHashObject("#")).toEqual({}) }) test("isHashLooseIncludes checks whether all requested hash keys exist", () => { expect(isHashLooseIncludes("#a=1&b=2", ["a"])).toBe(true) expect(isHashLooseIncludes("#a=1&b=2", ["a", "c"])).toBe(false) }) test("isHashStrictIncludes checks whether hash key sets are identical", () => { expect(isHashStrictIncludes("#a=1&b=2", ["b", "a"])).toBe(true) expect(isHashStrictIncludes("#ab=1&c=2", ["a", "bc"])).toBe(false) }) test("isHashIncludes supports required and optional hash keys", () => { expect(isHashIncludes("#a=1&b=2", { a: "required", b: "optional" })).toBe(true) expect(isHashIncludes("#a=1&b=2", { a: "required" })).toBe(false) }) test("isHashLooseEqual checks whether target hash values are a matching subset", () => { expect(isHashLooseEqual("#a=1&b=2", "#a=1")).toBe(true) expect(isHashLooseEqual("#a=1&b=2", { a: "1", c: "3" })).toBe(false) }) test("isHashStrictEqual checks whether hash key sets and values are identical", () => { expect(isHashStrictEqual("#a=1&b=2", "#b=2&a=1")).toBe(true) expect(isHashStrictEqual("#a=1&b=2", "#a=1")).toBe(false) })