diff --git a/java/java-tests/java-tests.iml b/java/java-tests/java-tests.iml index 8f933bc5bdf8..e45989a2ad8c 100644 --- a/java/java-tests/java-tests.iml +++ b/java/java-tests/java-tests.iml @@ -47,5 +47,6 @@ + \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/slicer/SliceBackwardTest.java b/java/java-tests/testSrc/com/intellij/slicer/SliceBackwardTest.java index c905d3cb2948..8d8638dc02d4 100644 --- a/java/java-tests/testSrc/com/intellij/slicer/SliceBackwardTest.java +++ b/java/java-tests/testSrc/com/intellij/slicer/SliceBackwardTest.java @@ -43,11 +43,11 @@ public class SliceBackwardTest extends SliceTestCase { private void doTest() throws Exception { configureByFile("/codeInsight/slice/backward/"+getTestName(false)+".java"); - Map sliceUsageName2Offset = extractSliceOffsetsFromDocument(getEditor().getDocument()); + Map sliceUsageName2Offset = SliceTestUtil.extractSliceOffsetsFromDocument(getEditor().getDocument()); PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); PsiElement element = new SliceHandler(true).getExpressionAtCaret(getEditor(), getFile()); assertNotNull(element); - calcRealOffsets(element, sliceUsageName2Offset, myFlownOffsets); + SliceTestUtil.calcRealOffsets(element, sliceUsageName2Offset, myFlownOffsets); Collection errors = highlightErrors(); assertEmpty(errors); SliceAnalysisParams params = new SliceAnalysisParams(); @@ -55,101 +55,7 @@ public class SliceBackwardTest extends SliceTestCase { params.dataFlowToThis = true; SliceUsage usage = LanguageSlicing.getProvider(element).createRootUsage(element, params); - checkUsages(usage, myFlownOffsets); - } - - static void checkUsages(final SliceUsage usage, final TIntObjectHashMap flownOffsets) { - final List children = new ArrayList(); - boolean b = ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { - @Override - public void run() { - usage.processChildren(new CommonProcessors.CollectProcessor(children)); - } - }, "Expanding", true, usage.getElement().getProject()); - assertTrue(b); - int startOffset = usage.getElement().getTextOffset(); - IntArrayList list = flownOffsets.get(startOffset); - int[] offsets = list == null ? new int[0] : list.toArray(); - Arrays.sort(offsets); - - int size = offsets.length; - assertEquals(message(startOffset, usage), size, children.size()); - Collections.sort(children, new Comparator() { - @Override - public int compare(SliceUsage o1, SliceUsage o2) { - return o1.compareTo(o2); - } - }); - - for (int i = 0; i < children.size(); i++) { - SliceUsage child = children.get(i); - int offset = offsets[i]; - assertEquals(message(offset, child), offset, child.getUsageInfo().getElement().getTextOffset()); - - checkUsages(child, flownOffsets); - } - } - - private static String message(int startOffset, SliceUsage usage) { - PsiFile file = usage.getElement().getContainingFile(); - Document document = PsiDocumentManager.getInstance(file.getProject()).getDocument(file); - Editor editor = FileEditorManager.getInstance(file.getProject()).getSelectedTextEditor(); - LogicalPosition position = editor.offsetToLogicalPosition(startOffset); - return position + ": '" + StringUtil.first(file.getText().substring(startOffset), 100, true) + "'"; - } - - static void calcRealOffsets(PsiElement startElement, Map sliceUsageName2Offset, - final TIntObjectHashMap flownOffsets) { - fill(sliceUsageName2Offset, "", startElement.getTextOffset(), flownOffsets); - } - - static Map extractSliceOffsetsFromDocument(final Document document) { - Map sliceUsageName2Offset = new THashMap(); - - extract(document, sliceUsageName2Offset, ""); - int index = document.getText().indexOf(" sliceUsageName2Offset, String name, int offset, - final TIntObjectHashMap flownOffsets) { - for (int i=1;i<9;i++) { - String newName = name + i; - RangeMarker marker = sliceUsageName2Offset.get(newName); - if (marker == null) break; - IntArrayList offsets = flownOffsets.get(offset); - if (offsets == null) { - offsets = new IntArrayList(); - flownOffsets.put(offset, offsets); - } - int newStartOffset = marker.getStartOffset(); - offsets.add(newStartOffset); - fill(sliceUsageName2Offset, newName, newStartOffset, flownOffsets); - } - } - - private static void extract(final Document document, final Map sliceUsageName2Offset, final String name) { - WriteCommandAction.runWriteCommandAction(null, new Runnable() { - @Override - public void run() { - for (int i = 1; i < 9; i++) { - String newName = name + i; - String s = ""; - if (!document.getText().contains(s)) break; - int off = document.getText().indexOf(s); - - document.deleteString(off, off + s.length()); - RangeMarker prev = sliceUsageName2Offset.put(newName, document.createRangeMarker(off, off)); - assertNull(prev); - - extract(document, sliceUsageName2Offset, newName); - } - } - }); + SliceTestUtil.checkUsages(usage, myFlownOffsets); } public void testSimple() throws Exception { doTest();} diff --git a/java/java-tests/testSrc/com/intellij/slicer/SliceForwardTest.java b/java/java-tests/testSrc/com/intellij/slicer/SliceForwardTest.java index 2d4458dcbe29..9348a1cb4c8e 100644 --- a/java/java-tests/testSrc/com/intellij/slicer/SliceForwardTest.java +++ b/java/java-tests/testSrc/com/intellij/slicer/SliceForwardTest.java @@ -35,18 +35,18 @@ public class SliceForwardTest extends DaemonAnalyzerTestCase { private void dotest() throws Exception { configureByFile("/codeInsight/slice/forward/"+getTestName(false)+".java"); - Map sliceUsageName2Offset = SliceBackwardTest.extractSliceOffsetsFromDocument(getEditor().getDocument()); + Map sliceUsageName2Offset = SliceTestUtil.extractSliceOffsetsFromDocument(getEditor().getDocument()); PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); PsiElement element = new SliceForwardHandler().getExpressionAtCaret(getEditor(), getFile()); assertNotNull(element); - SliceBackwardTest.calcRealOffsets(element, sliceUsageName2Offset, myFlownOffsets); + SliceTestUtil.calcRealOffsets(element, sliceUsageName2Offset, myFlownOffsets); Collection errors = highlightErrors(); assertEmpty(errors); SliceAnalysisParams params = new SliceAnalysisParams(); params.scope = new AnalysisScope(getProject()); params.dataFlowToThis = false; SliceUsage usage = LanguageSlicing.getProvider(element).createRootUsage(element, params); - SliceBackwardTest.checkUsages(usage, myFlownOffsets); + SliceTestUtil.checkUsages(usage, myFlownOffsets); } public void testSimple() throws Exception { dotest();} diff --git a/platform/lang-impl/testSources/com/intellij/slicer/SliceTestUtil.java b/platform/lang-impl/testSources/com/intellij/slicer/SliceTestUtil.java new file mode 100644 index 000000000000..144acf4a267d --- /dev/null +++ b/platform/lang-impl/testSources/com/intellij/slicer/SliceTestUtil.java @@ -0,0 +1,136 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * 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 com.intellij.slicer; + +import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.LogicalPosition; +import com.intellij.openapi.editor.RangeMarker; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.util.CommonProcessors; +import com.intellij.util.containers.IntArrayList; +import gnu.trove.THashMap; +import gnu.trove.TIntObjectHashMap; + +import java.util.*; + +import static junit.framework.TestCase.*; + +public class SliceTestUtil { + + private SliceTestUtil() { + } + + public static void calcRealOffsets(PsiElement startElement, Map sliceUsageName2Offset, + final TIntObjectHashMap flownOffsets) { + fill(sliceUsageName2Offset, "", startElement.getTextOffset(), flownOffsets); + } + + public static Map extractSliceOffsetsFromDocument(final Document document) { + Map sliceUsageName2Offset = new THashMap(); + + extract(document, sliceUsageName2Offset, ""); + int index = document.getText().indexOf(" sliceUsageName2Offset, String name, int offset, + final TIntObjectHashMap flownOffsets) { + for (int i=1;i<9;i++) { + String newName = name + i; + RangeMarker marker = sliceUsageName2Offset.get(newName); + if (marker == null) break; + IntArrayList offsets = flownOffsets.get(offset); + if (offsets == null) { + offsets = new IntArrayList(); + flownOffsets.put(offset, offsets); + } + int newStartOffset = marker.getStartOffset(); + offsets.add(newStartOffset); + fill(sliceUsageName2Offset, newName, newStartOffset, flownOffsets); + } + } + + private static void extract(final Document document, final Map sliceUsageName2Offset, final String name) { + WriteCommandAction.runWriteCommandAction(null, new Runnable() { + @Override + public void run() { + for (int i = 1; i < 9; i++) { + String newName = name + i; + String s = ""; + if (!document.getText().contains(s)) break; + int off = document.getText().indexOf(s); + + document.deleteString(off, off + s.length()); + RangeMarker prev = sliceUsageName2Offset.put(newName, document.createRangeMarker(off, off)); + assertNull(prev); + + extract(document, sliceUsageName2Offset, newName); + } + } + }); + } + + public static void checkUsages(final SliceUsage usage, final TIntObjectHashMap flownOffsets) { + final List children = new ArrayList(); + boolean b = ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { + @Override + public void run() { + usage.processChildren(new CommonProcessors.CollectProcessor(children)); + } + }, "Expanding", true, usage.getElement().getProject()); + assertTrue(b); + int startOffset = usage.getElement().getTextOffset(); + IntArrayList list = flownOffsets.get(startOffset); + int[] offsets = list == null ? new int[0] : list.toArray(); + Arrays.sort(offsets); + + int size = offsets.length; + assertEquals(message(startOffset, usage), size, children.size()); + Collections.sort(children, new Comparator() { + @Override + public int compare(SliceUsage o1, SliceUsage o2) { + return o1.compareTo(o2); + } + }); + + for (int i = 0; i < children.size(); i++) { + SliceUsage child = children.get(i); + int offset = offsets[i]; + assertEquals(message(offset, child), offset, child.getUsageInfo().getElement().getTextOffset()); + + checkUsages(child, flownOffsets); + } + } + + private static String message(int startOffset, SliceUsage usage) { + PsiFile file = usage.getElement().getContainingFile(); + Document document = PsiDocumentManager.getInstance(file.getProject()).getDocument(file); + Editor editor = FileEditorManager.getInstance(file.getProject()).getSelectedTextEditor(); + LogicalPosition position = editor.offsetToLogicalPosition(startOffset); + return position + ": '" + StringUtil.first(file.getText().substring(startOffset), 100, true) + "'"; + } +}