@@ -9,14 +9,21 @@ import com.intellij.execution.actions.RunConfigurationProducer
9
9
import com.intellij.execution.configurations.RunConfiguration
10
10
import com.intellij.execution.configurations.RunProfile
11
11
import com.intellij.lang.injection.InjectedLanguageManager
12
+ import com.intellij.openapi.application.WriteAction
12
13
import com.intellij.openapi.editor.Editor
13
14
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
14
18
import com.intellij.openapi.vfs.VirtualFile
15
19
import com.intellij.psi.PsiElement
16
20
import com.intellij.psi.PsiFile
17
21
import com.intellij.psi.PsiManager
18
22
import com.intellij.psi.util.PsiTreeUtil
19
23
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
20
27
import com.jetbrains.python.psi.PyClass
21
28
import com.jetbrains.python.psi.PyFile
22
29
import com.jetbrains.python.psi.PyFunction
@@ -66,7 +73,43 @@ class PythonAutoTestService : AutoTestService() {
66
73
}
67
74
68
75
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"
70
113
}
71
114
72
115
override fun lookupRelevantClass (project : Project , element : PsiElement ): List <ClassContext > {
0 commit comments