package org.infernus.idea.checkstyle.importer;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.lang.xml.XMLLanguage;
import com.intellij.openapi.project.Project;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.testFramework.LightPlatformTestCase;
import org.infernus.idea.checkstyle.CheckStyleConfiguration;
import org.infernus.idea.checkstyle.CheckstyleProjectService;
import org.infernus.idea.checkstyle.csapi.CheckstyleInternalObject;
import org.infernus.idea.checkstyle.model.ScanScope;
import org.jetbrains.annotations.NotNull;
import org.mockito.Mockito;
public class CodeStyleImporterTest
extends LightPlatformTestCase
{
private CodeStyleSettings codeStyleSettings;
private CommonCodeStyleSettings javaSettings;
private final Project project = Mockito.mock(Project.class);
private CheckstyleProjectService csService = null;
@Override
protected void setUp() throws Exception {
super.setUp();
CheckStyleConfiguration mockPluginConfig = null;
mockPluginConfig = Mockito.mock(CheckStyleConfiguration.class);
Mockito.when(mockPluginConfig.getCheckstyleVersion(Mockito.anyString())).thenReturn("7.1.1");
Mockito.when(mockPluginConfig.getThirdPartyClassPath()).thenReturn(null);
Mockito.when(mockPluginConfig.getProject()).thenReturn(project);
Mockito.when(mockPluginConfig.getScanScope()).thenReturn(ScanScope.AllSources);
CheckStyleConfiguration.activateMock4UnitTesting(mockPluginConfig);
csService = new CheckstyleProjectService(project);
codeStyleSettings = new CodeStyleSettings(false);
javaSettings = codeStyleSettings.getCommonSettings(JavaLanguage.INSTANCE);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
CheckStyleConfiguration.activateMock4UnitTesting(null);
}
private final static String FILE_PREFIX =
"<?xml version=\"1.0\"?>\n" +
"<!DOCTYPE module PUBLIC\n" +
" \"-//Puppy Crawl//DTD Check Configuration 1.3//EN\"\n" +
" \"http://www.puppycrawl.com/dtds/configuration_1_3.dtd\">\n" +
"<module name = \"Checker\">\n";
private final static String FILE_SUFFIX =
"</module>";
private void importConfiguration(@NotNull String configuration) throws Exception {
configuration = FILE_PREFIX + configuration + FILE_SUFFIX;
new CheckStyleCodeStyleImporter(csService).importConfiguration(
loadConfiguration(configuration), codeStyleSettings);
}
private String inTreeWalker(@NotNull String configuration) {
return "<module name=\"TreeWalker\">" + configuration + "</module>";
}
private CheckstyleInternalObject loadConfiguration(@NotNull final String configuration) {
return csService.getCheckstyleInstance().loadConfiguration(configuration);
}
public void testImportRightMargin() throws Exception {
importConfiguration(
inTreeWalker(
"<module name=\"LineLength\">\n" +
" <property name=\"max\" value=\"100\"/>\n" +
"</module>"
)
);
assertEquals(100, javaSettings.RIGHT_MARGIN);
}
public void testEmptyLineSeparator() throws Exception {
javaSettings.BLANK_LINES_AROUND_FIELD = 0;
javaSettings.BLANK_LINES_AROUND_METHOD = 0;
importConfiguration(
inTreeWalker(
"<module name=\"EmptyLineSeparator\">\n" +
" <property name=\"tokens\" value=\"VARIABLE_DEF, METHOD_DEF\"/>\n" +
"</module>"
)
);
assertEquals(1, javaSettings.BLANK_LINES_AROUND_FIELD);
assertEquals(1, javaSettings.BLANK_LINES_AROUND_METHOD);
}
public void testImportFileTabCharacter() throws Exception {
CommonCodeStyleSettings xmlSettings = codeStyleSettings.getCommonSettings(XMLLanguage.INSTANCE);
CommonCodeStyleSettings.IndentOptions javaIndentOptions = javaSettings.getIndentOptions();
assertNotNull(javaIndentOptions);
CommonCodeStyleSettings.IndentOptions xmlIndentOptions = xmlSettings.getIndentOptions();
assertNotNull(xmlIndentOptions);
javaIndentOptions.USE_TAB_CHARACTER = true;
xmlIndentOptions.USE_TAB_CHARACTER = true;
importConfiguration(
inTreeWalker(
"<module name=\"FileTabCharacter\">\n" +
" <property name=\"eachLine\" value=\"true\" />\n" +
" <property name=\"fileExtensions\" value=\"java,xml\" />\n" +
"</module>"
)
);
assertFalse(javaIndentOptions.USE_TAB_CHARACTER);
assertFalse(xmlIndentOptions.USE_TAB_CHARACTER);
}
public void testImportFileTabCharacterNoExplicitExtensions() throws Exception {
CommonCodeStyleSettings xmlSettings = codeStyleSettings.getCommonSettings(XMLLanguage.INSTANCE);
CommonCodeStyleSettings.IndentOptions javaIndentOptions = javaSettings.getIndentOptions();
assertNotNull(javaIndentOptions);
CommonCodeStyleSettings.IndentOptions xmlIndentOptions = xmlSettings.getIndentOptions();
assertNotNull(xmlIndentOptions);
javaIndentOptions.USE_TAB_CHARACTER = true;
xmlIndentOptions.USE_TAB_CHARACTER = true;
importConfiguration(
inTreeWalker(
"<module name=\"FileTabCharacter\"/>\n"
)
);
assertFalse(javaIndentOptions.USE_TAB_CHARACTER);
assertFalse(xmlIndentOptions.USE_TAB_CHARACTER);
}
public void testImportWhitespaceAfter() throws Exception {
javaSettings.SPACE_AFTER_COMMA = false;
javaSettings.SPACE_AFTER_SEMICOLON = false;
javaSettings.SPACE_AFTER_TYPE_CAST = false;
importConfiguration(
inTreeWalker(
"<module name=\"WhitespaceAfter\">\n" +
" <property name=\"tokens\" value=\"COMMA, SEMI\"/>\n" +
"</module>"
)
);
assertTrue(javaSettings.SPACE_AFTER_COMMA);
assertTrue(javaSettings.SPACE_AFTER_SEMICOLON);
assertFalse(javaSettings.SPACE_AFTER_TYPE_CAST);
}
public void testImportWhitespaceAround() throws Exception {
javaSettings.SPACE_AROUND_ASSIGNMENT_OPERATORS = false;
javaSettings.SPACE_AROUND_EQUALITY_OPERATORS = false;
javaSettings.SPACE_AROUND_BITWISE_OPERATORS = false;
importConfiguration(
inTreeWalker(
"<module name=\"WhitespaceAround\">\n" +
" <property name=\"tokens\" value=\"ASSIGN\"/>\n" +
" <property name=\"tokens\" value=\"EQUAL\"/>\n" +
"</module>"
)
);
assertTrue(javaSettings.SPACE_AROUND_ASSIGNMENT_OPERATORS);
assertTrue(javaSettings.SPACE_AROUND_EQUALITY_OPERATORS);
assertFalse(javaSettings.SPACE_AROUND_BITWISE_OPERATORS);
}
public void testNoWhitespaceBeforeImporter() throws Exception {
javaSettings.SPACE_BEFORE_SEMICOLON = true;
javaSettings.SPACE_BEFORE_COMMA = true;
importConfiguration(
inTreeWalker(
"<module name=\"NoWhitespaceBefore\"/>"
)
);
assertFalse(javaSettings.SPACE_BEFORE_SEMICOLON);
assertFalse(javaSettings.SPACE_BEFORE_COMMA);
}
public void testLeftCurlyImporter() throws Exception {
javaSettings.CLASS_BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE_SHIFTED;
javaSettings.METHOD_BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE_SHIFTED;
javaSettings.BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE_SHIFTED;
importConfiguration(
inTreeWalker(
"<module name=\"LeftCurly\">\n" +
" <property name=\"option\" value=\"nl\"/>\n" +
" <property name=\"tokens\" value=\"CLASS_DEF,INTERFACE_DEF\"/>\n" +
"</module>\n" +
"<module name=\"LeftCurly\">\n" +
" <property name=\"option\" value=\"eol\"/>\n" +
" <property name=\"tokens\" value=\"METHOD_DEF,LITERAL_IF\"/>\n" +
"</module>"
)
);
assertEquals(CommonCodeStyleSettings.NEXT_LINE, javaSettings.CLASS_BRACE_STYLE);
assertEquals(CommonCodeStyleSettings.END_OF_LINE, javaSettings.METHOD_BRACE_STYLE);
assertEquals(CommonCodeStyleSettings.END_OF_LINE, javaSettings.BRACE_STYLE);
}
public void testNeedBracesImporter() throws Exception {
javaSettings.DOWHILE_BRACE_FORCE = CommonCodeStyleSettings.DO_NOT_FORCE;
javaSettings.IF_BRACE_FORCE = CommonCodeStyleSettings.DO_NOT_FORCE;
javaSettings.FOR_BRACE_FORCE = CommonCodeStyleSettings.DO_NOT_FORCE;
importConfiguration(
inTreeWalker(
"<module name=\"NeedBraces\">\n" +
" <property name=\"allowSingleLineStatement\" value=\"true\"/>\n" +
"</module>"
)
);
assertEquals(CommonCodeStyleSettings.FORCE_BRACES_IF_MULTILINE, javaSettings.DOWHILE_BRACE_FORCE);
assertEquals(CommonCodeStyleSettings.FORCE_BRACES_IF_MULTILINE, javaSettings.IF_BRACE_FORCE);
assertEquals(CommonCodeStyleSettings.FORCE_BRACES_IF_MULTILINE, javaSettings.FOR_BRACE_FORCE);
}
public void testIndentationImporter() throws Exception {
javaSettings.INDENT_BREAK_FROM_CASE = false;
CommonCodeStyleSettings.IndentOptions indentOptions = javaSettings.getIndentOptions();
assertNotNull(indentOptions);
indentOptions.INDENT_SIZE = 8;
indentOptions.CONTINUATION_INDENT_SIZE = 8;
importConfiguration(
inTreeWalker(
" <module name=\"Indentation\">\n" +
" <property name=\"basicOffset\" value=\"2\"/>\n" +
" <property name=\"braceAdjustment\" value=\"0\"/>\n" +
" <property name=\"caseIndent\" value=\"2\"/>\n" +
" <property name=\"throwsIndent\" value=\"4\"/>\n" +
" <property name=\"lineWrappingIndentation\" value=\"4\"/>\n" +
" <property name=\"arrayInitIndent\" value=\"2\"/>\n" +
"</module>"
)
);
javaSettings.INDENT_BREAK_FROM_CASE = true;
indentOptions.INDENT_SIZE = 2;
indentOptions.CONTINUATION_INDENT_SIZE = 4;
}
}