@Before public void setup() { testVariable = null; feel = FEEL.newInstance(); feel.addListener(event -> testVariable = LISTENER_OUTPUT); feel.addListener(System.out::println); feel.addListener( (evt) -> { if (evt.getSeverity() == Severity.ERROR) System.err.println(evt); } ); }
@Before public void before() { errors = new ArrayList<>(); errorsCountingListener = evt -> { if ( evt.getSeverity() == Severity.ERROR ) { errors.add(evt); } }; feel.addListener( errorsCountingListener ); }
@Test public void unknownVariable() { final FEEL feel = FEEL.newInstance(); final FEELEventListener fel = Mockito.mock(FEELEventListener.class ); feel.addListener( fel ); final CompilerContext ctx = feel.newCompilerContext(); feel.compile( "a variable name", ctx ); final ArgumentCaptor<FEELEvent> captor = ArgumentCaptor.forClass(FEELEvent.class ); verify( fel, times(2) ).onEvent( captor.capture() ); Assert.assertThat( captor.getAllValues().size(), is( 2 ) ); Assert.assertThat( captor.getAllValues().get(1), is( instanceOf( UnknownVariableErrorEvent.class ) ) ); Assert.assertThat( ((UnknownVariableErrorEvent)captor.getAllValues().get(1)).getOffendingSymbol(), is( "a variable name" ) ); }
@Test public void testExpression() { final List<FEELProfile> profiles = getFEELProfilesForTests(); feel = FEEL.newInstance(profiles); final FEELEventListener listener = mock(FEELEventListener.class ); feel.addListener( listener ); feel.addListener(System.out::println); assertResult( expression, result ); if( severity != null ) { final ArgumentCaptor<FEELEvent> captor = ArgumentCaptor.forClass(FEELEvent.class ); verify( listener , atLeastOnce()).onEvent( captor.capture() ); assertThat( captor.getValue().getSeverity(), is( severity ) ); } else { verify( listener, never() ).onEvent( any(FEELEvent.class) ); } }
/** * Convert row to DTDecisionRule * @param mainCtx the main context is used to identify the hosted FEELEventManager * @param embeddedFEEL a possibly cached embedded FEEL to compile the output expression, error will be reported up to the mainCtx * @param index * @param rule * @param inputSize * @return */ private static DTDecisionRule toDecisionRule(EvaluationContext mainCtx, FEEL embeddedFEEL, int index, List<?> rule, int inputSize) { // TODO should be check indeed block of inputSize n inputs, followed by block of outputs. DTDecisionRule dr = new DTDecisionRule( index ); for ( int i = 0; i < rule.size(); i++ ) { Object o = rule.get( i ); if ( i < inputSize ) { dr.getInputEntry().add( toUnaryTest( mainCtx, o ) ); } else { FEELEventListener ruleListener = event -> mainCtx.notifyEvt( () -> new FEELEventBase(event.getSeverity(), Msg.createMessage(Msg.ERROR_COMPILE_EXPR_DT_FUNCTION_RULE_IDX, index+1, event.getMessage()), event.getSourceException())); embeddedFEEL.addListener(ruleListener); CompiledExpression compiledExpression = embeddedFEEL.compile((String) o, embeddedFEEL.newCompilerContext()); dr.getOutputEntry().add( compiledExpression ); embeddedFEEL.removeListener(ruleListener); } } return dr; }