package org.trimou.minify; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.io.Reader; import java.io.StringReader; import org.junit.Test; import org.trimou.engine.MustacheEngine; import org.trimou.engine.MustacheEngineBuilder; import org.trimou.engine.config.Configuration; import org.trimou.engine.config.EngineConfigurationKey; import org.trimou.exception.MustacheException; import org.trimou.exception.MustacheProblem; import org.trimou.lambda.InputLiteralLambda; import org.trimou.lambda.Lambda; import org.trimou.util.ImmutableMap; import com.googlecode.htmlcompressor.compressor.HtmlCompressor; /** * * @author Martin Kouba */ public class MinifyListenerTest { @Test public void testDefaultHtmlListener() { MustacheEngine engine = MustacheEngineBuilder.newBuilder() .addMustacheListener(Minify.htmlListener()).build(); assertEquals( "<html><body> <p>FOO</p> </body> </html>", engine.compileMustache("minify_html", "<html><body> <!-- My comment --> <p>{{foo}}</p> </body>\n </html>") .render(ImmutableMap.<String, Object> of("foo", "FOO"))); } @Test public void testDefaultXmlListener() { MustacheEngine engine = MustacheEngineBuilder.newBuilder() .addMustacheListener(Minify.xmlListener()).build(); assertEquals( "<foo><bar>Hey FOO!</bar></foo>", engine.compileMustache("minify_xml", "<foo> <!-- My comment --> <bar>Hey {{foo}}!</bar> \n\n </foo>") .render(ImmutableMap.<String, Object> of("foo", "FOO"))); } @Test public void testPreservePattern() { String template = "<html><body>{{ <!--foo--> }}</body> </html>"; MustacheEngine engine = MustacheEngineBuilder .newBuilder() .addMustacheListener(Minify.htmlListener()) .setProperty(EngineConfigurationKey.HANDLEBARS_SUPPORT_ENABLED, false).build(); assertEquals( "<html><body>FOO</body> </html>", engine.compileMustache("minify_html_preserve_pattern", template) .render(ImmutableMap.<String, Object> of("<!--foo-->", "FOO"))); engine = MustacheEngineBuilder .newBuilder() .addMustacheListener( Minify.customListener(new HtmlCompressorMinifier() { @Override public void init(Configuration configuration) { // No custom preserve pattern } })).build(); try { engine.compileMustache("minify_html_preserve_pattern", template); fail("Compilation should fail!"); } catch (MustacheException e) { if (!MustacheProblem.COMPILE_INVALID_TAG.equals(e.getCode())) { fail("Unexpected problem code: " + e.getCode()); } } } @Test public void testCustomizedHtmlListener() { String contents = "<html><body><!-- My comment --></body></html>"; MustacheEngine engine = MustacheEngineBuilder .newBuilder() .addMustacheListener( Minify.customListener(new HtmlCompressorMinifier() { @Override protected void initCompressor( HtmlCompressor compressor, Configuration configuration) { compressor.setEnabled(false); } })).build(); // Compressor is disabled assertEquals(contents, engine.compileMustache("minify_html_customized", contents) .render(null)); engine = MustacheEngineBuilder.newBuilder() .addMustacheListener( Minify.customListener(new HtmlCompressorMinifier( mustacheName -> mustacheName.endsWith("html")))) .build(); // Mustache name does not match assertEquals(contents, engine.compileMustache("minify_html_customized", contents) .render(null)); // Skip lambdas engine = MustacheEngineBuilder.newBuilder() .addMustacheListener( Minify.customListener(new HtmlCompressorMinifier( mustacheName -> !mustacheName.startsWith( Lambda.ONEOFF_LAMBDA_TEMPLATE_PREFIX)))) .build(); assertEquals(contents, engine .compileMustache("minify_html_customized_skip_lambda", "<html><body>{{{lambda}}}</body></html>") .render(ImmutableMap.of("lambda", new InputLiteralLambda() { @Override public boolean isReturnValueInterpolated() { return true; } @Override public String invoke(String text) { return "<!-- My comment -->"; } }))); } @Test public void testCustomListener() { MustacheEngine engine = MustacheEngineBuilder .newBuilder() .addMustacheListener( Minify.customListener(new AbstractMinifier() { @Override public Reader minify(String mustacheName, Reader mustacheContents) { return mustacheName.endsWith("js") ? new StringReader( "") : mustacheContents; } })).build(); assertEquals("", engine.compileMustache("mustache.js", "whatever") .render(null)); assertEquals("<html>", engine.compileMustache("foo", "<html>").render(null)); } }