update tranistions
This commit is contained in:
@@ -106,4 +106,23 @@ class HeuristicEventMatchingEngineTest {
|
||||
TriggerPoint triggerPoint2 = TriggerPoint.builder().event("pay").build();
|
||||
assertThat(engine.matches(smEvent2, triggerPoint2)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldMatchDottedEventPackageMismatch() {
|
||||
Event smEvent = Event.of("CREATE", "com.example.other.OrderEvent.CREATE");
|
||||
TriggerPoint triggerPoint = TriggerPoint.builder().event("com.example.some.OrderEvent.CREATE").build();
|
||||
|
||||
assertThat(engine.matches(smEvent, triggerPoint)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldMatchPolymorphicDottedEventPackageMismatch() {
|
||||
Event smEvent = Event.of("CREATE", "com.example.other.OrderEvent.CREATE");
|
||||
TriggerPoint triggerPoint = TriggerPoint.builder()
|
||||
.event("getType()")
|
||||
.polymorphicEvents(List.of("com.example.some.OrderEvent.CREATE"))
|
||||
.build();
|
||||
|
||||
assertThat(engine.matches(smEvent, triggerPoint)).isTrue();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -119,4 +119,58 @@ class LocalVariableTest {
|
||||
assertThat(chain.getTriggerPoint().getPolymorphicEvents())
|
||||
.containsExactlyInAnyOrder("OrderEvents.PAY", "OrderEvents.CANCEL");
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldNotUnwrapLocalDomainMethod(@TempDir Path tempDir) throws IOException {
|
||||
String source = """
|
||||
package com.example;
|
||||
public class OrderController {
|
||||
private OrderService service;
|
||||
public void processOrderEvent(RichOrderEvent domainEvent) {
|
||||
OrderEvents resolved = validateEvent(domainEvent);
|
||||
service.updateOrderState(resolved);
|
||||
}
|
||||
|
||||
private OrderEvents validateEvent(RichOrderEvent event) {
|
||||
return OrderEvents.CANCEL;
|
||||
}
|
||||
}
|
||||
|
||||
class OrderService {
|
||||
public void updateOrderState(OrderEvents event) {}
|
||||
}
|
||||
|
||||
class RichOrderEvent {
|
||||
public OrderEvents getType() {
|
||||
return OrderEvents.PAY;
|
||||
}
|
||||
}
|
||||
|
||||
enum OrderEvents { PAY, CANCEL }
|
||||
""";
|
||||
Files.writeString(tempDir.resolve("OrderConfig.java"), source);
|
||||
|
||||
CodebaseContext context = new CodebaseContext();
|
||||
context.scan(tempDir);
|
||||
|
||||
HeuristicCallGraphEngine builder = new HeuristicCallGraphEngine(context);
|
||||
|
||||
EntryPoint entryPoint = EntryPoint.builder()
|
||||
.className("com.example.OrderController")
|
||||
.methodName("processOrderEvent")
|
||||
.build();
|
||||
|
||||
TriggerPoint trigger = TriggerPoint.builder()
|
||||
.className("com.example.OrderService")
|
||||
.methodName("updateOrderState")
|
||||
.event("event")
|
||||
.build();
|
||||
|
||||
List<CallChain> chains = builder.findChains(List.of(entryPoint), List.of(trigger));
|
||||
|
||||
assertThat(chains).hasSize(1);
|
||||
CallChain chain = chains.get(0);
|
||||
assertThat(chain.getTriggerPoint().getPolymorphicEvents())
|
||||
.containsExactlyInAnyOrder("OrderEvents.CANCEL");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
package click.kamil.springstatemachineexporter.analysis.service;
|
||||
|
||||
import click.kamil.springstatemachineexporter.analysis.model.CallChain;
|
||||
import click.kamil.springstatemachineexporter.analysis.model.EntryPoint;
|
||||
import click.kamil.springstatemachineexporter.analysis.model.TriggerPoint;
|
||||
import click.kamil.springstatemachineexporter.ast.common.CodebaseContext;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.io.TempDir;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
class PolymorphicDispatchCallGraphTest {
|
||||
|
||||
@Test
|
||||
void shouldResolvePolymorphicDispatchCalls(@TempDir Path tempDir) throws IOException {
|
||||
String source = """
|
||||
package com.example;
|
||||
|
||||
public class OrderController {
|
||||
private OrderServiceRegistry registry;
|
||||
|
||||
public void handleRequest(String order, String event) {
|
||||
registry.getOrderService(order).processOrderEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
class OrderServiceRegistry {
|
||||
public OrderService getOrderService(String order) {
|
||||
return null; // dynamic lookup
|
||||
}
|
||||
}
|
||||
|
||||
interface OrderService {
|
||||
void processOrderEvent(String event);
|
||||
}
|
||||
|
||||
class PlatformOrderService implements OrderService {
|
||||
public void processOrderEvent(String event) {
|
||||
// trigger state machine
|
||||
}
|
||||
}
|
||||
|
||||
class TransportOrderService implements OrderService {
|
||||
public void processOrderEvent(String event) {
|
||||
// trigger state machine
|
||||
}
|
||||
}
|
||||
""";
|
||||
Files.writeString(tempDir.resolve("OrderConfig.java"), source);
|
||||
|
||||
CodebaseContext context = new CodebaseContext();
|
||||
context.scan(tempDir);
|
||||
|
||||
HeuristicCallGraphEngine builder = new HeuristicCallGraphEngine(context);
|
||||
|
||||
EntryPoint entryPoint = EntryPoint.builder()
|
||||
.className("com.example.OrderController")
|
||||
.methodName("handleRequest")
|
||||
.build();
|
||||
|
||||
TriggerPoint triggerPlatform = TriggerPoint.builder()
|
||||
.className("com.example.PlatformOrderService")
|
||||
.methodName("processOrderEvent")
|
||||
.event("event")
|
||||
.build();
|
||||
|
||||
TriggerPoint triggerTransport = TriggerPoint.builder()
|
||||
.className("com.example.TransportOrderService")
|
||||
.methodName("processOrderEvent")
|
||||
.event("event")
|
||||
.build();
|
||||
|
||||
List<CallChain> chainsPlatform = builder.findChains(List.of(entryPoint), List.of(triggerPlatform));
|
||||
List<CallChain> chainsTransport = builder.findChains(List.of(entryPoint), List.of(triggerTransport));
|
||||
|
||||
assertThat(chainsPlatform).hasSize(1);
|
||||
assertThat(chainsPlatform.get(0).getMethodChain())
|
||||
.containsExactly(
|
||||
"com.example.OrderController.handleRequest",
|
||||
"com.example.PlatformOrderService.processOrderEvent"
|
||||
);
|
||||
|
||||
assertThat(chainsTransport).hasSize(1);
|
||||
assertThat(chainsTransport.get(0).getMethodChain())
|
||||
.containsExactly(
|
||||
"com.example.OrderController.handleRequest",
|
||||
"com.example.TransportOrderService.processOrderEvent"
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user