Files
rea/tests/boundary/cli/nativeDispatchRecordBudget.test.ts
morluto 9eec57b469 fix(native): report record-local Objective-C budget omissions
Have method, property, ivar, and adopted-protocol list owners flag real budget omissions on returned class, protocol, and category records. Preserve known empty lists and existing decode reasons.

Validated 59 source tests, two built CLI controls, five static inspections of an Apple-clang fixture, and typecheck/lint. The target was never executed. Fixes #5543.
2026-10-20 23:15:05 +08:00

65 lines
2.3 KiB
TypeScript

import { writeFile } from "node:fs/promises";
import { join } from "node:path";
import { describe, expect } from "vitest";
import { parseEvidence } from "../../../src/domain/evidence.js";
import { nativeDispatchMetadataResultSchema } from "../../../src/domain/native/objcSwiftMetadata.js";
import { objcRecordBudgetMacho } from "../../fixtures/objcRecordBudgetMacho.js";
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
import { cliTest } from "../../support/cli/cliFixture.js";
describe.skipIf(process.platform !== "darwin")(
"native dispatch declaration-local record budget",
() => {
cliTest.for([["protocol"], ["class"]] as const)(
"marks an omitted $0 method list partial in public CLI output",
async ([owner], { cli }) => {
const directory = await createTestTempDirectory("rea-objc-budget-");
const path = join(directory, "fixture.macho");
await writeFile(path, objcRecordBudgetMacho(owner));
const output = await cli.run({
arguments: [
"inspect-native-dispatch-metadata",
path,
"--max-records",
"1",
"--json",
],
environment: { REA_LOG_LEVEL: "silent" },
});
expect(output.exitCode, `${output.stdout}\n${output.stderr}`).toBe(0);
const result = nativeDispatchMetadataResultSchema.parse(
parseEvidence(output.json).normalized_result,
).result;
if (owner === "protocol") {
expect(result?.objc_protocol_records).toMatchObject([
{
name: "FixtureProtocol",
methods: [],
decode: { status: "partial", reason: "max_records_reached" },
},
]);
} else {
expect(result?.objc_classes).toMatchObject([
{
name: "FixtureClass",
methods: [],
decode: { status: "partial", reason: "max_records_reached" },
},
]);
}
expect(result?.coverage).toEqual(
expect.arrayContaining([
expect.objectContaining({
facet: "objc_class_method_ivar_metadata",
status: "partial",
reason: expect.stringContaining("max_records_reached"),
}),
]),
);
},
);
},
);