diff --git a/java/idea-ui/intellij.java.ui.tests.iml b/java/idea-ui/intellij.java.ui.tests.iml index 70e9a1b2328b..ba257424d0c8 100644 --- a/java/idea-ui/intellij.java.ui.tests.iml +++ b/java/idea-ui/intellij.java.ui.tests.iml @@ -26,5 +26,8 @@ + + + \ No newline at end of file diff --git a/java/idea-ui/testSrc/com/intellij/ui/ProjectWizardJdkComboBoxTest.kt b/java/idea-ui/testSrc/com/intellij/ui/ProjectWizardJdkComboBoxTest.kt new file mode 100644 index 000000000000..fadf88387e00 --- /dev/null +++ b/java/idea-ui/testSrc/com/intellij/ui/ProjectWizardJdkComboBoxTest.kt @@ -0,0 +1,77 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.ui + +import com.intellij.ide.projectWizard.ProjectWizardJdkComboBox +import com.intellij.ide.projectWizard.ProjectWizardJdkIntent +import com.intellij.ide.projectWizard.ProjectWizardTestCase +import com.intellij.openapi.Disposable +import com.intellij.openapi.application.writeAction +import com.intellij.openapi.projectRoots.ProjectJdkTable +import com.intellij.openapi.projectRoots.Sdk +import com.intellij.openapi.projectRoots.SimpleJavaSdkType +import com.intellij.openapi.util.Disposer +import com.intellij.platform.eel.path.EelPath +import com.intellij.platform.eel.provider.LocalEelDescriptor +import com.intellij.platform.eel.provider.utils.EelPathUtils +import com.intellij.platform.testFramework.junit5.eel.fixture.eelFixture +import com.intellij.testFramework.common.timeoutRunBlocking +import com.intellij.testFramework.junit5.TestApplication +import com.intellij.testFramework.junit5.TestDisposable +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test +import java.nio.file.Files +import java.nio.file.Path + +@TestApplication +class ProjectWizardJdkComboBoxTest { + val eelFixture = eelFixture(EelPath.OS.UNIX) + + @Test + fun `changing eel changes available sdks`(@TestDisposable disposable: Disposable): Unit = timeoutRunBlocking { + val localSdk = createLocalSdk(disposable) + val eelSdk = createEelSdk(disposable) + + val comboBox = ProjectWizardJdkComboBox(null, disposable) + + comboBox.eelChanged(LocalEelDescriptor) + Assertions.assertTrue(comboBox.contains(localSdk)) + Assertions.assertFalse(comboBox.contains(eelSdk)) + + comboBox.eelChanged(eelFixture.get().eelDescriptor) + Assertions.assertFalse(comboBox.contains(localSdk)) + Assertions.assertTrue(comboBox.contains(eelSdk)) + } + + + suspend fun createSdk(path: Path, name: String, disposable: Disposable): Sdk { + val jdkTable = ProjectJdkTable.getInstance() + val javaSdkType = SimpleJavaSdkType.getInstance() + Disposer.register(disposable) { + Files.delete(path) + } + val sdk = jdkTable.createSdk(name, javaSdkType) + val modificator = sdk.sdkModificator + modificator.homePath = path.toString() + writeAction { + modificator.commitChanges() + jdkTable.addJdk(sdk, disposable) + } + return sdk + } + + suspend fun createLocalSdk(disposable: Disposable): Sdk { + val tempDir = Files.createTempDirectory("test-") + return createSdk(tempDir, "local-sdk", disposable) + } + + suspend fun createEelSdk(disposable: Disposable): Sdk { + val eel = eelFixture.get() + val tempDir = EelPathUtils.createTemporaryDirectory(eel.eelApi) + return createSdk(tempDir, "eel-sdk", disposable) + } + + fun ProjectWizardJdkComboBox.contains(sdk: Sdk): Boolean { + return model.items.find { it is ProjectWizardJdkIntent.ExistingJdk && it.jdk == sdk } != null + } + +} \ No newline at end of file diff --git a/platform/eel-provider/src/com/intellij/platform/eel/provider/utils/eelPathUtils.kt b/platform/eel-provider/src/com/intellij/platform/eel/provider/utils/eelPathUtils.kt index 39f99e153c83..aca7d7f4cc4c 100644 --- a/platform/eel-provider/src/com/intellij/platform/eel/provider/utils/eelPathUtils.kt +++ b/platform/eel-provider/src/com/intellij/platform/eel/provider/utils/eelPathUtils.kt @@ -65,11 +65,16 @@ object EelPathUtils { val projectFilePath = project.projectFilePath ?: return Files.createTempDirectory(prefix) return runBlockingMaybeCancellable { val eel = Path.of(projectFilePath).getEelApi() - val file = eel.fs.createTemporaryDirectory(EelFileSystemApi.CreateTemporaryEntryOptions.Builder().prefix(prefix).build()).getOrThrowFileSystemException() - eel.mapper.toNioPath(file) + createTemporaryDirectory(eel, prefix) } } + @JvmStatic + suspend fun createTemporaryDirectory(eelApi: EelApi, prefix: String = ""): Path { + val file = eelApi.fs.createTemporaryDirectory(EelFileSystemApi.CreateTemporaryEntryOptions.Builder().prefix(prefix).build()).getOrThrowFileSystemException() + return eelApi.mapper.toNioPath(file) + } + @JvmStatic fun renderAsEelPath(path: Path): String { if (isPathLocal(path)) {