@@ -4,19 +4,19 @@ import cc.unitmesh.devti.context.ClassContext
4
4
import cc.unitmesh.devti.provider.WriteTestService
5
5
import cc.unitmesh.devti.provider.context.TestFileContext
6
6
import cc.unitmesh.ide.javascript.context.JavaScriptClassContextBuilder
7
- import cc.unitmesh.ide.javascript.util.LanguageApplicableUtil
8
7
import cc.unitmesh.ide.javascript.util.JSPsiUtil
8
+ import cc.unitmesh.ide.javascript.util.LanguageApplicableUtil
9
9
import com.intellij.execution.configurations.RunProfile
10
10
import com.intellij.lang.javascript.buildTools.npm.rc.NpmRunConfiguration
11
11
import com.intellij.lang.javascript.psi.*
12
12
import com.intellij.lang.javascript.psi.ecmal4.JSClass
13
13
import com.intellij.openapi.application.ReadAction
14
14
import com.intellij.openapi.application.runReadAction
15
15
import com.intellij.openapi.command.WriteCommandAction
16
- import com.intellij.openapi.fileEditor.FileDocumentManager
17
16
import com.intellij.openapi.project.Project
18
17
import com.intellij.openapi.project.guessProjectDir
19
18
import com.intellij.openapi.vfs.LocalFileSystem
19
+ import com.intellij.openapi.vfs.VfsUtil
20
20
import com.intellij.openapi.vfs.VirtualFile
21
21
import com.intellij.openapi.vfs.findDirectory
22
22
import com.intellij.psi.*
@@ -25,7 +25,6 @@ import java.io.File
25
25
import java.io.IOException
26
26
import java.nio.file.Path
27
27
import kotlin.io.path.Path
28
- import kotlin.io.path.nameWithoutExtension
29
28
30
29
class JSWriteTestService : WriteTestService () {
31
30
override fun runConfigurationClass (project : Project ): Class <out RunProfile > = NpmRunConfiguration ::class .java
@@ -42,27 +41,23 @@ class JSWriteTestService : WriteTestService() {
42
41
val elementToTest = Util .getElementToTest(element) ? : return null
43
42
val elementName = JSPsiUtil .elementName(elementToTest) ? : return null
44
43
45
- val testFile = LocalFileSystem .getInstance().findFileByPath(testFilePath)
44
+ var testFile = LocalFileSystem .getInstance().findFileByPath(testFilePath)
46
45
if (testFile != null ) {
47
46
return TestFileContext (false , testFile, emptyList(), null , language, null )
48
47
}
49
48
50
- val testFileName = Path (testFilePath).nameWithoutExtension
51
- val testFileText = " "
52
- val testFilePsi = ReadAction .compute<PsiFile , Throwable > {
53
- PsiFileFactory .getInstance(project).createFileFromText(testFileName, language, testFileText)
54
- }
49
+ // create test file
55
50
56
- // write test file
57
- WriteCommandAction .runWriteCommandAction( project) {
58
- val document = testFilePsi.viewProvider.document !!
59
- document.insertString(document.textLength, testFileText )
60
- FileDocumentManager .getInstance().saveDocument(document )
61
- }
51
+
52
+ WriteCommandAction .writeCommandAction(sourceFile. project).withName( " Generate Unit Tests " )
53
+ .compute< Unit , Throwable > {
54
+ val parentDir = VfsUtil .createDirectoryIfMissing( Path (testFilePath).parent.toString() )
55
+ testFile = parentDir?.createChildData( this , Path (testFilePath).fileName.toString() )
56
+ }
62
57
63
58
val currentClz = JavaScriptClassContextBuilder ().getClassContext(elementToTest, false )
64
59
65
- return TestFileContext (true , testFilePsi.virtualFile , emptyList(), elementName, language, currentClz)
60
+ return TestFileContext (true , testFile !! , emptyList(), elementName, language, currentClz)
66
61
}
67
62
68
63
override fun lookupRelevantClass (project : Project , element : PsiElement ): List <ClassContext > {
@@ -153,26 +148,22 @@ class JSWriteTestService : WriteTestService() {
153
148
/* *
154
149
* Todo: since in JavaScript has different test framework, we need to find the test directory by the framework.
155
150
*/
156
- private fun suggestTestDirectory (element : PsiElement ): PsiDirectory ? {
157
- val project: Project = element.project
158
- val elementDirectory = runReadAction { element.containingFile }
151
+ private fun suggestTestDirectory (element : PsiElement ): PsiDirectory ? =
152
+ ReadAction .compute<PsiDirectory ?, Throwable > {
153
+ val project: Project = element.project
154
+ val elementDirectory = element.containingFile
159
155
160
- val parentDir = elementDirectory?.virtualFile?.parent ? : return null
161
- val psiManager = PsiManager .getInstance(project)
156
+ val parentDir = elementDirectory?.virtualFile?.parent ? : return @compute null
157
+ val psiManager = PsiManager .getInstance(project)
162
158
163
- val testDir = runReadAction { parentDir.findDirectory(" test" ) }
164
- testDir?.let {
165
- return runReadAction { psiManager.findDirectory(it) }
166
- }
167
-
168
- val outputFile = WriteCommandAction .writeCommandAction(project, elementDirectory)
169
- .withName(" Creating Directory For Tests" )
170
- .compute<VirtualFile ?, IOException > {
171
- return @compute parentDir.createChildDirectory(this , " test" )
172
- } ? : return null
159
+ val findDirectory = psiManager.findDirectory(parentDir)
160
+ if (findDirectory != null ) {
161
+ return @compute findDirectory
162
+ }
173
163
174
- return runReadAction { psiManager.findDirectory(outputFile) }
175
- }
164
+ val createChildDirectory = parentDir.createChildDirectory(this , " test" )
165
+ return @compute psiManager.findDirectory(createChildDirectory)
166
+ }
176
167
177
168
private fun generateUniqueTestFile (
178
169
elementName : String? ,
0 commit comments