{"version":3,"file":"snapshot-selector-resolver.test.d.ts","sourceRoot":"","sources":["../../src/core/snapshot-selector-resolver.test.ts"],"names":[],"mappings":"","sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport type { MemoryHistorySnapshot } from \"./memory.js\";\nimport { computeMemorySnapshotDiff } from \"./memory-diff.js\";\nimport {\n\tMEMORY_SNAPSHOT_SHORT_ID_LENGTH,\n\tnormalizeSnapshotSelector,\n\tresolveSnapshotSelector,\n} from \"./snapshot-selector-resolver.js\";\n\nfunction makeSnapshot(\n\tentryId: string,\n\titems: Array<{ key: string; value: string }>,\n\trecordedAt = \"2026-04-01T00:00:00.000Z\",\n): MemoryHistorySnapshot {\n\treturn {\n\t\tentryId,\n\t\tparentId: null,\n\t\trecordedAt,\n\t\titems: items.map((item) => ({ ...item, timestamp: recordedAt })),\n\t\tisCurrent: false,\n\t};\n}\n\ndescribe(\"snapshot selector resolver\", () => {\n\tit(\"normalizes bracketed and whitespace-padded selectors\", () => {\n\t\texpect(normalizeSnapshotSelector(\"  [abc12345]  \")).toBe(\"abc12345\");\n\t\texpect(normalizeSnapshotSelector(\"  abc12345  \")).toBe(\"abc12345\");\n\t\texpect(normalizeSnapshotSelector(\"[]\")).toBe(\"\");\n\t\texpect(normalizeSnapshotSelector(\"   \")).toBe(\"\");\n\t});\n\n\tit(\"resolves exact full entryId\", () => {\n\t\tconst snapshots = [makeSnapshot(\"abc12345-1111\", [{ key: \"a\", value: \"1\" }])];\n\t\tconst result = resolveSnapshotSelector(\"abc12345-1111\", snapshots);\n\t\texpect(result.snapshot?.entryId).toBe(\"abc12345-1111\");\n\t\texpect(result.resolvedId).toBe(\"abc12345-1111\");\n\t\texpect(result.error).toBeUndefined();\n\t\texpect(result.candidates).toEqual([]);\n\t});\n\n\tit(\"resolves exact displayed short ID\", () => {\n\t\tconst fullId = \"abc12345-1111\";\n\t\tconst snapshots = [makeSnapshot(fullId, [{ key: \"a\", value: \"1\" }])];\n\t\tconst result = resolveSnapshotSelector(fullId.slice(0, MEMORY_SNAPSHOT_SHORT_ID_LENGTH), snapshots);\n\t\texpect(result.snapshot?.entryId).toBe(fullId);\n\t\texpect(result.error).toBeUndefined();\n\t});\n\n\tit(\"resolves bracketed short ID copied from history\", () => {\n\t\tconst fullId = \"abc12345-1111\";\n\t\tconst snapshots = [makeSnapshot(fullId, [{ key: \"a\", value: \"1\" }])];\n\t\tconst result = resolveSnapshotSelector(`[${fullId.slice(0, MEMORY_SNAPSHOT_SHORT_ID_LENGTH)}]`, snapshots);\n\t\texpect(result.snapshot?.entryId).toBe(fullId);\n\t\texpect(result.matchedInput).toBe(fullId.slice(0, MEMORY_SNAPSHOT_SHORT_ID_LENGTH));\n\t\texpect(result.error).toBeUndefined();\n\t});\n\n\tit(\"prefers exact displayed short ID before broader prefix matching\", () => {\n\t\tconst snapshots = [\n\t\t\tmakeSnapshot(\"abc12345-1111\", [{ key: \"a\", value: \"1\" }]),\n\t\t\tmakeSnapshot(\"abc123456-2222\", [{ key: \"b\", value: \"2\" }]),\n\t\t];\n\t\tconst result = resolveSnapshotSelector(\"abc12345\", snapshots);\n\t\texpect(result.snapshot?.entryId).toBe(\"abc12345-1111\");\n\t\texpect(result.error).toBeUndefined();\n\t});\n\n\tit(\"resolves strict unique prefix\", () => {\n\t\tconst snapshots = [\n\t\t\tmakeSnapshot(\"aaa00000-1111\", [{ key: \"a\", value: \"1\" }]),\n\t\t\tmakeSnapshot(\"bbb12345-2222\", [{ key: \"b\", value: \"2\" }]),\n\t\t\tmakeSnapshot(\"ccc00000-3333\", [{ key: \"c\", value: \"3\" }]),\n\t\t];\n\t\tconst result = resolveSnapshotSelector(\"bbb1\", snapshots);\n\t\texpect(result.snapshot?.entryId).toBe(\"bbb12345-2222\");\n\t\texpect(result.error).toBeUndefined();\n\t\texpect(result.candidates).toEqual([]);\n\t});\n\n\tit(\"rejects ambiguous prefixes with candidates\", () => {\n\t\tconst snapshots = [\n\t\t\tmakeSnapshot(\"abc00001-1111\", [{ key: \"a\", value: \"1\" }]),\n\t\t\tmakeSnapshot(\"abc00002-2222\", [{ key: \"b\", value: \"2\" }]),\n\t\t\tmakeSnapshot(\"abd00003-3333\", [{ key: \"c\", value: \"3\" }]),\n\t\t];\n\t\tconst result = resolveSnapshotSelector(\"abc\", snapshots);\n\t\texpect(result.snapshot).toBeUndefined();\n\t\texpect(result.error).toBe(\"ambiguous\");\n\t\texpect(result.candidates).toEqual([\"abc00001-1111\", \"abc00002-2222\"]);\n\t});\n\n\tit(\"rejects selectors with no match\", () => {\n\t\tconst snapshots = [makeSnapshot(\"abc12345-1111\", [{ key: \"a\", value: \"1\" }])];\n\t\tconst result = resolveSnapshotSelector(\"zzz99999\", snapshots);\n\t\texpect(result.snapshot).toBeUndefined();\n\t\texpect(result.error).toBe(\"not_found\");\n\t\texpect(result.candidates).toEqual([]);\n\t});\n\n\tit(\"rejects empty selectors after normalization\", () => {\n\t\tconst snapshots = [makeSnapshot(\"abc12345-1111\", [{ key: \"a\", value: \"1\" }])];\n\t\texpect(resolveSnapshotSelector(\"\", snapshots).error).toBe(\"empty\");\n\t\texpect(resolveSnapshotSelector(\"   \", snapshots).error).toBe(\"empty\");\n\t\texpect(resolveSnapshotSelector(\"[]\", snapshots).error).toBe(\"empty\");\n\t});\n\n\tit(\"supports same-snapshot compare flows honestly\", () => {\n\t\tconst fullId = \"abc12345-1111\";\n\t\tconst snapshots = [makeSnapshot(fullId, [{ key: \"a\", value: \"1\" }])];\n\t\tconst baseline = resolveSnapshotSelector(fullId, snapshots);\n\t\tconst target = resolveSnapshotSelector(`[${fullId.slice(0, MEMORY_SNAPSHOT_SHORT_ID_LENGTH)}]`, snapshots);\n\t\tconst diff = computeMemorySnapshotDiff(baseline.snapshot!, target.snapshot!);\n\t\texpect(baseline.resolvedId).toBe(target.resolvedId);\n\t\texpect(diff.added).toEqual([]);\n\t\texpect(diff.removed).toEqual([]);\n\t\texpect(diff.changed).toEqual([]);\n\t});\n});\n"]}