This commit is contained in:
2026-07-04 07:25:11 +02:00
parent 4d7cda56f5
commit 0165da5f51
2 changed files with 140 additions and 14 deletions

View File

@@ -408,4 +408,83 @@ class TransitionLinkerEnricherTest {
assertThat(resComp.getMetadata().getCallChains().get(2).getMatchedTransitions()).isNullOrEmpty(); // Groc
}
@Test
void shouldHandleMultipleNegations() {
Transition t1 = new Transition();
t1.setSourceStates(List.of(State.of("NEW", "NEW")));
t1.setTargetStates(List.of(State.of("PAID", "PAID")));
t1.setEvent(Event.of("PAY", "PAY"));
// Case 1: Double Negation on ORDER -> !(!(ORDER)) -> Should act as POSITIVE (meaning order is required).
// Since we are running OrderStateMachineConfiguration, it should match!
CallChain chain1 = CallChain.builder()
.triggerPoint(TriggerPoint.builder()
.event("PAY")
.constraint("!(!(ORDER.equals(type)))")
.build())
.build();
AnalysisResult resultOrder = AnalysisResult.builder()
.name("com.example.OrderStateMachineConfiguration")
.transitions(List.of(t1))
.metadata(CodebaseMetadata.builder().callChains(List.of(chain1)).build())
.build();
enricher.enrich(resultOrder, null, null);
assertThat(resultOrder.getMetadata().getCallChains().get(0).getMatchedTransitions()).hasSize(1);
// Case 2: Triple Negation on ORDER -> !(!(!(ORDER))) -> Should act as NEGATIVE (meaning order is rejected/forbidden).
// Under OrderStateMachineConfiguration, this chain should be rejected!
CallChain chain2 = CallChain.builder()
.triggerPoint(TriggerPoint.builder()
.event("PAY")
.constraint("!(!(!(ORDER.equals(type))))")
.build())
.build();
AnalysisResult resultOrder2 = AnalysisResult.builder()
.name("com.example.OrderStateMachineConfiguration")
.transitions(List.of(t1))
.metadata(CodebaseMetadata.builder().callChains(List.of(chain2)).build())
.build();
enricher.enrich(resultOrder2, null, null);
assertThat(resultOrder2.getMetadata().getCallChains().get(0).getMatchedTransitions()).isNullOrEmpty();
}
@Test
void shouldHandleComplexBooleanLogic() {
Transition t1 = new Transition();
t1.setSourceStates(List.of(State.of("NEW", "NEW")));
t1.setTargetStates(List.of(State.of("PAID", "PAID")));
t1.setEvent(Event.of("PAY", "PAY"));
// Case 1: OR expression -> "ORDER".equals(type) || "DOCUMENT".equals(type)
// Under OrderStateMachineConfiguration, it should match!
CallChain chain1 = CallChain.builder()
.triggerPoint(TriggerPoint.builder()
.event("PAY")
.constraint("\"ORDER\".equalsIgnoreCase(type) || \"DOCUMENT\".equalsIgnoreCase(type)")
.build())
.build();
AnalysisResult resultOrder = AnalysisResult.builder()
.name("com.example.OrderStateMachineConfiguration")
.transitions(List.of(t1))
.metadata(CodebaseMetadata.builder().callChains(List.of(chain1)).build())
.build();
enricher.enrich(resultOrder, null, null);
assertThat(resultOrder.getMetadata().getCallChains().get(0).getMatchedTransitions()).hasSize(1);
// Case 2: Under UserStateMachineConfiguration, it should be rejected!
AnalysisResult resultUser = AnalysisResult.builder()
.name("com.example.UserStateMachineConfiguration")
.transitions(List.of(t1))
.metadata(CodebaseMetadata.builder().callChains(List.of(chain1)).build())
.build();
enricher.enrich(resultUser, null, null);
assertThat(resultUser.getMetadata().getCallChains().get(0).getMatchedTransitions()).isNullOrEmpty();
}
}