From eb9313d7dc0e486e907a65740c736ce6e6f4f967 Mon Sep 17 00:00:00 2001 From: Nikolay Chashnikov Date: Wed, 20 Jul 2022 15:42:38 +0200 Subject: [PATCH] [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 --- intellij.idea.community.main.iml | 1 + .../codegen/EntityCodeGenTest.kt | 62 +++++++++---------- 2 files changed, 29 insertions(+), 34 deletions(-) diff --git a/intellij.idea.community.main.iml b/intellij.idea.community.main.iml index 02eb547b9d63..f7b83e53ddfb 100644 --- a/intellij.idea.community.main.iml +++ b/intellij.idea.community.main.iml @@ -189,6 +189,7 @@ + diff --git a/platform/workspaceModel/codegen/test/testSrc/com/intellij/workspaceModel/codegen/EntityCodeGenTest.kt b/platform/workspaceModel/codegen/test/testSrc/com/intellij/workspaceModel/codegen/EntityCodeGenTest.kt index ba1d26081253..9257ef980cb4 100644 --- a/platform/workspaceModel/codegen/test/testSrc/com/intellij/workspaceModel/codegen/EntityCodeGenTest.kt +++ b/platform/workspaceModel/codegen/test/testSrc/com/intellij/workspaceModel/codegen/EntityCodeGenTest.kt @@ -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 { - 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)) + } + } } \ No newline at end of file