From da690a84d706c5b678e4bf2d704c3bab0784efd2 Mon Sep 17 00:00:00 2001 From: Nikolay Chashnikov Date: Tue, 31 Jan 2023 16:58:31 +0100 Subject: [PATCH] [java tests] rewrite OutputDirectoriesInProjectFileIndexTest Convert to Kotlin and JUnit5, get rid of usages of DirectoryIndex (IDEA-276394). GitOrigin-RevId: 744a213b35384c1d88a3d84946e11e227091950a --- ...OutputDirectoriesInProjectFileIndexTest.kt | 281 +++++++++--------- .../roots/impl/DirectoryIndexTestCase.java | 9 - 2 files changed, 147 insertions(+), 143 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/openapi/roots/impl/OutputDirectoriesInProjectFileIndexTest.kt b/java/java-tests/testSrc/com/intellij/openapi/roots/impl/OutputDirectoriesInProjectFileIndexTest.kt index 966bc39d4c63..7b760b181d60 100644 --- a/java/java-tests/testSrc/com/intellij/openapi/roots/impl/OutputDirectoriesInProjectFileIndexTest.kt +++ b/java/java-tests/testSrc/com/intellij/openapi/roots/impl/OutputDirectoriesInProjectFileIndexTest.kt @@ -1,158 +1,171 @@ // 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.openapi.roots.impl; +package com.intellij.openapi.roots.impl -import com.intellij.openapi.module.Module; -import com.intellij.openapi.roots.CompilerProjectExtension; -import com.intellij.openapi.vfs.*; -import com.intellij.testFramework.PsiTestUtil; -import com.intellij.testFramework.VfsTestUtil; -import org.jetbrains.annotations.NotNull; +import com.intellij.openapi.Disposable +import com.intellij.openapi.application.runWriteAction +import com.intellij.openapi.module.Module +import com.intellij.openapi.project.RootsChangeRescanningInfo +import com.intellij.openapi.roots.CompilerProjectExtension +import com.intellij.openapi.roots.ProjectFileIndex +import com.intellij.openapi.roots.ex.ProjectRootManagerEx +import com.intellij.openapi.roots.impl.ProjectFileIndexScopes.EXCLUDED +import com.intellij.openapi.roots.impl.ProjectFileIndexScopes.NOT_IN_PROJECT +import com.intellij.openapi.roots.impl.ProjectFileIndexScopes.assertInModule +import com.intellij.openapi.roots.impl.ProjectFileIndexScopes.assertScope +import com.intellij.openapi.util.EmptyRunnable +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.openapi.vfs.VirtualFileEvent +import com.intellij.openapi.vfs.VirtualFileListener +import com.intellij.openapi.vfs.VirtualFileManager +import com.intellij.testFramework.PsiTestUtil +import com.intellij.testFramework.VfsTestUtil +import com.intellij.testFramework.junit5.RunInEdt +import com.intellij.testFramework.junit5.TestApplication +import com.intellij.testFramework.junit5.TestDisposable +import com.intellij.testFramework.rules.ProjectModelExtension +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.RegisterExtension -import java.io.File; -import java.util.ArrayList; -import java.util.List; +@TestApplication +@RunInEdt +class OutputDirectoriesInProjectFileIndexTest { + @JvmField + @RegisterExtension + val projectModel: ProjectModelExtension = ProjectModelExtension() -public class OutputDirectoriesInProjectFileIndexTest extends DirectoryIndexTestCase { - private VirtualFile myRootDir; - private VirtualFile myOutputDir; - private VirtualFile myModule1Dir; - private VirtualFile mySrcDir1; - private VirtualFile myModule1OutputDir; - private Module myModule2; - private VirtualFile myModule2Dir; + private val fileIndex + get() = ProjectFileIndex.getInstance(projectModel.project) - @Override - protected void setUp() throws Exception { - super.setUp(); - final File root = createTempDirectory(); - myRootDir = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(root); - myOutputDir = createChildDirectory(myRootDir, "out"); - myModule1Dir = createChildDirectory(myRootDir, "module1"); - mySrcDir1 = createChildDirectory(myModule1Dir, "src1"); - myModule1OutputDir = createChildDirectory(myOutputDir, "module1"); - myModule2Dir = createChildDirectory(myModule1Dir, "module2"); - myModule2 = createJavaModuleWithContent(getProject(), "module2", myModule2Dir); + private val compilerProjectExtension: CompilerProjectExtension + get() = CompilerProjectExtension.getInstance(projectModel.project)!! - getCompilerProjectExtension().setCompilerOutputUrl(myOutputDir.getUrl()); - PsiTestUtil.addContentRoot(myModule, myModule1Dir); - PsiTestUtil.addSourceRoot(myModule, mySrcDir1); + private lateinit var outputDir: VirtualFile + private lateinit var module1Dir: VirtualFile + private lateinit var srcDir1: VirtualFile + private lateinit var module1OutputDir: VirtualFile + private lateinit var module1: Module + private lateinit var module2: Module + private lateinit var module2Dir: VirtualFile + + @BeforeEach + fun setUp() { + outputDir = projectModel.baseProjectDir.newVirtualDirectory("out") + module1Dir = projectModel.baseProjectDir.newVirtualDirectory("module1") + srcDir1 = projectModel.baseProjectDir.newVirtualDirectory("module1/src1") + module1OutputDir = projectModel.baseProjectDir.newVirtualDirectory("out/module1") + module2Dir = projectModel.baseProjectDir.newVirtualDirectory("module1/module2") + module1 = projectModel.createModule("module1") + module2 = projectModel.createModule("module2") + compilerProjectExtension.compilerOutputUrl = outputDir.url + PsiTestUtil.addContentRoot(module1, module1Dir) + PsiTestUtil.addSourceRoot(module1, srcDir1) + PsiTestUtil.addContentRoot(module2, module2Dir) } - public void testExcludeCompilerOutputOutsideOfContentRoot() { - assertTrue(myFileIndex.isExcluded(myOutputDir)); - assertFalse(myFileIndex.isUnderIgnored(myOutputDir)); - assertTrue(myFileIndex.isExcluded(myModule1OutputDir)); - assertFalse(myFileIndex.isExcluded(myOutputDir.getParent())); - assertExcludedFromProject(myOutputDir); - assertExcludedFromProject(myModule1OutputDir); - String moduleOutputUrl = myModule1OutputDir.getUrl(); - - VfsTestUtil.deleteFile(myOutputDir); - - PsiTestUtil.setCompilerOutputPath(myModule, moduleOutputUrl, false); - myOutputDir = createChildDirectory(myRootDir, "out"); - myModule1OutputDir = createChildDirectory(myOutputDir, "module1"); - - assertExcludedFromProject(myOutputDir); - assertExcludedFromProject(myModule1OutputDir); - assertTrue(myFileIndex.isExcluded(myModule1OutputDir)); - - PsiTestUtil.setCompilerOutputPath(myModule, moduleOutputUrl, true); - PsiTestUtil.setCompilerOutputPath(myModule2, moduleOutputUrl, false); - PsiTestUtil.setCompilerOutputPath(myModule2, moduleOutputUrl, true); + @Test + fun testExcludeCompilerOutputOutsideOfContentRoot() { + fileIndex.assertScope(outputDir, EXCLUDED) + fileIndex.assertScope(module1OutputDir, EXCLUDED) + fileIndex.assertScope(outputDir.parent, NOT_IN_PROJECT) + + val moduleOutputUrl = module1OutputDir.url + VfsTestUtil.deleteFile(outputDir) + PsiTestUtil.setCompilerOutputPath(module1, moduleOutputUrl, false) + outputDir = projectModel.baseProjectDir.newVirtualDirectory("out") + module1OutputDir = projectModel.baseProjectDir.newVirtualDirectory("out/module1") + fileIndex.assertScope(outputDir, EXCLUDED) + fileIndex.assertScope(module1OutputDir, EXCLUDED) + + PsiTestUtil.setCompilerOutputPath(module1, moduleOutputUrl, true) + PsiTestUtil.setCompilerOutputPath(module2, moduleOutputUrl, false) + PsiTestUtil.setCompilerOutputPath(module2, moduleOutputUrl, true) // now no module inherits project output dir, but it still should be project-excluded - assertExcludedFromProject(myOutputDir); + fileIndex.assertScope(outputDir, EXCLUDED) // project output inside module content shouldn't be projectExcludeRoot - VirtualFile projectOutputUnderContent = createChildDirectory(myModule1Dir, "projectOutputUnderContent"); - getCompilerProjectExtension().setCompilerOutputUrl(projectOutputUnderContent.getUrl()); - fireRootsChanged(); + var projectOutputUnderContent = projectModel.baseProjectDir.newVirtualDirectory("module1/projectOutputUnderContent") + compilerProjectExtension.compilerOutputUrl = projectOutputUnderContent.url + fireRootsChanged() + fileIndex.assertScope(outputDir, NOT_IN_PROJECT) + fileIndex.assertInModule(projectOutputUnderContent, module1, module1Dir, EXCLUDED) - assertNotExcluded(myOutputDir); - assertExcluded(projectOutputUnderContent, myModule); - - VfsTestUtil.deleteFile(projectOutputUnderContent); - projectOutputUnderContent = createChildDirectory(myModule1Dir, "projectOutputUnderContent"); - assertNotExcluded(myOutputDir); - assertExcluded(projectOutputUnderContent, myModule); + VfsTestUtil.deleteFile(projectOutputUnderContent) + projectOutputUnderContent = projectModel.baseProjectDir.newVirtualDirectory("module1/projectOutputUnderContent") + fileIndex.assertScope(outputDir, NOT_IN_PROJECT) + fileIndex.assertInModule(projectOutputUnderContent, module1, module1Dir, EXCLUDED) } - public void testResettingProjectOutputPath() { - VirtualFile output1 = createChildDirectory(myModule1Dir, "output1"); - VirtualFile output2 = createChildDirectory(myModule1Dir, "output2"); - - assertInProject(output1); - assertInProject(output2); - - getCompilerProjectExtension().setCompilerOutputUrl(output1.getUrl()); - fireRootsChanged(); - - assertExcluded(output1, myModule); - assertInProject(output2); - - getCompilerProjectExtension().setCompilerOutputUrl(output2.getUrl()); - fireRootsChanged(); - - assertInProject(output1); - assertExcluded(output2, myModule); + @Test + fun testResettingProjectOutputPath() { + val output1 = projectModel.baseProjectDir.newVirtualDirectory("module1/output1") + val output2 = projectModel.baseProjectDir.newVirtualDirectory("module1/output2") + fileIndex.assertInModule(output1, module1, module1Dir) + fileIndex.assertInModule(output2, module1, module1Dir) + + compilerProjectExtension.compilerOutputUrl = output1.url + fireRootsChanged() + fileIndex.assertInModule(output1, module1, module1Dir, EXCLUDED) + fileIndex.assertInModule(output2, module1, module1Dir) + + compilerProjectExtension.compilerOutputUrl = output2.url + fireRootsChanged() + fileIndex.assertInModule(output1, module1, module1Dir) + fileIndex.assertInModule(output2, module1, module1Dir, EXCLUDED) } - public void testExcludedOutputDirShouldBeExcludedRightAfterItsCreation() { - VirtualFile projectOutput = createChildDirectory(myModule1Dir, "projectOutput"); - VirtualFile module2Output = createChildDirectory(myModule1Dir, "module2Output"); - VirtualFile module2TestOutput = createChildDirectory(myModule2Dir, "module2TestOutput"); - - assertInProject(projectOutput); - assertInProject(module2Output); - assertInProject(module2TestOutput); - - getCompilerProjectExtension().setCompilerOutputUrl(projectOutput.getUrl()); - - PsiTestUtil.setCompilerOutputPath(myModule2, module2Output.getUrl(), false); - PsiTestUtil.setCompilerOutputPath(myModule2, module2TestOutput.getUrl(), true); - PsiTestUtil.setExcludeCompileOutput(myModule2, true); - - assertExcluded(projectOutput, myModule); - assertExcluded(module2Output, myModule); - assertExcluded(module2TestOutput, myModule2); - - VfsTestUtil.deleteFile(projectOutput); - VfsTestUtil.deleteFile(module2Output); - VfsTestUtil.deleteFile(module2TestOutput); - - final List created = new ArrayList<>(); - VirtualFileListener l = new VirtualFileListener() { - @Override - public void fileCreated(@NotNull VirtualFileEvent e) { - VirtualFile file = e.getFile(); - String fileName = e.getFileName(); - assertExcluded(file, fileName.contains("module2TestOutput") ? myModule2 : myModule); - created.add(file); + @Test + fun testExcludedOutputDirShouldBeExcludedRightAfterItsCreation(@TestDisposable disposable: Disposable) { + var projectOutput = projectModel.baseProjectDir.newVirtualDirectory("module1/projectOutput") + var module2Output = projectModel.baseProjectDir.newVirtualDirectory("module1/module2Output") + var module2TestOutput = projectModel.baseProjectDir.newVirtualDirectory("module1/module2/module2TestOutput") + fileIndex.assertInModule(projectOutput, module1, module1Dir) + fileIndex.assertInModule(module2Output, module1, module1Dir) + fileIndex.assertInModule(module2TestOutput, module2, module2Dir) + + compilerProjectExtension.compilerOutputUrl = projectOutput.url + PsiTestUtil.setCompilerOutputPath(module2, module2Output.url, false) + PsiTestUtil.setCompilerOutputPath(module2, module2TestOutput.url, true) + PsiTestUtil.setExcludeCompileOutput(module2, true) + fileIndex.assertInModule(projectOutput, module1, module1Dir, EXCLUDED) + fileIndex.assertInModule(module2Output, module1, module1Dir, EXCLUDED) + fileIndex.assertInModule(module2TestOutput, module2, module2Dir, EXCLUDED) + + VfsTestUtil.deleteFile(projectOutput) + VfsTestUtil.deleteFile(module2Output) + VfsTestUtil.deleteFile(module2TestOutput) + val created: MutableList = ArrayList() + val l: VirtualFileListener = object : VirtualFileListener { + override fun fileCreated(e: VirtualFileEvent) { + val file = e.file + val fileName = e.fileName + val (module, dir) = if (fileName.contains("module2TestOutput")) module2 to module2Dir else module1 to module1Dir + fileIndex.assertInModule(file, module, dir, EXCLUDED) + created.add(file) } - }; - VirtualFileManager.getInstance().addVirtualFileListener(l, getTestRootDisposable()); - - projectOutput = createChildDirectory(myModule1Dir, projectOutput.getName()); - assertExcluded(projectOutput, myModule); - - module2Output = createChildDirectory(myModule1Dir, module2Output.getName()); - assertExcluded(module2Output, myModule); - - module2TestOutput = createChildDirectory(myModule2Dir, module2TestOutput.getName()); - assertExcluded(module2TestOutput, myModule2); - - assertEquals(created.toString(), 3, created.size()); + } + VirtualFileManager.getInstance().addVirtualFileListener(l, disposable) + projectOutput = projectModel.baseProjectDir.newVirtualDirectory("module1/${projectOutput.name}") + fileIndex.assertInModule(projectOutput, module1, module1Dir, EXCLUDED) + module2Output = projectModel.baseProjectDir.newVirtualDirectory("module1/${module2Output.name}") + fileIndex.assertInModule(module2Output, module1, module1Dir, EXCLUDED) + module2TestOutput = projectModel.baseProjectDir.newVirtualDirectory("module1/module2/${module2TestOutput.name}") + fileIndex.assertInModule(module2TestOutput, module2, module2Dir, EXCLUDED) + assertEquals(3, created.size, created.toString()) } - public void testSameSourceAndOutput() { - PsiTestUtil.setCompilerOutputPath(myModule, mySrcDir1.getUrl(), false); - assertExcluded(mySrcDir1, myModule); + @Test + fun testSameSourceAndOutput() { + PsiTestUtil.setCompilerOutputPath(module1, srcDir1.url, false) + fileIndex.assertInModule(srcDir1, module1, module1Dir, EXCLUDED) } - private CompilerProjectExtension getCompilerProjectExtension() { - final CompilerProjectExtension instance = CompilerProjectExtension.getInstance(myProject); - assertNotNull(instance); - return instance; + private fun fireRootsChanged() { + runWriteAction { + ProjectRootManagerEx.getInstanceEx(projectModel.project).makeRootsChange(EmptyRunnable.getInstance(), + RootsChangeRescanningInfo.NO_RESCAN_NEEDED) + } } } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTestCase.java b/platform/platform-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTestCase.java index f7f5f8ce317d..02e80bd642e7 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTestCase.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTestCase.java @@ -1,19 +1,15 @@ // Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.roots.impl; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.*; import com.intellij.openapi.progress.EmptyProgressIndicator; import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.RootsChangeRescanningInfo; import com.intellij.openapi.roots.FileIndex; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.openapi.roots.ex.ProjectRootManagerEx; -import com.intellij.openapi.util.EmptyRunnable; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.testFramework.HeavyPlatformTestCase; import com.intellij.testFramework.PsiTestUtil; @@ -106,11 +102,6 @@ public abstract class DirectoryIndexTestCase extends HeavyPlatformTestCase { if (mustNotContain != null) assertDoesntContain(collected, mustNotContain); } - protected void fireRootsChanged() { - ApplicationManager.getApplication().runWriteAction(() -> ProjectRootManagerEx.getInstanceEx(getProject()). - makeRootsChange(EmptyRunnable.getInstance(), RootsChangeRescanningInfo.NO_RESCAN_NEEDED)); - } - protected static void assertIteratedContent(@NotNull FileIndex fileIndex, @Nullable List mustContain, @Nullable List mustNotContain) {