update argument resolution to

This commit is contained in:
2026-06-28 07:02:36 +02:00
parent ff2c8f8cfb
commit 93688ef59b
9 changed files with 412 additions and 46 deletions

View File

@@ -88,4 +88,22 @@ class HeuristicEventMatchingEngineTest {
TriggerPoint triggerPoint2 = TriggerPoint.builder().event("getType()").polymorphicEvents(List.of("com.example.OrderEvents.PAY")).build();
assertThat(engine.matches(smEvent2, triggerPoint2)).isTrue();
}
@Test
void shouldMatchCaseInsensitive() {
Event smEvent = Event.of("PAY", "PAY");
TriggerPoint triggerPoint = TriggerPoint.builder().event("pay").build();
assertThat(engine.matches(smEvent, triggerPoint)).isTrue();
}
@Test
void shouldMatchGuardedContains() {
Event smEvent = Event.of("PAY", "PAY");
TriggerPoint triggerPoint = TriggerPoint.builder().event("pay_order").build();
assertThat(engine.matches(smEvent, triggerPoint)).isTrue();
Event smEvent2 = Event.of("PAY_ORDER", "PAY_ORDER");
TriggerPoint triggerPoint2 = TriggerPoint.builder().event("pay").build();
assertThat(engine.matches(smEvent2, triggerPoint2)).isTrue();
}
}

View File

@@ -22,7 +22,7 @@ public class HeuristicBeanResolutionEngineTest {
String machineName = "com.acme.corp.division.project.payments.PaymentStateMachine";
boolean result = engine.isRoutedToCorrectMachine(chain, machineName);
boolean result = engine.isRoutedToCorrectMachine(chain, machineName, null);
// They share com.acme.corp.division.project, but diverge into orders vs payments
// This should be a strong mismatch, so it should return false
@@ -37,7 +37,7 @@ public class HeuristicBeanResolutionEngineTest {
String machineName = "com.acme.ecommerce.orders.OrderStateMachine";
boolean result = engine.isRoutedToCorrectMachine(chain, machineName);
boolean result = engine.isRoutedToCorrectMachine(chain, machineName, null);
// Same exact domain, should match
assertTrue(result, "Same domain should be accepted");
@@ -51,7 +51,7 @@ public class HeuristicBeanResolutionEngineTest {
String machineName = "com.acme.ecommerce.orders.OrderStateMachine";
boolean result = engine.isRoutedToCorrectMachine(chain, machineName);
boolean result = engine.isRoutedToCorrectMachine(chain, machineName, null);
// Subpackage should match
assertTrue(result, "Sub-packages of the same domain should be accepted");
@@ -65,7 +65,7 @@ public class HeuristicBeanResolutionEngineTest {
String machineName = "com.acme.orders.service.OrderStateMachine";
boolean result = engine.isRoutedToCorrectMachine(chain, machineName);
boolean result = engine.isRoutedToCorrectMachine(chain, machineName, null);
// Different subpackages, but they share the "order" domain term and common prefix
assertTrue(result, "Divergent packages that share a domain term should be accepted");
@@ -80,7 +80,7 @@ public class HeuristicBeanResolutionEngineTest {
String machineName = "com.acme.corp.payments.PaymentStateMachine";
boolean result = engine.isRoutedToCorrectMachine(chain, machineName);
boolean result = engine.isRoutedToCorrectMachine(chain, machineName, null);
// Mismatched domains, but explicit variable targeting works
assertTrue(result, "Explicit variable target matching the machine name should be accepted");
@@ -95,9 +95,24 @@ public class HeuristicBeanResolutionEngineTest {
String machineName = "com.acme.corp.orders.OrderStateMachine"; // But this is Order
boolean result = engine.isRoutedToCorrectMachine(chain, machineName);
boolean result = engine.isRoutedToCorrectMachine(chain, machineName, null);
// Explicit variable targeting completely conflicts
assertFalse(result, "Explicit variable target mismatching the machine name should be rejected");
}
@Test
public void testGenericStateMachineConfigInGenericPackage() {
CallChain chain = CallChain.builder()
.methodChain(Arrays.asList("com.acme.corp.orders.OrderController.submit()"))
.build();
String machineName = "com.acme.corp.config.StateMachineConfig";
boolean result = engine.isRoutedToCorrectMachine(chain, machineName, null);
// StateMachineConfig has generic prefix and is in config package. OrderController is in orders.
// There should be no domain mismatch because config/statemachine are generic.
assertTrue(result, "Generic state machine config in generic config package should not trigger mismatch");
}
}

View File

@@ -99,7 +99,7 @@ class EnterpriseBugsTest {
.build();
// Assert Bug 4: Connector entry points targeting shop SM trigger point are accepted
boolean isMatched = engine.isRoutedToCorrectMachine(chain, "project.shop.OrderStateMachine");
boolean isMatched = engine.isRoutedToCorrectMachine(chain, "project.shop.OrderStateMachine", null);
assertThat(isMatched).isTrue();
}
@@ -120,4 +120,52 @@ class EnterpriseBugsTest {
// Assert Bug 6: resolves cleanly to simple name (since prefix is a known type)
assertThat(resolved).containsExactly("CommonOrderEvent.ACCEPTED_BY_corp");
}
@Test
void shouldMatchFqnsAndMismatchesOnRouting(@TempDir Path tempDir) throws IOException {
String statesSrc = """
package com.example;
public enum OrderStates { S1, S2 }
""";
String eventsSrc = """
package com.example;
public enum OrderEvents { E1, E2 }
""";
String otherEventsSrc = """
package com.example.other;
public enum OtherEvents { E1, E2 }
""";
String configSrc = """
package com.example;
public class OrderStateMachineConfig extends org.springframework.statemachine.config.StateMachineConfigurerAdapter<OrderStates, OrderEvents> {}
""";
Files.writeString(tempDir.resolve("OrderStates.java"), statesSrc);
Files.writeString(tempDir.resolve("OrderEvents.java"), eventsSrc);
Files.writeString(tempDir.resolve("OtherEvents.java"), otherEventsSrc);
Files.writeString(tempDir.resolve("OrderStateMachineConfig.java"), configSrc);
CodebaseContext context = new CodebaseContext();
context.scan(tempDir);
HeuristicBeanResolutionEngine engine = new HeuristicBeanResolutionEngine();
// Scenario 1: Exact Event type argument match
CallChain chain1 = CallChain.builder()
.triggerPoint(TriggerPoint.builder()
.eventTypeFqn("com.example.OrderEvents")
.className("com.example.Service")
.build())
.build();
assertThat(engine.isRoutedToCorrectMachine(chain1, "com.example.OrderStateMachineConfig", context)).isTrue();
// Scenario 2: Event type argument mismatch
CallChain chain2 = CallChain.builder()
.triggerPoint(TriggerPoint.builder()
.eventTypeFqn("com.example.other.OtherEvents")
.className("com.example.Service")
.build())
.build();
assertThat(engine.isRoutedToCorrectMachine(chain2, "com.example.OrderStateMachineConfig", context)).isFalse();
}
}