blob: bc8f0511be55e7b2cecde28e68cf2f42480cbe53 [file] [log] [blame]
/*
* Copyright 2007 Sascha Weinreuter
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.intellij.plugins.relaxNG;
import com.intellij.codeHighlighting.Pass;
import com.intellij.codeInsight.daemon.impl.HighlightInfo;
import com.intellij.codeInspection.*;
import com.intellij.codeInspection.htmlInspections.RequiredAttributesInspection;
import com.intellij.javaee.ExternalResourceManagerEx;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
import com.intellij.testFramework.ExpectedHighlightingData;
import com.intellij.testFramework.PlatformTestCase;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.testFramework.UsefulTestCase;
import com.intellij.testFramework.builders.EmptyModuleFixtureBuilder;
import com.intellij.testFramework.fixtures.CodeInsightTestFixture;
import com.intellij.testFramework.fixtures.IdeaProjectTestFixture;
import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory;
import com.intellij.testFramework.fixtures.TestFixtureBuilder;
import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl;
import com.intellij.util.ArrayUtil;
import org.intellij.plugins.relaxNG.inspections.RngDomInspection;
import org.intellij.plugins.testUtil.IdeaCodeInsightTestCase;
import org.intellij.plugins.testUtil.ResourceUtil;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
/**
* Created by IntelliJ IDEA.
* User: sweinreuter
* Date: 25.07.2007
*/
public abstract class HighlightingTestBase extends UsefulTestCase implements IdeaCodeInsightTestCase {
protected CodeInsightTestFixture myTestFixture;
@SuppressWarnings("JUnitTestCaseWithNonTrivialConstructors")
protected HighlightingTestBase() {
PlatformTestCase.initPlatformLangPrefix();
}
@Override
protected void setUp() throws Exception {
super.setUp();
final IdeaTestFixtureFactory factory = IdeaTestFixtureFactory.getFixtureFactory();
myTestFixture = createFixture(factory);
myTestFixture.setTestDataPath(getTestDataBasePath() + getTestDataPath());
Class<? extends LocalInspectionTool>[] inspectionClasses = new DefaultInspectionProvider().getInspectionClasses();
if (getName().contains("Inspection")) {
inspectionClasses = ArrayUtil.mergeArrays(inspectionClasses, ApplicationLoader.getInspectionClasses());
}
myTestFixture.setUp();
myTestFixture.enableInspections(inspectionClasses);
new WriteAction() {
@Override
protected void run(@NotNull Result result) throws Throwable {
ResourceUtil.copyFiles(HighlightingTestBase.this);
init();
}
}.execute().throwException();
}
protected static String toAbsolutePath(String relativeTestDataPath) {
return FileUtil.toSystemDependentName(getTestDataBasePath() + relativeTestDataPath);
}
public static String getTestDataBasePath() {
return PlatformTestUtil.getCommunityPath() + "/xml/relaxng/testData/";
}
protected CodeInsightTestFixture createFixture(@NotNull IdeaTestFixtureFactory factory) {
final TestFixtureBuilder<IdeaProjectTestFixture> builder = factory.createLightFixtureBuilder();
final IdeaProjectTestFixture fixture = builder.getFixture();
return factory.createCodeInsightFixture(fixture);
}
protected CodeInsightTestFixture createContentFixture(IdeaTestFixtureFactory factory) {
final TestFixtureBuilder<IdeaProjectTestFixture> builder = factory.createFixtureBuilder(getName());
final EmptyModuleFixtureBuilder moduleBuilder = builder.addModule(EmptyModuleFixtureBuilder.class);
final IdeaProjectTestFixture fixture = builder.getFixture();
final CodeInsightTestFixture testFixture = factory.createCodeInsightFixture(fixture);
final String root = testFixture.getTempDirPath();
moduleBuilder.addContentRoot(root);
moduleBuilder.addSourceRoot("/");
return testFixture;
}
@Override
public CodeInsightTestFixture getFixture() {
return myTestFixture;
}
@Override
public abstract String getTestDataPath();
protected void init() {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
ExternalResourceManagerEx.getInstanceEx().addIgnoredResource("urn:test:undefined");
}
});
}
@Override
protected void tearDown() throws Exception {
myTestFixture.tearDown();
myTestFixture = null;
super.tearDown();
}
protected void doHighlightingTest(String s) throws Throwable {
doCustomHighlighting(s, true, false);
// myTestFixture.testHighlighting(true, false, true, s);
}
protected void doExternalToolHighlighting(String name) throws Throwable {
doCustomHighlighting(name, true, true);
}
protected void doCustomHighlighting(String name, final boolean checkWeakWarnings, final Boolean includeExternalToolPass) {
myTestFixture.configureByFile(name);
doCustomHighlighting(checkWeakWarnings, includeExternalToolPass);
}
protected void doCustomHighlighting(boolean checkWeakWarnings, Boolean includeExternalToolPass) {
final PsiFile file = myTestFixture.getFile();
final Document doc = myTestFixture.getEditor().getDocument();
ExpectedHighlightingData data = new ExpectedHighlightingData(doc, true, checkWeakWarnings, false, file);
data.init();
PsiDocumentManager.getInstance(myTestFixture.getProject()).commitAllDocuments();
Collection<HighlightInfo> highlights1 = doHighlighting(includeExternalToolPass);
data.checkResult(highlights1, doc.getText());
}
@NotNull
protected Collection<HighlightInfo> doHighlighting(final Boolean externalToolPass) {
final Project project = myTestFixture.getProject();
PsiDocumentManager.getInstance(project).commitAllDocuments();
final Editor editor = myTestFixture.getEditor();
int[] ignore = externalToolPass == null || externalToolPass ? new int[]{
Pass.LINE_MARKERS,
Pass.LOCAL_INSPECTIONS,
Pass.POPUP_HINTS,
Pass.POST_UPDATE_ALL,
Pass.UPDATE_ALL,
Pass.UPDATE_FOLDING,
Pass.UPDATE_OVERRIDEN_MARKERS,
Pass.VISIBLE_LINE_MARKERS,
} : new int[]{Pass.EXTERNAL_TOOLS};
return CodeInsightTestFixtureImpl.instantiateAndRun(myTestFixture.getFile(), editor, ignore, false);
}
protected void doTestCompletion(String name, String ext) {
myTestFixture.testCompletion(name + "." + ext, name + "_after." + ext);
}
protected void doTestCompletion(String before, String... variants) {
myTestFixture.testCompletionVariants(before, variants);
}
protected void doTestCompletion(String before) throws Throwable {
doTestCompletion(before, "xml");
}
protected void doTestRename(String name, String ext, String newName) {
myTestFixture.testRename(name + "." + ext, name + "_after." + ext, newName);
}
@SuppressWarnings({ "deprecation", "unchecked" })
protected void doTestQuickFix(String file, String ext) {
final PsiReference psiReference = myTestFixture.getReferenceAtCaretPositionWithAssertion(file + "." + ext);
assertNull("Reference", psiReference.resolve());
assertTrue(psiReference.getClass().getName() + " is not a QuickFixProvider", psiReference instanceof LocalQuickFixProvider);
final LocalQuickFix[] fixes = ((LocalQuickFixProvider)psiReference).getQuickFixes();
assertTrue("One action expected", fixes != null && fixes.length == 1);
final Project project = myTestFixture.getProject();
final ProblemDescriptor problemDescriptor = InspectionManager.getInstance(project).createProblemDescriptor(psiReference.getElement(),
"foo",
fixes,
ProblemHighlightType.GENERIC_ERROR_OR_WARNING,
true);
new WriteCommandAction.Simple(project, myTestFixture.getFile()) {
@Override
protected void run() throws Throwable {
fixes[0].applyFix(project, problemDescriptor);
}
}.execute();
myTestFixture.checkResultByFile(file + "_after." + ext);
}
private static class DefaultInspectionProvider implements InspectionToolProvider {
@Override
public Class[] getInspectionClasses() {
return new Class[]{
RngDomInspection.class,
RequiredAttributesInspection.class
};
}
}
}