Refactor slice testing API to non-java-dependent module

This commit is contained in:
Shaverdova Elena
2015-09-16 22:32:44 +03:00
parent 8be2fee2ee
commit 7a0d6dc2b1
4 changed files with 143 additions and 100 deletions
+1
View File
@@ -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();}