package com.fanruan.api.cal; import com.fanruan.api.Prepare; import com.fr.base.Parameter; import com.fr.json.JSON; import com.fr.json.JSONFactory; import com.fr.script.Calculator; import com.fr.stable.ParameterProvider; import com.fr.stable.UtilEvalError; import com.fr.stable.script.NameSpace; import org.junit.Assert; import org.junit.Test; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; /** * @author richie * @version 10.0 * Created by richie on 2019-08-16 */ public class ParameterKitTest extends Prepare { @Test public void analyze4ParametersFromFormula() { ParameterProvider[] providers = ParameterKit.analyze4ParametersFromFormula("=sum($p1, $p2) + max($p4 - 1, pow(2, $p5))"); TreeMap map = new TreeMap<>(); for (ParameterProvider provider : providers) { map.put(provider.getName(), provider.getValue()); } String[] names = map.keySet().toArray(new String[0]); Assert.assertArrayEquals(new String[]{"p1", "p2", "p4", "p5"}, names); } @Test public void analyze4Parameters() { String sql = "SELECT * FROM Equipment where 'Tel' = ${if(true, 1, 2)}"; ParameterProvider[] parameters = ParameterKit.analyze4Parameters(sql, false); Assert.assertEquals(0, parameters.length); parameters = ParameterKit.analyze4Parameters(sql, true); Assert.assertEquals(0, parameters.length); sql = "SELECT * FROM s订单 where 1=1 ${if(len(aa)==0,\"\",\" and 货主城市 in (\"+\"'\"+treelayer(aa,true,\"\\',\\'\")+\"'\"+\")\")}"; parameters = ParameterKit.analyze4Parameters(sql, false); Assert.assertEquals(1, parameters.length); Assert.assertEquals(parameters[0].getName(), "aa"); sql = "SELECT * FROM Equipment where 'Tel' = ${if(false, 1, 2)}"; parameters = ParameterKit.analyze4Parameters(sql, false); Assert.assertEquals(0, parameters.length); parameters = ParameterKit.analyze4Parameters(sql, true); Assert.assertEquals(0, parameters.length); sql = "SELECT * FROM s订单 where 1=1 ${if(len(aa)==0,\"\",\" and 货主城市 in (\"+\"'\"+treelayer(aa,false,\"\\',\\'\")+\"'\"+\")\")}"; parameters = ParameterKit.analyze4Parameters(sql, false); Assert.assertEquals(1, parameters.length); Assert.assertEquals(parameters[0].getName(), "aa"); sql = "SELECT * FROM s订单 where 1=1 ${if(len(aa)==0,\"\",\" and 货主城市 in (\"+\"'\"+treelayer(aa,\"true\",\"\\',\\'\")+\"'\"+\")\")}"; parameters = ParameterKit.analyze4Parameters(sql, false); Assert.assertEquals(1, parameters.length); Assert.assertEquals(parameters[0].getName(), "aa"); } @Test public void createParameterMapNameSpace() { Map map = new HashMap<>(); map.put("p1", 100); map.put("p2", 200); NameSpace ns = ParameterKit.createParameterMapNameSpace(map); Calculator calculator = Calculator.createCalculator(); calculator.pushNameSpace(ns); try { Object r = calculator.eval("=$p1 + $p2"); Assert.assertEquals(300, r); } catch (UtilEvalError utilEvalError) { Assert.fail(); } finally { calculator.removeNameSpace(ns); } } @Test public void createParameterMapNameSpace2() { ParameterProvider[] parameters = new ParameterProvider[]{ ParameterKit.newParameter("p1", 100), ParameterKit.newParameter("p2", 200) }; NameSpace ns = ParameterKit.createParameterMapNameSpace(parameters); Calculator calculator = Calculator.createCalculator(); calculator.pushNameSpace(ns); try { Object r = calculator.eval("=$p1 + $p2"); Assert.assertEquals(300, r); } catch (UtilEvalError utilEvalError) { Assert.fail(); } finally { calculator.removeNameSpace(ns); } } @Test public void newParameter() { ParameterProvider provider = ParameterKit.newParameter(); Assert.assertTrue(provider instanceof Parameter); } @Test public void newParameter1() { ParameterProvider provider = ParameterKit.newParameter("p1", "124"); Assert.assertEquals("p1", provider.getName()); Assert.assertEquals("124", provider.getValue()); } @Test public void newParameter2() { ParameterProvider provider = ParameterKit.newParameter("p1"); Assert.assertEquals(provider.getName(), "p1"); Assert.assertEquals("", provider.getValue()); } @Test public void analyzeAndUnionSameParameters() { ParameterProvider p1 = ParameterKit.newParameter("p1", 100); ParameterProvider p2 = ParameterKit.newParameter("p2", 200); ParameterProvider[] providers = ParameterKit.analyzeAndUnionSameParameters( new String[]{"select * from td where name = ${p1} and age = ${p3}"}, new ParameterProvider[]{p1, p2}); for (ParameterProvider provider : providers) { if ("p1".equals(provider.getName())) { Assert.assertEquals(100, provider.getValue()); } } } @Test public void json2Parameter() { String text = "{\"name\":\"p1\", \"type\":\"Formula\", \"value\":\"=1+1\"}"; ParameterProvider p = ParameterKit.json2Parameter(JSONFactory.createJSON(JSON.OBJECT, text)); Assert.assertEquals("p1", p.getName()); } @Test public void parameters2Json() { ParameterProvider[] providers = new ParameterProvider[]{ ParameterKit.newParameter("p1", 1), ParameterKit.newParameter("p2", "abc"), ParameterKit.newParameter("p3", "=sum(1, 2, 4)") }; Assert.assertEquals( "[{\"name\":\"p1\",\"value\":1,\"type\":\"Integer\"},{\"name\":\"p2\",\"value\":\"abc\",\"type\":\"String\"},{\"name\":\"p3\",\"value\":\"=sum(1, 2, 4)\",\"type\":\"String\"}]", ParameterKit.parameters2Json(providers).toString()); } @Test public void testAnalyzeAndMergeParameters() { ParameterProvider param1 = ParameterKit.newParameter("test1", "1"); ParameterProvider param2 = ParameterKit.newParameter("test2", "2"); String text1 = "${a}"; String text2 = "${test1}"; ParameterProvider[] parameters1 = ParameterKit.analyzeAndMergeParameters( new String[]{text1, text2}, new ParameterProvider[] {param1, param2} ); ParameterProvider[] parameters2 = ParameterKit.analyzeAndMergeParameters(null, null); ParameterProvider[] parameters3 = ParameterKit.analyzeAndMergeParameters( null, new ParameterProvider[] {param1, param2} ); ParameterProvider[] parameters4 = ParameterKit.analyzeAndMergeParameters( new String[] {}, new ParameterProvider[] {param1, param2} ); ParameterProvider[] parameters5 = ParameterKit.analyzeAndMergeParameters( new String[]{text1, text2}, new ParameterProvider[] {} ); Assert.assertEquals(parameters1.length, 3); Assert.assertEquals(parameters1[0], param1); Assert.assertEquals(parameters1[1], param2); Assert.assertEquals(parameters1[2].getName(), "a"); Assert.assertEquals(parameters1[2].getValue(), ""); Assert.assertEquals(parameters2.length, 0); Assert.assertEquals(parameters3.length, 2); Assert.assertEquals(parameters3[0], param1); Assert.assertEquals(parameters3[1], param2); Assert.assertEquals(parameters4.length, 2); Assert.assertEquals(parameters4[0], param1); Assert.assertEquals(parameters4[1], param2); Assert.assertEquals(parameters5.length, 2); Assert.assertEquals(parameters5[0].getName(), "a"); Assert.assertEquals(parameters5[0].getValue(), ""); Assert.assertEquals(parameters5[1].getName(), "test1"); Assert.assertEquals(parameters5[1].getValue(), ""); } }