107 lines
2.6 KiB
TypeScript
107 lines
2.6 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import {
|
|
analyzeFixtureProcedure,
|
|
requireCurrentDocument,
|
|
resolveFixtureProcedure,
|
|
} from "../scripts/lib/real-hopper-semantic.mjs";
|
|
|
|
const normalize = (value: unknown): unknown => value;
|
|
|
|
describe("real Hopper semantic fixture resolution", () => {
|
|
it("requests assembly when analyzing fixture procedures", async () => {
|
|
const requests: unknown[] = [];
|
|
const result = await analyzeFixtureProcedure(
|
|
{
|
|
callTool: async (request: unknown) => {
|
|
requests.push(request);
|
|
return { dossier: true };
|
|
},
|
|
},
|
|
{},
|
|
{ address: "0x1000", name: "rea_entry" },
|
|
normalize,
|
|
);
|
|
|
|
expect(result).toEqual({ dossier: true });
|
|
expect(requests).toEqual([
|
|
{
|
|
name: "analyze_function",
|
|
arguments: { procedure: "0x1000", include_assembly: true },
|
|
},
|
|
]);
|
|
});
|
|
|
|
it("binds mutations to the active document, not the first listed one", async () => {
|
|
await expect(
|
|
requireCurrentDocument(
|
|
clientReturning("active"),
|
|
{},
|
|
["unrelated", "active"],
|
|
normalize,
|
|
),
|
|
).resolves.toBe("active");
|
|
await expect(
|
|
requireCurrentDocument(
|
|
clientReturning("unknown"),
|
|
{},
|
|
["unrelated", "active"],
|
|
normalize,
|
|
),
|
|
).rejects.toThrow(/current_document/u);
|
|
});
|
|
|
|
it("resolves the public search value and preserves its reported name", async () => {
|
|
const procedure = await resolveFixtureProcedure(
|
|
clientWithItems([
|
|
{
|
|
address: "0x1000",
|
|
value: "_rea_entry",
|
|
value_truncated: false,
|
|
},
|
|
]),
|
|
{},
|
|
"rea_entry",
|
|
normalize,
|
|
);
|
|
|
|
expect(procedure).toEqual({ address: "0x1000", name: "_rea_entry" });
|
|
});
|
|
|
|
it.each([
|
|
["empty", []],
|
|
[
|
|
"truncated",
|
|
[{ address: "0x1000", value: "rea_entry", value_truncated: true }],
|
|
],
|
|
[
|
|
"duplicate",
|
|
[
|
|
{ address: "0x1000", value: "rea_entry", value_truncated: false },
|
|
{ address: "0x2000", value: "_rea_entry", value_truncated: false },
|
|
],
|
|
],
|
|
[
|
|
"wrong name",
|
|
[{ address: "0x1000", value: "rea_other", value_truncated: false }],
|
|
],
|
|
])("rejects %s search evidence", async (_label, items) => {
|
|
await expect(
|
|
resolveFixtureProcedure(
|
|
clientWithItems(items),
|
|
{},
|
|
"rea_entry",
|
|
normalize,
|
|
),
|
|
).rejects.toThrow(/exactly one Hopper procedure/u);
|
|
});
|
|
});
|
|
|
|
const clientWithItems = (items: readonly unknown[]) => ({
|
|
callTool: async () => ({ items }),
|
|
});
|
|
|
|
const clientReturning = (value: unknown) => ({
|
|
callTool: async () => value,
|
|
});
|