Skip to content

Commit ad1c4e8

Browse files
committed
refactor: ensure correct handling of cmakeLists.txt and test file creation.
1 parent 35b4847 commit ad1c4e8

File tree

2 files changed

+48
-9
lines changed

2 files changed

+48
-9
lines changed

cpp/src/233/main/kotlin/cc/unitmesh/cpp/provider/testing/CppAutoTestService.kt

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ class CppAutoTestService : AutoTestService() {
2727
return null
2828
}
2929

30-
val cmakelist = cmakeLists.readText()
31-
if (!cmakelist.contains("catch")) {
30+
val cmakelistsContent = cmakeLists.readText()
31+
if (!cmakelistsContent.contains("catch")) {
3232
return null
3333
}
3434

@@ -38,12 +38,9 @@ class CppAutoTestService : AutoTestService() {
3838
}
3939

4040
override fun findOrCreateTestFile(sourceFile: PsiFile, project: Project, element: PsiElement): TestFileContext? {
41-
// 1. check project root test folder, if not exist, create it
4241
val baseDir = project.guessProjectDir() ?: return null
4342

44-
val sourceVirtualFile = sourceFile.virtualFile
45-
46-
val testFilePath = getTestFilePath(sourceVirtualFile)
43+
val testFilePath = getTestFilePath(sourceFile.virtualFile)
4744
val testFile = WriteAction.computeAndWait<VirtualFile?, Throwable> {
4845
baseDir.findOrCreateChildData(this, testFilePath)
4946
} ?: return null
@@ -59,8 +56,7 @@ class CppAutoTestService : AutoTestService() {
5956
val relatedClasses = lookupRelevantClass(project, element)
6057

6158
return TestFileContext(
62-
true,
63-
testFile,
59+
true, testFile,
6460
relatedClasses,
6561
"",
6662
sourceFile.language,

pycharm/src/main/kotlin/cc/unitmesh/python/provider/PythonAutoTestService.kt

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,21 @@ import com.intellij.execution.actions.RunConfigurationProducer
99
import com.intellij.execution.configurations.RunConfiguration
1010
import com.intellij.execution.configurations.RunProfile
1111
import com.intellij.lang.injection.InjectedLanguageManager
12+
import com.intellij.openapi.application.WriteAction
1213
import com.intellij.openapi.editor.Editor
1314
import com.intellij.openapi.project.Project
15+
import com.intellij.openapi.project.guessProjectDir
16+
import com.intellij.openapi.roots.ProjectFileIndex
17+
import com.intellij.openapi.vfs.VfsUtil
1418
import com.intellij.openapi.vfs.VirtualFile
1519
import com.intellij.psi.PsiElement
1620
import com.intellij.psi.PsiFile
1721
import com.intellij.psi.PsiManager
1822
import com.intellij.psi.util.PsiTreeUtil
1923
import com.intellij.psi.util.PsiUtilBase
24+
import com.intellij.util.concurrency.annotations.RequiresReadLock
25+
import com.intellij.util.concurrency.annotations.RequiresWriteLock
26+
import com.jetbrains.python.PythonLanguage
2027
import com.jetbrains.python.psi.PyClass
2128
import com.jetbrains.python.psi.PyFile
2229
import com.jetbrains.python.psi.PyFunction
@@ -66,7 +73,43 @@ class PythonAutoTestService : AutoTestService() {
6673
}
6774

6875
override fun findOrCreateTestFile(sourceFile: PsiFile, project: Project, element: PsiElement): TestFileContext? {
69-
TODO("Not yet implemented")
76+
val testFileName = getTestNameExample(sourceFile.virtualFile)
77+
val testDir = getTestsDirectory(sourceFile.virtualFile, project)
78+
val testFile = WriteAction.computeAndWait<VirtualFile?, Throwable> {
79+
testDir.findOrCreateChildData(this, toTestFileName(testFileName, sourceFile.name))
80+
} ?: return null
81+
82+
return TestFileContext(true, testFile, listOf(), "", PythonLanguage.INSTANCE)
83+
}
84+
85+
@RequiresReadLock
86+
private fun getTestNameExample(file: VirtualFile): String {
87+
val children = file.children
88+
for (child in children) {
89+
val fileName = (child ?: continue).name
90+
if (fileName.endsWith(".py") && !fileName.startsWith("_")) {
91+
return fileName
92+
}
93+
}
94+
95+
return "test_example.py"
96+
}
97+
98+
@RequiresWriteLock
99+
fun getTestsDirectory(file: VirtualFile, project: Project): VirtualFile {
100+
val baseDirectory: VirtualFile? = ProjectFileIndex.getInstance(project).getContentRootForFile(file)
101+
if (baseDirectory == null) {
102+
val parent = file.parent
103+
return parent
104+
}
105+
106+
val testDir = VfsUtil.createDirectoryIfMissing("tests") ?: baseDirectory
107+
return testDir
108+
}
109+
110+
private fun toTestFileName(testFileName: String, testNameExample: String): String {
111+
if (testNameExample.startsWith("test_")) return "test_$testFileName.py"
112+
return "${testFileName}_test.py"
70113
}
71114

72115
override fun lookupRelevantClass(project: Project, element: PsiElement): List<ClassContext> {

0 commit comments

Comments
 (0)