blob: 8d7588783c74200f6e52209c9f3c04bbee217a40 [file] [log] [blame]
package com.intellij.codeInsight.psi;
import com.intellij.openapi.application.ex.PathManagerEx;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiCodeBlock;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiJavaFile;
import com.intellij.psi.controlFlow.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.testFramework.LightCodeInsightTestCase;
import com.intellij.util.containers.IntArrayList;
import org.jetbrains.annotations.NonNls;
import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author cdr
* Date: Nov 25, 2002
*/
public class ControlFlowTest extends LightCodeInsightTestCase {
@NonNls private static final String BASE_PATH = "/psi/controlFlow";
private static void doTestFor(final File file) throws Exception {
String contents = StringUtil.convertLineSeparators(FileUtil.loadFile(file));
configureFromFileText(file.getName(), contents);
// extract factory policy class name
Pattern pattern = Pattern.compile("^// (\\S*).*", Pattern.DOTALL);
Matcher matcher = pattern.matcher(contents);
assertTrue(matcher.matches());
final String policyClassName = matcher.group(1);
final ControlFlowPolicy policy;
if ("LocalsOrMyInstanceFieldsControlFlowPolicy".equals(policyClassName)) {
policy = LocalsOrMyInstanceFieldsControlFlowPolicy.getInstance();
}
else {
policy = null;
}
final int offset = getEditor().getCaretModel().getOffset();
PsiElement element = getFile().findElementAt(offset);
element = PsiTreeUtil.getParentOfType(element, PsiCodeBlock.class, false);
assertTrue("Selected element: "+element, element instanceof PsiCodeBlock);
ControlFlow controlFlow = ControlFlowFactory.getInstance(getProject()).getControlFlow(element, policy);
String result = controlFlow.toString().trim();
final String expectedFullPath = StringUtil.trimEnd(file.getPath(),".java") + ".txt";
VirtualFile expectedFile = LocalFileSystem.getInstance().findFileByPath(expectedFullPath);
String expected = new String(expectedFile.contentsToByteArray()).trim();
expected = expected.replaceAll("\r","");
assertEquals("Text mismatch (in file "+expectedFullPath+"):\n",expected, result);
}
private static void doAllTests() throws Exception {
final String testDirPath = PathManagerEx.getTestDataPath().replace(File.separatorChar, '/') + BASE_PATH;
File testDir = new File(testDirPath);
final File[] files = testDir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
});
for (int i = 0; i < files.length; i++) {
File file = files[i];
doTestFor(file);
System.out.print((i+1)+" ");
}
}
public void test() throws Exception { doAllTests(); }
public void testMethodWithOnlyDoWhileStatementHasExitPoints() throws Exception {
configureFromFileText("a.java", "public class Foo {\n" +
" public void foo() {\n" +
" boolean f;\n" +
" do {\n" +
" f = something();\n" +
" } while (f);\n" +
" }\n" +
"}");
final PsiCodeBlock body = ((PsiJavaFile)getFile()).getClasses()[0].getMethods()[0].getBody();
ControlFlow flow = ControlFlowFactory.getInstance(getProject()).getControlFlow(body, new LocalsControlFlowPolicy(body), false);
IntArrayList exitPoints = new IntArrayList();
ControlFlowUtil.findExitPointsAndStatements(flow, 0, flow.getSize() -1 , exitPoints, ControlFlowUtil.DEFAULT_EXIT_STATEMENTS_CLASSES);
assertEquals(1, exitPoints.size());
}
}