package com.gh.mygreen.xlsmapper.validation; import static com.gh.mygreen.xlsmapper.TestUtils.*; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.junit.Test; import com.gh.mygreen.xlsmapper.expression.ExpressionLanguageMVELImpl; /** * {@link MessageInterpolator}のテスタ * * @since 0.5 * @author T.TSUCHIE * */ public class MessageInterporlatorTest { /** * 変数のみ - EL式なし */ @Test public void testInterpolate_var() { MessageInterpolator interpolator = new MessageInterpolator(); String message = "{validatedValue} は、{min}~{max}の範囲で入力してください。"; int validatedValue = 3; Map<String, Object> vars = new HashMap<>(); vars.put("validatedValue", validatedValue); vars.put("min", 1); vars.put("max", 10); String actual = interpolator.interpolate(message, vars); assertThat(actual, is("3 は、1~10の範囲で入力してください。")); } /** * EL式あり - 数値のフォーマット */ @Test public void testInterpolate_el01() { MessageInterpolator interpolator = new MessageInterpolator(); String message = "${formatter.format('%1.1f', validatedValue)}は、${min}~${max}の範囲で入力してください。"; double validatedValue = 3; Map<String, Object> vars = new HashMap<>(); vars.put("validatedValue", validatedValue); vars.put("min", 1); vars.put("max", 10); String actual = interpolator.interpolate(message, vars); assertThat(actual, is("3.0は、1~10の範囲で入力してください。")); } /** * EL式あり - 日付のフォーマット */ @Test public void testInterpolate_el02() { MessageInterpolator interpolator = new MessageInterpolator(); String message = "現在の日付「${formatter.format('%1$tY/%1$tm/%1$td', validatedValue)}」は未来日です。"; Date validatedValue = toTimestamp("2015-05-01 12:31:49.000"); Map<String, Object> vars = new HashMap<>(); vars.put("validatedValue", validatedValue); String actual = interpolator.interpolate(message, vars); assertThat(actual, is("現在の日付「2015/05/01」は未来日です。")); // System.out.println(actual); } /** * EL式中にエスケープ文字あり */ @Test public void testInterpolate_escape01() { MessageInterpolator interpolator = new MessageInterpolator(); String message = "\\${formatter.format('%1.1f',validatedValue)}は、\\{min}~${max}の範囲で入力してください。"; double validatedValue = 3; Map<String, Object> vars = new HashMap<>(); vars.put("validatedValue", validatedValue); vars.put("min", 1); vars.put("max", 10); String actual = interpolator.interpolate(message, vars); assertThat(actual, is("${formatter.format('%1.1f',validatedValue)}は、{min}~10の範囲で入力してください。")); // System.out.println(actual); } /** * EL式中にエスケープ文字あり */ @Test public void testInterpolate_escape02() { MessageInterpolator interpolator = new MessageInterpolator(); String message = "${'Helo World\\}' += formatter.format('%1.1f', validatedValue)}は、{min}~${max}の範囲で入力してください。"; double validatedValue = 3; Map<String, Object> vars = new HashMap<>(); vars.put("validatedValue", validatedValue); vars.put("min", 1); vars.put("max", 10); String actual = interpolator.interpolate(message, vars); assertThat(actual, is("Helo World}3.0は、1~10の範囲で入力してください。")); // System.out.println(actual); } /** * メッセージ中の式が途中で終わる場合 */ @Test public void testInterpolate_lack_end() { MessageInterpolator interpolator = new MessageInterpolator(); String message = "${'Helo World\\}' += formatter.format('%1.1f', validatedValue)"; double validatedValue = 3; Map<String, Object> vars = new HashMap<>(); vars.put("validatedValue", validatedValue); vars.put("min", 1); vars.put("max", 10); String actual = interpolator.interpolate(message, vars); assertThat(actual, is("${'Helo World}' += formatter.format('%1.1f', validatedValue)")); } /** * 再起的にメッセージを評価する。 * 変数の再起 */ @Test public void testInterpolate_recursive_vars() { MessageInterpolator interpolator = new MessageInterpolator(); String message = "{abc} : {message}"; Map<String, Object> vars = new HashMap<>(); vars.put("message", "${1+2}"); String actual = interpolator.interpolate(message, vars, true); assertThat(actual, is("{abc} : 3")); } /** * 再起的にメッセージを評価する。 * 式の再起 */ @Test public void testInterpolate_recursive_el() { MessageInterpolator interpolator = new MessageInterpolator(); String message = "{abc} : ${value}"; Map<String, Object> vars = new HashMap<>(); vars.put("value", "{min}"); vars.put("min", 3); String actual = interpolator.interpolate(message, vars, true); assertThat(actual, is("{abc} : 3")); } /** * MVELに切り替えて実行する */ @Test public void testInterpolate_mvel() { MessageInterpolator interpolator = new MessageInterpolator(new ExpressionLanguageMVELImpl()); assertThat(interpolator.getExpressionLanguage(), instanceOf(ExpressionLanguageMVELImpl.class)); String message = "${formatter.format('%1.1f', validatedValue)}は、${min}~${max}の範囲で入力してください。"; double validatedValue = 3; Map<String, Object> vars = new HashMap<>(); vars.put("validatedValue", validatedValue); vars.put("min", 1); vars.put("max", 10); String actual = interpolator.interpolate(message, vars); assertThat(actual, is("3.0は、1~10の範囲で入力してください。")); } }