package com.dmarcotte.handlebars.format;
import com.dmarcotte.handlebars.config.HbConfig;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
public class HbFormatterIndentTest extends HbFormatterTest {
/**
* This sanity check should be enough to ensure that we don't format
* when the formatter is disabled
*/
public void testFormatterDisabled() {
boolean previousFormatterSetting = HbConfig.isFormattingEnabled();
HbConfig.setFormattingEnabled(false);
doStringBasedTest(
"{{#foo}}\n" +
"{{bar}}\n" +
"{{/foo}}\n",
"{{#foo}}\n" +
"{{bar}}\n" +
"{{/foo}}\n"
);
HbConfig.setFormattingEnabled(previousFormatterSetting);
}
/**
* Sanity check that we respect non-default (i.e. 4) indent sizes
*/
public void testNonDefaultIndentSize() {
int previousHtmlIndent = CodeStyleSettingsManager.getSettings(getProject()).getIndentOptions(StdFileTypes.HTML).INDENT_SIZE;
CodeStyleSettingsManager.getSettings(getProject()).getIndentOptions(StdFileTypes.HTML).INDENT_SIZE = 2;
doStringBasedTest(
"{{#foo}}\n" +
" <div>\n" +
"{{bar}}\n" +
" </div>\n" +
"{{/foo}}",
"{{#foo}}\n" +
" <div>\n" +
" {{bar}}\n" +
" </div>\n" +
"{{/foo}}"
);
CodeStyleSettingsManager.getSettings(getProject()).getIndentOptions(StdFileTypes.HTML).INDENT_SIZE = previousHtmlIndent;
}
public void testSimpleStache() {
doStringBasedTest(
"{{foo}}",
"{{foo}}"
);
}
public void testSimpleBlock() {
doStringBasedTest(
"{{#foo}}\n" +
"{{bar}}\n" +
"{{/foo}}\n",
"{{#foo}}\n" +
" {{bar}}\n" +
"{{/foo}}\n"
);
}
public void testNestedBlocks() {
doStringBasedTest(
"{{#foo}}\n" +
"{{#bar}}\n" +
"{{#bat}}\n" +
"{{baz}}\n" +
"{{/bat}}\n" +
"{{/bar}}\n" +
"{{/foo}}",
"{{#foo}}\n" +
" {{#bar}}\n" +
" {{#bat}}\n" +
" {{baz}}\n" +
" {{/bat}}\n" +
" {{/bar}}\n" +
"{{/foo}}"
);
}
public void testSimpleStacheInDiv() {
doStringBasedTest(
"<div>\n" +
"{{foo}}\n" +
"</div>",
"<div>\n" +
" {{foo}}\n" +
"</div>"
);
}
public void testMarkupInBlockStache() {
doStringBasedTest(
"{{#foo}}\n" +
"<span></span>\n" +
"{{/foo}}",
"{{#foo}}\n" +
" <span></span>\n" +
"{{/foo}}"
);
}
public void testSimpleBlockInDiv() {
doStringBasedTest(
"<div>\n" +
"{{#foo}}\n" +
"{{bar}}\n" +
"{{/foo}}\n" +
"</div>",
"<div>\n" +
" {{#foo}}\n" +
" {{bar}}\n" +
" {{/foo}}\n" +
"</div>"
);
}
public void testAttributeStaches() {
doStringBasedTest(
"<div {{foo}}>\n" +
"<div class=\"{{bar}}\">\n" +
"sweeet\n" +
"</div>\n" +
"</div>",
"<div {{foo}}>\n" +
" <div class=\"{{bar}}\">\n" +
" sweeet\n" +
" </div>\n" +
"</div>"
);
}
public void testMixedContentInDiv1() {
doStringBasedTest(
"<div>\n" +
"{{#foo}}\n" +
"<span class=\"{{bat}}\">{{bar}}</span>\n" +
"{{/foo}}\n" +
"</div>",
"<div>\n" +
" {{#foo}}\n" +
" <span class=\"{{bat}}\">{{bar}}</span>\n" +
" {{/foo}}\n" +
"</div>"
);
}
public void testMixedContentInDiv2() {
doStringBasedTest(
"<div>\n" +
"{{#foo}}\n" +
"bar {{baz}}\n" +
"{{/foo}}\n" +
"</div>",
"<div>\n" +
" {{#foo}}\n" +
" bar {{baz}}\n" +
" {{/foo}}\n" +
"</div>"
);
}
public void testSimpleStacheInNestedDiv() {
doStringBasedTest(
"{{#foo}}\n" +
" <div>\n" +
"{{bar}}\n" +
" </div>\n" +
"{{/foo}}",
"{{#foo}}\n" +
" <div>\n" +
" {{bar}}\n" +
" </div>\n" +
"{{/foo}}"
);
}
public void testBlockStacheInNestedDiv() {
doStringBasedTest(
"{{#foo}}\n" +
"<div>\n" +
"{{#bar}}\n" +
"stuff\n" +
"{{/bar}}\n" +
"</div>\n" +
"{{/foo}}",
"{{#foo}}\n" +
" <div>\n" +
" {{#bar}}\n" +
" stuff\n" +
" {{/bar}}\n" +
" </div>\n" +
"{{/foo}}"
);
}
public void testNestedDivsInBlock() {
doStringBasedTest(
"{{#foo}}\n" +
"<div>\n" +
"<div>\n" +
"<div>\n" +
"{{bar}}\n" +
"{{#foo}}\n" +
"{{/foo}}\n" +
"</div>\n" +
"</div>\n" +
"</div>\n" +
"{{/foo}}",
"{{#foo}}\n" +
" <div>\n" +
" <div>\n" +
" <div>\n" +
" {{bar}}\n" +
" {{#foo}}\n" +
" {{/foo}}\n" +
" </div>\n" +
" </div>\n" +
" </div>\n" +
"{{/foo}}"
);
}
public void testFormattingInsideDoNotIndentElems1() {
CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject());
settings.HTML_DO_NOT_INDENT_CHILDREN_OF = "body";
doStringBasedTest(
"<body>\n" +
"{{#foo}}\n" +
"<div></div>\n" +
"{{/foo}}\n" +
"</body>",
"<body>\n" +
"{{#foo}}\n" +
" <div></div>\n" +
"{{/foo}}\n" +
"</body>"
);
}
public void testFormattingInsideDoNotIndentElems2() {
CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject());
settings.HTML_DO_NOT_INDENT_CHILDREN_OF = "body";
doStringBasedTest(
"<body>\n" +
"{{foo}}\n" +
"<div></div>\n" +
"</body>",
"<body>\n" +
"{{foo}}\n" +
"<div></div>\n" +
"</body>"
);
}
public void testFormattingInsideNestedDoNotIndentElems() {
CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject());
settings.HTML_DO_NOT_INDENT_CHILDREN_OF = "span";
doStringBasedTest(
"<span>\n" +
"{{#foo}}\n" +
"<span>\n" +
"{{^bar}}\n" +
"<span></span>\n" +
"{{/bar}}\n" +
"</span>\n" +
"{{/foo}}\n" +
"</span>",
"<span>\n" +
"{{#foo}}\n" +
" <span>\n" +
" {{^bar}}\n" +
" <span></span>\n" +
" {{/bar}}\n" +
" </span>\n" +
"{{/foo}}\n" +
"</span>"
);
}
}