/* * Copyright 2013 eXo Platform SAS * * 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 juzu.impl.template.spi.juzu.ast; import juzu.impl.common.Tools; import juzu.impl.template.spi.TemplateException; import juzu.impl.template.spi.juzu.dialect.gtmpl.GroovyTemplateStub; import juzu.io.OutputStream; import juzu.template.TemplateExecutionException; import juzu.template.TemplateRenderContext; import org.junit.Test; import java.awt.*; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.text.DateFormat; import java.util.Date; import java.util.EmptyStackException; import java.util.HashMap; import java.util.Locale; import java.util.Map; /** @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */ public class TemplateRenderingTestCase extends AbstractTemplateTestCase { private DateFormat dateFormatFR; private DateFormat dateFormatEN; @Override public void setUp() throws Exception { super.setUp(); // dateFormatFR = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.FRANCE); dateFormatEN = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.ENGLISH); } /* public void testOutputStreamWriter() throws Exception { GroovyTemplate template = new GroovyTemplate("a<%='b'%>c<%out.print('d');%>e"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStreamPrinter writer = new OutputStreamPrinter(CharsetTextEncoder.getUTF8(), baos); template.render(writer); writer.close(); assertEquals("abcde", baos.toString("UTF-8")); } */ @Test public void testDate1() throws Exception { Date dateToTest = new Date(0); String template = "<% print(new Date(0)); %>"; assertEquals(dateFormatFR.format(dateToTest), render(template, Locale.FRENCH)); assertEquals(dateFormatEN.format(dateToTest), render(template, Locale.ENGLISH)); assertEquals(dateToTest.toString(), render(template)); } @Test public void testDate2() throws Exception { Date dateToTest = new Date(0); String template = "<% def date = new Date(0) %>${date}"; assertEquals(dateFormatFR.format(dateToTest), render(template, Locale.FRENCH)); assertEquals(dateFormatEN.format(dateToTest), render(template, Locale.ENGLISH)); assertEquals(dateToTest.toString(), render(template)); } @Test public void testDate3() throws Exception { Date dateToTest = new Date(0); String template = "<%= new Date(0) %>"; assertEquals(dateFormatFR.format(dateToTest), render(template, Locale.FRENCH)); assertEquals(dateFormatEN.format(dateToTest), render(template, Locale.ENGLISH)); assertEquals(dateToTest.toString(), render(template)); } @Test public void testFoo() throws Exception { String template = "a"; String render = render(template); assertEquals("a", render); } @Test public void testBar() throws Exception { String template = "<%='a'%>"; String render = render(template); assertEquals("a", render); } @Test public void testFooBar() throws Exception { String template = "a<%='b'%>c"; String render = render(template); assertEquals("abc", render); } @Test public void testJuu() throws Exception { String template = "<% out.print(\"a\"); %>"; String render = render(template); assertEquals("a", render); } @Test public void testMessage() throws Exception { String template = "&{a}"; String render = render(template); assertEquals("MessageKey[a]", render); } @Test public void testLineBreak() throws Exception { String template = "\n"; String render = render(template); assertEquals("\n", render); } @Test public void testMultiLine() throws Exception { String template = "a\n" + "b\n" + "<%= 'c' %>\n" + "d"; String render = render(template); assertEquals("a\nb\nc\nd", render); } @Test public void testIf() throws Exception { String template = "a\n" + "<% if (true) {\n %>" + "b\n" + "<% } %>"; String s = render(template); assertEquals("a\nb\n", s); } @Test public void testLineComment() throws Exception { String template = "<% // foo %>a\nb"; String s = render(template); assertEquals("a\nb", s); } @Test public void testContextResolution() throws Exception { String template = "<%= foo %>"; Map<String, Object> context = new HashMap<String, Object>(); context.put("foo", "bar"); String s = render(template, context); assertEquals("bar", s); } @Test public void testDollarInExpression() throws Exception { String template = "<%= \"$foo\" %>"; Map<String, Object> context = new HashMap<String, Object>(); context.put("foo", "bar"); String s = render(template, context); assertEquals("bar", s); } @Test public void testEscapeDollarInExpression() throws Exception { String template = "<%= \"\\$foo\" %>"; Map<String, Object> context = new HashMap<String, Object>(); context.put("foo", "bar"); String s = render(template, context); assertEquals("$foo", s); } @Test public void testEscapeDollarInText() throws Exception { String template = "\\$foo"; Map<String, Object> context = new HashMap<String, Object>(); context.put("foo", "bar"); String s = render(template, context); assertEquals("$foo", s); } @Test public void testDollarInScriplet() throws Exception { String template = "<% out.print(\"$foo\") %>"; Map<String, Object> context = new HashMap<String, Object>(); context.put("foo", "bar"); String s = render(template, context); assertEquals("bar", s); } @Test public void testEscapeDollarInScriplet() throws Exception { String template = "<% out.print(\"\\$foo\") %>"; Map<String, Object> context = new HashMap<String, Object>(); context.put("foo", "bar"); String s = render(template, context); assertEquals("$foo", s); } @Test public void testQuote() throws Exception { String template = "\""; String s = render(template); assertEquals("\"", s); } @Test public void testNoArgURL() throws Exception { String s = render("@{foo()}"); assertEquals("foo_value", s); } // public void testSingleArgURL() throws Exception // { // String s = render("@{echo('julien')}"); // assertEquals("julien", s); // } public static String foo() { return "foo_value"; } public static String echo(String s) { return s; } /* public void testFooFoo() throws Exception { InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("UIPortalApplication.gtmpl"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[256]; for (int l = in.read(buffer);l != -1;l = in.read(buffer)) { baos.write(buffer, 0, l); } String gtmpl = baos.toString("UTF-8"); GroovyTemplate template = new GroovyTemplate(gtmpl); } */ @Test public void testException() throws Exception { String template = "<% throw new java.awt.AWTException(); %>"; try { render(template); fail(); } catch (TemplateExecutionException e) { assertTrue(e.getCause() instanceof AWTException); } } @Test public void testRuntimeException() throws Exception { String template = "<% throw new java.util.EmptyStackException(); %>"; try { render(template); fail(); } catch (TemplateExecutionException e) { assertTrue(e.getCause() instanceof EmptyStackException); } } @Test public void testSiblingClosures() throws IOException, TemplateException { GroovyTemplateStub template = template("#{title value=a/}#{title value=b/}"); template.getClassName(); } @Test public void testIOException() throws Exception { String template = "<% throw new java.io.IOException(); %>"; try { render(template); fail(); } catch (IOException e) { } // try { render("foobar", null, null, new Appendable() { public Appendable append(CharSequence csq) throws IOException { throw new IOException(); } public Appendable append(CharSequence csq, int start, int end) throws IOException { throw new IOException(); } public Appendable append(char c) throws IOException { throw new IOException(); } }); fail(); } catch (IOException e) { } } @Test public void testError() throws Exception { String template = "<% throw new java.awt.AWTError(); %>"; try { render(template); fail(); } catch (AWTError e) { } } @Test public void testThrowable() throws Exception { String template = "<% throw new Throwable(); %>"; try { render(template); fail(); } catch (Throwable t) { } } @Test public void testScriptLineNumber() throws Exception { testLineNumber("<%"); assertLineNumber(2, "throw new Exception('e')", "<%\nthrow new Exception('e')%>"); } @Test public void testExpressionLineNumber() throws Exception { testLineNumber("<%="); } private void testLineNumber(String prolog) throws Exception { assertLineNumber(1, "throw new Exception('a')", prolog + "throw new Exception('a')%>"); assertLineNumber(1, "throw new Exception('b')", "foo" + prolog + "throw new Exception('b')%>"); assertLineNumber(2, "throw new Exception('c')", "foo\n" + prolog + "throw new Exception('c')%>"); assertLineNumber(1, "throw new Exception('d')", "<%;%>foo" + prolog + "throw new Exception('d')%>"); } public static Object out; @Test public void testWriterAccess() throws Exception { out = null; Writer writer = new StringWriter(); GroovyTemplateStub template = template("<% " + TemplateRenderingTestCase.class.getName() + ".out = out; %>"); new TemplateRenderContext(template).render(OutputStream.create(Tools.UTF_8, writer)); assertNotNull(out); } private void assertLineNumber(int expectedLineNumber, String expectedText, String script) throws IOException, TemplateException { GroovyTemplateStub template = template(script); try { new TemplateRenderContext(template).render(OutputStream.create()); fail(); } catch (TemplateExecutionException t) { assertEquals(expectedText, t.getText()); assertEquals(expectedLineNumber, (Object)t.getLineNumber()); StackTraceElement scriptElt = null; for (StackTraceElement elt : t.getCause().getStackTrace()) { if (elt.getClassName().equals(template.getClassName())) { scriptElt = elt; break; } } assertEquals(expectedLineNumber, scriptElt.getLineNumber()); } } }