//get a different result with dependencies preserved because the definition of the dependent function can change
Expr cube = new E_Multiply(new E_Function("http://example/square", new ExprList(new ExprVar("x"))), new ExprVar("x"));
UserDefinedFunctionFactory.getFactory().add("http://example/cube", cube, new ArrayList<Var>(cube.getVarsMentioned()));
UserDefinedFunction f = (UserDefinedFunction) UserDefinedFunctionFactory.getFactory().create("http://example/cube");
f.build("http://example/cube", new ExprList(new NodeValueInteger(2)));
Expr actual = f.getActualExpr();
NodeValue result = actual.eval(BindingFactory.create(), FunctionEnvBase.createTest());
Assert.assertEquals(8, NodeFactory.nodeToInt(result.asNode()));
//Change the definition of the function we depend on
square = new ExprVar("x");
UserDefinedFunctionFactory.getFactory().add("http://example/square", square, new ArrayList<Var>(square.getVarsMentioned()));
f.build("http://example/cube", new ExprList(new NodeValueInteger(2)));
actual = f.getActualExpr();
result = actual.eval(BindingFactory.create(), FunctionEnvBase.createTest());
Assert.assertEquals(4, NodeFactory.nodeToInt(result.asNode()));
}