/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.expression; import static org.testng.Assert.assertEquals; import org.testng.annotations.Test; import com.google.common.base.Function; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.UNIT) public class ELExpressionParserTest { @Test(expectedExceptions = {IllegalArgumentException.class }) public void testInvalidExpression() { final ELExpressionParser parser = new ELExpressionParser(); parser.parse("Not a valid expression"); } public void testSingleExpr() { final ELExpressionParser parser = new ELExpressionParser(); final UserExpression expr = parser.parse("x * 0.9"); UserExpression.Evaluator eval = expr.evaluator(); eval.setVariable("x", 42d); assertEquals(eval.evaluate(), 42d * 0.9); eval = expr.evaluator(); assertEquals(eval.evaluate(), UserExpression.NA); } public void testCompositeExpr() { final ELExpressionParser parser = new ELExpressionParser(); final UserExpression expr = parser.parse("x * 0.9; y + 0.5"); UserExpression.Evaluator eval = expr.evaluator(); eval.setVariable("x", 42d); assertEquals(eval.evaluate(), 42d * 0.9); eval = expr.evaluator(); eval.setVariable("y", 42d); assertEquals(eval.evaluate(), 42d + 0.5); eval = expr.evaluator(); assertEquals(eval.evaluate(), UserExpression.NA); } public void testConditional() { final ELExpressionParser parser = new ELExpressionParser(); final UserExpression expr = parser.parse("if (b) 0.42"); UserExpression.Evaluator eval = expr.evaluator(); eval.setVariable("b", true); assertEquals(eval.evaluate(), 0.42); eval = expr.evaluator(); assertEquals(eval.evaluate(), UserExpression.NA); } public void testMultipleConditional() { final ELExpressionParser parser = new ELExpressionParser(); final UserExpression expr = parser.parse("if (b) 0.1; if (!b) 0.2"); UserExpression.Evaluator eval = expr.evaluator(); eval.setVariable("b", true); assertEquals(eval.evaluate(), 0.1); eval = expr.evaluator(); eval.setVariable("b", false); assertEquals(eval.evaluate(), 0.2); eval = expr.evaluator(); assertEquals(eval.evaluate(), UserExpression.NA); } public static final class Foo { private final int _bar; public Foo(final int v) { _bar = v; } public int getBar() { return _bar; } } public void testSyntheticProperties() { final ELExpressionParser parser = new ELExpressionParser(); UserExpression expr = parser.parse("x.bar"); UserExpression.Evaluator eval = expr.evaluator(); eval.setVariable("x", new Foo(42)); assertEquals(eval.evaluate(), 42); expr = parser.parse("x.foo"); eval = expr.evaluator(); eval.setVariable("x", new Foo(42)); assertEquals(eval.evaluate(), UserExpression.NA); parser.setSynthetic(Foo.class, Integer.class, "foo", new Function<Foo, Integer>() { @Override public Integer apply(final Foo from) { return from.getBar() / 2; } }); expr = parser.parse("x.foo"); eval = expr.evaluator(); eval.setVariable("x", new Foo(42)); assertEquals(eval.evaluate(), 21); } }