| /* |
| * 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 |
| }; |
| } |
| } |
| } |