[workspace model codegen tests] ensure that EntityCodeGenTest doesn't change shared state

Project model for light project must not be changed in the test code because it's shared between tests, a new LightProjectDescriptor should be configured instead. Changes in global settings must be restored when test finishes to avoid problems in other tests. In order to execute test on TeamCity, its module must be added to dependencies of one of *.main modules.

GitOrigin-RevId: c9d5f03d2a26402359785f0d3059e9184753bf9c
This commit is contained in:
Nikolay Chashnikov
2022-07-20 15:04:22 +00:00
committed by intellij-monorepo-bot
parent 42a9e7538a
commit eb9313d7dc
2 changed files with 29 additions and 34 deletions
+1
View File
@@ -189,6 +189,7 @@
<orderEntry type="module" module-name="intellij.evaluationPlugin.languages.java" scope="RUNTIME" />
<orderEntry type="module" module-name="intellij.vcs.gitlab" scope="RUNTIME" />
<orderEntry type="module" module-name="intellij.platform.warmup" scope="RUNTIME" />
<orderEntry type="module" module-name="intellij.platform.workspaceModel.codegen.test" scope="TEST" />
<orderEntry type="module" module-name="intellij.platform.testFramework.junit5" scope="TEST" />
<orderEntry type="module" module-name="intellij.remoteControl" scope="RUNTIME" />
</component>
@@ -1,47 +1,45 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.workspaceModel.codegen
import com.intellij.openapi.application.WriteAction
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ex.PathManagerEx
import com.intellij.openapi.application.runWriteActionAndWait
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.module.Module
import com.intellij.openapi.roots.ModifiableRootModel
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.psi.PsiDocumentManager
import com.intellij.testFramework.LightProjectDescriptor
import com.intellij.testFramework.PlatformTestUtil
import com.intellij.util.io.assertMatches
import com.intellij.util.io.directoryContentOf
import org.jetbrains.jps.model.java.JavaSourceRootType
import org.jetbrains.jps.model.java.JpsJavaExtensionService
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.idea.test.KotlinLightProjectDescriptor
import java.io.File
import java.nio.file.Path
class EntityCodeGenTest: KotlinLightCodeInsightFixtureTestCase() {
private var genFolder: VirtualFile? = null
override val testDataDirectory: File
get() = File(PathManagerEx.getCommunityHomePath() + "/platform/workspaceModel/codegen/test/testData/$testDirectoryName")
override fun setUp() {
super.setUp()
// Set strip trailing spaces
val settings = EditorSettingsExternalizable.getInstance()
val oldValue = settings.stripTrailingSpaces
settings.stripTrailingSpaces = EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE
runWriteActionAndWait {
genFolder = createGeneratedSourceFolder()
}
val entityFolderVfu = VirtualFileManager.getInstance().findFileByNioPath(testDataDirectory.toPath().resolve("before"))!!
runWriteActionAndWait {
VfsUtil.copyDirectory(this, entityFolderVfu, getSourceRootVfu(), null)
}
disposeOnTearDown(Disposable {
settings.stripTrailingSpaces = oldValue
})
myFixture.copyDirectoryToProject("before", "")
}
override fun getProjectDescriptor(): LightProjectDescriptor = entitiesProjectDescriptor
fun testSimpleCase() {
doTest()
}
@@ -68,7 +66,7 @@ class EntityCodeGenTest: KotlinLightCodeInsightFixtureTestCase() {
private fun doTest() {
runWriteActionAndWait {
CodeWriter.generate(project, getSourceRootVfu(), false) { genFolder }
CodeWriter.generate(project, myFixture.findFileInTempDir("."), false) { myFixture.tempDirFixture.findOrCreateDir("gen") }
PsiDocumentManager.getInstance(project).commitAllDocuments()
VirtualFileManager.getInstance().syncRefresh()
}
@@ -82,31 +80,27 @@ class EntityCodeGenTest: KotlinLightCodeInsightFixtureTestCase() {
val expectedDir = FileUtil.createTempDirectory(EntityCodeGenTest::class.java.simpleName, "${testDirectoryName}_api", true)
val expectedDirVfu = VirtualFileManager.getInstance().findFileByNioPath(expectedDir.toPath())!!
runWriteActionAndWait {
VfsUtil.copyDirectory(this, getSourceRootVfu(), expectedDirVfu, null)
VfsUtil.copyDirectory(this, myFixture.findFileInTempDir("."), expectedDirVfu, null)
}
expectedDir.assertMatches(directoryContentOf(getExpectedDir()))
}
private fun createGeneratedSourceFolder(): VirtualFile {
val generatedFolder = WriteAction.compute<VirtualFile, RuntimeException> {
VfsUtil.createDirectoryIfMissing(getSourceRootVfu(), "gen")
}
val modifiableModel = ModuleRootManager.getInstance(module).modifiableModel
val contentEntry = modifiableModel.contentEntries.first()
contentEntry.addSourceFolder(generatedFolder, JavaSourceRootType.SOURCE,
JpsJavaExtensionService.getInstance().createSourceRootProperties("", true))
modifiableModel.commit()
module.project.save()
return generatedFolder
}
private fun getSourceRootVfu(): VirtualFile {
val moduleRootManager = ModuleRootManager.getInstance(module)
return moduleRootManager.contentEntries.first().sourceFolders.first().file!!
}
private fun getExpectedDir(): Path {
return testDataDirectory.toPath().resolve("after")
}
companion object {
val entitiesProjectDescriptor: EntitiesProjectDescriptor by lazy { EntitiesProjectDescriptor() }
}
class EntitiesProjectDescriptor : KotlinLightProjectDescriptor() {
override fun configureModule(module: Module, model: ModifiableRootModel) {
val contentEntry = model.contentEntries.first()
val genFolder = VfsUtil.createDirectoryIfMissing(contentEntry.file, "gen")
contentEntry.addSourceFolder(genFolder, JavaSourceRootType.SOURCE,
JpsJavaExtensionService.getInstance().createSourceRootProperties("", true))
}
}
}