package com.gh.mygreen.xlsmapper.expression; import static org.junit.Assert.*; import static org.hamcrest.Matchers.*; import java.sql.Timestamp; import java.util.Arrays; import java.util.Date; import java.util.Formatter; import java.util.HashMap; import java.util.Locale; import java.util.Map; import org.junit.Before; import org.junit.Test; import com.github.mygreen.expression.el.FormatterWrapper; import com.github.mygreen.expression.el.tld.Taglib; import com.github.mygreen.expression.el.tld.TldLoader; /** * {@link ExpressionLangaugeEL3Impl}のテスタ * * @since 1.6 * @author T.TSUCHIE * */ public class ExpressionLangaugeEL3ImplTest { private ExpressionLangaugeEL3Impl el; @Before public void setUp() throws Exception { this.el = new ExpressionLangaugeEL3Impl(); } /** * empty句のテスト */ @Test public void testEvaluate_empty() { String expression = "empty label ? '空です' : label"; Map<String, Object> vars = new HashMap<>(); String eval = (String) el.evaluate(expression, vars); assertThat(eval, is("空です")); } @Test(expected=IllegalArgumentException.class) public void testEvaluate_exprNull() { Map<String, Object> vars = new HashMap<>(); el.evaluate(null, vars); fail(); } @Test(expected=IllegalArgumentException.class) public void testEvaluate_exprEmpty() { Map<String, Object> vars = new HashMap<>(); el.evaluate("", vars); fail(); } @Test(expected=IllegalArgumentException.class) public void testEvaluate_valueNull() { { // empty Map<String, Object> vars = new HashMap<>(); el.evaluate("1+2", vars); } { el.evaluate("1+2", null); fail(); } } /** * formatterのテスト */ @Test public void testEvaluate_format() { Date date = Timestamp.valueOf("2015-04-15 10:20:30.000"); String expression = "formatter.format('%1$tY/%1$tm/%1$td', currentDate)"; Map<String, Object> vars = new HashMap<>(); vars.put("currentDate", date); vars.put("formatter", new Formatter(Locale.getDefault())); String eval = (String) el.evaluate(expression, vars); assertThat(eval, is("2015/04/15")); } /** * formatterのテスト - {@link FormatterWrapper}でラップしてある */ @Test public void testEvaluate_format_wrap() { Date date = Timestamp.valueOf("2015-04-15 10:20:30.000"); String expression = "formatter.format('%1$tY/%1$tm/%1$td', currentDate)"; Map<String, Object> vars = new HashMap<>(); vars.put("currentDate", date); vars.put("formatter", new FormatterWrapper(Locale.getDefault())); String eval = (String) el.evaluate(expression, vars); assertThat(eval, is("2015/04/15")); } /** * ラムダ式のテスト */ @Test public void testEvaluate_lambda() { String expression = "sum=0;list.stream().forEach(x->(sum=sum+x));sum"; Map<String, Object> vars = new HashMap<>(); vars.put("list", Arrays.asList(1, 2, 3, 4, 5, 6)); long eval = (long) el.evaluate(expression, vars); assertThat(eval, is(21L)); } /** * 式中のエスケープのテスト */ @Test public void testEvaluate_escape() { String expression = "'Helo World}' += formatter.format('%1.1f', validatedValue)"; Map<String, Object> vars = new HashMap<>(); vars.put("validatedValue", 12.34); vars.put("formatter", new FormatterWrapper(Locale.getDefault())); String eval = (String) el.evaluate(expression, vars); assertThat(eval, is("Helo World}12.3")); } /** * EL式でExcelの数式を組み立てた場合のエスケープの確認 */ @Test public void testEvaluate_buildFormula() { String expression = "columnNumber == 7 ? 'COUNTIF(D' += rowNumber += ':F' += rowNumber += ', \"出席\")' : ''"; Map<String, Object> vars = new HashMap<>(); vars.put("columnNumber", 6); vars.put("rowNumber", 10); String eval1 = (String) el.evaluate(expression, vars); assertThat(eval1, is("")); vars.clear(); vars.put("columnNumber", 7); vars.put("rowNumber", 10); String eval2 = (String) el.evaluate(expression, vars); assertThat(eval2, is("COUNTIF(D10:F10, \"出席\")")); } /** * EL関数の確認 */ @Test public void testEvaluate_function() throws Exception { // EL関数の登録 TldLoader loader = new TldLoader(); Taglib taglib = loader.load(ExpressionLangaugeEL3ImplTest.class.getResourceAsStream("/com/gh/mygreen/xlsmapper/expression/xlsmapper.tld")); el.register(taglib); String expression = "x:colToAlpha(columnNumber)"; Map<String, Object> vars = new HashMap<>(); vars.put("columnNumber", 1); String eval = (String) el.evaluate(expression, vars); assertThat(eval, is("A")); } /** * EL関数の確認 - 存在しないクラスの場合 */ @Test(expected=ExpressionEvaluationException.class) public void testEvaluate_function_notFound() throws Exception { // EL関数の登録 TldLoader loader = new TldLoader(); Taglib taglib = loader.load(ExpressionLangaugeEL2ImplTest.class.getResourceAsStream("/error_notFoundClass.tld")); el.register(taglib); String expression = "1 + 2"; Map<String, Object> vars = new HashMap<>(); try { el.evaluate(expression, vars); fail(); } catch(Exception e) { assertThat(e, is(instanceOf(ExpressionEvaluationException.class))); assertThat(e.getCause(), is(instanceOf(ClassNotFoundException.class))); throw e; } } /** * 不正なEL式 */ @Test(expected=ExpressionEvaluationException.class) public void testEvaluate_invalidExp() { String expression = "y:test(D + C + 1, 23)"; Map<String, Object> vars = new HashMap<>(); el.evaluate(expression, vars); fail(); } }