@Override public String evaluate(EvaluationContext ctx) { return EvalHelper.normalizeVariableName( getText() ); }
@Override public DirectCompilerResult visit(NameDefNode n) { StringLiteralExpr expr = Expressions.stringLiteral(EvalHelper.normalizeVariableName(n.getText())); return DirectCompilerResult.of(expr, BuiltInType.STRING); }
@Test public void testFunctionDefinition() { String inputExpression = "{ is minor : function( person's age ) person's age < 21 }"; BaseNode ctxbase = parse( inputExpression ); assertThat( ctxbase, is( instanceOf( ContextNode.class ) ) ); assertThat( ctxbase.getText(), is( inputExpression ) ); ContextNode ctx = (ContextNode) ctxbase; assertThat( ctx.getEntries().size(), is( 1 ) ); ContextEntryNode entry = ctx.getEntries().get( 0 ); assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); NameDefNode name = (NameDefNode) entry.getName(); assertThat( name.getText(), is("is minor") ); assertThat( entry.getValue(), is( instanceOf( FunctionDefNode.class ) ) ); assertThat( entry.getValue().getText(), is("function( person's age ) person's age < 21") ); FunctionDefNode isMinorFunc = (FunctionDefNode) entry.getValue(); assertThat( isMinorFunc.getFormalParameters().size(), is( 1 ) ); assertThat( isMinorFunc.getFormalParameters().get( 0 ).getText(), is( "person's age" ) ); assertThat( isMinorFunc.isExternal(), is( false ) ); assertThat( isMinorFunc.getBody(), is( instanceOf( InfixOpNode.class ) ) ); }
@Test public void testForExpression() { String inputExpression = "for item in order.items return item.price * item.quantity"; BaseNode forbase = parse( inputExpression ); assertThat( forbase, is( instanceOf( ForExpressionNode.class ) ) ); assertThat( forbase.getText(), is( inputExpression ) ); assertThat( forbase.getResultType(), is( BuiltInType.LIST ) ); ForExpressionNode forExpr = (ForExpressionNode) forbase; assertThat( forExpr.getIterationContexts().size(), is( 1 ) ); assertThat( forExpr.getExpression(), is( instanceOf( InfixOpNode.class ) ) ); assertThat( forExpr.getExpression().getText(), is( "item.price * item.quantity" ) ); IterationContextNode ic = forExpr.getIterationContexts().get( 0 ); assertThat( ic.getName().getText(), is("item") ); assertThat( ic.getExpression(), is( instanceOf( QualifiedNameNode.class ) ) ); assertThat( ic.getExpression().getText(), is("order.items") ); }
@Test public void testFunctionInvocationNamedParams() { String inputExpression = "my.test.Function( named parameter 1 : x+10, named parameter 2 : \"foo\" )"; BaseNode functionBase = parse( inputExpression ); assertThat( functionBase, is( instanceOf( FunctionInvocationNode.class ) ) ); assertThat( functionBase.getText(), is( inputExpression ) ); FunctionInvocationNode function = (FunctionInvocationNode) functionBase; assertThat( function.getName(), is( instanceOf( QualifiedNameNode.class ) ) ); assertThat( function.getName().getText(), is( "my.test.Function" ) ); assertThat( function.getParams(), is( instanceOf( ListNode.class ) ) ); assertThat( function.getParams().getElements().size(), is( 2 ) ); assertThat( function.getParams().getElements().get( 0 ), is( instanceOf( NamedParameterNode.class ) ) ); assertThat( function.getParams().getElements().get( 1 ), is( instanceOf( NamedParameterNode.class ) ) ); NamedParameterNode named = (NamedParameterNode) function.getParams().getElements().get( 0 ); assertThat( named.getText(), is( "named parameter 1 : x+10" ) ); assertThat( named.getName().getText(), is( "named parameter 1" ) ); assertThat( named.getExpression(), is( instanceOf( InfixOpNode.class ) ) ); assertThat( named.getExpression().getText(), is( "x+10" ) ); named = (NamedParameterNode) function.getParams().getElements().get( 1 ); assertThat( named.getText(), is( "named parameter 2 : \"foo\"" ) ); assertThat( named.getName().getText(), is( "named parameter 2" ) ); assertThat( named.getExpression(), is( instanceOf( StringNode.class ) ) ); assertThat( named.getExpression().getText(), is( "\"foo\"" ) ); }
@Test public void testNestedContexts2() { String inputExpression = "{ an applicant : { " + " home address : {" + " street name: \"broadway st\"," + " city : \"New York\" " + " } " + " },\n " + " street : an applicant.home address.street name \n" + "}"; BaseNode ctxbase = parse( inputExpression ); assertThat( ctxbase, is( instanceOf( ContextNode.class ) ) ); assertThat( ctxbase.getText(), is( inputExpression ) ); ContextNode ctx = (ContextNode) ctxbase; assertThat( ctx.getEntries().size(), is( 2 ) ); ContextEntryNode entry = ctx.getEntries().get( 1 ); assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); assertThat( entry.getResultType(), is( BuiltInType.STRING ) ); NameDefNode name = (NameDefNode) entry.getName(); assertThat( name.getText(), is("street") ); assertThat( entry.getValue(), is( instanceOf( QualifiedNameNode.class ) ) ); QualifiedNameNode qnn = (QualifiedNameNode) entry.getValue(); assertThat( qnn.getParts().get( 0 ).getText(), is("an applicant") ); assertThat( qnn.getParts().get( 1 ).getText(), is("home address") ); assertThat( qnn.getParts().get( 2 ).getText(), is("street name") ); }
assertThat( named.getName().getText(), is( "outputs" ) ); assertThat( named.getExpression(), is( instanceOf( StringNode.class ) ) ); assertThat( named.getExpression().getText(), is( "\"Applicant Risk Rating\"" ) ); assertThat( named.getName().getText(), is( "input expression list" ) ); assertThat( named.getExpression(), is( instanceOf( ListNode.class ) ) ); assertThat( named.getName().getText(), is( "rule list" ) ); assertThat( named.getExpression(), is( instanceOf( ListNode.class ) ) ); assertThat( named.getName().getText(), is( "hit policy" ) ); assertThat( named.getExpression(), is( instanceOf( StringNode.class ) ) ); assertThat( named.getExpression().getText(), is( "\"Unique\"" ) );
assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); NameDefNode name = (NameDefNode) entry.getName(); assertThat( name.getText(), is("trigonometric cosine") ); assertThat( entry.getValue(), is( instanceOf( FunctionDefNode.class ) ) ); assertThat( entry.getValue().getText(), is("function( angle ) external {" assertThat( cos.getFormalParameters().get( 0 ).getText(), is( "angle" ) ); assertThat( cos.isExternal(), is( true ) ); assertThat( cos.getBody(), is( instanceOf( ContextNode.class ) ) );
assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); NameDefNode name = (NameDefNode) entry.getName(); assertThat( name.getText(), is("a value") ); assertThat( entry.getValue(), is( instanceOf( NumberNode.class ) ) ); assertThat( entry.getResultType(), is( BuiltInType.NUMBER ) ); assertThat( entry.getName(), is( instanceOf( NameDefNode.class ) ) ); name = (NameDefNode) entry.getName(); assertThat( name.getText(), is( "an applicant" ) ); assertThat( entry.getValue(), is( instanceOf( ContextNode.class ) ) );
Expressions.namedLambda( iterName.getExpression(), n.getName().getText()); Expressions.NamedLambda exprLambda = Expressions.namedLambda(