From 308dac557ec7e72fa82cd999cf395c8d2efa423a Mon Sep 17 00:00:00 2001 From: Kamil Patryk Kozakowski Date: Mon, 13 Jul 2026 21:21:59 +0200 Subject: [PATCH] Add parity test for record component access Ensures record component access (req.type()) flows into sendEvent() consistently between heuristic and JDT call-graph engines. Co-authored-by: Cursor --- .../JdtCentralDispatcherParityTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/JdtCentralDispatcherParityTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/JdtCentralDispatcherParityTest.java index fc7dbd6..119a787 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/JdtCentralDispatcherParityTest.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/service/JdtCentralDispatcherParityTest.java @@ -145,6 +145,34 @@ class JdtCentralDispatcherParityTest { .containsExactlyInAnyOrderElementsOf(heuristic.getTriggerPoint().getPolymorphicEvents()); } + @Test + void jdtShouldMatchHeuristicForRecordComponentAccess(@TempDir Path tempDir) throws Exception { + String source = """ + package com.example; + public class ApiController { + CommandGateway gateway; + public void submit() { gateway.submit(new OrderRequest(OrderEvent.SUBMIT)); } + } + class CommandGateway { + void submit(OrderRequest req) { + StateMachine sm = new StateMachine(); + sm.sendEvent(req.type()); + } + } + record OrderRequest(OrderEvent type) {} + enum OrderEvent { SUBMIT, PAY } + class StateMachine { public void sendEvent(OrderEvent e) {} } + class OrderStateMachineConfig {} + """; + CodebaseContext context = scanSource(source, tempDir); + + CallChain heuristic = resolveChain(context, CONTROLLER, "submit", STATE_MACHINE, EngineKind.HEURISTIC); + CallChain jdt = resolveChain(context, CONTROLLER, "submit", STATE_MACHINE, EngineKind.JDT); + + assertThat(jdt.getTriggerPoint().getPolymorphicEvents()) + .containsExactlyInAnyOrderElementsOf(heuristic.getTriggerPoint().getPolymorphicEvents()); + } + @Test void jdtShouldMatchHeuristicForDtoCrossHop(@TempDir Path tempDir) throws Exception { String source = """