mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
Refactor slice testing API to non-java-dependent module
This commit is contained in:
@@ -47,5 +47,6 @@
|
||||
<orderEntry type="module" module-name="util-tests" scope="TEST" />
|
||||
<orderEntry type="library" scope="TEST" name="Mocks" level="project" />
|
||||
<orderEntry type="module" module-name="jetgroovy" scope="TEST" />
|
||||
<orderEntry type="module" module-name="lang-tests" scope="TEST" />
|
||||
</component>
|
||||
</module>
|
||||
@@ -43,11 +43,11 @@ public class SliceBackwardTest extends SliceTestCase {
|
||||
|
||||
private void doTest() throws Exception {
|
||||
configureByFile("/codeInsight/slice/backward/"+getTestName(false)+".java");
|
||||
Map<String, RangeMarker> sliceUsageName2Offset = extractSliceOffsetsFromDocument(getEditor().getDocument());
|
||||
Map<String, RangeMarker> 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<HighlightInfo> 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<IntArrayList> flownOffsets) {
|
||||
final List<SliceUsage> children = new ArrayList<SliceUsage>();
|
||||
boolean b = ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
usage.processChildren(new CommonProcessors.CollectProcessor<SliceUsage>(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<SliceUsage>() {
|
||||
@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<String, RangeMarker> sliceUsageName2Offset,
|
||||
final TIntObjectHashMap<IntArrayList> flownOffsets) {
|
||||
fill(sliceUsageName2Offset, "", startElement.getTextOffset(), flownOffsets);
|
||||
}
|
||||
|
||||
static Map<String, RangeMarker> extractSliceOffsetsFromDocument(final Document document) {
|
||||
Map<String, RangeMarker> sliceUsageName2Offset = new THashMap<String, RangeMarker>();
|
||||
|
||||
extract(document, sliceUsageName2Offset, "");
|
||||
int index = document.getText().indexOf("<flown");
|
||||
if(index!=-1) {
|
||||
fail(document.getText().substring(index, Math.min(document.getText().length(), index+50)));
|
||||
}
|
||||
assertTrue(!sliceUsageName2Offset.isEmpty());
|
||||
return sliceUsageName2Offset;
|
||||
}
|
||||
|
||||
private static void fill(Map<String, RangeMarker> sliceUsageName2Offset, String name, int offset,
|
||||
final TIntObjectHashMap<IntArrayList> 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<String, RangeMarker> 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 = "<flown" + newName + ">";
|
||||
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();}
|
||||
|
||||
@@ -35,18 +35,18 @@ public class SliceForwardTest extends DaemonAnalyzerTestCase {
|
||||
|
||||
private void dotest() throws Exception {
|
||||
configureByFile("/codeInsight/slice/forward/"+getTestName(false)+".java");
|
||||
Map<String, RangeMarker> sliceUsageName2Offset = SliceBackwardTest.extractSliceOffsetsFromDocument(getEditor().getDocument());
|
||||
Map<String, RangeMarker> 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<HighlightInfo> 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();}
|
||||
|
||||
Reference in New Issue
Block a user