MultiFile tests now support java + kotlin testing. // FILE directive now accepts path in source root instead of just name
This commit is contained in:
committed by
Valentin Kipyatkov
parent
5f24b68368
commit
67c916a7d1
@@ -25,6 +25,8 @@ import com.intellij.codeInspection.InspectionEP;
|
||||
import com.intellij.codeInspection.InspectionProfileEntry;
|
||||
import com.intellij.codeInspection.LocalInspectionEP;
|
||||
import com.intellij.ide.highlighter.JavaFileType;
|
||||
import com.intellij.openapi.application.Result;
|
||||
import com.intellij.openapi.application.WriteAction;
|
||||
import com.intellij.openapi.command.CommandProcessor;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.fileTypes.FileType;
|
||||
@@ -33,8 +35,12 @@ import com.intellij.openapi.projectRoots.Sdk;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.vfs.CharsetToolkit;
|
||||
import com.intellij.openapi.vfs.LocalFileSystem;
|
||||
import com.intellij.openapi.vfs.VfsUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.testFramework.PsiTestUtil;
|
||||
import com.intellij.testFramework.VfsTestUtil;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
@@ -57,10 +63,7 @@ import org.jetbrains.kotlin.test.KotlinTestUtils;
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
public abstract class AbstractQuickFixMultiFileTest extends KotlinDaemonAnalyzerTestCase {
|
||||
|
||||
@@ -81,6 +84,66 @@ public abstract class AbstractQuickFixMultiFileTest extends KotlinDaemonAnalyzer
|
||||
return mainFileName.replace(".Main.kt", ".").replace(".Main.java", ".");
|
||||
}
|
||||
|
||||
protected static FileType guessFileType(TestFile file) {
|
||||
if (file.path.contains("." + KotlinFileType.EXTENSION)) {
|
||||
return KotlinFileType.INSTANCE;
|
||||
}
|
||||
else if (file.path.contains("." + JavaFileType.DEFAULT_EXTENSION)) {
|
||||
return JavaFileType.INSTANCE;
|
||||
}
|
||||
else {
|
||||
return PlainTextFileType.INSTANCE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param sourceRootDir Base path of test file(Test source directory)
|
||||
* @param testFile source of VFile content
|
||||
* @return created VirtualFile
|
||||
*/
|
||||
protected static VirtualFile createVirtualFileFromTestFile(File sourceRootDir, final TestFile testFile) {
|
||||
try {
|
||||
assertFalse("Please don't use absolute path for multifile test 'FILE' directive: " + testFile.path,
|
||||
FileUtil.isAbsolutePlatformIndependent(testFile.path));
|
||||
FileType fileType = guessFileType(testFile);
|
||||
String extension = fileType.getDefaultExtension();
|
||||
|
||||
|
||||
final File fileInSourceRoot = new File(testFile.path);
|
||||
File container = FileUtil.getParentFile(fileInSourceRoot);
|
||||
if (container == null) {
|
||||
container = sourceRootDir;
|
||||
}
|
||||
else {
|
||||
container = new File(sourceRootDir, container.getPath());
|
||||
}
|
||||
|
||||
if (!container.exists()) {
|
||||
assertTrue(container.mkdirs());
|
||||
}
|
||||
|
||||
final File tempFile =
|
||||
FileUtil.createTempFile(container, FileUtil.getNameWithoutExtension(testFile.path), "." + extension, true);
|
||||
|
||||
|
||||
final VirtualFile vFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(tempFile);
|
||||
assert vFile != null;
|
||||
new WriteAction() {
|
||||
@Override
|
||||
protected void run(@NotNull Result result) throws Throwable {
|
||||
vFile.setCharset(CharsetToolkit.UTF8_CHARSET);
|
||||
VfsUtil.saveText(vFile, testFile.content);
|
||||
}
|
||||
}.execute();
|
||||
|
||||
|
||||
return vFile;
|
||||
}
|
||||
catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
protected void doTestWithoutExtraFile(String beforeFileName) throws Exception {
|
||||
doTest(beforeFileName, false);
|
||||
}
|
||||
@@ -133,18 +196,37 @@ public abstract class AbstractQuickFixMultiFileTest extends KotlinDaemonAnalyzer
|
||||
super.tearDown();
|
||||
}
|
||||
|
||||
protected FileType guessFileType(TestFile file) {
|
||||
if (file.name.contains("." + KotlinFileType.EXTENSION)) {
|
||||
return KotlinFileType.INSTANCE;
|
||||
/**
|
||||
* @param subFiles subFiles of multiFile test
|
||||
* @param beforeFile will be added last, as subFiles are dependencies of it
|
||||
*/
|
||||
protected void configureMultiFileTest(List<TestFile> subFiles, TestFile beforeFile) {
|
||||
try {
|
||||
File sourceRootDir = createTempDirectory();
|
||||
Map<TestFile, VirtualFile> virtualFiles = new HashMap<TestFile, VirtualFile>();
|
||||
|
||||
for (TestFile file : subFiles) {
|
||||
virtualFiles.put(file, createVirtualFileFromTestFile(sourceRootDir, file));
|
||||
}
|
||||
virtualFiles.put(beforeFile, createVirtualFileFromTestFile(sourceRootDir, beforeFile));
|
||||
|
||||
VirtualFile sourceRootVFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(sourceRootDir);
|
||||
PsiTestUtil.addSourceRoot(myModule, sourceRootVFile);
|
||||
|
||||
for (TestFile file : subFiles) {
|
||||
configureByExistingFile(virtualFiles.get(file));
|
||||
assertEquals(guessFileType(file), myFile.getVirtualFile().getFileType());
|
||||
}
|
||||
|
||||
configureByExistingFile(virtualFiles.get(beforeFile));
|
||||
assertEquals(guessFileType(beforeFile), myFile.getVirtualFile().getFileType());
|
||||
}
|
||||
else if (file.name.contains("." + JavaFileType.DEFAULT_EXTENSION)) {
|
||||
return JavaFileType.INSTANCE;
|
||||
}
|
||||
else {
|
||||
return PlainTextFileType.INSTANCE;
|
||||
catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected void doMultiFileTest(final String beforeFileName) throws Exception {
|
||||
String multifileText = FileUtil.loadFile(new File(beforeFileName), true);
|
||||
|
||||
@@ -168,13 +250,13 @@ public abstract class AbstractQuickFixMultiFileTest extends KotlinDaemonAnalyzer
|
||||
final TestFile afterFile = CollectionsKt.firstOrNull(subFiles, new Function1<TestFile, Boolean>() {
|
||||
@Override
|
||||
public Boolean invoke(TestFile file) {
|
||||
return file.name.contains(".after");
|
||||
return file.path.contains(".after");
|
||||
}
|
||||
});
|
||||
final TestFile beforeFile = CollectionsKt.firstOrNull(subFiles, new Function1<TestFile, Boolean>() {
|
||||
@Override
|
||||
public Boolean invoke(TestFile file) {
|
||||
return file.name.contains(".before");
|
||||
return file.path.contains(".before");
|
||||
}
|
||||
});
|
||||
|
||||
@@ -184,11 +266,7 @@ public abstract class AbstractQuickFixMultiFileTest extends KotlinDaemonAnalyzer
|
||||
subFiles.remove(afterFile);
|
||||
subFiles.remove(beforeFile);
|
||||
|
||||
for (TestFile file : subFiles) {
|
||||
configureByText(guessFileType(file), file.content);
|
||||
}
|
||||
|
||||
configureByText(guessFileType(beforeFile), beforeFile.content);
|
||||
configureMultiFileTest(subFiles, beforeFile);
|
||||
|
||||
CommandProcessor.getInstance().executeCommand(getProject(), new Runnable() {
|
||||
@Override
|
||||
@@ -212,11 +290,11 @@ public abstract class AbstractQuickFixMultiFileTest extends KotlinDaemonAnalyzer
|
||||
|
||||
if (pair.second && !afterText.equals(afterFile.content)) {
|
||||
StringBuilder actualTestFile = new StringBuilder();
|
||||
actualTestFile.append("// FILE: ").append(beforeFile.name).append("\n").append(beforeFile.content);
|
||||
actualTestFile.append("// FILE: ").append(beforeFile.path).append("\n").append(beforeFile.content);
|
||||
for (TestFile file : subFiles) {
|
||||
actualTestFile.append("// FILE: ").append(file.name).append("\n").append(file.content);
|
||||
actualTestFile.append("// FILE: ").append(file.path).append("\n").append(file.content);
|
||||
}
|
||||
actualTestFile.append("// FILE: ").append(afterFile.name).append("\n").append(afterText);
|
||||
actualTestFile.append("// FILE: ").append(afterFile.path).append("\n").append(afterText);
|
||||
|
||||
KotlinTestUtils.assertEqualsToFile(new File(beforeFileName), actualTestFile.toString());
|
||||
}
|
||||
@@ -406,11 +484,11 @@ public abstract class AbstractQuickFixMultiFileTest extends KotlinDaemonAnalyzer
|
||||
}
|
||||
|
||||
private static class TestFile {
|
||||
public final String name;
|
||||
public final String path;
|
||||
public final String content;
|
||||
|
||||
TestFile(String name, String content) {
|
||||
this.name = name;
|
||||
TestFile(String path, String content) {
|
||||
this.path = path;
|
||||
this.content = content;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user