/* * Copyright [2012-2014] PayPal Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ml.shifu.shifu.util; import org.apache.commons.jexl2.Expression; import org.apache.commons.jexl2.JexlContext; import org.apache.commons.jexl2.JexlEngine; import org.apache.commons.jexl2.MapContext; import org.apache.commons.lang.math.NumberUtils; import org.testng.Assert; import org.testng.annotations.Test; import java.text.DecimalFormat; /** * JexlTest class */ public class JexlTest { @Test public void testJavaExpressionNum() { JexlEngine jexl = new JexlEngine(); String jexlExp = "bad_num == 2"; Expression e = jexl.createExpression(jexlExp); JexlContext jc = new MapContext(); jc.set("bad_num", 2); // Now evaluate the expression, getting the result Boolean isEqual = (Boolean) e.evaluate(jc); Assert.assertTrue(isEqual); jc.set("bad_num", null); isEqual = (Boolean) e.evaluate(jc); Assert.assertFalse(isEqual); jc.set("bad_num", "2"); isEqual = (Boolean) e.evaluate(jc); Assert.assertTrue(isEqual); } @Test public void testJavaExpressionString() { JexlEngine jexl = new JexlEngine(); String jexlExp = "name == \"user_a\""; Expression e = jexl.createExpression(jexlExp); JexlContext jc = new MapContext(); jc.set("name", "user_a"); // Now evaluate the expression, getting the result Boolean isEqual = (Boolean) e.evaluate(jc); Assert.assertTrue(isEqual); jc.set("name", "user_b"); isEqual = (Boolean) e.evaluate(jc); Assert.assertFalse(isEqual); } @Test public void testJavaDouble() { JexlEngine jexl = new JexlEngine(); String jexlExp = "columnA + columnB"; Expression e = jexl.createExpression(jexlExp); JexlContext jc = new MapContext(); // Now evaluate the expression, getting the result Integer val = (Integer) e.evaluate(jc); Assert.assertEquals(val, Integer.valueOf(0)); jc.set("columnA", "0.3"); double value = (Double) e.evaluate(jc); Assert.assertEquals(0.3, value); jc.set("columnB", "0.7"); value = (Double) e.evaluate(jc); Assert.assertEquals(value, 1.0); } @Test public void testJavaNull() { JexlEngine jexl = new JexlEngine(); String jexlExp = "is_bad_new != null"; String jexlExpEqual = "is_bad_new == null"; Expression e = jexl.createExpression(jexlExp); Expression exp = jexl.createExpression(jexlExpEqual); JexlContext jc = new MapContext(); jc.set("is_bad_new", null); Assert.assertEquals(Boolean.FALSE, e.evaluate(jc)); Assert.assertEquals(Boolean.TRUE, exp.evaluate(jc)); jc.set("is_bad_new", new Object()); Assert.assertEquals(Boolean.TRUE, e.evaluate(jc)); Assert.assertEquals(Boolean.FALSE, exp.evaluate(jc)); } @Test public void testJavaMode() { JexlEngine jexl = new JexlEngine(); String jexlExp = "txn_id % 2 == 0 "; Expression e = jexl.createExpression(jexlExp); JexlContext jc = new MapContext(); jc.set("txn_id", "1"); Assert.assertEquals(Boolean.FALSE, e.evaluate(jc)); jc.set("txn_id", "2"); Assert.assertEquals(Boolean.TRUE, e.evaluate(jc)); } @Test public void testJavaSubString() { JexlEngine jexl = new JexlEngine(); String jexlExp = "str.substring(0, 1) == \"a\" "; Expression e = jexl.createExpression(jexlExp); JexlContext jc = new MapContext(); jc.set("str", "a1"); Assert.assertEquals(Boolean.TRUE, e.evaluate(jc)); } @Test public void testMathMethod() { JexlEngine jexl = new JexlEngine(); String jexlExp = "NumberUtils.max(a, b, c)"; Expression e = jexl.createExpression(jexlExp); JexlContext jc = new MapContext(); jc.set("NumberUtils", new NumberUtils()); jc.set("a", 7); jc.set("b", 5); jc.set("c", 9); Assert.assertEquals(9, e.evaluate(jc)); } @Test public void testDerived() { JexlEngine jexl = new JexlEngine(); String jexlExp = "(0.00472217*vbase_t1_model_V2R1 + 0.00341543*vbase_t1_model_V2BM)/0.00813760"; Expression e = jexl.createExpression(jexlExp); JexlContext jc = new MapContext(); jc.set("NumberUtils", new NumberUtils()); jc.set("vbase_t1_model_V2R1", 238); jc.set("vbase_t1_model_V2BM", 289); Assert.assertEquals(259.40519686394026, e.evaluate(jc)); } @Test public void testDouble() { Double a = Double.NaN; Double b = Double.valueOf(a.toString()); Assert.assertEquals(a, b); } @Test public void testEvaluator() { String weightColumnName = "cg_dol_wgt"; JexlEngine jexl = new JexlEngine(); Expression e = jexl.createExpression(weightColumnName); JexlContext jc = new MapContext(); jc.set("cg_dol_wgt", "1083.22500000"); Object result = e.evaluate(jc); System.out.println((result instanceof Integer)); System.out.println((result instanceof Double)); System.out.println(result.toString()); } @Test public void testDoubleFormat() { Double a = Double.NaN; DecimalFormat df = new DecimalFormat("##.######"); Assert.assertEquals("NaN", a.toString()); Assert.assertFalse(df.format(a).equals("NaN")); } }