event maching heuristic update 3
This commit is contained in:
@@ -79,6 +79,124 @@ class HeuristicCallGraphEngineTest {
|
||||
.containsExactlyInAnyOrder("OrderEvents.A8", "OrderEvents.A133");
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldResolveOldStyleSwitchStatementPolymorphism(@TempDir Path tempDir) throws IOException {
|
||||
String source = """
|
||||
package com.example;
|
||||
public class OrderService {
|
||||
public void updateOrderState(String vv) {
|
||||
StateMachine sm = new StateMachine();
|
||||
sm.sendEvent(getEventFromOldSwitch(vv));
|
||||
}
|
||||
|
||||
private OrderEvents getEventFromOldSwitch(String q) {
|
||||
switch (q) {
|
||||
case "a": return OrderEvents.A8;
|
||||
case "b":
|
||||
case "c": return OrderEvents.A133;
|
||||
default: return OrderEvents.PAY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum OrderEvents { A8, A133, PAY }
|
||||
|
||||
class StateMachine {
|
||||
public void sendEvent(OrderEvents event) {}
|
||||
}
|
||||
""";
|
||||
Files.writeString(tempDir.resolve("OrderService.java"), source);
|
||||
CodebaseContext context = new CodebaseContext();
|
||||
context.scan(tempDir);
|
||||
HeuristicCallGraphEngine builder = new HeuristicCallGraphEngine(context);
|
||||
|
||||
EntryPoint entryPoint = EntryPoint.builder().className("com.example.OrderService").methodName("updateOrderState").build();
|
||||
TriggerPoint trigger = TriggerPoint.builder().className("com.example.StateMachine").methodName("sendEvent").event("event").build();
|
||||
List<CallChain> chains = builder.findChains(List.of(entryPoint), List.of(trigger));
|
||||
assertThat(chains).hasSize(1);
|
||||
assertThat(chains.get(0).getTriggerPoint().getPolymorphicEvents())
|
||||
.containsExactlyInAnyOrder("OrderEvents.A8", "OrderEvents.A133", "OrderEvents.PAY");
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldResolveMultiValueSwitchExpressionPolymorphism(@TempDir Path tempDir) throws IOException {
|
||||
String source = """
|
||||
package com.example;
|
||||
public class OrderService {
|
||||
public void updateOrderState(String vv) {
|
||||
StateMachine sm = new StateMachine();
|
||||
sm.sendEvent(getEventMultiValue(vv));
|
||||
}
|
||||
|
||||
private OrderEvents getEventMultiValue(String q) {
|
||||
return switch (q) {
|
||||
case "a", "b" -> OrderEvents.A8;
|
||||
case "c" -> OrderEvents.A133;
|
||||
default -> OrderEvents.PAY;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
enum OrderEvents { A8, A133, PAY }
|
||||
|
||||
class StateMachine {
|
||||
public void sendEvent(OrderEvents event) {}
|
||||
}
|
||||
""";
|
||||
Files.writeString(tempDir.resolve("OrderService.java"), source);
|
||||
CodebaseContext context = new CodebaseContext();
|
||||
context.scan(tempDir);
|
||||
HeuristicCallGraphEngine builder = new HeuristicCallGraphEngine(context);
|
||||
|
||||
EntryPoint entryPoint = EntryPoint.builder().className("com.example.OrderService").methodName("updateOrderState").build();
|
||||
TriggerPoint trigger = TriggerPoint.builder().className("com.example.StateMachine").methodName("sendEvent").event("event").build();
|
||||
List<CallChain> chains = builder.findChains(List.of(entryPoint), List.of(trigger));
|
||||
assertThat(chains).hasSize(1);
|
||||
assertThat(chains.get(0).getTriggerPoint().getPolymorphicEvents())
|
||||
.containsExactlyInAnyOrder("OrderEvents.A8", "OrderEvents.A133", "OrderEvents.PAY");
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldResolveSwitchExpressionWithBlockAndYieldPolymorphism(@TempDir Path tempDir) throws IOException {
|
||||
String source = """
|
||||
package com.example;
|
||||
public class OrderService {
|
||||
public void updateOrderState(String vv) {
|
||||
StateMachine sm = new StateMachine();
|
||||
sm.sendEvent(getEventWithYield(vv));
|
||||
}
|
||||
|
||||
private OrderEvents getEventWithYield(String q) {
|
||||
return switch (q) {
|
||||
case "a" -> {
|
||||
System.out.println("Processing a");
|
||||
yield OrderEvents.A8;
|
||||
}
|
||||
case "b" -> { yield OrderEvents.A133; }
|
||||
default -> OrderEvents.PAY;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
enum OrderEvents { A8, A133, PAY }
|
||||
|
||||
class StateMachine {
|
||||
public void sendEvent(OrderEvents event) {}
|
||||
}
|
||||
""";
|
||||
Files.writeString(tempDir.resolve("OrderService.java"), source);
|
||||
CodebaseContext context = new CodebaseContext();
|
||||
context.scan(tempDir);
|
||||
HeuristicCallGraphEngine builder = new HeuristicCallGraphEngine(context);
|
||||
|
||||
EntryPoint entryPoint = EntryPoint.builder().className("com.example.OrderService").methodName("updateOrderState").build();
|
||||
TriggerPoint trigger = TriggerPoint.builder().className("com.example.StateMachine").methodName("sendEvent").event("event").build();
|
||||
List<CallChain> chains = builder.findChains(List.of(entryPoint), List.of(trigger));
|
||||
assertThat(chains).hasSize(1);
|
||||
assertThat(chains.get(0).getTriggerPoint().getPolymorphicEvents())
|
||||
.containsExactlyInAnyOrder("OrderEvents.A8", "OrderEvents.A133", "OrderEvents.PAY");
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldFindCallChainWithLambdaMethodReference(@TempDir Path tempDir) throws IOException {
|
||||
String source = """
|
||||
|
||||
Reference in New Issue
Block a user