/*
* Copyright (C) 2013-2016 The Rythm Engine project
* for LICENSE and other details see:
* https://github.com/rythmengine/rythmengine
*/
package org.rythmengine.advanced;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.junit.Test;
import org.rythmengine.Rythm;
import org.rythmengine.TestBase;
import org.rythmengine.conf.RythmConfigurationKey;
import org.rythmengine.extension.Transformer;
import org.rythmengine.utils.S;
import java.util.*;
@Transformer
public class TransformerTest extends TestBase {
boolean debug=false;
public static Integer dbl(Integer i) {
return i * 2;
}
public static String dbl(String s) {
if (null == s) return "";
return s + s;
}
public static String dbl(Object o) {
if (null == o) return "";
return dbl(o.toString());
}
@Test
public void testBuiltInTranformers() {
System.setProperty("feature.type_inference.enabled", "true");
Rythm.shutdown();
String p;
// raw
p = "<h1>h1</h1>";
s = Rythm.render("@1.raw()", p);
eq(p);
// escape
s = Rythm.render("<script>alert('@1.escape()' + x);</script>", "xyz,'abc'");
eq("<script>alert('xyz,\'abc\'' + x);</script>");
String[] sa = "json,xml,javascript,html,csv,raw".split(",");
for (String escape : sa) {
if (debug)
System.err.println(escape);
s = Rythm.render(String.format("@1.escape(\"%s\")", escape), p);
assertEquals(S.escape(p, escape).toString(), s);
}
// lowerFirst
p = "FOO BAR";
s = Rythm.render("@1.lowerFirst()", p);
assertEquals("fOO BAR", s);
// capFirst
p = "foo bar";
s = Rythm.render("@1.capFirst()", p);
assertEquals("Foo bar", s);
// camelCase
p = "foo_bar zee";
s = Rythm.render("@1.camelCase()", p);
assertEquals("FooBar Zee", s);
// format date
Date d = new Date();
s = Rythm.render("@1.format(\"dd/MM/yyyy\")", d);
assertEquals(S.format(d, "dd/MM/yyyy"), s);
s = Rythm.render("@1.format()", d);
eq(S.format(d));
//format number
Number n = 113432.33;
s = r("@1.format()", n);
eq(S.format(n));
if (debug)
System.out.println(s);
n = .03;
String np = "#,###,###,000.00";
s = r("@1.format(@2)", n, np);
eq(S.format(n, np));
if (debug)
System.out.println(s);
// format currency
s = Rythm.render("@1.formatCurrency()", 100000/100);
eq(S.formatCurrency("1000.00"));
s = Rythm.render("@args int x;@s().formatCurrency(x)", 100000/100);
eq(S.formatCurrency("1000.00"));
// eq
s = Rythm.render("@1.eq(@2)", "a", "b");
eq("false");
s = Rythm.render("@1.eq(@2)", "a", "a");
eq("true");
s = Rythm.render("@1.eq(@2)", 1, 3);
eq("false");
s = Rythm.render("@1.eq(@2)", 1, 1);
eq("true");
s = Rythm.render("@1.eq(@2)", null, null);
eq("true");
// format joda date time
DateTime dt = new DateTime();
s = r("@1.format(\"dd/MM/yyyy hh:mm\")", dt);
DateTimeFormatter fmt = DateTimeFormat.forPattern("dd/MM/yyyy hh:mm");
eq(fmt.print(dt));
if (debug)
System.out.println(s);
// toJSON
// TBD s = Rythm.render("@1.toJSON()", )
}
@SuppressWarnings("rawtypes")
@Test
public void testJoin() {
System.setProperty("feature.type_inference.enabled", "true");
Rythm.shutdown();
List l = Arrays.asList(new Integer[]{1, 2, 3});
s = r("@1.join()", l);
eq("1,2,3");
s = r("@1.join(\";\")", l);
eq("1;2;3");
s = r("@1.join(':')", l);
eq("1:2:3");
}
@Test
public void testUserDefinedTransformer() {
Rythm.engine().registerTransformer(TransformerTest.class);
String t = "@args String s, int i\n" +
"double of \"@s\" is \"@s.app_dbl()\",\n " +
"double of [@i] is [@i.app_dbl().format(\"0000.00\")]";
String s = Rythm.render(t, "Java", 99);
assertContains(s, "double of \"Java\" is \"JavaJava\"");
//assertContains(s, "double of [99] is [0198.00]");
assertContains(s, "double of [99] is [" + S.format(dbl(99), "0000.00") + "]");
}
@Test
public void testUserDefinedTransformerWithNamespace() {
// test register with namespace specified
Rythm.engine().registerTransformer("foo", "", TransformerTest.class);
String t = "@args String s, int i\n" +
"double of \"@s\" is \"@s.foo_dbl()\",\n " +
"double of [@i] is [@i.foo_dbl().format(\"0000.00\")]";
String s = Rythm.render(t, "Java", 99);
assertContains(s, "double of \"Java\" is \"JavaJava\"");
//assertContains(s, "double of [99] is [0198.00]");
assertContains(s, "double of [99] is [" + S.format(dbl(99), "0000.00") + "]");
}
@Test
public void testTransformerConf() {
Map<String, Object> conf = new HashMap<String, Object>();
conf.put(RythmConfigurationKey.EXT_TRANSFORMER_IMPLS.getKey(), "org.rythmengine.advanced.TransformerTest");
Rythm.init(conf);
String t = "@args String s, int i\n" +
"double of \"@s\" is \"@s.app_dbl()\",\n " +
"double of [@i] is [@i.app_dbl().format(\"0000.00\")]";
String s = Rythm.render(t, "Java", 99);
assertContains(s, "double of \"Java\" is \"JavaJava\"");
//assertContains(s, "double of [99] is [0198.00]");
assertContains(s, "double of [99] is [" + S.format(dbl(99), "0000.00") + "]");
}
/**
* main routine
* @param args
*/
public static void main(String[] args) {
run(TransformerTest.class);
}
}