use of org.drools.scenariosimulation.backend.expression.ExpressionEvaluator in project drools by kiegroup.
the class DMNScenarioRunnerHelper method verifyConditions.
@Override
protected void verifyConditions(ScesimModelDescriptor scesimModelDescriptor, ScenarioRunnerData scenarioRunnerData, ExpressionEvaluatorFactory expressionEvaluatorFactory, Map<String, Object> requestContext) {
DMNResult dmnResult = (DMNResult) requestContext.get(DMNScenarioExecutableBuilder.DMN_RESULT);
List<DMNMessage> dmnMessages = dmnResult.getMessages();
for (ScenarioExpect output : scenarioRunnerData.getExpects()) {
FactIdentifier factIdentifier = output.getFactIdentifier();
String decisionName = factIdentifier.getName();
DMNDecisionResult decisionResult = dmnResult.getDecisionResultByName(decisionName);
if (decisionResult == null) {
throw new ScenarioException("DMN execution has not generated a decision result with name " + decisionName);
}
for (FactMappingValue expectedResult : output.getExpectedResult()) {
ExpressionIdentifier expressionIdentifier = expectedResult.getExpressionIdentifier();
FactMapping factMapping = scesimModelDescriptor.getFactMapping(factIdentifier, expressionIdentifier).orElseThrow(() -> new IllegalStateException("Wrong expression, this should not happen"));
ExpressionEvaluator expressionEvaluator = expressionEvaluatorFactory.getOrCreate(expectedResult);
ScenarioResult scenarioResult = fillResult(expectedResult, () -> getSingleFactValueResult(factMapping, expectedResult, decisionResult, dmnMessages, expressionEvaluator), expressionEvaluator);
scenarioRunnerData.addResult(scenarioResult);
}
}
}
use of org.drools.scenariosimulation.backend.expression.ExpressionEvaluator in project drools by kiegroup.
the class AbstractRunnerHelperTest method fillResult.
@Test
public void fillResult() {
FactIdentifier factIdentifier = FactIdentifier.create("MyInstance", String.class.getCanonicalName());
ExpressionIdentifier expressionIdentifier = ExpressionIdentifier.create("MyProperty", FactMappingType.GIVEN);
FactMappingValue expectedResultSpy = spy(new FactMappingValue(factIdentifier, expressionIdentifier, VALUE));
AtomicReference<ValueWrapper> resultWrapperAtomicReference = new AtomicReference<>();
Supplier<ValueWrapper<?>> resultWrapperSupplier = resultWrapperAtomicReference::get;
ExpressionEvaluator expressionEvaluator = new BaseExpressionEvaluator(AbstractRunnerHelper.class.getClassLoader());
// Success
resultWrapperAtomicReference.set(ValueWrapper.of(VALUE));
assertTrue(abstractRunnerHelper.fillResult(expectedResultSpy, resultWrapperSupplier, expressionEvaluator).getResult());
verify(expectedResultSpy, times(1)).resetStatus();
reset(expectedResultSpy);
// Fail with expected value
resultWrapperAtomicReference.set(ValueWrapper.errorWithValidValue(VALUE, "value1"));
assertFalse(abstractRunnerHelper.fillResult(expectedResultSpy, resultWrapperSupplier, expressionEvaluator).getResult());
verify(expectedResultSpy, times(1)).setErrorValue(VALUE);
reset(expectedResultSpy);
// Fail with exception while reverting actual value
resultWrapperAtomicReference.set(ValueWrapper.errorWithValidValue(VALUE, "value1"));
ExpressionEvaluator expressionEvaluatorMock = mock(ExpressionEvaluator.class);
when(expressionEvaluatorMock.fromObjectToExpression(any())).thenThrow(new IllegalArgumentException("Error"));
assertFalse(abstractRunnerHelper.fillResult(expectedResultSpy, resultWrapperSupplier, expressionEvaluatorMock).getResult());
verify(expectedResultSpy, times(1)).setExceptionMessage("Error");
reset(expectedResultSpy);
// Fail in collection case
List<String> pathToValue = Arrays.asList("field1", "fields2");
resultWrapperAtomicReference.set(ValueWrapper.errorWithCollectionPathToValue(VALUE, pathToValue));
assertFalse(abstractRunnerHelper.fillResult(expectedResultSpy, resultWrapperSupplier, expressionEvaluator).getResult());
verify(expectedResultSpy, times(1)).setCollectionPathToValue(pathToValue);
verify(expectedResultSpy, times(1)).setErrorValue(VALUE);
// Fail with exception
resultWrapperAtomicReference.set(ValueWrapper.errorWithMessage("detailedError"));
assertFalse(abstractRunnerHelper.fillResult(expectedResultSpy, resultWrapperSupplier, expressionEvaluator).getResult());
verify(expectedResultSpy, times(1)).setExceptionMessage("detailedError");
}
use of org.drools.scenariosimulation.backend.expression.ExpressionEvaluator in project drools by kiegroup.
the class AbstractRunnerHelperTest method getResultWrapper.
@Test
public void getResultWrapper() {
ExpressionEvaluator expressionEvaluatorMock = mock(ExpressionEvaluator.class);
Object resultRaw = "test";
Object expectedResultRaw = "";
String collectionWrongValue = "value";
String collectionValuePath = "Item #: 1";
String genericErrorMessage = "errorMessage";
// case 1: succeed
when(expressionEvaluatorMock.evaluateUnaryExpression(any(), any(), any(Class.class))).thenReturn(ExpressionEvaluatorResult.ofSuccessful());
ValueWrapper valueWrapper = abstractRunnerHelper.getResultWrapper(String.class.getCanonicalName(), new FactMappingValue(), expressionEvaluatorMock, expectedResultRaw, resultRaw, String.class);
assertTrue(valueWrapper.isValid());
assertNull(valueWrapper.getCollectionPathToValue());
// case 2: failed with actual value
when(expressionEvaluatorMock.evaluateUnaryExpression(any(), any(), any(Class.class))).thenReturn(ExpressionEvaluatorResult.ofFailed());
valueWrapper = abstractRunnerHelper.getResultWrapper(String.class.getCanonicalName(), new FactMappingValue(), expressionEvaluatorMock, expectedResultRaw, resultRaw, String.class);
assertFalse(valueWrapper.isValid());
assertEquals(resultRaw, valueWrapper.getValue());
assertNull(valueWrapper.getCollectionPathToValue());
// case 3: failed without actual value (list)
valueWrapper = abstractRunnerHelper.getResultWrapper(List.class.getCanonicalName(), new FactMappingValue(), expressionEvaluatorMock, expectedResultRaw, resultRaw, List.class);
assertFalse(valueWrapper.getErrorMessage().isPresent());
assertTrue(valueWrapper.getCollectionPathToValue().isEmpty());
assertNull(valueWrapper.getValue());
// case 4: failed without actual value (map)
valueWrapper = abstractRunnerHelper.getResultWrapper(Map.class.getCanonicalName(), new FactMappingValue(), expressionEvaluatorMock, expectedResultRaw, resultRaw, Map.class);
assertFalse(valueWrapper.getErrorMessage().isPresent());
assertTrue(valueWrapper.getCollectionPathToValue().isEmpty());
assertNull(valueWrapper.getValue());
// case 5: failed with wrong value (list)
ExpressionEvaluatorResult result = ExpressionEvaluatorResult.ofFailed(collectionWrongValue, collectionValuePath);
when(expressionEvaluatorMock.evaluateUnaryExpression(any(), any(), any(Class.class))).thenReturn(result);
valueWrapper = abstractRunnerHelper.getResultWrapper(List.class.getCanonicalName(), new FactMappingValue(), expressionEvaluatorMock, expectedResultRaw, resultRaw, List.class);
assertFalse(valueWrapper.getErrorMessage().isPresent());
assertEquals(1, valueWrapper.getCollectionPathToValue().size());
assertEquals(collectionWrongValue, valueWrapper.getValue());
// case 6: failed without actual value (map)
valueWrapper = abstractRunnerHelper.getResultWrapper(Map.class.getCanonicalName(), new FactMappingValue(), expressionEvaluatorMock, expectedResultRaw, resultRaw, Map.class);
assertFalse(valueWrapper.getErrorMessage().isPresent());
assertEquals(1, valueWrapper.getCollectionPathToValue().size());
assertEquals(collectionWrongValue, valueWrapper.getValue());
// case 7: failed without wrong value (list)
result = ExpressionEvaluatorResult.ofFailed(null, collectionValuePath);
when(expressionEvaluatorMock.evaluateUnaryExpression(any(), any(), any(Class.class))).thenReturn(result);
valueWrapper = abstractRunnerHelper.getResultWrapper(List.class.getCanonicalName(), new FactMappingValue(), expressionEvaluatorMock, expectedResultRaw, resultRaw, List.class);
assertFalse(valueWrapper.getErrorMessage().isPresent());
assertEquals(1, valueWrapper.getCollectionPathToValue().size());
assertNull(valueWrapper.getValue());
// case 8: failed without actual value (map)
valueWrapper = abstractRunnerHelper.getResultWrapper(Map.class.getCanonicalName(), new FactMappingValue(), expressionEvaluatorMock, expectedResultRaw, resultRaw, Map.class);
assertFalse(valueWrapper.getErrorMessage().isPresent());
assertEquals(1, valueWrapper.getCollectionPathToValue().size());
assertNull(valueWrapper.getValue());
// case 9: failed with generic exception
when(expressionEvaluatorMock.evaluateUnaryExpression(any(), any(), any(Class.class))).thenThrow(new IllegalArgumentException(genericErrorMessage));
FactMappingValue expectedResult5 = new FactMappingValue();
valueWrapper = abstractRunnerHelper.getResultWrapper(Map.class.getCanonicalName(), expectedResult5, expressionEvaluatorMock, expectedResultRaw, resultRaw, Map.class);
assertEquals(genericErrorMessage, valueWrapper.getErrorMessage().get());
assertEquals(genericErrorMessage, expectedResult5.getExceptionMessage());
}
use of org.drools.scenariosimulation.backend.expression.ExpressionEvaluator in project drools by kiegroup.
the class RuleScenarioRunnerHelper method getScenarioResultsFromGivenFacts.
protected List<ScenarioResult> getScenarioResultsFromGivenFacts(ScesimModelDescriptor scesimModelDescriptor, List<ScenarioExpect> scenarioOutputsPerFact, InstanceGiven input, ExpressionEvaluatorFactory expressionEvaluatorFactory) {
Object factInstance = input.getValue();
List<ScenarioResult> scenarioResults = new ArrayList<>();
for (ScenarioExpect scenarioExpect : scenarioOutputsPerFact) {
if (scenarioExpect.isNewFact()) {
continue;
}
for (FactMappingValue expectedResult : scenarioExpect.getExpectedResult()) {
ExpressionEvaluator expressionEvaluator = expressionEvaluatorFactory.getOrCreate(expectedResult);
ScenarioResult scenarioResult = fillResult(expectedResult, () -> createExtractorFunction(expressionEvaluator, expectedResult, scesimModelDescriptor).apply(factInstance), expressionEvaluator);
scenarioResults.add(scenarioResult);
}
}
return scenarioResults;
}
use of org.drools.scenariosimulation.backend.expression.ExpressionEvaluator in project drools by kiegroup.
the class RuleScenarioRunnerHelper method executeScenario.
@Override
protected Map<String, Object> executeScenario(KieContainer kieContainer, ScenarioRunnerData scenarioRunnerData, ExpressionEvaluatorFactory expressionEvaluatorFactory, ScesimModelDescriptor scesimModelDescriptor, Settings settings) {
if (!Type.RULE.equals(settings.getType())) {
throw new ScenarioException("Impossible to run a not-RULE simulation with RULE runner");
}
RuleScenarioExecutableBuilder ruleScenarioExecutableBuilder = createBuilderWrapper(kieContainer, settings);
if (settings.getRuleFlowGroup() != null) {
ruleScenarioExecutableBuilder.setActiveRuleFlowGroup(settings.getRuleFlowGroup());
}
loadInputData(scenarioRunnerData.getBackgrounds(), ruleScenarioExecutableBuilder);
loadInputData(scenarioRunnerData.getGivens(), ruleScenarioExecutableBuilder);
// all new facts should be verified internally to the working memory
scenarioRunnerData.getExpects().stream().filter(ScenarioExpect::isNewFact).flatMap(output -> output.getExpectedResult().stream().map(ScenarioResult::new)).forEach(scenarioResult -> {
Class<?> clazz = ScenarioBeanUtil.loadClass(scenarioResult.getFactIdentifier().getClassName(), kieContainer.getClassLoader());
ExpressionEvaluator expressionEvaluator = expressionEvaluatorFactory.getOrCreate(scenarioResult.getFactMappingValue());
scenarioRunnerData.addResult(scenarioResult);
ruleScenarioExecutableBuilder.addInternalCondition(clazz, createExtractorFunction(expressionEvaluator, scenarioResult.getFactMappingValue(), scesimModelDescriptor), scenarioResult);
});
return ruleScenarioExecutableBuilder.run();
}
Aggregations