package com.dmarcotte.handlebars.format; import com.dmarcotte.handlebars.config.HbConfig; import com.dmarcotte.handlebars.editor.actions.HbActionHandlerTest; public class HbFormatOnEnterTest extends HbActionHandlerTest implements HbFormattingModelBuilderTest { private boolean myPrevFormatSetting; @Override protected void setUp() throws Exception { super.setUp(); myPrevFormatSetting = HbConfig.isFormattingEnabled(); HbConfig.setFormattingEnabled(true); } @Override protected void tearDown() throws Exception { HbConfig.setFormattingEnabled(myPrevFormatSetting); super.tearDown(); } /** * This sanity check should be enough to ensure that we don't format on Enter * when the formatter is disabled */ public void testEnterWithFormatterDisabled() { boolean previousFormatterSetting = HbConfig.isFormattingEnabled(); HbConfig.setFormattingEnabled(false); doEnterTest( "{{#foo}}<caret>", "{{#foo}}\n" + "<caret>" ); HbConfig.setFormattingEnabled(previousFormatterSetting); } public void testSimpleStache() { doEnterTest( "{{foo}}<caret>", "{{foo}}\n" + "<caret>" ); } public void testSimpleBlock1() { doEnterTest( "{{#foo}}<caret>", "{{#foo}}\n" + " <caret>" ); } public void testSimpleBlock2() { doEnterTest( "{{#foo}}\n" + " {{bar}}<caret>htmlPadding", "{{#foo}}\n" + " {{bar}}\n" + " <caret>htmlPadding" ); } public void testSimpleBlock3() { doEnterTest( "{{#foo}}\n" + " {{bar}}<caret>\n" + "{{/foo}}\n", "{{#foo}}\n" + " {{bar}}\n" + " <caret>\n" + "{{/foo}}\n"); } public void testNestedBlocks1() { doEnterTest( "{{#foo}}\n" + "{{#bar}}\n" + "{{#bat}}<caret>\n" + "{{baz}}\n" + "{{/bat}}\n" + "{{/bar}}\n" + "{{/foo}}", "{{#foo}}\n" + "{{#bar}}\n" + "{{#bat}}\n" + " <caret>\n" + "{{baz}}\n" + "{{/bat}}\n" + "{{/bar}}\n" + "{{/foo}}" ); } public void testNestedBlocks2() { doEnterTest( "{{#foo}}\n" + " {{#bar}}\n" + " {{#bat}}<caret>\n" + " {{baz}}\n" + " {{/bat}}\n" + " {{/bar}}\n" + "{{/foo}}", "{{#foo}}\n" + " {{#bar}}\n" + " {{#bat}}\n" + " <caret>\n" + " {{baz}}\n" + " {{/bat}}\n" + " {{/bar}}\n" + "{{/foo}}" ); } public void testNestedBlocks3() { doEnterTest( "{{#foo}}\n" + " {{#bar}}\n" + " {{#bat}}\n" + " {{baz}}<caret>\n" + " {{/bat}}\n" + " {{/bar}}\n" + "{{/foo}}", "{{#foo}}\n" + " {{#bar}}\n" + " {{#bat}}\n" + " {{baz}}\n" + " <caret>\n" + " {{/bat}}\n" + " {{/bar}}\n" + "{{/foo}}" ); } public void testSimpleStacheInDiv1() { doEnterTest( "<div><caret>\n" + " {{foo}}\n" + "</div>", "<div>\n" + " <caret>\n" + " {{foo}}\n" + "</div>" ); } public void testSimpleStacheInDiv2() { doEnterTest( "<div>\n" + " {{foo}}<caret>\n" + "</div>", "<div>\n" + " {{foo}}\n" + " <caret>\n" + "</div>" ); } public void testSimpleStacheInDiv3() { doEnterTest( "<div>\n" + " {{foo}}<caret>", "<div>\n" + " {{foo}}\n" + " <caret>" ); } public void testMarkupInBlockStache1() { doEnterTest( "{{#foo}}\n" + " <span></span><caret>\n" + "{{/foo}}", "{{#foo}}\n" + " <span></span>\n" + " <caret>\n" + "{{/foo}}" ); } public void testMarkupInBlockStache2() { doEnterTest( "{{#foo}}<caret>\n" + " <span></span>\n" + "{{/foo}}", "{{#foo}}\n" + " <caret>\n" + " <span></span>\n" + "{{/foo}}" ); } public void testMarkupInBlockStache3() { doEnterTest( "{{#foo}}\n" + " <span></span><caret>", "{{#foo}}\n" + " <span></span>\n" + " <caret>" ); } public void testEmptyBlockInDiv1() { doEnterTest( "<div>\n" + " {{#foo}}<caret>\n" + " {{/foo}}\n" + "</div>", "<div>\n" + " {{#foo}}\n" + " <caret>\n" + " {{/foo}}\n" + "</div>" ); } public void testEmptyBlockInDiv2() { doEnterTest( "<div>\n" + " {{#foo}}<caret>{{/foo}}\n" + "</div>", "<div>\n" + " {{#foo}}\n" + " <caret>\n" + " {{/foo}}\n" + "</div>" ); } public void testEmptyBlockInDiv3() { doEnterTest( "<div>\n" + " {{#foo}}<caret>\n" + "htmlPadding", "<div>\n" + " {{#foo}}\n" + " <caret>\n" + "htmlPadding" ); } public void testEmptyBlockInDiv4() { doEnterTest( "<div>\n" + "{{#foo}}<caret>{{/foo}}", "<div>\n" + "{{#foo}}\n" + " <caret>\n" + "{{/foo}}" ); } public void testSimpleBlockInDiv1() { doEnterTest( "<div>\n" + "{{#foo}}\n" + "{{bar}}<caret>\n" + "{{/foo}}\n" + "</div>", "<div>\n" + "{{#foo}}\n" + "{{bar}}\n" + " <caret>\n" + "{{/foo}}\n" + "</div>" ); } public void testSimpleBlockInDiv2() { doEnterTest( "<div>\n" + " {{#foo}}\n" + " {{bar}}<caret>\n" + " {{/foo}}\n" + "</div>", "<div>\n" + " {{#foo}}\n" + " {{bar}}\n" + " <caret>\n" + " {{/foo}}\n" + "</div>" ); } public void testSimpleBlockInDiv3() { doEnterTest( "<div>\n" + " {{#foo}}\n" + " {{bar}}\n" + " {{/foo}}<caret>\n" + "</div>", "<div>\n" + " {{#foo}}\n" + " {{bar}}\n" + " {{/foo}}\n" + " <caret>\n" + "</div>" ); } public void testSimpleBlockInDiv4() { doEnterTest( "<div>\n" + "{{#foo}}\n" + "{{bar}}<caret>", "<div>\n" + "{{#foo}}\n" + "{{bar}}\n" + " <caret>" ); } public void testSimpleBlockInDiv5() { doEnterTest( "<div>\n" + " {{#foo}}\n" + " {{bar}}<caret>\n" + "htmlPadding", "<div>\n" + " {{#foo}}\n" + " {{bar}}\n" + " <caret>\n" + "htmlPadding" ); } public void testSimpleBlockInDiv6() { doEnterTest( "<div>\n" + " {{#foo}}\n" + " {{bar}}\n" + " {{/foo}}<caret>", "<div>\n" + " {{#foo}}\n" + " {{bar}}\n" + " {{/foo}}\n" + " <caret>" ); } public void testSimpleBlockInDiv7() { doEnterTest( "<div>\n" + " {{#foo}}<caret>\n" + " {{bar}}\n" + " {{/foo}}", "<div>\n" + " {{#foo}}\n" + " <caret>\n" + // NOTE: this is not ideal, but it's tough to get the formatting right when there's unclosed html elements " {{bar}}\n" + " {{/foo}}" ); } public void testSimpleBlockInDiv8() { doEnterTest( "<div>\n" + " {{#foo}}<caret>\n" + " {{bar}}\n" + " {{/foo}}\n" + "</div>", "<div>\n" + " {{#foo}}\n" + " <caret>\n" + " {{bar}}\n" + " {{/foo}}\n" + "</div>" ); } public void testAttributeStaches1() { doEnterTest( "<div {{foo}}><caret>\n" + " <div class=\"{{bar}}\">\n" + " sweeet\n" + " </div>\n" + "</div>", "<div {{foo}}>\n" + " <caret>\n" + " <div class=\"{{bar}}\">\n" + " sweeet\n" + " </div>\n" + "</div>" ); } public void testAttributeStaches2() { doEnterTest( "<div {{foo}}>\n" + " <div class=\"{{bar}}\"><caret>\n" + " sweeet\n" + " </div>\n" + "</div>", "<div {{foo}}>\n" + " <div class=\"{{bar}}\">\n" + " <caret>\n" + " sweeet\n" + " </div>\n" + "</div>" ); } public void testAttributeStaches3() { doEnterTest( "<div {{foo}}>\n" + " <div class=\"{{bar}}\">\n" + " sweeet<caret>\n" + " </div>\n" + "</div>", "<div {{foo}}>\n" + " <div class=\"{{bar}}\">\n" + " sweeet\n" + " <caret>\n" + " </div>\n" + "</div>" ); } public void testAttributeStaches4() { doEnterTest( "<div {{foo}}><caret>", "<div {{foo}}>\n" + " <caret>" ); } public void testAttributeStaches5() { doEnterTest( "<div {{foo}}>\n" + " <div class=\"{{bar}}\"><caret>", "<div {{foo}}>\n" + " <div class=\"{{bar}}\">\n" + " <caret>" ); } public void testAttributeStaches6() { doEnterTest( "<div {{foo}}>\n" + " <div class=\"{{bar}}\">\n" + " sweeet<caret>", "<div {{foo}}>\n" + " <div class=\"{{bar}}\">\n" + " sweeet\n" + " <caret>" ); } public void testMixedContentInDiv1() { doEnterTest( "<div>\n" + " {{#foo}}\n" + " <span class=\"{{bat}}\">{{bar}}</span><caret>\n" + " {{/foo}}\n" + "</div>", "<div>\n" + " {{#foo}}\n" + " <span class=\"{{bat}}\">{{bar}}</span>\n" + " <caret>\n" + " {{/foo}}\n" + "</div>" ); } public void testMixedContentInDiv2() { doEnterTest( "<div>\n" + " {{#foo}}<caret>\n" + " <span class=\"{{bat}}\">{{bar}}</span>\n" + " {{/foo}}\n" + "</div>", "<div>\n" + " {{#foo}}\n" + " <caret>\n" + " <span class=\"{{bat}}\">{{bar}}</span>\n" + " {{/foo}}\n" + "</div>" ); } public void testMixedContentInDiv3() { doEnterTest( "<div>\n" + " {{#foo}}\n" + " <span class=\"{{bat}}\">{{bar}}</span><caret>\n" + " {{/foo}}\n" + "</div>", "<div>\n" + " {{#foo}}\n" + " <span class=\"{{bat}}\">{{bar}}</span>\n" + " <caret>\n" + " {{/foo}}\n" + "</div>" ); } public void testMixedContentInDiv4() { doEnterTest( "<div>\n" + " {{#foo}}\n" + " <span class=\"{{bat}}\">{{bar}}</span>\n" + " {{/foo}}<caret>\n" + "</div>", "<div>\n" + " {{#foo}}\n" + " <span class=\"{{bat}}\">{{bar}}</span>\n" + " {{/foo}}\n" + " <caret>\n" + "</div>" ); } public void testMixedContentInDiv5() { doEnterTest( "<div><caret>\n" + " {{#foo}}\n" + " <span class=\"{{bat}}\">{{bar}}</span>", "<div>\n" + " <caret>\n" + " {{#foo}}\n" + " <span class=\"{{bat}}\">{{bar}}</span>" ); } public void testMixedContentInDiv6() { doEnterTest( "<div>\n" + " {{#foo}}<caret>\n" + " <span class=\"{{bat}}\">{{bar}}</span>", "<div>\n" + " {{#foo}}\n" + " <caret>\n" + " <span class=\"{{bat}}\">{{bar}}</span>" ); } public void testMixedContentInDiv7() { doEnterTest( "<div>\n" + " {{#foo}}\n" + " <span class=\"{{bat}}\">{{bar}}</span><caret>", "<div>\n" + " {{#foo}}\n" + " <span class=\"{{bat}}\">{{bar}}</span>\n" + " <caret>" ); } public void testMixedContentInDiv8() { doEnterTest( "<div>\n" + " {{#foo}}\n" + " <span class=\"{{bat}}\">{{bar}}</span>\n" + " {{/foo}}<caret>", "<div>\n" + " {{#foo}}\n" + " <span class=\"{{bat}}\">{{bar}}</span>\n" + " {{/foo}}\n" + " <caret>" ); } public void testEmptyLinesAfterOpenBlock1() { doEnterTest( "{{#foo}}\n" + " \n" + " \n" + " \n" + " <caret>\n" + " \n", "{{#foo}}\n" + " \n" + " \n" + " \n" + " \n" + " <caret>\n" + " \n" ); } public void testEmptyLinesAfterOpenBlock2() { doEnterTest( "{{#if}}\n" + " \n" + " \n" + "{{else}}\n" + " \n" + " \n" + " <caret>\n" + " \n" + " \n", "{{#if}}\n" + " \n" + " \n" + "{{else}}\n" + " \n" + " \n" + " \n" + " <caret>\n" + " \n" + " \n" ); } public void testSimpleStacheInNestedDiv1() { doEnterTest( "{{#foo}}\n" + " <div><caret>\n" + " {{bar}}\n" + " </div>\n" + "{{/foo}}", "{{#foo}}\n" + " <div>\n" + " <caret>\n" + " {{bar}}\n" + " </div>\n" + "{{/foo}}" ); } public void testSimpleStacheInNestedDiv2() { doEnterTest( "{{#foo}}\n" + " <div>\n" + " {{bar}}<caret>\n" + " </div>\n" + "{{/foo}}", "{{#foo}}\n" + " <div>\n" + " {{bar}}\n" + " <caret>\n" + " </div>\n" + "{{/foo}}" ); } public void testBlockStacheInNestedDiv1() { doEnterTest( "{{#foo}}\n" + " <div><caret>\n" + " {{#bar}}\n" + " stuff\n" + " {{/bar}}\n" + " </div>\n" + "{{/foo}}", "{{#foo}}\n" + " <div>\n" + " <caret>\n" + " {{#bar}}\n" + " stuff\n" + " {{/bar}}\n" + " </div>\n" + "{{/foo}}" ); } public void testBlockStacheInNestedDiv2() { doEnterTest( "{{#foo}}\n" + " <div>\n" + " {{#bar}}<caret>\n" + " stuff\n" + " {{/bar}}\n" + " </div>\n" + "{{/foo}}", "{{#foo}}\n" + " <div>\n" + " {{#bar}}\n" + " <caret>\n" + " stuff\n" + " {{/bar}}\n" + " </div>\n" + "{{/foo}}" ); } public void testBlockStacheInNestedDiv3() { doEnterTest( "{{#foo}}\n" + " <div>\n" + " {{#bar}}\n" + " stuff<caret>\n" + " {{/bar}}\n" + " </div>\n" + "{{/foo}}", "{{#foo}}\n" + " <div>\n" + " {{#bar}}\n" + " stuff\n" + " <caret>\n" + " {{/bar}}\n" + " </div>\n" + "{{/foo}}" ); } public void testBlockStacheInNestedDiv4() { doEnterTest( "{{#foo}}\n" + " <div>\n" + " {{#bar}}\n" + " stuff\n" + " {{/bar}}<caret>\n" + " </div>\n" + "{{/foo}}", "{{#foo}}\n" + " <div>\n" + " {{#bar}}\n" + " stuff\n" + " {{/bar}}\n" + " <caret>\n" + " </div>\n" + "{{/foo}}" ); } }