package cn.org.rapid_framework.velocity.directive; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; import org.junit.Before; import org.junit.Test; import org.springframework.ui.velocity.VelocityEngineUtils; import org.springframework.util.ResourceUtils; public class OverrideDirectiveTest { VelocityEngine engine; @Before public void setUp() throws Exception{ String path = ResourceUtils.getFile("classpath:fortest_velocity").getCanonicalPath().replace('\\', '/')+"/"; engine = new VelocityEngine(); Properties p = new Properties(); p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path); p.setProperty("userdirective","cn.org.rapid_framework.velocity.directive.BlockDirective,cn.org.rapid_framework.velocity.directive.OverrideDirective,cn.org.rapid_framework.velocity.directive.ExtendsDirective,cn.org.rapid_framework.velocity.directive.SuperDirective"); p.setProperty(Velocity.FILE_RESOURCE_LOADER_CACHE, "true"); engine.init(p); } @Test public void test_override() throws Exception { System.out.println(VelocityEngineUtils.mergeTemplateIntoString(engine,"base.vm",new HashMap())); System.out.println(VelocityEngineUtils.mergeTemplateIntoString(engine,"child.vm",new HashMap())); System.out.println(VelocityEngineUtils.mergeTemplateIntoString(engine,"grandchild.vm",new HashMap())); assertEquals("<html><head>base_head_content</head><body>base_body_content</body></html>",processTemplate("base.vm")); assertEquals("<html><head>base_head_content</head><body><divclass='content'>PoweredByrapid-framework</div></body></html>",processTemplate("child.vm")); assertEquals("<html><head>grandchild_head_content</head><body>grandchild_body_content</body></html>",processTemplate("grandchild.vm")); // assertEquals("<html><head>base_head_content</head><body>base_body_content</body></html>",processTemplate("base-ext.vm")); } @Test public void test_override_by_super() throws Exception { assertEquals("<html><head>base_head_content</head><body><super>base_body_content<super></body></html>",processTemplate("super.vm")); assertEquals("<html><head><supersuperhead/></head><body><supersuper><super>base_body_content<super><supersuper></body></html>",processTemplate("supersuper.vm")); assertEquals("<html><head><supersuperhead/><supersupersuper><supersuperhead/></head><body><supersuper><super>base_body_content<super><supersuper><supersupersuper_body></body></html>",processTemplate("supersupersuper.vm")); // assertEquals("<html><head>base_head_content</head><body>base_body_content</body></html>",processTemplate("base-ext.vm")); } @Test public void test_override_by_super_by_not_found_parent() throws Exception { assertEquals("<html><head>base_head_content</head><body>base_body_content</body></html>",processTemplate("super_not_found_parent.vm")); // assertEquals("<html><head>base_head_content</head><body>base_body_content</body></html>",processTemplate("base-ext.vm")); } @Test(expected=ParseErrorException.class) public void testArgumentWithOverride() throws ParseErrorException, MethodInvocationException, ResourceNotFoundException, IOException { VelocityContext context = new VelocityContext(); StringWriter out = new StringWriter(); engine.evaluate(context,out , "test.vm", "#override() diy \n #end"); System.out.println(out.toString()); } @Test(expected=ParseErrorException.class) public void testArgumentWithBlock() throws ParseErrorException, MethodInvocationException, ResourceNotFoundException, IOException { VelocityContext context = new VelocityContext(); StringWriter out = new StringWriter(); engine.evaluate(context,out , "test.vm", "#block() diy \n #end"); System.out.println(out.toString()); } @Test public void testSetDirective() throws ParseErrorException, MethodInvocationException, ResourceNotFoundException, IOException { Map map = new HashMap(); VelocityContext context = new VelocityContext(map); StringWriter out = new StringWriter(); engine.evaluate(context,out , "test.vm", "#set($v = '123')"); System.out.println(out.toString()); System.out.println("testSetDirective() map:"+map); assertEquals("123",map.get("v")); } @Test(timeout=10100) public void testPerformance() throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception { long start = System.currentTimeMillis(); int count = 100000; // String content = RandomStringUtils.randomAscii(8192); String content = "china"; for(int i = 0; i < count; i++) { HashMap hashMap = new HashMap(); hashMap.put("content", content); hashMap.put("data", new String[]{"1","2"}); if(i % 1000 == 0) { System.out.println("current:"+i); } Template t = engine.getTemplate("performance.vm"); if( i == count - 2) { StringWriter out = new StringWriter(); t.merge(new VelocityContext(hashMap), out); System.out.println(out.toString()); }else { t.merge(new VelocityContext(hashMap),NULL_WRITER); } } float cost = System.currentTimeMillis() - start; System.out.println("testPerformance() cost:"+cost+" "+ (count/(cost/1000))+" "); } private String processTemplate(String name) throws ResourceNotFoundException, ParseErrorException, Exception { String str = VelocityEngineUtils.mergeTemplateIntoString(engine, name, new HashMap()); return str.replaceAll("\\s+", ""); } @Test(expected=ResourceNotFoundException.class) public void test_extends_relative_path() throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception { String str = processTemplate("/extends_relative_path/relative_child.vm"); // assertEquals("BBBBBB",str); } public static Writer NULL_WRITER = new Writer() { @Override public void close() { } @Override public void flush() { } @Override public void write(char[] cbuf, int off, int len){ } }; }