From 029f03d54fe4e3500bb42166449b531df27382d2 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Fri, 27 Mar 2026 17:52:24 +0100 Subject: [PATCH 01/31] #1296: implemented basic IdeDialog Class --- .../main/java/com/devonfw/ide/gui/App.java | 8 ++++ .../com/devonfw/ide/gui/modal/IdeDialog.java | 42 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index 590e29d4b5..faee0c1a0c 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -10,6 +10,7 @@ import javafx.stage.Screen; import javafx.stage.Stage; +import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.version.IdeVersion; /** @@ -34,6 +35,13 @@ public void start(Stage primaryStage) throws IOException { primaryStage.setMinWidth(scene.getWidth()); primaryStage.setMinHeight(scene.getHeight()); primaryStage.show(); + + //TODO: Remove this before PR! + IdeDialog welcomeDialog = new IdeDialog(IdeDialog.AlertType.INFORMATION); + welcomeDialog.setTitle("Welcome to IDEasy"); + welcomeDialog.setHeaderText("Welcome to IDEasy"); + welcomeDialog.setContentText("Thank you for using "); + welcomeDialog.showAndWait(); } diff --git a/gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java b/gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java new file mode 100644 index 0000000000..2ee467ae23 --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java @@ -0,0 +1,42 @@ +package com.devonfw.ide.gui.modal; + +import javafx.scene.control.Alert; +import javafx.scene.control.ButtonType; +import javafx.scene.image.Image; +import javafx.stage.Stage; + +/** + * Custom Alert class for IDEasy to allow interaction via the CLIs questions/modals/selections. + */ +public class IdeDialog extends Alert { + + /** + * @param alertType the {@link AlertType} of the alert (e.g. INFORMATION, CONFIRMATION, etc). + */ + public IdeDialog(AlertType alertType) { + + super(alertType); + setupDefaultProperties(); + } + + /** + * @param alertType the {@link AlertType} of the alert (e.g. INFORMATION, CONFIRMATION, etc). + * @param message main message displayed in the dialoge + * @param buttonTypes defines the different buttons that the alert displays. + */ + public IdeDialog(AlertType alertType, String message, ButtonType... buttonTypes) { + + super(alertType, message, buttonTypes); + setupDefaultProperties(); + } + + private void setupDefaultProperties() { + + setTitle("IDEasy"); + + setOnShowing(event -> { + Stage stage = (Stage) getDialogPane().getScene().getWindow(); + stage.getIcons().add(new Image("com/devonfw/ide/gui/assets/devonfw.png")); + }); + } +} From 89cfb670431cd7168fe3157034963a28e8752a04 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Mon, 30 Mar 2026 11:53:34 +0200 Subject: [PATCH 02/31] #1296: Added basic context state manager class - Added testing class for modals --- .../ide/commandlet/CommandletManagerImpl.java | 1 + .../ide/commandlet/TestModalsCommandlet.java | 29 ++++++++ .../devonfw/ide/gui/IdeGuiContextManager.java | 67 +++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java create mode 100644 gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java index c44f5b7403..ff9af5cf23 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java @@ -147,6 +147,7 @@ public CommandletManagerImpl(IdeContext context) { add(new Corepack(context)); add(new Pip(context)); add(new Go(context)); + add(new TestModalsCommandlet(context)); } /** diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java new file mode 100644 index 0000000000..4aa3755f2b --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java @@ -0,0 +1,29 @@ +package com.devonfw.tools.ide.commandlet; + +import com.devonfw.tools.ide.context.IdeContext; + +public class TestModalsCommandlet extends Commandlet { + + IdeContext context; + + /** + * The constructor. + * + * @param context the {@link IdeContext}. + */ + public TestModalsCommandlet(IdeContext context) { + super(context); + addKeyword("testQuestion"); + this.context = context; + } + + @Override + public String getName() { + return "testQuestion"; + } + + @Override + protected void doRun() { + context.question("Test Question", "Yes", "No", "Maybe"); + } +} diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java new file mode 100644 index 0000000000..0022de7c8b --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java @@ -0,0 +1,67 @@ +package com.devonfw.ide.gui; + +import java.io.FileNotFoundException; +import java.nio.file.Path; + +import com.devonfw.tools.ide.context.IdeStartContextImpl; + +/** + * This class has the purpose of enabling the context state management for the IDEasy GUI. It is a thread-safe singleton implementation (Bill Pugh Singleton). + */ +public class IdeGuiContextManager { + + private String projectDirectory; + + /** + * Project context based on which project the user works in. + */ + private IdeGuiContext currentContext; + + private IdeGuiContextManager() { + } + + /** + * @return the singleton instance of the {@link IdeGuiContextManager}. + */ + public static IdeGuiContextManager getInstance() { + + return Holder.INSTANCE; + } + + /** + * @param projectName name of the project folder + * @param workspaceName name of the workspace folder + * @return the new {@link IdeGuiContext} for the selected project and workspace. + * @throws FileNotFoundException if workspace or project does not exist + */ + public IdeGuiContext switchContext(String projectName, String workspaceName) throws FileNotFoundException { + + Path workspacePath = Path.of(projectDirectory, projectName, workspaceName); + + if (!workspacePath.toFile().exists()) { + throw new FileNotFoundException("Workspace " + workspacePath + " does not exist!"); + } + + IdeGuiContext newContext = new IdeGuiContext(IdeStartContextImpl.get(), workspacePath); + this.currentContext = newContext; + return this.currentContext; + } + + /** + * @return the current {@link IdeGuiContext} based on the selected project. + */ + public IdeGuiContext getCurrentContext() { + + return this.currentContext; + } + + /** + * Holder class for the singleton instance. The static keyword ensures the thread-safety of the singleton. + * + * @see More info + */ + private static class Holder { + + private static final IdeGuiContextManager INSTANCE = new IdeGuiContextManager(); + } +} From a53296d1cddeb4f957697ba77dda77dc013e1072 Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Mon, 30 Mar 2026 14:42:35 +0200 Subject: [PATCH 03/31] #1785: Added basic question/confirmation modal implementation - Added logging to IdeGuiStateManager. - Added functionality, that selecting a different project now switches the IdeContext to the new project. --- .../ide/commandlet/TestModalsCommandlet.java | 4 +- .../main/java/com/devonfw/ide/gui/App.java | 8 ---- .../com/devonfw/ide/gui/IdeGuiContext.java | 41 +++++++++++++++++++ ...xtManager.java => IdeGuiStateManager.java} | 31 +++++++++----- .../com/devonfw/ide/gui/MainController.java | 31 ++++++++++---- 5 files changed, 88 insertions(+), 27 deletions(-) rename gui/src/main/java/com/devonfw/ide/gui/{IdeGuiContextManager.java => IdeGuiStateManager.java} (60%) diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java index 4aa3755f2b..43fa6fd93f 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java @@ -24,6 +24,8 @@ public String getName() { @Override protected void doRun() { - context.question("Test Question", "Yes", "No", "Maybe"); + //context.question("Test Question", "Yes", "No", "Maybe"); + Object result = context.question(new String[] { "Red", "Green", "Blue", "Yellow" }, "Test Checkbox Question", "Yes", "No", "Maybe"); + System.out.println(result); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index faee0c1a0c..590e29d4b5 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -10,7 +10,6 @@ import javafx.stage.Screen; import javafx.stage.Stage; -import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.version.IdeVersion; /** @@ -35,13 +34,6 @@ public void start(Stage primaryStage) throws IOException { primaryStage.setMinWidth(scene.getWidth()); primaryStage.setMinHeight(scene.getHeight()); primaryStage.show(); - - //TODO: Remove this before PR! - IdeDialog welcomeDialog = new IdeDialog(IdeDialog.AlertType.INFORMATION); - welcomeDialog.setTitle("Welcome to IDEasy"); - welcomeDialog.setHeaderText("Welcome to IDEasy"); - welcomeDialog.setContentText("Thank you for using "); - welcomeDialog.showAndWait(); } diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java index c16732d70a..dae8887154 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java @@ -1,7 +1,14 @@ package com.devonfw.ide.gui; import java.nio.file.Path; +import javafx.scene.control.Alert; +import javafx.scene.control.ButtonType; +import javafx.scene.control.DialogPane; +import javafx.scene.control.RadioButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.VBox; +import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.context.AbstractIdeContext; import com.devonfw.tools.ide.context.IdeStartContextImpl; import com.devonfw.tools.ide.io.IdeProgressBar; @@ -25,12 +32,46 @@ public IdeGuiContext(IdeStartContextImpl startContext, Path workingDirectory) { @Override protected String readLine() { + return ""; } @Override public IdeProgressBar newProgressBar(String title, long size, String unitName, long unitSize) { + return new IdeProgressBarNone(title, 0, unitName, unitSize); } + @Override + public boolean question(String question, Object... args) { + + IdeDialog dialog = new IdeDialog(IdeDialog.AlertType.CONFIRMATION, question); + dialog.showAndWait(); + return dialog.getResult() == ButtonType.YES; + } + + @Override + public O question(O[] options, String question, Object... args) { + + IdeDialog dialog = new IdeDialog(Alert.AlertType.CONFIRMATION, question, ButtonType.APPLY, ButtonType.CANCEL); + + dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(true); + + DialogPane pane = dialog.getDialogPane(); + ToggleGroup group = new ToggleGroup(); + + VBox vbox = new VBox(10); + for (O option : options) { + RadioButton button = new RadioButton(option.toString()); + button.setOnAction(e -> dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(false)); + button.setToggleGroup(group); + vbox.getChildren().add(button); + } + pane.setContent(vbox); + dialog.showAndWait(); + + RadioButton selectedOption = (RadioButton) group.getSelectedToggle(); + + return selectedOption == null ? null : (O) selectedOption.getText(); + } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java similarity index 60% rename from gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java rename to gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java index 0022de7c8b..2fabdb8b94 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java @@ -3,28 +3,35 @@ import java.io.FileNotFoundException; import java.nio.file.Path; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.devonfw.tools.ide.context.IdeStartContextImpl; +import com.devonfw.tools.ide.log.IdeLogLevel; +import com.devonfw.tools.ide.log.IdeLogListenerBuffer; /** * This class has the purpose of enabling the context state management for the IDEasy GUI. It is a thread-safe singleton implementation (Bill Pugh Singleton). */ -public class IdeGuiContextManager { +public class IdeGuiStateManager { + + private static final Logger LOG = LoggerFactory.getLogger(IdeGuiStateManager.class); - private String projectDirectory; + private final String projectDirectory; /** * Project context based on which project the user works in. */ private IdeGuiContext currentContext; - private IdeGuiContextManager() { + private IdeGuiStateManager() { + this.projectDirectory = System.getenv("IDE_ROOT"); } /** - * @return the singleton instance of the {@link IdeGuiContextManager}. + * @return the singleton instance of the {@link IdeGuiStateManager}. */ - public static IdeGuiContextManager getInstance() { - + public static IdeGuiStateManager getInstance() { return Holder.INSTANCE; } @@ -36,14 +43,18 @@ public static IdeGuiContextManager getInstance() { */ public IdeGuiContext switchContext(String projectName, String workspaceName) throws FileNotFoundException { - Path workspacePath = Path.of(projectDirectory, projectName, workspaceName); + LOG.debug("Switching context to project {} and workspace {}", projectName, workspaceName); + + Path workspacePath = Path.of(projectDirectory, projectName, "workspaces", workspaceName); if (!workspacePath.toFile().exists()) { throw new FileNotFoundException("Workspace " + workspacePath + " does not exist!"); } - IdeGuiContext newContext = new IdeGuiContext(IdeStartContextImpl.get(), workspacePath); - this.currentContext = newContext; + final IdeLogListenerBuffer buffer = new IdeLogListenerBuffer(); + IdeLogLevel logLevel = IdeLogLevel.DEBUG; + IdeStartContextImpl startContext = new IdeStartContextImpl(logLevel, buffer); + this.currentContext = new IdeGuiContext(startContext, workspacePath); return this.currentContext; } @@ -62,6 +73,6 @@ public IdeGuiContext getCurrentContext() { */ private static class Holder { - private static final IdeGuiContextManager INSTANCE = new IdeGuiContextManager(); + private static final IdeGuiStateManager INSTANCE = new IdeGuiStateManager(); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index 0e64f0a47e..954a5d3cf2 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -1,5 +1,6 @@ package com.devonfw.ide.gui; +import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -8,10 +9,9 @@ import javafx.scene.control.Button; import javafx.scene.control.ComboBox; +import com.devonfw.ide.gui.modal.IdeDialog; +import com.devonfw.tools.ide.commandlet.TestModalsCommandlet; import com.devonfw.tools.ide.context.IdeContext; -import com.devonfw.tools.ide.context.IdeStartContextImpl; -import com.devonfw.tools.ide.log.IdeLogLevel; -import com.devonfw.tools.ide.log.IdeLogListenerBuffer; import com.devonfw.tools.ide.variable.IdeVariables; /** @@ -107,6 +107,10 @@ private void setProjectsComboBox() { vsCodeOpen.setDisable(false); selectedWorkspace.setValue("main"); this.workspaceValue = Path.of("main"); + updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); + + //TODO: remove this before PR + IdeGuiStateManager.getInstance().getCurrentContext().getCommandletManager().getCommandlet(TestModalsCommandlet.class).run(); }); } @@ -128,14 +132,25 @@ private void setWorkspaceValue() { } } this.workspaceValue = Path.of(selectedWorkspace.getValue()); + updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); } private void openIDE(String inIde) { - final IdeLogListenerBuffer buffer = new IdeLogListenerBuffer(); - IdeLogLevel logLevel = IdeLogLevel.INFO; - IdeStartContextImpl startContext = new IdeStartContextImpl(logLevel, buffer); - IdeGuiContext context = new IdeGuiContext(startContext, Path.of(this.directoryPath).resolve(this.projectValue).resolve(this.workspaceValue)); - context.getCommandletManager().getCommandlet(inIde).run(); + IdeGuiStateManager + .getInstance() + .getCurrentContext() + .getCommandletManager() + .getCommandlet(inIde) + .run(); + } + + private void updateContext(String selectedProjectName, String selectedWorkspaceName) { + try { + IdeGuiStateManager.getInstance().switchContext(selectedProjectName, selectedWorkspaceName); + } catch (FileNotFoundException e) { + IdeDialog errorDialog = new IdeDialog(IdeDialog.AlertType.ERROR, e.getMessage()); + errorDialog.showAndWait(); + } } } From 37cad74f65c07e9c0c5815d379c2633da82aeee6 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Fri, 27 Mar 2026 17:52:24 +0100 Subject: [PATCH 04/31] #1296: implemented basic IdeDialog Class --- .../main/java/com/devonfw/ide/gui/App.java | 1 - .../com/devonfw/ide/gui/modal/IdeDialog.java | 42 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index 3094e5185c..9023131653 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -10,7 +10,6 @@ import javafx.stage.Screen; import javafx.stage.Stage; -import com.devonfw.tools.ide.variable.IdeVariables; import com.devonfw.tools.ide.version.IdeVersion; /** diff --git a/gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java b/gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java new file mode 100644 index 0000000000..2ee467ae23 --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/modal/IdeDialog.java @@ -0,0 +1,42 @@ +package com.devonfw.ide.gui.modal; + +import javafx.scene.control.Alert; +import javafx.scene.control.ButtonType; +import javafx.scene.image.Image; +import javafx.stage.Stage; + +/** + * Custom Alert class for IDEasy to allow interaction via the CLIs questions/modals/selections. + */ +public class IdeDialog extends Alert { + + /** + * @param alertType the {@link AlertType} of the alert (e.g. INFORMATION, CONFIRMATION, etc). + */ + public IdeDialog(AlertType alertType) { + + super(alertType); + setupDefaultProperties(); + } + + /** + * @param alertType the {@link AlertType} of the alert (e.g. INFORMATION, CONFIRMATION, etc). + * @param message main message displayed in the dialoge + * @param buttonTypes defines the different buttons that the alert displays. + */ + public IdeDialog(AlertType alertType, String message, ButtonType... buttonTypes) { + + super(alertType, message, buttonTypes); + setupDefaultProperties(); + } + + private void setupDefaultProperties() { + + setTitle("IDEasy"); + + setOnShowing(event -> { + Stage stage = (Stage) getDialogPane().getScene().getWindow(); + stage.getIcons().add(new Image("com/devonfw/ide/gui/assets/devonfw.png")); + }); + } +} From 55a50cea93a4e858100ceee95e0de41d4cfb9b3e Mon Sep 17 00:00:00 2001 From: laim2003 Date: Mon, 30 Mar 2026 11:53:34 +0200 Subject: [PATCH 05/31] #1296: Added basic context state manager class - Added testing class for modals --- .../ide/commandlet/CommandletManagerImpl.java | 1 + .../ide/commandlet/TestModalsCommandlet.java | 29 ++++++++ .../devonfw/ide/gui/IdeGuiContextManager.java | 67 +++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java create mode 100644 gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java index c44f5b7403..ff9af5cf23 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java @@ -147,6 +147,7 @@ public CommandletManagerImpl(IdeContext context) { add(new Corepack(context)); add(new Pip(context)); add(new Go(context)); + add(new TestModalsCommandlet(context)); } /** diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java new file mode 100644 index 0000000000..4aa3755f2b --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java @@ -0,0 +1,29 @@ +package com.devonfw.tools.ide.commandlet; + +import com.devonfw.tools.ide.context.IdeContext; + +public class TestModalsCommandlet extends Commandlet { + + IdeContext context; + + /** + * The constructor. + * + * @param context the {@link IdeContext}. + */ + public TestModalsCommandlet(IdeContext context) { + super(context); + addKeyword("testQuestion"); + this.context = context; + } + + @Override + public String getName() { + return "testQuestion"; + } + + @Override + protected void doRun() { + context.question("Test Question", "Yes", "No", "Maybe"); + } +} diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java new file mode 100644 index 0000000000..0022de7c8b --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java @@ -0,0 +1,67 @@ +package com.devonfw.ide.gui; + +import java.io.FileNotFoundException; +import java.nio.file.Path; + +import com.devonfw.tools.ide.context.IdeStartContextImpl; + +/** + * This class has the purpose of enabling the context state management for the IDEasy GUI. It is a thread-safe singleton implementation (Bill Pugh Singleton). + */ +public class IdeGuiContextManager { + + private String projectDirectory; + + /** + * Project context based on which project the user works in. + */ + private IdeGuiContext currentContext; + + private IdeGuiContextManager() { + } + + /** + * @return the singleton instance of the {@link IdeGuiContextManager}. + */ + public static IdeGuiContextManager getInstance() { + + return Holder.INSTANCE; + } + + /** + * @param projectName name of the project folder + * @param workspaceName name of the workspace folder + * @return the new {@link IdeGuiContext} for the selected project and workspace. + * @throws FileNotFoundException if workspace or project does not exist + */ + public IdeGuiContext switchContext(String projectName, String workspaceName) throws FileNotFoundException { + + Path workspacePath = Path.of(projectDirectory, projectName, workspaceName); + + if (!workspacePath.toFile().exists()) { + throw new FileNotFoundException("Workspace " + workspacePath + " does not exist!"); + } + + IdeGuiContext newContext = new IdeGuiContext(IdeStartContextImpl.get(), workspacePath); + this.currentContext = newContext; + return this.currentContext; + } + + /** + * @return the current {@link IdeGuiContext} based on the selected project. + */ + public IdeGuiContext getCurrentContext() { + + return this.currentContext; + } + + /** + * Holder class for the singleton instance. The static keyword ensures the thread-safety of the singleton. + * + * @see More info + */ + private static class Holder { + + private static final IdeGuiContextManager INSTANCE = new IdeGuiContextManager(); + } +} From 3f1569f38aaab8d6609a40e200804243fdbe221e Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Mon, 30 Mar 2026 14:42:35 +0200 Subject: [PATCH 06/31] #1785: Added basic question/confirmation modal implementation - Added logging to IdeGuiStateManager. - Added functionality, that selecting a different project now switches the IdeContext to the new project. --- .../ide/commandlet/TestModalsCommandlet.java | 4 +- .../com/devonfw/ide/gui/IdeGuiContext.java | 41 +++++++++++++++++ ...xtManager.java => IdeGuiStateManager.java} | 31 ++++++++----- .../com/devonfw/ide/gui/MainController.java | 44 +++++++++++-------- 4 files changed, 91 insertions(+), 29 deletions(-) rename gui/src/main/java/com/devonfw/ide/gui/{IdeGuiContextManager.java => IdeGuiStateManager.java} (60%) diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java index 4aa3755f2b..43fa6fd93f 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java @@ -24,6 +24,8 @@ public String getName() { @Override protected void doRun() { - context.question("Test Question", "Yes", "No", "Maybe"); + //context.question("Test Question", "Yes", "No", "Maybe"); + Object result = context.question(new String[] { "Red", "Green", "Blue", "Yellow" }, "Test Checkbox Question", "Yes", "No", "Maybe"); + System.out.println(result); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java index c16732d70a..dae8887154 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java @@ -1,7 +1,14 @@ package com.devonfw.ide.gui; import java.nio.file.Path; +import javafx.scene.control.Alert; +import javafx.scene.control.ButtonType; +import javafx.scene.control.DialogPane; +import javafx.scene.control.RadioButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.VBox; +import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.context.AbstractIdeContext; import com.devonfw.tools.ide.context.IdeStartContextImpl; import com.devonfw.tools.ide.io.IdeProgressBar; @@ -25,12 +32,46 @@ public IdeGuiContext(IdeStartContextImpl startContext, Path workingDirectory) { @Override protected String readLine() { + return ""; } @Override public IdeProgressBar newProgressBar(String title, long size, String unitName, long unitSize) { + return new IdeProgressBarNone(title, 0, unitName, unitSize); } + @Override + public boolean question(String question, Object... args) { + + IdeDialog dialog = new IdeDialog(IdeDialog.AlertType.CONFIRMATION, question); + dialog.showAndWait(); + return dialog.getResult() == ButtonType.YES; + } + + @Override + public O question(O[] options, String question, Object... args) { + + IdeDialog dialog = new IdeDialog(Alert.AlertType.CONFIRMATION, question, ButtonType.APPLY, ButtonType.CANCEL); + + dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(true); + + DialogPane pane = dialog.getDialogPane(); + ToggleGroup group = new ToggleGroup(); + + VBox vbox = new VBox(10); + for (O option : options) { + RadioButton button = new RadioButton(option.toString()); + button.setOnAction(e -> dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(false)); + button.setToggleGroup(group); + vbox.getChildren().add(button); + } + pane.setContent(vbox); + dialog.showAndWait(); + + RadioButton selectedOption = (RadioButton) group.getSelectedToggle(); + + return selectedOption == null ? null : (O) selectedOption.getText(); + } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java similarity index 60% rename from gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java rename to gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java index 0022de7c8b..2fabdb8b94 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContextManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java @@ -3,28 +3,35 @@ import java.io.FileNotFoundException; import java.nio.file.Path; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.devonfw.tools.ide.context.IdeStartContextImpl; +import com.devonfw.tools.ide.log.IdeLogLevel; +import com.devonfw.tools.ide.log.IdeLogListenerBuffer; /** * This class has the purpose of enabling the context state management for the IDEasy GUI. It is a thread-safe singleton implementation (Bill Pugh Singleton). */ -public class IdeGuiContextManager { +public class IdeGuiStateManager { + + private static final Logger LOG = LoggerFactory.getLogger(IdeGuiStateManager.class); - private String projectDirectory; + private final String projectDirectory; /** * Project context based on which project the user works in. */ private IdeGuiContext currentContext; - private IdeGuiContextManager() { + private IdeGuiStateManager() { + this.projectDirectory = System.getenv("IDE_ROOT"); } /** - * @return the singleton instance of the {@link IdeGuiContextManager}. + * @return the singleton instance of the {@link IdeGuiStateManager}. */ - public static IdeGuiContextManager getInstance() { - + public static IdeGuiStateManager getInstance() { return Holder.INSTANCE; } @@ -36,14 +43,18 @@ public static IdeGuiContextManager getInstance() { */ public IdeGuiContext switchContext(String projectName, String workspaceName) throws FileNotFoundException { - Path workspacePath = Path.of(projectDirectory, projectName, workspaceName); + LOG.debug("Switching context to project {} and workspace {}", projectName, workspaceName); + + Path workspacePath = Path.of(projectDirectory, projectName, "workspaces", workspaceName); if (!workspacePath.toFile().exists()) { throw new FileNotFoundException("Workspace " + workspacePath + " does not exist!"); } - IdeGuiContext newContext = new IdeGuiContext(IdeStartContextImpl.get(), workspacePath); - this.currentContext = newContext; + final IdeLogListenerBuffer buffer = new IdeLogListenerBuffer(); + IdeLogLevel logLevel = IdeLogLevel.DEBUG; + IdeStartContextImpl startContext = new IdeStartContextImpl(logLevel, buffer); + this.currentContext = new IdeGuiContext(startContext, workspacePath); return this.currentContext; } @@ -62,6 +73,6 @@ public IdeGuiContext getCurrentContext() { */ private static class Holder { - private static final IdeGuiContextManager INSTANCE = new IdeGuiContextManager(); + private static final IdeGuiStateManager INSTANCE = new IdeGuiStateManager(); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index e153149107..954a5d3cf2 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -1,5 +1,6 @@ package com.devonfw.ide.gui; +import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -8,21 +9,16 @@ import javafx.scene.control.Button; import javafx.scene.control.ComboBox; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +import com.devonfw.ide.gui.modal.IdeDialog; +import com.devonfw.tools.ide.commandlet.TestModalsCommandlet; import com.devonfw.tools.ide.context.IdeContext; -import com.devonfw.tools.ide.context.IdeStartContextImpl; -import com.devonfw.tools.ide.log.IdeLogLevel; -import com.devonfw.tools.ide.log.IdeLogListenerBuffer; +import com.devonfw.tools.ide.variable.IdeVariables; /** * Controller of the main screen of the dashboard GUI. */ public class MainController { - private static Logger LOG = LoggerFactory.getLogger(MainController.class); - @FXML private ComboBox selectedProject; @@ -48,9 +44,8 @@ public class MainController { /** * Constructor */ - public MainController(String directoryPath) { - LOG.debug("IDE_ROOT path={}", directoryPath); - this.directoryPath = directoryPath; + public MainController() { + this.directoryPath = System.getenv(IdeVariables.IDE_ROOT.getName()); } @FXML @@ -86,8 +81,6 @@ private void openVsCode() { private void setProjectsComboBox() { - assert (directoryPath != null) : "directoryPath is null! Please check the setup of your environment variables (IDE_ROOT)"; - selectedProject.getItems().clear(); Path directory = Path.of(directoryPath); @@ -114,6 +107,10 @@ private void setProjectsComboBox() { vsCodeOpen.setDisable(false); selectedWorkspace.setValue("main"); this.workspaceValue = Path.of("main"); + updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); + + //TODO: remove this before PR + IdeGuiStateManager.getInstance().getCurrentContext().getCommandletManager().getCommandlet(TestModalsCommandlet.class).run(); }); } @@ -135,14 +132,25 @@ private void setWorkspaceValue() { } } this.workspaceValue = Path.of(selectedWorkspace.getValue()); + updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); } private void openIDE(String inIde) { - final IdeLogListenerBuffer buffer = new IdeLogListenerBuffer(); - IdeLogLevel logLevel = IdeLogLevel.INFO; - IdeStartContextImpl startContext = new IdeStartContextImpl(logLevel, buffer); - IdeGuiContext context = new IdeGuiContext(startContext, Path.of(this.directoryPath).resolve(this.projectValue).resolve(this.workspaceValue)); - context.getCommandletManager().getCommandlet(inIde).run(); + IdeGuiStateManager + .getInstance() + .getCurrentContext() + .getCommandletManager() + .getCommandlet(inIde) + .run(); + } + + private void updateContext(String selectedProjectName, String selectedWorkspaceName) { + try { + IdeGuiStateManager.getInstance().switchContext(selectedProjectName, selectedWorkspaceName); + } catch (FileNotFoundException e) { + IdeDialog errorDialog = new IdeDialog(IdeDialog.AlertType.ERROR, e.getMessage()); + errorDialog.showAndWait(); + } } } From 7ef65f35cd9ea78f8a078e54c11041cca8eac82f Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Mon, 30 Mar 2026 19:46:59 +0200 Subject: [PATCH 07/31] #1785: - Added logging to IdeGuiStateManager. - Added functionality, that selecting a different project now switches the IdeContext to the new project. --- gui/src/main/java/com/devonfw/ide/gui/App.java | 3 +++ .../java/com/devonfw/ide/gui/IdeGuiContext.java | 2 +- .../java/com/devonfw/ide/gui/MainController.java | 14 +++++++++++--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index 9023131653..20a50063a4 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -1,6 +1,9 @@ package com.devonfw.ide.gui; import java.io.IOException; + +import com.devonfw.tools.ide.variable.IdeVariables; + import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.geometry.Rectangle2D; diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java index dae8887154..2a4c96d69b 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java @@ -72,6 +72,6 @@ public O question(O[] options, String question, Object... args) { RadioButton selectedOption = (RadioButton) group.getSelectedToggle(); - return selectedOption == null ? null : (O) selectedOption.getText(); + return selectedOption == null | dialog.getResult() == ButtonType.CANCEL ? null : (O) selectedOption.getText(); } } diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index 954a5d3cf2..1c2318d3a2 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -9,16 +9,21 @@ import javafx.scene.control.Button; import javafx.scene.control.ComboBox; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.commandlet.TestModalsCommandlet; import com.devonfw.tools.ide.context.IdeContext; -import com.devonfw.tools.ide.variable.IdeVariables; /** * Controller of the main screen of the dashboard GUI. */ public class MainController { + private static Logger LOG = LoggerFactory.getLogger(MainController.class); + + @FXML private ComboBox selectedProject; @@ -44,8 +49,9 @@ public class MainController { /** * Constructor */ - public MainController() { - this.directoryPath = System.getenv(IdeVariables.IDE_ROOT.getName()); + public MainController(String directoryPath) { + LOG.debug("IDE_ROOT path={}", directoryPath); + this.directoryPath = directoryPath; } @FXML @@ -81,6 +87,8 @@ private void openVsCode() { private void setProjectsComboBox() { + assert (directoryPath != null) : "directoryPath is null! Please check the setup of your environment variables (IDE_ROOT)"; + selectedProject.getItems().clear(); Path directory = Path.of(directoryPath); From 1764b2f5b352d9f3006b7520fc6a6f28b4ddfd2c Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Tue, 7 Apr 2026 12:35:20 +0200 Subject: [PATCH 08/31] #1724: implemented basic gui state management --- .../com/devonfw/ide/gui/IdeGuiContext.java | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java index 2a4c96d69b..e56218999f 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java @@ -1,14 +1,7 @@ package com.devonfw.ide.gui; import java.nio.file.Path; -import javafx.scene.control.Alert; -import javafx.scene.control.ButtonType; -import javafx.scene.control.DialogPane; -import javafx.scene.control.RadioButton; -import javafx.scene.control.ToggleGroup; -import javafx.scene.layout.VBox; -import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.context.AbstractIdeContext; import com.devonfw.tools.ide.context.IdeStartContextImpl; import com.devonfw.tools.ide.io.IdeProgressBar; @@ -41,37 +34,4 @@ public IdeProgressBar newProgressBar(String title, long size, String unitName, l return new IdeProgressBarNone(title, 0, unitName, unitSize); } - - @Override - public boolean question(String question, Object... args) { - - IdeDialog dialog = new IdeDialog(IdeDialog.AlertType.CONFIRMATION, question); - dialog.showAndWait(); - return dialog.getResult() == ButtonType.YES; - } - - @Override - public O question(O[] options, String question, Object... args) { - - IdeDialog dialog = new IdeDialog(Alert.AlertType.CONFIRMATION, question, ButtonType.APPLY, ButtonType.CANCEL); - - dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(true); - - DialogPane pane = dialog.getDialogPane(); - ToggleGroup group = new ToggleGroup(); - - VBox vbox = new VBox(10); - for (O option : options) { - RadioButton button = new RadioButton(option.toString()); - button.setOnAction(e -> dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(false)); - button.setToggleGroup(group); - vbox.getChildren().add(button); - } - pane.setContent(vbox); - dialog.showAndWait(); - - RadioButton selectedOption = (RadioButton) group.getSelectedToggle(); - - return selectedOption == null | dialog.getResult() == ButtonType.CANCEL ? null : (O) selectedOption.getText(); - } } From ddd3e5fb8fe1079f74122baff2c72f1824d75750 Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Tue, 7 Apr 2026 12:35:20 +0200 Subject: [PATCH 09/31] #1802: implemented basic gui state management --- .../com/devonfw/ide/gui/IdeGuiContext.java | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java index 2a4c96d69b..e56218999f 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java @@ -1,14 +1,7 @@ package com.devonfw.ide.gui; import java.nio.file.Path; -import javafx.scene.control.Alert; -import javafx.scene.control.ButtonType; -import javafx.scene.control.DialogPane; -import javafx.scene.control.RadioButton; -import javafx.scene.control.ToggleGroup; -import javafx.scene.layout.VBox; -import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.context.AbstractIdeContext; import com.devonfw.tools.ide.context.IdeStartContextImpl; import com.devonfw.tools.ide.io.IdeProgressBar; @@ -41,37 +34,4 @@ public IdeProgressBar newProgressBar(String title, long size, String unitName, l return new IdeProgressBarNone(title, 0, unitName, unitSize); } - - @Override - public boolean question(String question, Object... args) { - - IdeDialog dialog = new IdeDialog(IdeDialog.AlertType.CONFIRMATION, question); - dialog.showAndWait(); - return dialog.getResult() == ButtonType.YES; - } - - @Override - public O question(O[] options, String question, Object... args) { - - IdeDialog dialog = new IdeDialog(Alert.AlertType.CONFIRMATION, question, ButtonType.APPLY, ButtonType.CANCEL); - - dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(true); - - DialogPane pane = dialog.getDialogPane(); - ToggleGroup group = new ToggleGroup(); - - VBox vbox = new VBox(10); - for (O option : options) { - RadioButton button = new RadioButton(option.toString()); - button.setOnAction(e -> dialog.getDialogPane().lookupButton(ButtonType.APPLY).setDisable(false)); - button.setToggleGroup(group); - vbox.getChildren().add(button); - } - pane.setContent(vbox); - dialog.showAndWait(); - - RadioButton selectedOption = (RadioButton) group.getSelectedToggle(); - - return selectedOption == null | dialog.getResult() == ButtonType.CANCEL ? null : (O) selectedOption.getText(); - } } From b28e2161437b23b91d5d2aa98d41ab5d40cd40dc Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Tue, 7 Apr 2026 13:01:47 +0200 Subject: [PATCH 10/31] #1802: removed a few changes so this branch can be the base for other ui feature branches --- .../ide/commandlet/CommandletManagerImpl.java | 1 - .../ide/commandlet/TestModalsCommandlet.java | 31 ------------------- .../com/devonfw/ide/gui/MainController.java | 4 --- 3 files changed, 36 deletions(-) delete mode 100644 cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java index ff9af5cf23..c44f5b7403 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java @@ -147,7 +147,6 @@ public CommandletManagerImpl(IdeContext context) { add(new Corepack(context)); add(new Pip(context)); add(new Go(context)); - add(new TestModalsCommandlet(context)); } /** diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java deleted file mode 100644 index 43fa6fd93f..0000000000 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/TestModalsCommandlet.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.devonfw.tools.ide.commandlet; - -import com.devonfw.tools.ide.context.IdeContext; - -public class TestModalsCommandlet extends Commandlet { - - IdeContext context; - - /** - * The constructor. - * - * @param context the {@link IdeContext}. - */ - public TestModalsCommandlet(IdeContext context) { - super(context); - addKeyword("testQuestion"); - this.context = context; - } - - @Override - public String getName() { - return "testQuestion"; - } - - @Override - protected void doRun() { - //context.question("Test Question", "Yes", "No", "Maybe"); - Object result = context.question(new String[] { "Red", "Green", "Blue", "Yellow" }, "Test Checkbox Question", "Yes", "No", "Maybe"); - System.out.println(result); - } -} diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index 1c2318d3a2..4054f4966d 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -13,7 +13,6 @@ import org.slf4j.LoggerFactory; import com.devonfw.ide.gui.modal.IdeDialog; -import com.devonfw.tools.ide.commandlet.TestModalsCommandlet; import com.devonfw.tools.ide.context.IdeContext; /** @@ -116,9 +115,6 @@ private void setProjectsComboBox() { selectedWorkspace.setValue("main"); this.workspaceValue = Path.of("main"); updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); - - //TODO: remove this before PR - IdeGuiStateManager.getInstance().getCurrentContext().getCommandletManager().getCommandlet(TestModalsCommandlet.class).run(); }); } From 234e98b8a21690832f69b1d42a1953a7b07e128a Mon Sep 17 00:00:00 2001 From: laim2003 Date: Thu, 9 Apr 2026 13:29:07 +0200 Subject: [PATCH 11/31] #1802: disabled javadoc warning --- gui/src/main/java/com/devonfw/ide/gui/AppLauncher.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/AppLauncher.java b/gui/src/main/java/com/devonfw/ide/gui/AppLauncher.java index aac16bfb9b..916f511b98 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/AppLauncher.java +++ b/gui/src/main/java/com/devonfw/ide/gui/AppLauncher.java @@ -2,10 +2,11 @@ /** * Launcher class for the App. Workaround for "Error: JavaFX runtime components are missing, and are required to run this application." Inspired by - * StackOverflow + * StackOverflow */ public class AppLauncher { + @SuppressWarnings("MissingJavadoc") public static void main(final String[] args) { App.main(args); From 1c4e766247a435f9f47df3f00c2b42e187126712 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Thu, 9 Apr 2026 17:24:23 +0200 Subject: [PATCH 12/31] #1802: - fixed AppBaseTest being stuck - added DI for IdeGuiStateManager.switchContext --- gui/pom.xml | 1 + gui/src/main/java/com/devonfw/ide/gui/App.java | 17 ++++++++++++++--- .../com/devonfw/ide/gui/IdeGuiStateManager.java | 17 ++++++++++++++++- .../com/devonfw/ide/gui/main-view.fxml | 2 +- .../java/com/devonfw/ide/gui/AppBaseTest.java | 11 ++++++++--- .../ide/gui/HeadlessApplicationTest.java | 5 +++-- 6 files changed, 43 insertions(+), 10 deletions(-) diff --git a/gui/pom.xml b/gui/pom.xml index c581b1dd09..f78ea6e2ec 100644 --- a/gui/pom.xml +++ b/gui/pom.xml @@ -56,6 +56,7 @@ org.testfx openjfx-monocle + 21.0.2 test diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index 20a50063a4..4809e232c9 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -1,10 +1,8 @@ package com.devonfw.ide.gui; import java.io.IOException; - -import com.devonfw.tools.ide.variable.IdeVariables; - import javafx.application.Application; +import javafx.application.Platform; import javafx.fxml.FXMLLoader; import javafx.geometry.Rectangle2D; import javafx.scene.Parent; @@ -13,6 +11,11 @@ import javafx.stage.Screen; import javafx.stage.Stage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.devonfw.ide.gui.modal.IdeDialog; +import com.devonfw.tools.ide.variable.IdeVariables; import com.devonfw.tools.ide.version.IdeVersion; /** @@ -22,9 +25,17 @@ public class App extends Application { Parent root; + private static final Logger LOG = LoggerFactory.getLogger(App.class); + @Override public void start(Stage primaryStage) throws IOException { + Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { + LOG.info("Uncaught exception in thread {}: {}", thread.getName(), throwable.getMessage(), throwable); + Platform.runLater(() -> new IdeDialog(IdeDialog.AlertType.ERROR, throwable.getMessage()).showAndWait()); + } + ); + FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource("main-view.fxml")); fxmlLoader.setController( new MainController(System.getenv(IdeVariables.IDE_ROOT.getName())) diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java index 2fabdb8b94..598c09ae12 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java @@ -17,7 +17,7 @@ public class IdeGuiStateManager { private static final Logger LOG = LoggerFactory.getLogger(IdeGuiStateManager.class); - private final String projectDirectory; + private String projectDirectory; /** * Project context based on which project the user works in. @@ -58,6 +58,21 @@ public IdeGuiContext switchContext(String projectName, String workspaceName) thr return this.currentContext; } + /** + * This variant of the {@link #switchContext(String, String)} method is used when the IDE_ROOT environment variable has to be set manually. USE WITH CARE. + * (e.g. in tests) + * + * @param rootDirectory root directory for the ide projects. + * @param projectName 1st level folder of the project + * @param workspaceName used workspace + * @return the new {@link IdeGuiContext} for the selected project and workspace. + * @throws FileNotFoundException id either the specified project folder or workspace does not exist. + */ + protected IdeGuiContext switchContext(Path rootDirectory, String projectName, String workspaceName) throws FileNotFoundException { + this.projectDirectory = rootDirectory.toString(); + return switchContext(projectName, workspaceName); + } + /** * @return the current {@link IdeGuiContext} based on the selected project. */ diff --git a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml index eafdea657a..6a19d8b517 100644 --- a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml +++ b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml @@ -12,7 +12,7 @@ - + diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index 423de657e0..8673054fed 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -2,6 +2,7 @@ import static org.testfx.assertions.api.Assertions.assertThat; +import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; import java.nio.file.Path; @@ -15,6 +16,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.CleanupMode; import org.junit.jupiter.api.io.TempDir; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,7 +31,7 @@ public class AppBaseTest extends HeadlessApplicationTest { private Button androidStudioOpen, eclipseOpen, intellijOpen, vsCodeOpen; private ComboBox selectedProject, selectedWorkspace; - @TempDir + @TempDir(cleanup = CleanupMode.ON_SUCCESS) private static Path temporayProjectDirectoryPath; @Override @@ -58,7 +60,7 @@ public void start(Stage stage) throws IOException { * to work in the test context. Generates a structure like this: /project-[0..6]/workspaces/main */ @BeforeAll - public static void generateProjectFolderStructure() { + protected static void generateProjectFolderStructure() throws FileNotFoundException { LOGGER.debug("tempDir: {}", temporayProjectDirectoryPath); for (int i = 0; i <= 5; i++) { @@ -74,7 +76,10 @@ public static void generateProjectFolderStructure() { "Unable to create mock main workspace directory for mock project " + i) .isTrue(); } - LOGGER.debug("project folders: {}", Arrays.toString(temporayProjectDirectoryPath.toFile().list())); + LOGGER.info("project folders: {}", Arrays.toString(temporayProjectDirectoryPath.toFile().list())); + + //We set the project root directory to the temporary directory before all tests, so that the IDE can find the projects in the test. + IdeGuiStateManager.getInstance().switchContext(temporayProjectDirectoryPath, "project-1", "main"); } /** diff --git a/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java b/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java index 2e7298caac..3b51b66787 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java @@ -15,10 +15,11 @@ public abstract class HeadlessApplicationTest extends ApplicationTest { System.setProperty("testfx.robot", "glass"); System.setProperty("testfx.headless", "true"); - System.setProperty("glass.platform", "Monocle"); System.setProperty("prism.order", "sw"); System.setProperty("prism.text", "t2k"); - System.setProperty("testfx.setup.timeout", "10000"); // increased timeout for testing on server-side CIs System.setProperty("java.awt.headless", "true"); + System.setProperty("glass.platform", "Monocle"); + System.setProperty("monocle.platform", "Headless"); + System.setProperty("testfx.setup.timeout", "10000"); // increased timeout for testing on server-side CIs } } From 2026757ec0feb515faf6556f9bcde02e6581a87d Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 14 Apr 2026 17:45:14 +0200 Subject: [PATCH 13/31] #1802: Added ProjectManager class to handle business logic of reading the list of workspaces/projects instead of reading those from the UI --- .../com/devonfw/ide/gui/MainController.java | 45 +++---- .../ide/gui/{ => context}/IdeGuiContext.java | 4 +- .../gui/{ => context}/IdeGuiStateManager.java | 17 ++- .../ide/gui/context/ProjectManager.java | 118 ++++++++++++++++++ .../java/com/devonfw/ide/gui/AppBaseTest.java | 2 + 5 files changed, 152 insertions(+), 34 deletions(-) rename gui/src/main/java/com/devonfw/ide/gui/{ => context}/IdeGuiContext.java (96%) rename gui/src/main/java/com/devonfw/ide/gui/{ => context}/IdeGuiStateManager.java (86%) create mode 100644 gui/src/main/java/com/devonfw/ide/gui/context/ProjectManager.java diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index 4054f4966d..333ae4a494 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -1,10 +1,8 @@ package com.devonfw.ide.gui; import java.io.FileNotFoundException; -import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; -import java.util.stream.Stream; +import java.util.List; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; @@ -12,6 +10,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.devonfw.ide.gui.context.IdeGuiStateManager; +import com.devonfw.ide.gui.context.ProjectManager; import com.devonfw.ide.gui.modal.IdeDialog; import com.devonfw.tools.ide.context.IdeContext; @@ -22,6 +22,8 @@ public class MainController { private static Logger LOG = LoggerFactory.getLogger(MainController.class); + private ProjectManager projectManager; + @FXML private ComboBox selectedProject; @@ -49,8 +51,11 @@ public class MainController { * Constructor */ public MainController(String directoryPath) { + LOG.debug("IDE_ROOT path={}", directoryPath); this.directoryPath = directoryPath; + + this.projectManager = IdeGuiStateManager.getInstance().getProjectManager(); } @FXML @@ -88,21 +93,10 @@ private void setProjectsComboBox() { assert (directoryPath != null) : "directoryPath is null! Please check the setup of your environment variables (IDE_ROOT)"; + List projects = projectManager.getProjectNames(); + selectedProject.getItems().clear(); - Path directory = Path.of(directoryPath); - - if (Files.exists(directory) && Files.isDirectory(directory)) { - try (Stream subPaths = Files.list(directory)) { - subPaths - .filter(Files::isDirectory) - .map(Path::getFileName) - .map(Path::toString) - .filter(name -> !name.startsWith("_")) - .forEach(name -> selectedProject.getItems().add(name)); - } catch (IOException e) { - throw new IllegalStateException("Failed to list projects!", e); - } - } + selectedProject.getItems().addAll(projects); selectedProject.setOnAction(actionEvent -> { @@ -121,20 +115,11 @@ private void setProjectsComboBox() { @FXML private void setWorkspaceValue() { + List workspaces = projectManager.getWorkspaceNames(selectedProject.getValue()); + selectedWorkspace.getItems().clear(); - Path directory = Path.of(directoryPath).resolve(projectValue); - if (Files.exists(directory) && Files.isDirectory(directory)) { - try (Stream subPaths = Files.list(directory)) { - subPaths - .filter(Files::isDirectory) - .map(Path::getFileName) - .map(Path::toString) - .forEach(name -> selectedWorkspace.getItems().add(name)); - - } catch (IOException e) { - throw new RuntimeException("Error occurred while fetching workspace names.", e); - } - } + selectedWorkspace.getItems().addAll(workspaces); + this.workspaceValue = Path.of(selectedWorkspace.getValue()); updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); } diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiContext.java similarity index 96% rename from gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java rename to gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiContext.java index e56218999f..221e9325c3 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiContext.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiContext.java @@ -1,4 +1,4 @@ -package com.devonfw.ide.gui; +package com.devonfw.ide.gui.context; import java.nio.file.Path; @@ -12,7 +12,6 @@ */ public class IdeGuiContext extends AbstractIdeContext { - /** * The constructor. * @@ -20,6 +19,7 @@ public class IdeGuiContext extends AbstractIdeContext { * @param workingDirectory the optional {@link Path} to current working directory. */ public IdeGuiContext(IdeStartContextImpl startContext, Path workingDirectory) { + super(startContext, workingDirectory); } diff --git a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java similarity index 86% rename from gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java rename to gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index 598c09ae12..8c1eb392fe 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -1,4 +1,4 @@ -package com.devonfw.ide.gui; +package com.devonfw.ide.gui.context; import java.io.FileNotFoundException; import java.nio.file.Path; @@ -19,13 +19,22 @@ public class IdeGuiStateManager { private String projectDirectory; + private ProjectManager projectManager; + /** * Project context based on which project the user works in. */ private IdeGuiContext currentContext; private IdeGuiStateManager() { + this.projectDirectory = System.getenv("IDE_ROOT"); + + if (this.projectDirectory == null) { + throw new IllegalStateException("IDE_ROOT environment variable is not set!"); + } + + this.projectManager = new ProjectManager(Path.of(projectDirectory)); } /** @@ -68,7 +77,7 @@ public IdeGuiContext switchContext(String projectName, String workspaceName) thr * @return the new {@link IdeGuiContext} for the selected project and workspace. * @throws FileNotFoundException id either the specified project folder or workspace does not exist. */ - protected IdeGuiContext switchContext(Path rootDirectory, String projectName, String workspaceName) throws FileNotFoundException { + public IdeGuiContext switchContext(Path rootDirectory, String projectName, String workspaceName) throws FileNotFoundException { this.projectDirectory = rootDirectory.toString(); return switchContext(projectName, workspaceName); } @@ -81,6 +90,10 @@ public IdeGuiContext getCurrentContext() { return this.currentContext; } + public ProjectManager getProjectManager() { + return projectManager; + } + /** * Holder class for the singleton instance. The static keyword ensures the thread-safety of the singleton. * diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/ProjectManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/ProjectManager.java new file mode 100644 index 0000000000..87354f5186 --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/context/ProjectManager.java @@ -0,0 +1,118 @@ +package com.devonfw.ide.gui.context; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Stream; + +import org.jline.utils.Log; + +/** + * Service class that allows to access the list of projects + */ +public class ProjectManager { + + private final Path ideRootDirectory; + + private final ArrayList projectNames = new ArrayList<>(); + private final HashMap> workspaces = new HashMap<>(); + + /** + * Service class that reads the list of projects/workspaces + * + * @param ideRootDirectory IDE_ROOT ENV variable value + */ + /* + * Protected: Class should only be accessed by the code via the {@link IdeGuiStateManager} + * Why not in the IdeGuiContext? Reasoning is, that you might want to read the list of projects without being already in the project context + */ + protected ProjectManager(Path ideRootDirectory) { + + this.ideRootDirectory = ideRootDirectory; + + if (ideRootDirectory == null) { + throw new IllegalArgumentException("Root directory is null"); + } else if (!Files.exists(ideRootDirectory)) { + throw new IllegalArgumentException("Root directory does not exist"); + } else if (!Files.isDirectory(ideRootDirectory)) { + throw new IllegalArgumentException("Root directory is not a directory"); + } + + refreshProjects(); + } + + /** + * re-reads the list of projects/workspaces + */ + public void refreshProjects() { + projectNames.clear(); + workspaces.clear(); + + readProjects(); + readWorkspaces(); + } + + /** + * read all projects in the users IDE_ROOT directory + */ + private void readProjects() { + + try (Stream subPaths = Files.list(ideRootDirectory)) { + subPaths + .filter(Files::isDirectory) + .map(Path::getFileName) + .map(Path::toString) + .filter(name -> !name.startsWith("_") && Files.exists(ideRootDirectory.resolve(name).resolve("workspaces"))) + .forEach(projectNames::add); + } catch (IOException e) { + Log.error("Failed to read project list!", e); + throw new IllegalStateException("Failed to read project list!", e); + } + } + + /** + * reads all workspaces of all loaded projects. + */ + protected void readWorkspaces() { + + assert !projectNames.isEmpty() : "No projects initialized, cannot read workspaces!"; + + for (String projectName : projectNames) { + Path projectDirectory = ideRootDirectory.resolve(projectName); + Path workspacesDirectory = projectDirectory.resolve("workspaces"); + + ArrayList workspaceNames = new ArrayList<>(); + + try (Stream subPaths = Files.list(workspacesDirectory)) { + subPaths + .filter(Files::isDirectory) + .map(Path::getFileName) + .map(Path::toString) + .forEach(workspaceNames::add); + + workspaces.put(projectName, workspaceNames); + } catch (IOException e) { + Log.error("Error occurred while fetching workspace names.", e); + throw new RuntimeException("Error occurred while fetching workspace names.", e); + } + } + } + + /** + * @return the list of project (names) in the project directory + */ + public List getProjectNames() { + return projectNames; + } + + /** + * @param projectName name of the project for which the workspace names should be returned + * @return the list of workspace (names) for the given project name + */ + public List getWorkspaceNames(String projectName) { + return workspaces.get(projectName); + } +} diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index 8673054fed..f32f3f047a 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -21,6 +21,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.devonfw.ide.gui.context.IdeGuiStateManager; + /** * Basic UI Test */ From c76e1850ebabf707a85206761de25c13a913fece Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 14 Apr 2026 18:12:49 +0200 Subject: [PATCH 14/31] #1802: Updated IdeGuiStateManager to also update its projectManager, when switchContext(Path rootDirectory, ...) is called. --- .../java/com/devonfw/ide/gui/context/IdeGuiStateManager.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index 8c1eb392fe..b0e3f05393 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -31,7 +31,7 @@ private IdeGuiStateManager() { this.projectDirectory = System.getenv("IDE_ROOT"); if (this.projectDirectory == null) { - throw new IllegalStateException("IDE_ROOT environment variable is not set!"); + LOG.warn("IDE_ROOT environment variable is not set! Any dependent operation will fail before switchContext is called"); } this.projectManager = new ProjectManager(Path.of(projectDirectory)); @@ -78,7 +78,10 @@ public IdeGuiContext switchContext(String projectName, String workspaceName) thr * @throws FileNotFoundException id either the specified project folder or workspace does not exist. */ public IdeGuiContext switchContext(Path rootDirectory, String projectName, String workspaceName) throws FileNotFoundException { + this.projectDirectory = rootDirectory.toString(); + this.projectManager = new ProjectManager(rootDirectory); + return switchContext(projectName, workspaceName); } From 6f92d9390c168e4b5efb9c0c308d61632f277031 Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Wed, 15 Apr 2026 11:32:17 +0200 Subject: [PATCH 15/31] #1802: javafx updated to java 25 --- gui/pom.xml | 1 - .../com/devonfw/ide/gui/main-view.fxml | 100 +++++++++--------- pom.xml | 2 +- 3 files changed, 53 insertions(+), 50 deletions(-) diff --git a/gui/pom.xml b/gui/pom.xml index f78ea6e2ec..c581b1dd09 100644 --- a/gui/pom.xml +++ b/gui/pom.xml @@ -56,7 +56,6 @@ org.testfx openjfx-monocle - 21.0.2 test diff --git a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml index 6a19d8b517..0ce3546a95 100644 --- a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml +++ b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml @@ -1,126 +1,129 @@ - - - - - - - - - - + + + + - - + - + - + - - + - - + - +
- - + + - + - + - + - - + - + - + - - + - + - + - diff --git a/pom.xml b/pom.xml index d4651d71a6..962dbfe68e 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ 2.18.3 2.11.0 3.11.0 - 21 + 25 4.0.18 0.10.6 3.7.1 From 48fe018d83b847f5e0bcc756ad3e6ab44076929b Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 21 Apr 2026 12:46:29 +0200 Subject: [PATCH 16/31] Revert "#1802: javafx updated to java 25" This reverts commit 6f92d9390c168e4b5efb9c0c308d61632f277031. --- gui/pom.xml | 1 + .../com/devonfw/ide/gui/main-view.fxml | 100 +++++++++--------- pom.xml | 2 +- 3 files changed, 50 insertions(+), 53 deletions(-) diff --git a/gui/pom.xml b/gui/pom.xml index c581b1dd09..f78ea6e2ec 100644 --- a/gui/pom.xml +++ b/gui/pom.xml @@ -56,6 +56,7 @@ org.testfx openjfx-monocle + 21.0.2 test diff --git a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml index 0ce3546a95..6a19d8b517 100644 --- a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml +++ b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml @@ -1,129 +1,126 @@ - - - - + + + + + + + + + + - + + - + - + - - + - - + - +
- - + + - + - + - + - - + - + - + - - + - + - + - diff --git a/pom.xml b/pom.xml index 962dbfe68e..d4651d71a6 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ 2.18.3 2.11.0 3.11.0 - 25 + 21 4.0.18 0.10.6 3.7.1 From e0ad0152a1d9422f942a134bd26dede8decd33c7 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 21 Apr 2026 16:47:44 +0200 Subject: [PATCH 17/31] #1803: added DI for IDE_ROOT in GuiStateManager --- .../ide/gui/context/IdeGuiStateManager.java | 17 +++++++++++++-- .../java/com/devonfw/ide/gui/AppBaseTest.java | 21 +++++++------------ ...onTest.java => IdeGuiApplicationTest.java} | 17 ++++++++++++++- 3 files changed, 39 insertions(+), 16 deletions(-) rename gui/src/test/java/com/devonfw/ide/gui/{HeadlessApplicationTest.java => IdeGuiApplicationTest.java} (70%) diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index b0e3f05393..65fd9913ea 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -31,7 +31,7 @@ private IdeGuiStateManager() { this.projectDirectory = System.getenv("IDE_ROOT"); if (this.projectDirectory == null) { - LOG.warn("IDE_ROOT environment variable is not set! Any dependent operation will fail before switchContext is called"); + LOG.warn("IDE_ROOT environment variable is not set! This might lead to unexpected behavior!"); } this.projectManager = new ProjectManager(Path.of(projectDirectory)); @@ -44,6 +44,19 @@ public static IdeGuiStateManager getInstance() { return Holder.INSTANCE; } + /** + * This method is used in cases where the IDE_ROOT environment variable is not set, e.g. in test contexts on GitHub actions. This method will retrieve the + * current instance, set the project directory manually an then return the updated instance. USE WITH CARE. + * + * @param ideRoot root directory for the ide projects. + * @return the singleton instance of the {@link IdeGuiStateManager}. + */ + public static IdeGuiStateManager getInstance(String ideRoot) { + IdeGuiStateManager instance = Holder.INSTANCE; + instance.projectDirectory = ideRoot; + return instance; + } + /** * @param projectName name of the project folder * @param workspaceName name of the workspace folder @@ -78,7 +91,7 @@ public IdeGuiContext switchContext(String projectName, String workspaceName) thr * @throws FileNotFoundException id either the specified project folder or workspace does not exist. */ public IdeGuiContext switchContext(Path rootDirectory, String projectName, String workspaceName) throws FileNotFoundException { - + this.projectDirectory = rootDirectory.toString(); this.projectManager = new ProjectManager(rootDirectory); diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index f32f3f047a..786d2ed6e1 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -5,7 +5,6 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; -import java.nio.file.Path; import java.util.Arrays; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; @@ -16,8 +15,6 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.CleanupMode; -import org.junit.jupiter.api.io.TempDir; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,15 +23,13 @@ /** * Basic UI Test */ -public class AppBaseTest extends HeadlessApplicationTest { +public class AppBaseTest extends IdeGuiApplicationTest { private static Logger LOGGER = LoggerFactory.getLogger(AppBaseTest.class); private Button androidStudioOpen, eclipseOpen, intellijOpen, vsCodeOpen; private ComboBox selectedProject, selectedWorkspace; - @TempDir(cleanup = CleanupMode.ON_SUCCESS) - private static Path temporayProjectDirectoryPath; @Override public void start(Stage stage) throws IOException { @@ -43,7 +38,7 @@ public void start(Stage stage) throws IOException { assertThat(mainViewUrl).as("Cannot resolve main UI FXML resource!").isNotNull(); FXMLLoader fxmlLoader = new FXMLLoader(mainViewUrl); - fxmlLoader.setController(new MainController(temporayProjectDirectoryPath.toString())); + fxmlLoader.setController(new MainController(getMockIdeRoot().toString())); Parent root = fxmlLoader.load(); stage.setScene(new Scene(root)); stage.requestFocus(); //sometimes needed for headless setup to work @@ -64,24 +59,24 @@ public void start(Stage stage) throws IOException { @BeforeAll protected static void generateProjectFolderStructure() throws FileNotFoundException { - LOGGER.debug("tempDir: {}", temporayProjectDirectoryPath); + LOGGER.debug("tempDir: {}", getMockIdeRoot()); for (int i = 0; i <= 5; i++) { String projectFolderName = "project-" + i; - assertThat(temporayProjectDirectoryPath.resolve(projectFolderName).toFile().mkdir()) + assertThat(getMockIdeRoot().resolve(projectFolderName).toFile().mkdir()) .as("Unable to create mock project directory for mock project " + i) .isTrue(); - assertThat(temporayProjectDirectoryPath.resolve(projectFolderName).resolve("workspaces").toFile().mkdir()) + assertThat(getMockIdeRoot().resolve(projectFolderName).resolve("workspaces").toFile().mkdir()) .as("Unable to create mock workspaces directory for mock project " + i) .isTrue(); - assertThat(temporayProjectDirectoryPath.resolve(projectFolderName).resolve("workspaces").resolve("main").toFile().mkdir()) + assertThat(getMockIdeRoot().resolve(projectFolderName).resolve("workspaces").resolve("main").toFile().mkdir()) .as( "Unable to create mock main workspace directory for mock project " + i) .isTrue(); } - LOGGER.info("project folders: {}", Arrays.toString(temporayProjectDirectoryPath.toFile().list())); + LOGGER.info("project folders: {}", Arrays.toString(getMockIdeRoot().toFile().list())); //We set the project root directory to the temporary directory before all tests, so that the IDE can find the projects in the test. - IdeGuiStateManager.getInstance().switchContext(temporayProjectDirectoryPath, "project-1", "main"); + IdeGuiStateManager.getInstance(getMockIdeRoot().toString()).switchContext(getMockIdeRoot(), "project-1", "main"); } /** diff --git a/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java similarity index 70% rename from gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java rename to gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java index 3b51b66787..18802dbddb 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java @@ -1,5 +1,9 @@ package com.devonfw.ide.gui; +import java.nio.file.Path; + +import org.junit.jupiter.api.io.CleanupMode; +import org.junit.jupiter.api.io.TempDir; import org.testfx.framework.junit5.ApplicationTest; /** @@ -8,7 +12,10 @@ * @see UI-Tests: Ein umfassender Leitfaden * @see Best Practices for UI Testing */ -public abstract class HeadlessApplicationTest extends ApplicationTest { +public abstract class IdeGuiApplicationTest extends ApplicationTest { + + @TempDir(cleanup = CleanupMode.ON_SUCCESS) + private static Path mockIdeRoot; //setting up for headless testing static { @@ -22,4 +29,12 @@ public abstract class HeadlessApplicationTest extends ApplicationTest { System.setProperty("monocle.platform", "Headless"); System.setProperty("testfx.setup.timeout", "10000"); // increased timeout for testing on server-side CIs } + + /** + * @return a mock {@link Path} to a temporary IDE_ROOT directory. + */ + public static Path getMockIdeRoot() { + + return mockIdeRoot; + } } From 2c9fc55ecf8a3ef6df7a5d17fb8d4cb1d89775ec Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 21 Apr 2026 16:47:44 +0200 Subject: [PATCH 18/31] #1802: added DI for IDE_ROOT in GuiStateManager --- .../ide/gui/context/IdeGuiStateManager.java | 17 +++++++++++++-- .../java/com/devonfw/ide/gui/AppBaseTest.java | 21 +++++++------------ ...onTest.java => IdeGuiApplicationTest.java} | 17 ++++++++++++++- 3 files changed, 39 insertions(+), 16 deletions(-) rename gui/src/test/java/com/devonfw/ide/gui/{HeadlessApplicationTest.java => IdeGuiApplicationTest.java} (70%) diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index b0e3f05393..65fd9913ea 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -31,7 +31,7 @@ private IdeGuiStateManager() { this.projectDirectory = System.getenv("IDE_ROOT"); if (this.projectDirectory == null) { - LOG.warn("IDE_ROOT environment variable is not set! Any dependent operation will fail before switchContext is called"); + LOG.warn("IDE_ROOT environment variable is not set! This might lead to unexpected behavior!"); } this.projectManager = new ProjectManager(Path.of(projectDirectory)); @@ -44,6 +44,19 @@ public static IdeGuiStateManager getInstance() { return Holder.INSTANCE; } + /** + * This method is used in cases where the IDE_ROOT environment variable is not set, e.g. in test contexts on GitHub actions. This method will retrieve the + * current instance, set the project directory manually an then return the updated instance. USE WITH CARE. + * + * @param ideRoot root directory for the ide projects. + * @return the singleton instance of the {@link IdeGuiStateManager}. + */ + public static IdeGuiStateManager getInstance(String ideRoot) { + IdeGuiStateManager instance = Holder.INSTANCE; + instance.projectDirectory = ideRoot; + return instance; + } + /** * @param projectName name of the project folder * @param workspaceName name of the workspace folder @@ -78,7 +91,7 @@ public IdeGuiContext switchContext(String projectName, String workspaceName) thr * @throws FileNotFoundException id either the specified project folder or workspace does not exist. */ public IdeGuiContext switchContext(Path rootDirectory, String projectName, String workspaceName) throws FileNotFoundException { - + this.projectDirectory = rootDirectory.toString(); this.projectManager = new ProjectManager(rootDirectory); diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index f32f3f047a..786d2ed6e1 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -5,7 +5,6 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; -import java.nio.file.Path; import java.util.Arrays; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; @@ -16,8 +15,6 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.CleanupMode; -import org.junit.jupiter.api.io.TempDir; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,15 +23,13 @@ /** * Basic UI Test */ -public class AppBaseTest extends HeadlessApplicationTest { +public class AppBaseTest extends IdeGuiApplicationTest { private static Logger LOGGER = LoggerFactory.getLogger(AppBaseTest.class); private Button androidStudioOpen, eclipseOpen, intellijOpen, vsCodeOpen; private ComboBox selectedProject, selectedWorkspace; - @TempDir(cleanup = CleanupMode.ON_SUCCESS) - private static Path temporayProjectDirectoryPath; @Override public void start(Stage stage) throws IOException { @@ -43,7 +38,7 @@ public void start(Stage stage) throws IOException { assertThat(mainViewUrl).as("Cannot resolve main UI FXML resource!").isNotNull(); FXMLLoader fxmlLoader = new FXMLLoader(mainViewUrl); - fxmlLoader.setController(new MainController(temporayProjectDirectoryPath.toString())); + fxmlLoader.setController(new MainController(getMockIdeRoot().toString())); Parent root = fxmlLoader.load(); stage.setScene(new Scene(root)); stage.requestFocus(); //sometimes needed for headless setup to work @@ -64,24 +59,24 @@ public void start(Stage stage) throws IOException { @BeforeAll protected static void generateProjectFolderStructure() throws FileNotFoundException { - LOGGER.debug("tempDir: {}", temporayProjectDirectoryPath); + LOGGER.debug("tempDir: {}", getMockIdeRoot()); for (int i = 0; i <= 5; i++) { String projectFolderName = "project-" + i; - assertThat(temporayProjectDirectoryPath.resolve(projectFolderName).toFile().mkdir()) + assertThat(getMockIdeRoot().resolve(projectFolderName).toFile().mkdir()) .as("Unable to create mock project directory for mock project " + i) .isTrue(); - assertThat(temporayProjectDirectoryPath.resolve(projectFolderName).resolve("workspaces").toFile().mkdir()) + assertThat(getMockIdeRoot().resolve(projectFolderName).resolve("workspaces").toFile().mkdir()) .as("Unable to create mock workspaces directory for mock project " + i) .isTrue(); - assertThat(temporayProjectDirectoryPath.resolve(projectFolderName).resolve("workspaces").resolve("main").toFile().mkdir()) + assertThat(getMockIdeRoot().resolve(projectFolderName).resolve("workspaces").resolve("main").toFile().mkdir()) .as( "Unable to create mock main workspace directory for mock project " + i) .isTrue(); } - LOGGER.info("project folders: {}", Arrays.toString(temporayProjectDirectoryPath.toFile().list())); + LOGGER.info("project folders: {}", Arrays.toString(getMockIdeRoot().toFile().list())); //We set the project root directory to the temporary directory before all tests, so that the IDE can find the projects in the test. - IdeGuiStateManager.getInstance().switchContext(temporayProjectDirectoryPath, "project-1", "main"); + IdeGuiStateManager.getInstance(getMockIdeRoot().toString()).switchContext(getMockIdeRoot(), "project-1", "main"); } /** diff --git a/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java similarity index 70% rename from gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java rename to gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java index 3b51b66787..18802dbddb 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java @@ -1,5 +1,9 @@ package com.devonfw.ide.gui; +import java.nio.file.Path; + +import org.junit.jupiter.api.io.CleanupMode; +import org.junit.jupiter.api.io.TempDir; import org.testfx.framework.junit5.ApplicationTest; /** @@ -8,7 +12,10 @@ * @see UI-Tests: Ein umfassender Leitfaden * @see Best Practices for UI Testing */ -public abstract class HeadlessApplicationTest extends ApplicationTest { +public abstract class IdeGuiApplicationTest extends ApplicationTest { + + @TempDir(cleanup = CleanupMode.ON_SUCCESS) + private static Path mockIdeRoot; //setting up for headless testing static { @@ -22,4 +29,12 @@ public abstract class HeadlessApplicationTest extends ApplicationTest { System.setProperty("monocle.platform", "Headless"); System.setProperty("testfx.setup.timeout", "10000"); // increased timeout for testing on server-side CIs } + + /** + * @return a mock {@link Path} to a temporary IDE_ROOT directory. + */ + public static Path getMockIdeRoot() { + + return mockIdeRoot; + } } From 40ff54e0cdbc28aae9c09617582e5966cc59d3d0 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 21 Apr 2026 17:18:37 +0200 Subject: [PATCH 19/31] #1802: Workaround for IDE_ROOT=null issue. The ideRoot in GuiStateManager is now set when calling getInstance(), allowing us to provide a getInstance() method with a DI parameter --- .../ide/gui/context/IdeGuiStateManager.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index 65fd9913ea..754cc4a52e 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -27,20 +27,20 @@ public class IdeGuiStateManager { private IdeGuiContext currentContext; private IdeGuiStateManager() { - - this.projectDirectory = System.getenv("IDE_ROOT"); - - if (this.projectDirectory == null) { - LOG.warn("IDE_ROOT environment variable is not set! This might lead to unexpected behavior!"); - } - - this.projectManager = new ProjectManager(Path.of(projectDirectory)); } /** * @return the singleton instance of the {@link IdeGuiStateManager}. */ public static IdeGuiStateManager getInstance() { + IdeGuiStateManager instance = Holder.INSTANCE; + if (instance.projectDirectory == null) { + String ideRoot = System.getenv("IDE_ROOT"); + if (ideRoot == null) { + throw new IllegalStateException("IDE_ROOT environment variable is not set!"); + } + instance.projectManager = new ProjectManager(Path.of(ideRoot)); + } return Holder.INSTANCE; } @@ -52,8 +52,12 @@ public static IdeGuiStateManager getInstance() { * @return the singleton instance of the {@link IdeGuiStateManager}. */ public static IdeGuiStateManager getInstance(String ideRoot) { + if (ideRoot == null) { + throw new IllegalArgumentException("ideRoot must not be null!"); + } IdeGuiStateManager instance = Holder.INSTANCE; instance.projectDirectory = ideRoot; + instance.projectManager = new ProjectManager(Path.of(ideRoot)); return instance; } @@ -107,6 +111,7 @@ public IdeGuiContext getCurrentContext() { } public ProjectManager getProjectManager() { + return projectManager; } @@ -117,6 +122,6 @@ public ProjectManager getProjectManager() { */ private static class Holder { - private static final IdeGuiStateManager INSTANCE = new IdeGuiStateManager(); + private static IdeGuiStateManager INSTANCE = new IdeGuiStateManager(); } } From 0b67210b30c958026d37c80a51c2464163db20c2 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 21 Apr 2026 17:44:21 +0200 Subject: [PATCH 20/31] #1802: removed redundant DI variant of switchContext() (DI via getInstance()) (see previous commit) --- gui/pom.xml | 1 - .../ide/gui/context/IdeGuiStateManager.java | 18 ------------------ .../java/com/devonfw/ide/gui/AppBaseTest.java | 2 +- 3 files changed, 1 insertion(+), 20 deletions(-) diff --git a/gui/pom.xml b/gui/pom.xml index f78ea6e2ec..c581b1dd09 100644 --- a/gui/pom.xml +++ b/gui/pom.xml @@ -56,7 +56,6 @@ org.testfx openjfx-monocle - 21.0.2 test diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index 754cc4a52e..551994d738 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -84,24 +84,6 @@ public IdeGuiContext switchContext(String projectName, String workspaceName) thr return this.currentContext; } - /** - * This variant of the {@link #switchContext(String, String)} method is used when the IDE_ROOT environment variable has to be set manually. USE WITH CARE. - * (e.g. in tests) - * - * @param rootDirectory root directory for the ide projects. - * @param projectName 1st level folder of the project - * @param workspaceName used workspace - * @return the new {@link IdeGuiContext} for the selected project and workspace. - * @throws FileNotFoundException id either the specified project folder or workspace does not exist. - */ - public IdeGuiContext switchContext(Path rootDirectory, String projectName, String workspaceName) throws FileNotFoundException { - - this.projectDirectory = rootDirectory.toString(); - this.projectManager = new ProjectManager(rootDirectory); - - return switchContext(projectName, workspaceName); - } - /** * @return the current {@link IdeGuiContext} based on the selected project. */ diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index 786d2ed6e1..b9c10ba958 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -76,7 +76,7 @@ protected static void generateProjectFolderStructure() throws FileNotFoundExcept LOGGER.info("project folders: {}", Arrays.toString(getMockIdeRoot().toFile().list())); //We set the project root directory to the temporary directory before all tests, so that the IDE can find the projects in the test. - IdeGuiStateManager.getInstance(getMockIdeRoot().toString()).switchContext(getMockIdeRoot(), "project-1", "main"); + IdeGuiStateManager.getInstance(getMockIdeRoot().toString()).switchContext("project-1", "main"); } /** From 2e15d60d7fd376f03c378b4363c7cf8c372bbce9 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 21 Apr 2026 18:47:10 +0200 Subject: [PATCH 21/31] #1802: Added tests for GuiStateManager --- .../ide/gui/context/IdeGuiStateManager.java | 31 +++--- .../ide/gui/context/ProjectManager.java | 4 +- .../java/com/devonfw/ide/gui/AppBaseTest.java | 18 +--- .../gui/FakeProjectFolderStructureHelper.java | 36 +++++++ .../ide/gui/IdeGuiStateManagerTest.java | 94 +++++++++++++++++++ 5 files changed, 156 insertions(+), 27 deletions(-) create mode 100644 gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java create mode 100644 gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index 551994d738..266515e179 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -17,7 +17,7 @@ public class IdeGuiStateManager { private static final Logger LOG = LoggerFactory.getLogger(IdeGuiStateManager.class); - private String projectDirectory; + private Path ideRootDir; private ProjectManager projectManager; @@ -33,13 +33,15 @@ private IdeGuiStateManager() { * @return the singleton instance of the {@link IdeGuiStateManager}. */ public static IdeGuiStateManager getInstance() { + IdeGuiStateManager instance = Holder.INSTANCE; - if (instance.projectDirectory == null) { + if (instance.ideRootDir == null) { String ideRoot = System.getenv("IDE_ROOT"); if (ideRoot == null) { throw new IllegalStateException("IDE_ROOT environment variable is not set!"); } - instance.projectManager = new ProjectManager(Path.of(ideRoot)); + instance.ideRootDir = Path.of(ideRoot); + instance.projectManager = new ProjectManager(instance.ideRootDir); } return Holder.INSTANCE; } @@ -51,13 +53,17 @@ public static IdeGuiStateManager getInstance() { * @param ideRoot root directory for the ide projects. * @return the singleton instance of the {@link IdeGuiStateManager}. */ - public static IdeGuiStateManager getInstance(String ideRoot) { + public static IdeGuiStateManager getInstanceOverrideRootDir(String ideRoot) { + + IdeGuiStateManager instance = Holder.INSTANCE; if (ideRoot == null) { throw new IllegalArgumentException("ideRoot must not be null!"); + } else if (instance.ideRootDir != null) { + LOG.warn("ideRootDir is already set. You are overriding it."); } - IdeGuiStateManager instance = Holder.INSTANCE; - instance.projectDirectory = ideRoot; - instance.projectManager = new ProjectManager(Path.of(ideRoot)); + + instance.ideRootDir = Path.of(ideRoot); + instance.projectManager = new ProjectManager(instance.ideRootDir); return instance; } @@ -69,11 +75,14 @@ public static IdeGuiStateManager getInstance(String ideRoot) { */ public IdeGuiContext switchContext(String projectName, String workspaceName) throws FileNotFoundException { - LOG.debug("Switching context to project {} and workspace {}", projectName, workspaceName); + LOG.debug("Trying to switch context to project {} and workspace {}", projectName, workspaceName); - Path workspacePath = Path.of(projectDirectory, projectName, "workspaces", workspaceName); + Path projectPath = ideRootDir.resolve(projectName); + Path workspacePath = projectPath.resolve("workspaces").resolve(workspaceName); - if (!workspacePath.toFile().exists()) { + if (!projectPath.toFile().exists()) { + throw new FileNotFoundException("Project " + workspacePath + " does not exist!"); + } else if (!workspacePath.toFile().exists()) { throw new FileNotFoundException("Workspace " + workspacePath + " does not exist!"); } @@ -85,7 +94,7 @@ public IdeGuiContext switchContext(String projectName, String workspaceName) thr } /** - * @return the current {@link IdeGuiContext} based on the selected project. + * @return the current {@link IdeGuiContext} based on the selected project. is null, if no context has been set via switchContext. */ public IdeGuiContext getCurrentContext() { diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/ProjectManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/ProjectManager.java index 87354f5186..929f39485b 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/ProjectManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/ProjectManager.java @@ -78,7 +78,9 @@ private void readProjects() { */ protected void readWorkspaces() { - assert !projectNames.isEmpty() : "No projects initialized, cannot read workspaces!"; + if (projectNames.isEmpty()) { + Log.info("Project list is empty. Therefore no workspaces can be read."); + } for (String projectName : projectNames) { Path projectDirectory = ideRootDirectory.resolve(projectName); diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index b9c10ba958..d27eb578a3 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -60,23 +60,11 @@ public void start(Stage stage) throws IOException { protected static void generateProjectFolderStructure() throws FileNotFoundException { LOGGER.debug("tempDir: {}", getMockIdeRoot()); - for (int i = 0; i <= 5; i++) { - String projectFolderName = "project-" + i; - assertThat(getMockIdeRoot().resolve(projectFolderName).toFile().mkdir()) - .as("Unable to create mock project directory for mock project " + i) - .isTrue(); - assertThat(getMockIdeRoot().resolve(projectFolderName).resolve("workspaces").toFile().mkdir()) - .as("Unable to create mock workspaces directory for mock project " + i) - .isTrue(); - assertThat(getMockIdeRoot().resolve(projectFolderName).resolve("workspaces").resolve("main").toFile().mkdir()) - .as( - "Unable to create mock main workspace directory for mock project " + i) - .isTrue(); - } - LOGGER.info("project folders: {}", Arrays.toString(getMockIdeRoot().toFile().list())); + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); + LOGGER.debug("project folders: {}", Arrays.toString(getMockIdeRoot().toFile().list())); //We set the project root directory to the temporary directory before all tests, so that the IDE can find the projects in the test. - IdeGuiStateManager.getInstance(getMockIdeRoot().toString()).switchContext("project-1", "main"); + IdeGuiStateManager.getInstanceOverrideRootDir(getMockIdeRoot().toString()).switchContext("project-1", "main"); } /** diff --git a/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java b/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java new file mode 100644 index 0000000000..1842db86ea --- /dev/null +++ b/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java @@ -0,0 +1,36 @@ +package com.devonfw.ide.gui; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.nio.file.Path; + +/** + * This class helps to create a fake project folder structure for testing. The projects are named in the format "project-{i}" and the workspaces are named + * "main". + */ +public class FakeProjectFolderStructureHelper { + + /** + * @param rootPath root path where fake structure should be created + * @return the rootPath + */ + public static Path createFakeProjectFolderStructure(Path rootPath) { + + for (int i = 0; i <= 5; i++) { + String projectFolderName = "project-" + i; + assertThat(rootPath.resolve(projectFolderName).toFile().mkdir()) + .as("Unable to create mock project directory for mock project " + i) + .isTrue(); + assertThat(rootPath.resolve(projectFolderName).resolve("workspaces").toFile().mkdir()) + .as("Unable to create mock workspaces directory for mock project " + i) + .isTrue(); + assertThat(rootPath.resolve(projectFolderName).resolve("workspaces").resolve("main").toFile().mkdir()) + .as( + "Unable to create mock main workspace directory for mock project " + i) + .isTrue(); + } + + return rootPath; + } + +} diff --git a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java new file mode 100644 index 0000000000..c8f8cc8ffb --- /dev/null +++ b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java @@ -0,0 +1,94 @@ +package com.devonfw.ide.gui; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import com.devonfw.ide.gui.context.IdeGuiContext; +import com.devonfw.ide.gui.context.IdeGuiStateManager; + +public class IdeGuiStateManagerTest { + + @TempDir + static Path mockIdeRoot; + + private IdeGuiStateManager guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(mockIdeRoot.toString()); + + @BeforeAll + static void setup() { + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); + } + + @Test + void testThrowsIfIdeRootNull() { + + try { + IdeGuiStateManager.getInstanceOverrideRootDir(null); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage()).contains("ideRoot must not be null!"); + } + } + + @Test + void testThrowsIfIdeRootDoesNotExist() { + + try { + IdeGuiStateManager.getInstanceOverrideRootDir("nonExistingIdeRoot"); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage()).contains("Root directory does not exist"); + } + } + + @Test + void testGetContext() throws FileNotFoundException { + + IdeGuiContext context = guiStateManager.switchContext("project-0", "main"); + assertThat(context).isNotNull().as("context was null after switchContext was called"); // When switching to a project, the context should be set. + } + + @Test + void testSwitchContext() throws IOException { + + Files.list(mockIdeRoot).forEach((projectPath) -> { + try { + guiStateManager.switchContext(projectPath.getFileName().toString(), "main"); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + }); + } + + @Test + void testThrowsIfNonExistantProjectSelected() throws IOException { + + Path fakeProject = mockIdeRoot.resolve("nonExistingProject"); + + try { + guiStateManager.switchContext(fakeProject.getFileName().toString(), "main"); + } catch (FileNotFoundException e) { + assertThat(e.getMessage()).contains("Project " + fakeProject.resolve("workspaces").resolve("main") + " does not exist!") + .as("GuiStateManager.switchContext should throw an exception, if a non-existent project is selected"); + } + } + + @Test + void testThrowsIfNonExistantWorkspaceSelected() throws IOException { + + Files.list(mockIdeRoot).forEach((projectPath) -> { + try { + guiStateManager.switchContext(projectPath.getFileName().toString(), "test"); + } catch (FileNotFoundException e) { + assertThat(e.getMessage()).contains("Workspace " + projectPath.resolve("workspaces").resolve("test") + " does not exist!") + .as("GuiStateManager.switchContext should throw an exception, if a non-existent workspace is selected"); + } + }); + } + +} From 5f0b40a90d3191396f5d316710c04f0de4fe93a5 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Thu, 23 Apr 2026 09:58:12 +0200 Subject: [PATCH 22/31] #1802: Extracted mock IDE_ROOT logic into seperate class that can be extended by tests --- .../java/com/devonfw/ide/gui/AppBaseTest.java | 2 +- ...Test.java => HeadlessApplicationTest.java} | 19 +-------------- .../devonfw/ide/gui/IdeGuiMockRootTest.java | 24 +++++++++++++++++++ .../ide/gui/IdeGuiStateManagerTest.java | 16 +++++-------- 4 files changed, 32 insertions(+), 29 deletions(-) rename gui/src/test/java/com/devonfw/ide/gui/{IdeGuiApplicationTest.java => HeadlessApplicationTest.java} (66%) create mode 100644 gui/src/test/java/com/devonfw/ide/gui/IdeGuiMockRootTest.java diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index d27eb578a3..7135473869 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -23,7 +23,7 @@ /** * Basic UI Test */ -public class AppBaseTest extends IdeGuiApplicationTest { +public class AppBaseTest extends HeadlessApplicationTest { private static Logger LOGGER = LoggerFactory.getLogger(AppBaseTest.class); diff --git a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java b/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java similarity index 66% rename from gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java rename to gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java index 18802dbddb..8a21c660a6 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiApplicationTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java @@ -1,21 +1,12 @@ package com.devonfw.ide.gui; -import java.nio.file.Path; - -import org.junit.jupiter.api.io.CleanupMode; -import org.junit.jupiter.api.io.TempDir; -import org.testfx.framework.junit5.ApplicationTest; - /** * Headless testing is often required for contexts, in which the device running the test does not have access to a physical display (e.g. GitHub CI). * * @see UI-Tests: Ein umfassender Leitfaden * @see Best Practices for UI Testing */ -public abstract class IdeGuiApplicationTest extends ApplicationTest { - - @TempDir(cleanup = CleanupMode.ON_SUCCESS) - private static Path mockIdeRoot; +public abstract class HeadlessApplicationTest extends IdeGuiMockRootTest { //setting up for headless testing static { @@ -29,12 +20,4 @@ public abstract class IdeGuiApplicationTest extends ApplicationTest { System.setProperty("monocle.platform", "Headless"); System.setProperty("testfx.setup.timeout", "10000"); // increased timeout for testing on server-side CIs } - - /** - * @return a mock {@link Path} to a temporary IDE_ROOT directory. - */ - public static Path getMockIdeRoot() { - - return mockIdeRoot; - } } diff --git a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiMockRootTest.java b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiMockRootTest.java new file mode 100644 index 0000000000..c650f7bf39 --- /dev/null +++ b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiMockRootTest.java @@ -0,0 +1,24 @@ +package com.devonfw.ide.gui; + +import java.nio.file.Path; + +import org.junit.jupiter.api.io.CleanupMode; +import org.junit.jupiter.api.io.TempDir; +import org.testfx.framework.junit5.ApplicationTest; + +/** + * Provides the handling of mocking the IDE_ROOT directory to subclasses. + */ +public class IdeGuiMockRootTest extends ApplicationTest { + + @TempDir(cleanup = CleanupMode.ON_SUCCESS) + private static Path mockIdeRoot; + + /** + * @return a mock {@link Path} to a temporary IDE_ROOT directory. + */ + public static Path getMockIdeRoot() { + + return mockIdeRoot; + } +} diff --git a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java index c8f8cc8ffb..57d32bb4f1 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java @@ -9,21 +9,17 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; import com.devonfw.ide.gui.context.IdeGuiContext; import com.devonfw.ide.gui.context.IdeGuiStateManager; -public class IdeGuiStateManagerTest { +public class IdeGuiStateManagerTest extends IdeGuiMockRootTest { - @TempDir - static Path mockIdeRoot; - - private IdeGuiStateManager guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(mockIdeRoot.toString()); + private IdeGuiStateManager guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(getMockIdeRoot().toString()); @BeforeAll static void setup() { - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); } @Test @@ -56,7 +52,7 @@ void testGetContext() throws FileNotFoundException { @Test void testSwitchContext() throws IOException { - Files.list(mockIdeRoot).forEach((projectPath) -> { + Files.list(getMockIdeRoot()).forEach((projectPath) -> { try { guiStateManager.switchContext(projectPath.getFileName().toString(), "main"); } catch (FileNotFoundException e) { @@ -68,7 +64,7 @@ void testSwitchContext() throws IOException { @Test void testThrowsIfNonExistantProjectSelected() throws IOException { - Path fakeProject = mockIdeRoot.resolve("nonExistingProject"); + Path fakeProject = getMockIdeRoot().resolve("nonExistingProject"); try { guiStateManager.switchContext(fakeProject.getFileName().toString(), "main"); @@ -81,7 +77,7 @@ void testThrowsIfNonExistantProjectSelected() throws IOException { @Test void testThrowsIfNonExistantWorkspaceSelected() throws IOException { - Files.list(mockIdeRoot).forEach((projectPath) -> { + Files.list(getMockIdeRoot()).forEach((projectPath) -> { try { guiStateManager.switchContext(projectPath.getFileName().toString(), "test"); } catch (FileNotFoundException e) { From e406b659973b17f6d1c318745835f11fb5658fe0 Mon Sep 17 00:00:00 2001 From: Lukas Faber Date: Thu, 23 Apr 2026 11:39:14 +0200 Subject: [PATCH 23/31] #1802: added ProjectManagerTest --- .../java/com/devonfw/ide/gui/AppBaseTest.java | 3 +- .../gui/FakeProjectFolderStructureHelper.java | 16 +- .../ide/gui/IdeGuiStateManagerTest.java | 2 +- .../ide/gui/context/ProjectManagerTest.java | 366 ++++++++++++++++++ 4 files changed, 377 insertions(+), 10 deletions(-) create mode 100644 gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index 7135473869..e7177d4733 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -2,7 +2,6 @@ import static org.testfx.assertions.api.Assertions.assertThat; -import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; import java.util.Arrays; @@ -57,7 +56,7 @@ public void start(Stage stage) throws IOException { * to work in the test context. Generates a structure like this: /project-[0..6]/workspaces/main */ @BeforeAll - protected static void generateProjectFolderStructure() throws FileNotFoundException { + protected static void generateProjectFolderStructure() throws IOException { LOGGER.debug("tempDir: {}", getMockIdeRoot()); FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); diff --git a/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java b/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java index 1842db86ea..d3d115d617 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java +++ b/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; /** @@ -14,20 +16,20 @@ public class FakeProjectFolderStructureHelper { * @param rootPath root path where fake structure should be created * @return the rootPath */ - public static Path createFakeProjectFolderStructure(Path rootPath) { + public static Path createFakeProjectFolderStructure(Path rootPath) throws IOException { for (int i = 0; i <= 5; i++) { String projectFolderName = "project-" + i; - assertThat(rootPath.resolve(projectFolderName).toFile().mkdir()) + assertThat(Files.createDirectory(rootPath.resolve(projectFolderName))) .as("Unable to create mock project directory for mock project " + i) - .isTrue(); - assertThat(rootPath.resolve(projectFolderName).resolve("workspaces").toFile().mkdir()) + .isNotNull(); + assertThat(Files.createDirectory(rootPath.resolve(projectFolderName).resolve("workspaces"))) .as("Unable to create mock workspaces directory for mock project " + i) - .isTrue(); - assertThat(rootPath.resolve(projectFolderName).resolve("workspaces").resolve("main").toFile().mkdir()) + .isNotNull(); + assertThat(Files.createDirectory(rootPath.resolve(projectFolderName).resolve("workspaces").resolve("main"))) .as( "Unable to create mock main workspace directory for mock project " + i) - .isTrue(); + .isNotNull(); } return rootPath; diff --git a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java index 57d32bb4f1..2bcc89783a 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java @@ -18,7 +18,7 @@ public class IdeGuiStateManagerTest extends IdeGuiMockRootTest { private IdeGuiStateManager guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(getMockIdeRoot().toString()); @BeforeAll - static void setup() { + static void setup() throws IOException { FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); } diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java new file mode 100644 index 0000000000..b240bd5141 --- /dev/null +++ b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java @@ -0,0 +1,366 @@ +package com.devonfw.ide.gui.context; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.apache.commons.io.FileUtils; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.devonfw.ide.gui.FakeProjectFolderStructureHelper; +import com.devonfw.ide.gui.IdeGuiMockRootTest; + +/** + * Tests for the ProjectManager class. + */ +public class ProjectManagerTest extends IdeGuiMockRootTest { + + private static final Logger LOG = LoggerFactory.getLogger(ProjectManagerTest.class); + + private ProjectManager projectManager; + + // Used in tests where we don't want to have any projects in the root directory + @TempDir + private Path emptyRootDir; + + @BeforeAll + static void setup() throws IOException { + + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); + } + + //Before each test, we want to restore the default clean test folder structure + @BeforeEach + void resetToDefault() { + + try (var stream = Files.list(getMockIdeRoot())) { + stream.forEach(p -> { + try { + if (Files.isDirectory(p)) { + FileUtils.deleteDirectory(p.toFile()); + } else if (Files.isRegularFile(p)) { + Files.delete(p); + } + } catch (Exception e) { + LOG.error("Error deleting file while resetting project structure: {}", p, e); + } + }); + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); + } catch (IOException e) { + LOG.error("Error walking through files while resetting project structure", e); + } + } + + @Test + void testConstructorWithValidDirectory() { + + //No exception should be thrown + projectManager = new ProjectManager(getMockIdeRoot()); + } + + @Test + void testConstructorWithNullDirectory() { + + try { + projectManager = new ProjectManager(null); + fail("IllegalArgumentException expected"); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage()).contains("Root directory is null"); + } + } + + @Test + void testConstructorWithNonExistentDirectory() { + + try { + + projectManager = new ProjectManager(getMockIdeRoot().resolve("nonExistent")); + fail("IllegalArgumentException expected"); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage()).contains("Root directory does not exist"); + } + } + + @Test + void testConstructorWithFile() throws IOException { + + try { + + File testFile = getMockIdeRoot().resolve("testFile").toFile(); + boolean success = testFile.createNewFile(); + if (!success) { + throw new RuntimeException("Unable to create test file"); + } + + projectManager = new ProjectManager(getMockIdeRoot().resolve("testFile")); + fail("IllegalArgumentException expected"); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage()).contains("Root directory is not a directory"); + } + } + + // ============ readProjects() Tests ============ + + @Test + void testReadProjectsWithEmptyProjectDirectory() { + + projectManager = new ProjectManager(emptyRootDir); + projectManager.refreshProjects(); + + assertThat(projectManager.getProjectNames()).isEmpty(); + } + + @Test + void testReadProjectsWithValidProjects() { + + projectManager = new ProjectManager(getMockIdeRoot()); + + // FakeProjectFolderStructureHelper creates projects 0-5 + assertThat(projectManager.getProjectNames()).hasSize(6).as("Should have 6 projects") + .containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); + } + + @Test + void testReadProjectsIgnoresUnderscorePrefixed() throws Exception { + + // Create a project with underscore prefix + Path underscoreProject = getMockIdeRoot().resolve("_project"); + Files.createDirectories(underscoreProject.resolve("workspaces")); + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Should not include _project, same as _ide directory should be ignored + assertThat(projectManager.getProjectNames()).doesNotContain("_project").hasSize(6); + } + + @Test + void testReadProjectsIgnoresDirectoriesWithoutWorkspacesFolder() throws Exception { + + // Create a project directory without workspaces folder + Path projectWithoutWorkspaces = getMockIdeRoot().resolve("projectNoWorkspaces"); + Files.createDirectory(projectWithoutWorkspaces); + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Should not include projectNoWorkspaces + assertThat(projectManager.getProjectNames()).doesNotContain("projectNoWorkspaces").hasSize(6); + } + + // ============ readWorkspaces() Tests ============ + + @Test + void testReadWorkspacesEmpty() { + + projectManager = new ProjectManager(emptyRootDir); + + // No projects, so no workspaces + assertThat(projectManager.getWorkspaceNames("any-project")).isNull(); + } + + @Test + void testReadWorkspacesWithMultipleWorkspaces() throws Exception { + + Path project = getMockIdeRoot().resolve("project-0"); + Path workspacesDir = project.resolve("workspaces"); + + // Create additional workspaces + Files.createDirectory(workspacesDir.resolve("dev")); + Files.createDirectory(workspacesDir.resolve("prod")); + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Should have main, dev, prod workspaces + assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(3) + .containsExactlyInAnyOrder("main", "dev", "prod"); + } + + @Test + void testReadWorkspacesEmptyWorkspaceDirectory() throws Exception { + + // Create a project with empty workspaces directory + Path emptyWorkspacesProject = getMockIdeRoot().resolve("emptyWorkspacesProject"); + Files.createDirectories(emptyWorkspacesProject.resolve("workspaces")); + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Should return empty list for empty workspaces directory + assertThat(projectManager.getWorkspaceNames("emptyWorkspacesProject")).isEmpty(); + } + + // ============ refreshProjects() Tests ============ + + @Test + void testRefreshProjectsClearsExistingData() throws Exception { + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Get initial projects + assertThat(projectManager.getProjectNames()).hasSize(6); + + // Delete a project + try (var stream = Files.walk(getMockIdeRoot().resolve("project-0"))) { + stream.forEach(p -> { + try { + FileUtils.deleteDirectory(p.toFile()); + } catch (Exception e) { + fail("Error deleting project for test case: {}", p, e); + } + }); + } + + // Refresh should clear old data and reload + projectManager.refreshProjects(); + + assertThat(projectManager.getProjectNames()).hasSize(5).doesNotContain("project-0"); + } + + @Test + void testRefreshProjectsReloadsAll() throws Exception { + + projectManager = new ProjectManager(emptyRootDir); + + assertThat(projectManager.getProjectNames()).isEmpty(); + + Path newProject = emptyRootDir.resolve("newProject"); + Files.createDirectories(newProject.resolve("workspaces").resolve("main")); + + projectManager.refreshProjects(); + + assertThat(projectManager.getProjectNames()).hasSize(1).contains("newProject"); + } + + @Test + void testGetProjectNamesReturnsNotNull() { + + projectManager = new ProjectManager(emptyRootDir); + + assertThat(projectManager.getProjectNames()).isNotNull(); + } + + @Test + void testGetProjectNamesReturnsCorrectList() { + + projectManager = new ProjectManager(getMockIdeRoot()); + + assertThat(projectManager.getProjectNames()).isNotEmpty().hasSize(6); + } + + @Test + void testGetWorkspaceNamesReturnsCorrectList() { + + projectManager = new ProjectManager(getMockIdeRoot()); + + assertThat(projectManager.getWorkspaceNames("project-0")).isNotNull().containsExactly("main"); + } + + @Test + void testGetWorkspaceNamesWithInvalidProject() { + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Should return null for unknown project + assertThat(projectManager.getWorkspaceNames("unknownProject")).isNull(); + } + + //Just checks whether getting projects and workspaces works correctly in one go + @Test + void testCompleteWorkflow() { + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Verify projects are loaded + assertThat(projectManager.getProjectNames()).hasSize(6); + + // Verify workspaces are loaded for each project + for (String projectName : projectManager.getProjectNames()) { + assertThat(projectManager.getWorkspaceNames(projectName)).isNotNull().contains("main"); + } + } + + @Test + void testProjectWithMultipleWorkspaces() throws Exception { + + Path project = getMockIdeRoot().resolve("project-0"); + Path workspacesDir = project.resolve("workspaces"); + + // Create multiple workspaces + for (String workspace : new String[] { "dev", "test", "staging", "production" }) { + Files.createDirectory(workspacesDir.resolve(workspace)); + } + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Should have all workspaces including main + assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(5) + .contains("main", "dev", "test", "staging", "production"); + } + + @Test + void testMultipleProjectsWithWorkspaces() throws Exception { + + // Create different workspace structures for different projects + for (int i = 0; i < 6; i++) { + Path project = getMockIdeRoot().resolve("project-" + i); + Path workspacesDir = project.resolve("workspaces"); + + // Add additional workspaces to each project + for (int j = 1; j <= i; j++) { + Files.createDirectory(workspacesDir.resolve("workspace-" + j)); + } + } + + projectManager = new ProjectManager(getMockIdeRoot()); + + // Verify each project has correct number of workspaces + for (int i = 0; i < 6; i++) { + String projectName = "project-" + i; + // Each project has "main" + i additional workspaces + assertThat(projectManager.getWorkspaceNames(projectName)).hasSize(i + 1); + } + } + + @Test + void testConstructorCallsRefreshProjects() { + + projectManager = new ProjectManager(getMockIdeRoot()); + + // If refreshProjects is called in constructor, projects should be loaded immediately + assertThat(projectManager.getProjectNames()).isNotEmpty().hasSize(6); + } + + @Test + void testProjectNamesWithSpecialCharacters() throws Exception { + + Path specialProject = getMockIdeRoot().resolve("project-dash_underscore&"); + Files.createDirectories(specialProject.resolve("workspaces").resolve("main")); + + projectManager = new ProjectManager(getMockIdeRoot()); + + assertThat(projectManager.getProjectNames()).contains("project-dash_underscore&"); + } + + @Test + void testWorkspaceNamesWithSpecialCharacters() throws Exception { + + Path project = getMockIdeRoot().resolve("project-0"); + Path workspacesDir = project.resolve("workspaces"); + + // Create workspaces with special characters + Files.createDirectory(workspacesDir.resolve("dev-environment")); + Files.createDirectory(workspacesDir.resolve("test_workspace")); + + projectManager = new ProjectManager(getMockIdeRoot()); + + assertThat(projectManager.getWorkspaceNames("project-0")) + .contains("dev-environment", "test_workspace", "main"); + } +} From e0e2d9daa1254f842b00880f79277e4bdfef34e3 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Fri, 24 Apr 2026 10:57:14 +0200 Subject: [PATCH 24/31] #1802: Detached startContext creation from switchContext in IdeGuiStateManager; --- .../ide/gui/context/IdeGuiStateManager.java | 19 +++-- .../java/com/devonfw/ide/gui/AppBaseTest.java | 16 +++-- .../ide/gui/HeadlessApplicationTest.java | 4 +- .../{ => context}/IdeGuiStateManagerTest.java | 29 +++++--- .../ide/gui/context/ProjectManagerTest.java | 70 ++++++++++--------- .../FakeProjectFolderStructureHelper.java | 4 +- 6 files changed, 85 insertions(+), 57 deletions(-) rename gui/src/test/java/com/devonfw/ide/gui/{ => context}/IdeGuiStateManagerTest.java (78%) rename gui/src/test/java/com/devonfw/ide/gui/{ => helper}/FakeProjectFolderStructureHelper.java (89%) diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index 266515e179..e2d646ee17 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -26,7 +26,16 @@ public class IdeGuiStateManager { */ private IdeGuiContext currentContext; + /** + * The {@link IdeStartContextImpl} for the GUI, this stays the same for the whole GUI session, only the {@link IdeGuiContext} changes. + */ + private final IdeStartContextImpl startContext; + private IdeGuiStateManager() { + + final IdeLogListenerBuffer buffer = new IdeLogListenerBuffer(); + IdeLogLevel logLevel = IdeLogLevel.DEBUG; + startContext = new IdeStartContextImpl(logLevel, buffer); } /** @@ -81,14 +90,11 @@ public IdeGuiContext switchContext(String projectName, String workspaceName) thr Path workspacePath = projectPath.resolve("workspaces").resolve(workspaceName); if (!projectPath.toFile().exists()) { - throw new FileNotFoundException("Project " + workspacePath + " does not exist!"); + throw new FileNotFoundException("Project " + projectPath + " does not exist!"); } else if (!workspacePath.toFile().exists()) { throw new FileNotFoundException("Workspace " + workspacePath + " does not exist!"); } - final IdeLogListenerBuffer buffer = new IdeLogListenerBuffer(); - IdeLogLevel logLevel = IdeLogLevel.DEBUG; - IdeStartContextImpl startContext = new IdeStartContextImpl(logLevel, buffer); this.currentContext = new IdeGuiContext(startContext, workspacePath); return this.currentContext; } @@ -101,6 +107,9 @@ public IdeGuiContext getCurrentContext() { return this.currentContext; } + /** + * @return instance of {@link ProjectManager} + */ public ProjectManager getProjectManager() { return projectManager; @@ -113,6 +122,6 @@ public ProjectManager getProjectManager() { */ private static class Holder { - private static IdeGuiStateManager INSTANCE = new IdeGuiStateManager(); + private static final IdeGuiStateManager INSTANCE = new IdeGuiStateManager(); } } diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index e7177d4733..bb2ac5a280 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.net.URL; +import java.nio.file.Path; import java.util.Arrays; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; @@ -14,10 +15,12 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.devonfw.ide.gui.context.IdeGuiStateManager; +import com.devonfw.ide.gui.helper.FakeProjectFolderStructureHelper; /** * Basic UI Test @@ -29,6 +32,9 @@ public class AppBaseTest extends HeadlessApplicationTest { private Button androidStudioOpen, eclipseOpen, intellijOpen, vsCodeOpen; private ComboBox selectedProject, selectedWorkspace; + @TempDir + private static Path mockIdeRoot; + @Override public void start(Stage stage) throws IOException { @@ -37,7 +43,7 @@ public void start(Stage stage) throws IOException { assertThat(mainViewUrl).as("Cannot resolve main UI FXML resource!").isNotNull(); FXMLLoader fxmlLoader = new FXMLLoader(mainViewUrl); - fxmlLoader.setController(new MainController(getMockIdeRoot().toString())); + fxmlLoader.setController(new MainController(mockIdeRoot.toString())); Parent root = fxmlLoader.load(); stage.setScene(new Scene(root)); stage.requestFocus(); //sometimes needed for headless setup to work @@ -58,12 +64,12 @@ public void start(Stage stage) throws IOException { @BeforeAll protected static void generateProjectFolderStructure() throws IOException { - LOGGER.debug("tempDir: {}", getMockIdeRoot()); - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); - LOGGER.debug("project folders: {}", Arrays.toString(getMockIdeRoot().toFile().list())); + LOGGER.debug("tempDir: {}", mockIdeRoot); + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); + LOGGER.debug("project folders: {}", Arrays.toString(mockIdeRoot.toFile().list())); //We set the project root directory to the temporary directory before all tests, so that the IDE can find the projects in the test. - IdeGuiStateManager.getInstanceOverrideRootDir(getMockIdeRoot().toString()).switchContext("project-1", "main"); + IdeGuiStateManager.getInstanceOverrideRootDir(mockIdeRoot.toString()).switchContext("project-1", "main"); } /** diff --git a/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java b/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java index 8a21c660a6..3b51b66787 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/HeadlessApplicationTest.java @@ -1,12 +1,14 @@ package com.devonfw.ide.gui; +import org.testfx.framework.junit5.ApplicationTest; + /** * Headless testing is often required for contexts, in which the device running the test does not have access to a physical display (e.g. GitHub CI). * * @see UI-Tests: Ein umfassender Leitfaden * @see Best Practices for UI Testing */ -public abstract class HeadlessApplicationTest extends IdeGuiMockRootTest { +public abstract class HeadlessApplicationTest extends ApplicationTest { //setting up for headless testing static { diff --git a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java similarity index 78% rename from gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java rename to gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java index 2bcc89783a..d5e09a0dbe 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/IdeGuiStateManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java @@ -1,4 +1,4 @@ -package com.devonfw.ide.gui; +package com.devonfw.ide.gui.context; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; @@ -9,17 +9,24 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; -import com.devonfw.ide.gui.context.IdeGuiContext; -import com.devonfw.ide.gui.context.IdeGuiStateManager; +import com.devonfw.ide.gui.helper.FakeProjectFolderStructureHelper; -public class IdeGuiStateManagerTest extends IdeGuiMockRootTest { +/** + * Tests for {@link IdeGuiStateManager}. + */ +public class IdeGuiStateManagerTest { - private IdeGuiStateManager guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(getMockIdeRoot().toString()); + @TempDir + private static Path mockIdeRoot; + + private IdeGuiStateManager guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(mockIdeRoot.toString()); @BeforeAll static void setup() throws IOException { - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); + + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); } @Test @@ -52,7 +59,7 @@ void testGetContext() throws FileNotFoundException { @Test void testSwitchContext() throws IOException { - Files.list(getMockIdeRoot()).forEach((projectPath) -> { + Files.list(mockIdeRoot).forEach((projectPath) -> { try { guiStateManager.switchContext(projectPath.getFileName().toString(), "main"); } catch (FileNotFoundException e) { @@ -62,9 +69,9 @@ void testSwitchContext() throws IOException { } @Test - void testThrowsIfNonExistantProjectSelected() throws IOException { + void testThrowsIfNonExistentProjectSelected() throws IOException { - Path fakeProject = getMockIdeRoot().resolve("nonExistingProject"); + Path fakeProject = mockIdeRoot.resolve("nonExistingProject"); try { guiStateManager.switchContext(fakeProject.getFileName().toString(), "main"); @@ -75,9 +82,9 @@ void testThrowsIfNonExistantProjectSelected() throws IOException { } @Test - void testThrowsIfNonExistantWorkspaceSelected() throws IOException { + void testThrowsIfNonExistentWorkspaceSelected() throws IOException { - Files.list(getMockIdeRoot()).forEach((projectPath) -> { + Files.list(mockIdeRoot).forEach((projectPath) -> { try { guiStateManager.switchContext(projectPath.getFileName().toString(), "test"); } catch (FileNotFoundException e) { diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java index b240bd5141..e8c2eea6eb 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java @@ -16,18 +16,20 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.devonfw.ide.gui.FakeProjectFolderStructureHelper; -import com.devonfw.ide.gui.IdeGuiMockRootTest; +import com.devonfw.ide.gui.helper.FakeProjectFolderStructureHelper; /** * Tests for the ProjectManager class. */ -public class ProjectManagerTest extends IdeGuiMockRootTest { +public class ProjectManagerTest { private static final Logger LOG = LoggerFactory.getLogger(ProjectManagerTest.class); private ProjectManager projectManager; + @TempDir + private static Path mockIdeRoot; + // Used in tests where we don't want to have any projects in the root directory @TempDir private Path emptyRootDir; @@ -35,14 +37,14 @@ public class ProjectManagerTest extends IdeGuiMockRootTest { @BeforeAll static void setup() throws IOException { - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); } //Before each test, we want to restore the default clean test folder structure @BeforeEach void resetToDefault() { - try (var stream = Files.list(getMockIdeRoot())) { + try (var stream = Files.list(mockIdeRoot)) { stream.forEach(p -> { try { if (Files.isDirectory(p)) { @@ -54,7 +56,7 @@ void resetToDefault() { LOG.error("Error deleting file while resetting project structure: {}", p, e); } }); - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(getMockIdeRoot()); + FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); } catch (IOException e) { LOG.error("Error walking through files while resetting project structure", e); } @@ -64,7 +66,7 @@ void resetToDefault() { void testConstructorWithValidDirectory() { //No exception should be thrown - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); } @Test @@ -83,7 +85,7 @@ void testConstructorWithNonExistentDirectory() { try { - projectManager = new ProjectManager(getMockIdeRoot().resolve("nonExistent")); + projectManager = new ProjectManager(mockIdeRoot.resolve("nonExistent")); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException e) { assertThat(e.getMessage()).contains("Root directory does not exist"); @@ -95,13 +97,13 @@ void testConstructorWithFile() throws IOException { try { - File testFile = getMockIdeRoot().resolve("testFile").toFile(); + File testFile = mockIdeRoot.resolve("testFile").toFile(); boolean success = testFile.createNewFile(); if (!success) { throw new RuntimeException("Unable to create test file"); } - projectManager = new ProjectManager(getMockIdeRoot().resolve("testFile")); + projectManager = new ProjectManager(mockIdeRoot.resolve("testFile")); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException e) { assertThat(e.getMessage()).contains("Root directory is not a directory"); @@ -122,7 +124,7 @@ void testReadProjectsWithEmptyProjectDirectory() { @Test void testReadProjectsWithValidProjects() { - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // FakeProjectFolderStructureHelper creates projects 0-5 assertThat(projectManager.getProjectNames()).hasSize(6).as("Should have 6 projects") @@ -133,10 +135,10 @@ void testReadProjectsWithValidProjects() { void testReadProjectsIgnoresUnderscorePrefixed() throws Exception { // Create a project with underscore prefix - Path underscoreProject = getMockIdeRoot().resolve("_project"); + Path underscoreProject = mockIdeRoot.resolve("_project"); Files.createDirectories(underscoreProject.resolve("workspaces")); - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Should not include _project, same as _ide directory should be ignored assertThat(projectManager.getProjectNames()).doesNotContain("_project").hasSize(6); @@ -146,10 +148,10 @@ void testReadProjectsIgnoresUnderscorePrefixed() throws Exception { void testReadProjectsIgnoresDirectoriesWithoutWorkspacesFolder() throws Exception { // Create a project directory without workspaces folder - Path projectWithoutWorkspaces = getMockIdeRoot().resolve("projectNoWorkspaces"); + Path projectWithoutWorkspaces = mockIdeRoot.resolve("projectNoWorkspaces"); Files.createDirectory(projectWithoutWorkspaces); - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Should not include projectNoWorkspaces assertThat(projectManager.getProjectNames()).doesNotContain("projectNoWorkspaces").hasSize(6); @@ -169,14 +171,14 @@ void testReadWorkspacesEmpty() { @Test void testReadWorkspacesWithMultipleWorkspaces() throws Exception { - Path project = getMockIdeRoot().resolve("project-0"); + Path project = mockIdeRoot.resolve("project-0"); Path workspacesDir = project.resolve("workspaces"); // Create additional workspaces Files.createDirectory(workspacesDir.resolve("dev")); Files.createDirectory(workspacesDir.resolve("prod")); - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Should have main, dev, prod workspaces assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(3) @@ -187,10 +189,10 @@ void testReadWorkspacesWithMultipleWorkspaces() throws Exception { void testReadWorkspacesEmptyWorkspaceDirectory() throws Exception { // Create a project with empty workspaces directory - Path emptyWorkspacesProject = getMockIdeRoot().resolve("emptyWorkspacesProject"); + Path emptyWorkspacesProject = mockIdeRoot.resolve("emptyWorkspacesProject"); Files.createDirectories(emptyWorkspacesProject.resolve("workspaces")); - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Should return empty list for empty workspaces directory assertThat(projectManager.getWorkspaceNames("emptyWorkspacesProject")).isEmpty(); @@ -201,13 +203,13 @@ void testReadWorkspacesEmptyWorkspaceDirectory() throws Exception { @Test void testRefreshProjectsClearsExistingData() throws Exception { - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Get initial projects assertThat(projectManager.getProjectNames()).hasSize(6); // Delete a project - try (var stream = Files.walk(getMockIdeRoot().resolve("project-0"))) { + try (var stream = Files.walk(mockIdeRoot.resolve("project-0"))) { stream.forEach(p -> { try { FileUtils.deleteDirectory(p.toFile()); @@ -249,7 +251,7 @@ void testGetProjectNamesReturnsNotNull() { @Test void testGetProjectNamesReturnsCorrectList() { - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); assertThat(projectManager.getProjectNames()).isNotEmpty().hasSize(6); } @@ -257,7 +259,7 @@ void testGetProjectNamesReturnsCorrectList() { @Test void testGetWorkspaceNamesReturnsCorrectList() { - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); assertThat(projectManager.getWorkspaceNames("project-0")).isNotNull().containsExactly("main"); } @@ -265,7 +267,7 @@ void testGetWorkspaceNamesReturnsCorrectList() { @Test void testGetWorkspaceNamesWithInvalidProject() { - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Should return null for unknown project assertThat(projectManager.getWorkspaceNames("unknownProject")).isNull(); @@ -275,7 +277,7 @@ void testGetWorkspaceNamesWithInvalidProject() { @Test void testCompleteWorkflow() { - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Verify projects are loaded assertThat(projectManager.getProjectNames()).hasSize(6); @@ -289,7 +291,7 @@ void testCompleteWorkflow() { @Test void testProjectWithMultipleWorkspaces() throws Exception { - Path project = getMockIdeRoot().resolve("project-0"); + Path project = mockIdeRoot.resolve("project-0"); Path workspacesDir = project.resolve("workspaces"); // Create multiple workspaces @@ -297,7 +299,7 @@ void testProjectWithMultipleWorkspaces() throws Exception { Files.createDirectory(workspacesDir.resolve(workspace)); } - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Should have all workspaces including main assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(5) @@ -309,7 +311,7 @@ void testMultipleProjectsWithWorkspaces() throws Exception { // Create different workspace structures for different projects for (int i = 0; i < 6; i++) { - Path project = getMockIdeRoot().resolve("project-" + i); + Path project = mockIdeRoot.resolve("project-" + i); Path workspacesDir = project.resolve("workspaces"); // Add additional workspaces to each project @@ -318,7 +320,7 @@ void testMultipleProjectsWithWorkspaces() throws Exception { } } - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // Verify each project has correct number of workspaces for (int i = 0; i < 6; i++) { @@ -331,7 +333,7 @@ void testMultipleProjectsWithWorkspaces() throws Exception { @Test void testConstructorCallsRefreshProjects() { - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); // If refreshProjects is called in constructor, projects should be loaded immediately assertThat(projectManager.getProjectNames()).isNotEmpty().hasSize(6); @@ -340,10 +342,10 @@ void testConstructorCallsRefreshProjects() { @Test void testProjectNamesWithSpecialCharacters() throws Exception { - Path specialProject = getMockIdeRoot().resolve("project-dash_underscore&"); + Path specialProject = mockIdeRoot.resolve("project-dash_underscore&"); Files.createDirectories(specialProject.resolve("workspaces").resolve("main")); - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); assertThat(projectManager.getProjectNames()).contains("project-dash_underscore&"); } @@ -351,14 +353,14 @@ void testProjectNamesWithSpecialCharacters() throws Exception { @Test void testWorkspaceNamesWithSpecialCharacters() throws Exception { - Path project = getMockIdeRoot().resolve("project-0"); + Path project = mockIdeRoot.resolve("project-0"); Path workspacesDir = project.resolve("workspaces"); // Create workspaces with special characters Files.createDirectory(workspacesDir.resolve("dev-environment")); Files.createDirectory(workspacesDir.resolve("test_workspace")); - projectManager = new ProjectManager(getMockIdeRoot()); + projectManager = new ProjectManager(mockIdeRoot); assertThat(projectManager.getWorkspaceNames("project-0")) .contains("dev-environment", "test_workspace", "main"); diff --git a/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java b/gui/src/test/java/com/devonfw/ide/gui/helper/FakeProjectFolderStructureHelper.java similarity index 89% rename from gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java rename to gui/src/test/java/com/devonfw/ide/gui/helper/FakeProjectFolderStructureHelper.java index d3d115d617..3b6f4a3019 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java +++ b/gui/src/test/java/com/devonfw/ide/gui/helper/FakeProjectFolderStructureHelper.java @@ -1,4 +1,4 @@ -package com.devonfw.ide.gui; +package com.devonfw.ide.gui.helper; import static org.assertj.core.api.Assertions.assertThat; @@ -9,6 +9,8 @@ /** * This class helps to create a fake project folder structure for testing. The projects are named in the format "project-{i}" and the workspaces are named * "main". + *

+ * This class is supposed to be replaced by enabling ide-cli test dependencies allowing to mock a IdeContext */ public class FakeProjectFolderStructureHelper { From d70f46027ef731828fb4366738d5fdf813c5deb0 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Fri, 24 Apr 2026 11:18:33 +0200 Subject: [PATCH 25/31] #1802: Fixed bug in IdeGuiStateManagerTest leading to test failure --- .../com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java index d5e09a0dbe..3dbfffd0e5 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java @@ -69,14 +69,14 @@ void testSwitchContext() throws IOException { } @Test - void testThrowsIfNonExistentProjectSelected() throws IOException { + void testThrowsIfNonExistentProjectSelected() { Path fakeProject = mockIdeRoot.resolve("nonExistingProject"); try { guiStateManager.switchContext(fakeProject.getFileName().toString(), "main"); } catch (FileNotFoundException e) { - assertThat(e.getMessage()).contains("Project " + fakeProject.resolve("workspaces").resolve("main") + " does not exist!") + assertThat(e.getMessage()).contains("Project " + fakeProject + " does not exist!") .as("GuiStateManager.switchContext should throw an exception, if a non-existent project is selected"); } } From 9c78eacd1fe03acc2cd3557bafc28edbb72a927f Mon Sep 17 00:00:00 2001 From: laim2003 Date: Fri, 24 Apr 2026 12:53:17 +0200 Subject: [PATCH 26/31] #1802: Added ContextChangeListener; improved thread safety of IdeGuiStateManager --- .../gui/context/GuiContextChangeListener.java | 15 ++++++++ .../ide/gui/context/IdeGuiStateManager.java | 38 ++++++++++++++++--- 2 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 gui/src/main/java/com/devonfw/ide/gui/context/GuiContextChangeListener.java diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/GuiContextChangeListener.java b/gui/src/main/java/com/devonfw/ide/gui/context/GuiContextChangeListener.java new file mode 100644 index 0000000000..53972265f6 --- /dev/null +++ b/gui/src/main/java/com/devonfw/ide/gui/context/GuiContextChangeListener.java @@ -0,0 +1,15 @@ +package com.devonfw.ide.gui.context; + +/** + * Interface that notifies listeners of context changes. + */ +public interface GuiContextChangeListener { + + /** + * This method is called when the context changes. It can be used to update the GUI based on the new context. + * + * @param newContext the new {@link IdeGuiContext}. + */ + void onContextChange(IdeGuiContext newContext); + +} diff --git a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java index e2d646ee17..070b0e90a0 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java +++ b/gui/src/main/java/com/devonfw/ide/gui/context/IdeGuiStateManager.java @@ -1,7 +1,9 @@ package com.devonfw.ide.gui.context; import java.io.FileNotFoundException; +import java.nio.file.Files; import java.nio.file.Path; +import java.util.concurrent.CopyOnWriteArrayList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,13 +20,14 @@ public class IdeGuiStateManager { private static final Logger LOG = LoggerFactory.getLogger(IdeGuiStateManager.class); private Path ideRootDir; - private ProjectManager projectManager; + private final CopyOnWriteArrayList listeners = new CopyOnWriteArrayList<>(); + /** * Project context based on which project the user works in. */ - private IdeGuiContext currentContext; + private volatile IdeGuiContext currentContext; /** * The {@link IdeStartContextImpl} for the GUI, this stays the same for the whole GUI session, only the {@link IdeGuiContext} changes. @@ -56,13 +59,16 @@ public static IdeGuiStateManager getInstance() { } /** + * USE WITH CARE. * This method is used in cases where the IDE_ROOT environment variable is not set, e.g. in test contexts on GitHub actions. This method will retrieve the - * current instance, set the project directory manually an then return the updated instance. USE WITH CARE. + * current instance, set the project directory manually an then return the updated instance. * * @param ideRoot root directory for the ide projects. * @return the singleton instance of the {@link IdeGuiStateManager}. */ + //TODO: remove this method once we have a better solution for the test context, after implementing CLi's test jar. public static IdeGuiStateManager getInstanceOverrideRootDir(String ideRoot) { + LOG.warn("Using unsafe getInstanceOverrideRootDir method."); IdeGuiStateManager instance = Holder.INSTANCE; if (ideRoot == null) { @@ -82,20 +88,22 @@ public static IdeGuiStateManager getInstanceOverrideRootDir(String ideRoot) { * @return the new {@link IdeGuiContext} for the selected project and workspace. * @throws FileNotFoundException if workspace or project does not exist */ - public IdeGuiContext switchContext(String projectName, String workspaceName) throws FileNotFoundException { + public synchronized IdeGuiContext switchContext(String projectName, String workspaceName) throws FileNotFoundException { LOG.debug("Trying to switch context to project {} and workspace {}", projectName, workspaceName); Path projectPath = ideRootDir.resolve(projectName); Path workspacePath = projectPath.resolve("workspaces").resolve(workspaceName); - if (!projectPath.toFile().exists()) { + if (!Files.exists(projectPath)) { throw new FileNotFoundException("Project " + projectPath + " does not exist!"); - } else if (!workspacePath.toFile().exists()) { + } else if (!Files.exists(workspacePath)) { throw new FileNotFoundException("Workspace " + workspacePath + " does not exist!"); } this.currentContext = new IdeGuiContext(startContext, workspacePath); + listeners.forEach(listener -> listener.onContextChange(this.currentContext)); + return this.currentContext; } @@ -115,6 +123,24 @@ public ProjectManager getProjectManager() { return projectManager; } + /** + * Add a listener to the context change events. + * + * @param listener the {@link GuiContextChangeListener} to attach to context updates. + */ + public void addGuiContextChangeListener(GuiContextChangeListener listener) { + listeners.add(listener); + } + + /** + * Remove a listener from the context change events. + * + * @param listener the {@link GuiContextChangeListener} to remove from context updates. + */ + public void removeGuiContextChangeListener(GuiContextChangeListener listener) { + listeners.remove(listener); + } + /** * Holder class for the singleton instance. The static keyword ensures the thread-safety of the singleton. * From 69055d99a6ce76ff07545e69e753e0a0492d83f6 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 28 Apr 2026 11:42:10 +0200 Subject: [PATCH 27/31] #1802: tests now use AbstractIdeContextTest --- cli/pom.xml | 2 - .../tools/ide/context/IdeContextTest.java | 22 +- gui/pom.xml | 9 +- .../java/com/devonfw/ide/gui/AppBaseTest.java | 1 - .../FakeProjectFolderStructureHelper.java | 2 +- .../gui/context/IdeGuiStateManagerTest.java | 44 ++-- .../ide/gui/context/ProjectManagerTest.java | 188 ++++++------------ .../ide-projects/emptyProjects/_ide/bin/ide | 2 + .../az/az/testVersion/.ide.software.version | 1 + .../emptyProjects/_ide/software/readme | 1 + .../urls/java/java/17.0.10/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.10/mac_x64.urls | 1 + .../urls/java/java/17.0.10/windows_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/mac_x64.urls | 1 + .../urls/java/java/17.0.6/windows_x64.urls | 1 + .../urls/java/java/21.0.8_9/linux_x64.urls | 1 + .../_ide/urls/java/java/21.0.8_9/mac_x64.urls | 1 + .../urls/java/java/21.0.8_9/windows_x64.urls | 1 + .../_ide/urls/mvn/mvn/3.0.5/status.json | 10 + .../_ide/urls/mvn/mvn/3.0.5/urls | 1 + .../_ide/urls/mvn/mvn/3.1.0/status.json | 10 + .../_ide/urls/mvn/mvn/3.1.0/urls | 1 + .../_ide/urls/mvn/mvn/3.2.1/status.json | 10 + .../_ide/urls/mvn/mvn/3.2.1/urls | 1 + .../mvn/secondMvnEdition/3.2.1/status.json | 10 + .../emptyProjects/_ide/urls/readme | 1 + .../emptyWorkspaceFolders/_ide/bin/ide | 2 + .../az/az/testVersion/.ide.software.version | 1 + .../_ide/software/readme | 1 + .../urls/java/java/17.0.10/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.10/mac_x64.urls | 1 + .../urls/java/java/17.0.10/windows_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/mac_x64.urls | 1 + .../urls/java/java/17.0.6/windows_x64.urls | 1 + .../urls/java/java/21.0.8_9/linux_x64.urls | 1 + .../_ide/urls/java/java/21.0.8_9/mac_x64.urls | 1 + .../urls/java/java/21.0.8_9/windows_x64.urls | 1 + .../_ide/urls/mvn/mvn/3.0.5/status.json | 10 + .../_ide/urls/mvn/mvn/3.0.5/urls | 1 + .../_ide/urls/mvn/mvn/3.1.0/status.json | 10 + .../_ide/urls/mvn/mvn/3.1.0/urls | 1 + .../_ide/urls/mvn/mvn/3.2.1/status.json | 10 + .../_ide/urls/mvn/mvn/3.2.1/urls | 1 + .../mvn/secondMvnEdition/3.2.1/status.json | 10 + .../emptyWorkspaceFolders/_ide/urls/readme | 1 + .../project-0/conf/ide.properties | 6 + .../project-0/home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../project-0/home/Downloads/ide/readme | 1 + .../project-0/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../project-0/settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../emptyWorkspaceFolders/project-0/setup | 1 + .../project-0/software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../project-0/software/mvn/bin/mvn | 5 + .../project-0/software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../project-0/software/node/npm | 6 + .../ide-projects/noWorkspaces/_ide/bin/ide | 2 + .../az/az/testVersion/.ide.software.version | 1 + .../noWorkspaces/_ide/software/readme | 1 + .../urls/java/java/17.0.10/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.10/mac_x64.urls | 1 + .../urls/java/java/17.0.10/windows_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/mac_x64.urls | 1 + .../urls/java/java/17.0.6/windows_x64.urls | 1 + .../urls/java/java/21.0.8_9/linux_x64.urls | 1 + .../_ide/urls/java/java/21.0.8_9/mac_x64.urls | 1 + .../urls/java/java/21.0.8_9/windows_x64.urls | 1 + .../_ide/urls/mvn/mvn/3.0.5/status.json | 10 + .../noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls | 1 + .../_ide/urls/mvn/mvn/3.1.0/status.json | 10 + .../noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls | 1 + .../_ide/urls/mvn/mvn/3.2.1/status.json | 10 + .../noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls | 1 + .../mvn/secondMvnEdition/3.2.1/status.json | 10 + .../noWorkspaces/_ide/urls/readme | 1 + .../conf/ide.properties | 6 + .../home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../home/Downloads/ide/readme | 1 + .../projectWithoutWorkspaces/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../projectWithoutWorkspaces/setup | 1 + .../software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../software/mvn/bin/mvn | 5 + .../software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../software/node/npm | 6 + .../ide-projects/testProject/_ide/bin/ide | 2 + .../az/az/testVersion/.ide.software.version | 1 + .../testProject/_ide/software/readme | 1 + .../urls/java/java/17.0.10/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.10/mac_x64.urls | 1 + .../urls/java/java/17.0.10/windows_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/linux_x64.urls | 1 + .../_ide/urls/java/java/17.0.6/mac_x64.urls | 1 + .../urls/java/java/17.0.6/windows_x64.urls | 1 + .../urls/java/java/21.0.8_9/linux_x64.urls | 1 + .../_ide/urls/java/java/21.0.8_9/mac_x64.urls | 1 + .../urls/java/java/21.0.8_9/windows_x64.urls | 1 + .../_ide/urls/mvn/mvn/3.0.5/status.json | 10 + .../testProject/_ide/urls/mvn/mvn/3.0.5/urls | 1 + .../_ide/urls/mvn/mvn/3.1.0/status.json | 10 + .../testProject/_ide/urls/mvn/mvn/3.1.0/urls | 1 + .../_ide/urls/mvn/mvn/3.2.1/status.json | 10 + .../testProject/_ide/urls/mvn/mvn/3.2.1/urls | 1 + .../mvn/secondMvnEdition/3.2.1/status.json | 10 + .../ide-projects/testProject/_ide/urls/readme | 1 + .../testProject/project-0/conf/ide.properties | 6 + .../project-0/home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../project-0/home/Downloads/ide/readme | 1 + .../testProject/project-0/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../project-0/settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../ide-projects/testProject/project-0/setup | 1 + .../project-0/software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../project-0/software/mvn/bin/mvn | 5 + .../project-0/software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../testProject/project-0/software/node/npm | 6 + .../project-0/workspaces/foo-test/readme | 1 + .../project-0/workspaces/main/readme | 1 + .../testProject/project-1/conf/ide.properties | 6 + .../project-1/home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../project-1/home/Downloads/ide/readme | 1 + .../testProject/project-1/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../project-1/settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../ide-projects/testProject/project-1/setup | 1 + .../project-1/software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../project-1/software/mvn/bin/mvn | 5 + .../project-1/software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../testProject/project-1/software/node/npm | 6 + .../project-1/workspaces/foo-test/readme | 1 + .../project-1/workspaces/main/readme | 1 + .../testProject/project-2/conf/ide.properties | 6 + .../project-2/home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../project-2/home/Downloads/ide/readme | 1 + .../testProject/project-2/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../project-2/settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../ide-projects/testProject/project-2/setup | 1 + .../project-2/software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../project-2/software/mvn/bin/mvn | 5 + .../project-2/software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../testProject/project-2/software/node/npm | 6 + .../project-2/workspaces/foo-test/readme | 1 + .../project-2/workspaces/main/readme | 1 + .../testProject/project-3/conf/ide.properties | 6 + .../project-3/home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../project-3/home/Downloads/ide/readme | 1 + .../testProject/project-3/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../project-3/settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../ide-projects/testProject/project-3/setup | 1 + .../project-3/software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../project-3/software/mvn/bin/mvn | 5 + .../project-3/software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../testProject/project-3/software/node/npm | 6 + .../project-3/workspaces/foo-test/readme | 1 + .../project-3/workspaces/main/readme | 1 + .../testProject/project-4/conf/ide.properties | 6 + .../project-4/home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../project-4/home/Downloads/ide/readme | 1 + .../testProject/project-4/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../project-4/settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../ide-projects/testProject/project-4/setup | 1 + .../project-4/software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../project-4/software/mvn/bin/mvn | 5 + .../project-4/software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../testProject/project-4/software/node/npm | 6 + .../project-4/workspaces/foo-test/readme | 1 + .../project-4/workspaces/main/readme | 1 + .../testProject/project-5/conf/ide.properties | 6 + .../project-5/home/.ide/ide.properties | 13 ++ .../eclipse/plugins/anyedit.properties | 3 + .../project-5/home/Downloads/ide/readme | 1 + .../testProject/project-5/home/readme | 1 + .../eclipse/plugins/anyedit.properties | 3 + .../eclipse/plugins/checkstyle.properties | 3 + .../project-5/settings/ide.properties | 9 + .../settings/workspace/update/.editorconfig | 0 .../ide-projects/testProject/project-5/setup | 1 + .../project-5/software/java/bin/readme | 1 + .../software/mvn/.devon.software.version | 1 + .../project-5/software/mvn/bin/mvn | 5 + .../project-5/software/mvn/bin/readme | 1 + .../software/node/.ide.software.version | 1 + .../testProject/project-5/software/node/npm | 6 + .../project-5/workspaces/foo-test/readme | 1 + .../project-5/workspaces/main/readme | 1 + 227 files changed, 786 insertions(+), 162 deletions(-) rename gui/src/test/java/com/devonfw/ide/gui/{helper => }/FakeProjectFolderStructureHelper.java (97%) create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/bin/ide create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/software/default/az/az/testVersion/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/software/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/linux_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/mac_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/windows_x64.urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/status.json create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/status.json create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/urls create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json create mode 100644 gui/src/test/resources/ide-projects/testProject/_ide/urls/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/home/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/setup create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/workspaces/foo-test/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-0/workspaces/main/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/home/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/setup create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/workspaces/foo-test/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-1/workspaces/main/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/home/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/setup create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/workspaces/foo-test/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-2/workspaces/main/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/home/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/setup create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/workspaces/foo-test/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-3/workspaces/main/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/home/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/setup create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/workspaces/foo-test/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-4/workspaces/main/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/conf/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/home/Downloads/ide/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/home/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/anyedit.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/checkstyle.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/settings/ide.properties create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/settings/workspace/update/.editorconfig create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/setup create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/software/java/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/.devon.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/mvn create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/software/node/.ide.software.version create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/software/node/npm create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/workspaces/foo-test/readme create mode 100644 gui/src/test/resources/ide-projects/testProject/project-5/workspaces/main/readme diff --git a/cli/pom.xml b/cli/pom.xml index 80e9623ca4..d4967c49ce 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -138,8 +138,6 @@ - - test-jar diff --git a/cli/src/test/java/com/devonfw/tools/ide/context/IdeContextTest.java b/cli/src/test/java/com/devonfw/tools/ide/context/IdeContextTest.java index c167895a49..c1ac76e39c 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/context/IdeContextTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/context/IdeContextTest.java @@ -5,13 +5,6 @@ import java.util.Properties; import org.junit.jupiter.api.Test; -import com.devonfw.tools.ide.security.ToolVersionChoice; -import com.devonfw.tools.ide.tool.ToolEditionAndVersion; -import com.devonfw.tools.ide.security.ToolVulnerabilities; -import com.devonfw.tools.ide.version.VersionIdentifier; -import com.devonfw.tools.ide.version.VersionRange; -import com.devonfw.tools.ide.url.model.file.json.Cve; -import com.devonfw.tools.ide.tool.ToolEdition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,13 +17,20 @@ import com.devonfw.tools.ide.log.IdeLogLevel; import com.devonfw.tools.ide.os.SystemInfo; import com.devonfw.tools.ide.os.SystemInfoMock; +import com.devonfw.tools.ide.security.ToolVersionChoice; +import com.devonfw.tools.ide.security.ToolVulnerabilities; +import com.devonfw.tools.ide.tool.ToolEdition; +import com.devonfw.tools.ide.tool.ToolEditionAndVersion; +import com.devonfw.tools.ide.url.model.file.json.Cve; import com.devonfw.tools.ide.variable.IdeVariables; import com.devonfw.tools.ide.version.IdeVersion; +import com.devonfw.tools.ide.version.VersionIdentifier; +import com.devonfw.tools.ide.version.VersionRange; /** * Test of {@link IdeContext}. */ -class IdeContextTest extends AbstractIdeContextTest { +public class IdeContextTest extends AbstractIdeContextTest { private static final Logger LOG = LoggerFactory.getLogger(IdeContextTest.class); @@ -284,7 +284,7 @@ void testFindBashOnSystemPathOnWindowsWithInvalidBashPathSet() { @Test void testQuestionWithMultipleOptions() { IdeTestContext context = newContext(PROJECT_BASIC, null, false); - String[] options = {"option1", "option2"}; + String[] options = { "option1", "option2" }; context.setAnswers("option1"); String result = context.question(options, "Which option?"); assertThat(result).isEqualTo("option1"); @@ -293,7 +293,7 @@ void testQuestionWithMultipleOptions() { @Test void testQuestionWithSingleOptionAndEmptyAnswer() { IdeTestContext context = newContext(PROJECT_BASIC, null, false); - String[] options = {"onlyOption"}; + String[] options = { "onlyOption" }; context.setAnswers(""); // Empty answer (Enter) String result = context.question(options, "Which option?"); assertThat(result).isEqualTo("onlyOption"); @@ -306,7 +306,7 @@ void testQuestionWithSingleToolVersionChoiceAndEmptyAnswer() { VersionIdentifier version = VersionIdentifier.of("17"); Cve cve = new Cve("CVE-2023-XXXX", 9.8, List.of(VersionRange.of("[17,18)"))); ToolVersionChoice choice = new ToolVersionChoice(new ToolEditionAndVersion(edition, version), "current", ToolVulnerabilities.of(List.of(cve))); - ToolVersionChoice[] options = {choice}; + ToolVersionChoice[] options = { choice }; context.setAnswers(""); // Empty answer (Enter) ToolVersionChoice result = context.question(options, "Which version?"); diff --git a/gui/pom.xml b/gui/pom.xml index fe87f3969c..7f4ca2ee50 100644 --- a/gui/pom.xml +++ b/gui/pom.xml @@ -30,7 +30,6 @@ ${project.groupId} ide-cli - tests ${project.version} test-jar test @@ -68,6 +67,14 @@ openjfx-monocle test + + + + org.wiremock + wiremock + 3.13.2 + test + diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index bb2ac5a280..1ee15816d0 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -20,7 +20,6 @@ import org.slf4j.LoggerFactory; import com.devonfw.ide.gui.context.IdeGuiStateManager; -import com.devonfw.ide.gui.helper.FakeProjectFolderStructureHelper; /** * Basic UI Test diff --git a/gui/src/test/java/com/devonfw/ide/gui/helper/FakeProjectFolderStructureHelper.java b/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java similarity index 97% rename from gui/src/test/java/com/devonfw/ide/gui/helper/FakeProjectFolderStructureHelper.java rename to gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java index 3b6f4a3019..d6850e22c3 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/helper/FakeProjectFolderStructureHelper.java +++ b/gui/src/test/java/com/devonfw/ide/gui/FakeProjectFolderStructureHelper.java @@ -1,4 +1,4 @@ -package com.devonfw.ide.gui.helper; +package com.devonfw.ide.gui; import static org.assertj.core.api.Assertions.assertThat; diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java index 3dbfffd0e5..7668971ef7 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java @@ -1,32 +1,44 @@ package com.devonfw.ide.gui.context; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import com.devonfw.ide.gui.helper.FakeProjectFolderStructureHelper; +import com.devonfw.tools.ide.context.AbstractIdeContextTest; +import com.devonfw.tools.ide.context.IdeTestContext; /** * Tests for {@link IdeGuiStateManager}. */ -public class IdeGuiStateManagerTest { +public class IdeGuiStateManagerTest extends AbstractIdeContextTest { + + private static final Logger LOG = LoggerFactory.getLogger(IdeGuiStateManagerTest.class); - @TempDir - private static Path mockIdeRoot; + private static IdeTestContext context; - private IdeGuiStateManager guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(mockIdeRoot.toString()); + private static IdeGuiStateManager guiStateManager; + private static ProjectManager projectManager; @BeforeAll - static void setup() throws IOException { + static void setup() throws FileNotFoundException { + + context = newContext("testProject", "project"); + LOG.warn("root: {}", context.getIdeRoot()); + + guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(context.getIdeRoot().toString()); + projectManager = guiStateManager.getProjectManager(); + } - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); + @BeforeEach + void reset() { + IdeGuiStateManager.getInstanceOverrideRootDir(context.getIdeRoot().toString()); } @Test @@ -52,16 +64,16 @@ void testThrowsIfIdeRootDoesNotExist() { @Test void testGetContext() throws FileNotFoundException { - IdeGuiContext context = guiStateManager.switchContext("project-0", "main"); + IdeGuiContext context = guiStateManager.switchContext(projectManager.getProjectNames().getFirst(), "main"); assertThat(context).isNotNull().as("context was null after switchContext was called"); // When switching to a project, the context should be set. } @Test - void testSwitchContext() throws IOException { + void testSwitchContext() { - Files.list(mockIdeRoot).forEach((projectPath) -> { + projectManager.getProjectNames().forEach((projectName) -> { try { - guiStateManager.switchContext(projectPath.getFileName().toString(), "main"); + guiStateManager.switchContext(projectName, "main"); } catch (FileNotFoundException e) { throw new RuntimeException(e); } @@ -71,7 +83,7 @@ void testSwitchContext() throws IOException { @Test void testThrowsIfNonExistentProjectSelected() { - Path fakeProject = mockIdeRoot.resolve("nonExistingProject"); + Path fakeProject = context.getIdeRoot().resolve("nonExistingProject"); try { guiStateManager.switchContext(fakeProject.getFileName().toString(), "main"); @@ -84,7 +96,7 @@ void testThrowsIfNonExistentProjectSelected() { @Test void testThrowsIfNonExistentWorkspaceSelected() throws IOException { - Files.list(mockIdeRoot).forEach((projectPath) -> { + Files.list(context.getIdeRoot()).forEach((projectPath) -> { try { guiStateManager.switchContext(projectPath.getFileName().toString(), "test"); } catch (FileNotFoundException e) { diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java index e8c2eea6eb..98056cd77f 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java @@ -1,72 +1,44 @@ package com.devonfw.ide.gui.context; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; - import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.devonfw.ide.gui.helper.FakeProjectFolderStructureHelper; +import com.devonfw.tools.ide.context.AbstractIdeContextTest; +import com.devonfw.tools.ide.context.IdeTestContext; /** * Tests for the ProjectManager class. */ -public class ProjectManagerTest { +public class ProjectManagerTest extends AbstractIdeContextTest { private static final Logger LOG = LoggerFactory.getLogger(ProjectManagerTest.class); - private ProjectManager projectManager; - - @TempDir - private static Path mockIdeRoot; - - // Used in tests where we don't want to have any projects in the root directory - @TempDir - private Path emptyRootDir; + private static ProjectManager projectManager; - @BeforeAll - static void setup() throws IOException { - - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); - } + private static IdeTestContext context; + private static Path ideRoot; - //Before each test, we want to restore the default clean test folder structure @BeforeEach - void resetToDefault() { + void resetContext() { - try (var stream = Files.list(mockIdeRoot)) { - stream.forEach(p -> { - try { - if (Files.isDirectory(p)) { - FileUtils.deleteDirectory(p.toFile()); - } else if (Files.isRegularFile(p)) { - Files.delete(p); - } - } catch (Exception e) { - LOG.error("Error deleting file while resetting project structure: {}", p, e); - } - }); - FakeProjectFolderStructureHelper.createFakeProjectFolderStructure(mockIdeRoot); - } catch (IOException e) { - LOG.error("Error walking through files while resetting project structure", e); - } + context = newContext("testProject", "project-0"); + ideRoot = context.getIdeRoot(); } @Test void testConstructorWithValidDirectory() { //No exception should be thrown - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); } @Test @@ -85,7 +57,7 @@ void testConstructorWithNonExistentDirectory() { try { - projectManager = new ProjectManager(mockIdeRoot.resolve("nonExistent")); + projectManager = new ProjectManager(ideRoot.resolve("nonExistent")); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException e) { assertThat(e.getMessage()).contains("Root directory does not exist"); @@ -96,17 +68,18 @@ void testConstructorWithNonExistentDirectory() { void testConstructorWithFile() throws IOException { try { - - File testFile = mockIdeRoot.resolve("testFile").toFile(); + File testFile = ideRoot.resolve("testFile").toFile(); boolean success = testFile.createNewFile(); if (!success) { throw new RuntimeException("Unable to create test file"); } - projectManager = new ProjectManager(mockIdeRoot.resolve("testFile")); + projectManager = new ProjectManager(ideRoot.resolve("testFile")); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException e) { assertThat(e.getMessage()).contains("Root directory is not a directory"); + } finally { + Files.deleteIfExists(ideRoot.resolve("testFile")); } } @@ -115,7 +88,8 @@ void testConstructorWithFile() throws IOException { @Test void testReadProjectsWithEmptyProjectDirectory() { - projectManager = new ProjectManager(emptyRootDir); + context = newContext("emptyProjects", ""); + projectManager = new ProjectManager(ideRoot); projectManager.refreshProjects(); assertThat(projectManager.getProjectNames()).isEmpty(); @@ -124,9 +98,9 @@ void testReadProjectsWithEmptyProjectDirectory() { @Test void testReadProjectsWithValidProjects() { - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); - // FakeProjectFolderStructureHelper creates projects 0-5 + //test folder contains baseProject to project-5 assertThat(projectManager.getProjectNames()).hasSize(6).as("Should have 6 projects") .containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); } @@ -135,67 +109,57 @@ void testReadProjectsWithValidProjects() { void testReadProjectsIgnoresUnderscorePrefixed() throws Exception { // Create a project with underscore prefix - Path underscoreProject = mockIdeRoot.resolve("_project"); - Files.createDirectories(underscoreProject.resolve("workspaces")); + Path underscoreProject = ideRoot.resolve("_project"); + Files.createDirectories(underscoreProject); + Files.copy(ideRoot.resolve("project-0"), underscoreProject, StandardCopyOption.REPLACE_EXISTING); - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); // Should not include _project, same as _ide directory should be ignored assertThat(projectManager.getProjectNames()).doesNotContain("_project").hasSize(6); + + //clean up + Files.delete(underscoreProject); } @Test - void testReadProjectsIgnoresDirectoriesWithoutWorkspacesFolder() throws Exception { + void testReadProjectsIgnoresDirectoriesWithoutWorkspacesFolder() { - // Create a project directory without workspaces folder - Path projectWithoutWorkspaces = mockIdeRoot.resolve("projectNoWorkspaces"); - Files.createDirectory(projectWithoutWorkspaces); - - projectManager = new ProjectManager(mockIdeRoot); + context = newContext("noWorkspaces", "projectWithoutWorkspaces"); + projectManager = new ProjectManager(ideRoot); // Should not include projectNoWorkspaces - assertThat(projectManager.getProjectNames()).doesNotContain("projectNoWorkspaces").hasSize(6); + assertThat(projectManager.getProjectNames()).doesNotContain("projectWithoutWorkspaces"); } // ============ readWorkspaces() Tests ============ - @Test - void testReadWorkspacesEmpty() { - - projectManager = new ProjectManager(emptyRootDir); - - // No projects, so no workspaces - assertThat(projectManager.getWorkspaceNames("any-project")).isNull(); - } - @Test void testReadWorkspacesWithMultipleWorkspaces() throws Exception { - Path project = mockIdeRoot.resolve("project-0"); + Path project = ideRoot.resolve("project-0"); Path workspacesDir = project.resolve("workspaces"); - // Create additional workspaces + // Create additional workspaces besides existing Files.createDirectory(workspacesDir.resolve("dev")); Files.createDirectory(workspacesDir.resolve("prod")); - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); // Should have main, dev, prod workspaces - assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(3) - .containsExactlyInAnyOrder("main", "dev", "prod"); + assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(4) + .containsExactlyInAnyOrder("main", "foo-test", "dev", "prod"); } @Test - void testReadWorkspacesEmptyWorkspaceDirectory() throws Exception { + void testReadWorkspacesEmptyWorkspaceDirectory() { - // Create a project with empty workspaces directory - Path emptyWorkspacesProject = mockIdeRoot.resolve("emptyWorkspacesProject"); - Files.createDirectories(emptyWorkspacesProject.resolve("workspaces")); + context = newContext("emptyWorkspaceFolders", "project-0"); - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); // Should return empty list for empty workspaces directory - assertThat(projectManager.getWorkspaceNames("emptyWorkspacesProject")).isEmpty(); + assertThat(projectManager.getWorkspaceNames("project-0")).isEmpty(); } // ============ refreshProjects() Tests ============ @@ -203,13 +167,13 @@ void testReadWorkspacesEmptyWorkspaceDirectory() throws Exception { @Test void testRefreshProjectsClearsExistingData() throws Exception { - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); // Get initial projects assertThat(projectManager.getProjectNames()).hasSize(6); // Delete a project - try (var stream = Files.walk(mockIdeRoot.resolve("project-0"))) { + try (var stream = Files.walk(ideRoot.resolve("project-0"))) { stream.forEach(p -> { try { FileUtils.deleteDirectory(p.toFile()); @@ -228,70 +192,43 @@ void testRefreshProjectsClearsExistingData() throws Exception { @Test void testRefreshProjectsReloadsAll() throws Exception { - projectManager = new ProjectManager(emptyRootDir); + projectManager = new ProjectManager(ideRoot); assertThat(projectManager.getProjectNames()).isEmpty(); - Path newProject = emptyRootDir.resolve("newProject"); + Path newProject = ideRoot.resolve("newProject"); Files.createDirectories(newProject.resolve("workspaces").resolve("main")); projectManager.refreshProjects(); assertThat(projectManager.getProjectNames()).hasSize(1).contains("newProject"); - } - @Test - void testGetProjectNamesReturnsNotNull() { - - projectManager = new ProjectManager(emptyRootDir); - - assertThat(projectManager.getProjectNames()).isNotNull(); - } - - @Test - void testGetProjectNamesReturnsCorrectList() { - - projectManager = new ProjectManager(mockIdeRoot); - - assertThat(projectManager.getProjectNames()).isNotEmpty().hasSize(6); + //clean up + Files.delete(newProject); } @Test - void testGetWorkspaceNamesReturnsCorrectList() { + void testGetWorkspaceNamesReturnsValidList() { - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); - assertThat(projectManager.getWorkspaceNames("project-0")).isNotNull().containsExactly("main"); + assertThat(projectManager.getWorkspaceNames("project-0")).containsExactly("foo-test", "main"); } @Test void testGetWorkspaceNamesWithInvalidProject() { - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); // Should return null for unknown project assertThat(projectManager.getWorkspaceNames("unknownProject")).isNull(); } - //Just checks whether getting projects and workspaces works correctly in one go - @Test - void testCompleteWorkflow() { - - projectManager = new ProjectManager(mockIdeRoot); - - // Verify projects are loaded - assertThat(projectManager.getProjectNames()).hasSize(6); - - // Verify workspaces are loaded for each project - for (String projectName : projectManager.getProjectNames()) { - assertThat(projectManager.getWorkspaceNames(projectName)).isNotNull().contains("main"); - } - } @Test void testProjectWithMultipleWorkspaces() throws Exception { - Path project = mockIdeRoot.resolve("project-0"); + Path project = ideRoot.resolve("project-0"); Path workspacesDir = project.resolve("workspaces"); // Create multiple workspaces @@ -299,7 +236,7 @@ void testProjectWithMultipleWorkspaces() throws Exception { Files.createDirectory(workspacesDir.resolve(workspace)); } - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); // Should have all workspaces including main assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(5) @@ -311,7 +248,7 @@ void testMultipleProjectsWithWorkspaces() throws Exception { // Create different workspace structures for different projects for (int i = 0; i < 6; i++) { - Path project = mockIdeRoot.resolve("project-" + i); + Path project = ideRoot.resolve("project-" + i); Path workspacesDir = project.resolve("workspaces"); // Add additional workspaces to each project @@ -320,7 +257,7 @@ void testMultipleProjectsWithWorkspaces() throws Exception { } } - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); // Verify each project has correct number of workspaces for (int i = 0; i < 6; i++) { @@ -330,22 +267,13 @@ void testMultipleProjectsWithWorkspaces() throws Exception { } } - @Test - void testConstructorCallsRefreshProjects() { - - projectManager = new ProjectManager(mockIdeRoot); - - // If refreshProjects is called in constructor, projects should be loaded immediately - assertThat(projectManager.getProjectNames()).isNotEmpty().hasSize(6); - } - @Test void testProjectNamesWithSpecialCharacters() throws Exception { - Path specialProject = mockIdeRoot.resolve("project-dash_underscore&"); + Path specialProject = ideRoot.resolve("project-dash_underscore&"); Files.createDirectories(specialProject.resolve("workspaces").resolve("main")); - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); assertThat(projectManager.getProjectNames()).contains("project-dash_underscore&"); } @@ -353,14 +281,14 @@ void testProjectNamesWithSpecialCharacters() throws Exception { @Test void testWorkspaceNamesWithSpecialCharacters() throws Exception { - Path project = mockIdeRoot.resolve("project-0"); + Path project = ideRoot.resolve("project-0"); Path workspacesDir = project.resolve("workspaces"); // Create workspaces with special characters Files.createDirectory(workspacesDir.resolve("dev-environment")); Files.createDirectory(workspacesDir.resolve("test_workspace")); - projectManager = new ProjectManager(mockIdeRoot); + projectManager = new ProjectManager(ideRoot); assertThat(projectManager.getWorkspaceNames("project-0")) .contains("dev-environment", "test_workspace", "main"); diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide b/gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide new file mode 100644 index 0000000000..01f20642fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide @@ -0,0 +1,2 @@ +#!/bin/bash +echo "ide $*" diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version b/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version new file mode 100644 index 0000000000..62ec2f6393 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version @@ -0,0 +1 @@ +testVersion diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme b/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme new file mode 100644 index 0000000000..c5be1dc4fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme @@ -0,0 +1 @@ +this is the tool repository \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls new file mode 100644 index 0000000000..979afbc06f --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.tgz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls new file mode 100644 index 0000000000..1697e0ff2d --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.dmg diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls new file mode 100644 index 0000000000..e43fbf1dc6 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.zip diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls new file mode 100644 index 0000000000..f500d7d6f5 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.tgz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls new file mode 100644 index 0000000000..36094258c3 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.dmg diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls new file mode 100644 index 0000000000..8c9ad7e518 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.zip diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls new file mode 100644 index 0000000000..2f0e744d44 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.tgz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls new file mode 100644 index 0000000000..e2c2050871 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.dmg diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls new file mode 100644 index 0000000000..81e4b0c021 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.zip diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls new file mode 100644 index 0000000000..2d5a377122 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls new file mode 100644 index 0000000000..10aea51a47 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls new file mode 100644 index 0000000000..82d63fe842 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme new file mode 100644 index 0000000000..befcdfa755 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme @@ -0,0 +1 @@ +this is the download metadata \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide new file mode 100644 index 0000000000..01f20642fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide @@ -0,0 +1,2 @@ +#!/bin/bash +echo "ide $*" diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version new file mode 100644 index 0000000000..62ec2f6393 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version @@ -0,0 +1 @@ +testVersion diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme new file mode 100644 index 0000000000..c5be1dc4fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme @@ -0,0 +1 @@ +this is the tool repository \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls new file mode 100644 index 0000000000..979afbc06f --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.tgz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls new file mode 100644 index 0000000000..1697e0ff2d --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.dmg diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls new file mode 100644 index 0000000000..e43fbf1dc6 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.zip diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls new file mode 100644 index 0000000000..f500d7d6f5 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.tgz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls new file mode 100644 index 0000000000..36094258c3 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.dmg diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls new file mode 100644 index 0000000000..8c9ad7e518 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.zip diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls new file mode 100644 index 0000000000..2f0e744d44 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.tgz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls new file mode 100644 index 0000000000..e2c2050871 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.dmg diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls new file mode 100644 index 0000000000..81e4b0c021 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.zip diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls new file mode 100644 index 0000000000..2d5a377122 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls new file mode 100644 index 0000000000..10aea51a47 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls new file mode 100644 index 0000000000..82d63fe842 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme new file mode 100644 index 0000000000..befcdfa755 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme @@ -0,0 +1 @@ +this is the download metadata \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide new file mode 100644 index 0000000000..01f20642fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide @@ -0,0 +1,2 @@ +#!/bin/bash +echo "ide $*" diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version new file mode 100644 index 0000000000..62ec2f6393 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version @@ -0,0 +1 @@ +testVersion diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme new file mode 100644 index 0000000000..c5be1dc4fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme @@ -0,0 +1 @@ +this is the tool repository \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls new file mode 100644 index 0000000000..979afbc06f --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.tgz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls new file mode 100644 index 0000000000..1697e0ff2d --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.dmg diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls new file mode 100644 index 0000000000..e43fbf1dc6 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.zip diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls new file mode 100644 index 0000000000..f500d7d6f5 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.tgz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls new file mode 100644 index 0000000000..36094258c3 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.dmg diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls new file mode 100644 index 0000000000..8c9ad7e518 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.zip diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls new file mode 100644 index 0000000000..2f0e744d44 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.tgz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls new file mode 100644 index 0000000000..e2c2050871 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.dmg diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls new file mode 100644 index 0000000000..81e4b0c021 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.zip diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls new file mode 100644 index 0000000000..2d5a377122 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls new file mode 100644 index 0000000000..10aea51a47 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls new file mode 100644 index 0000000000..82d63fe842 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme new file mode 100644 index 0000000000..befcdfa755 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme @@ -0,0 +1 @@ +this is the download metadata \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/bin/ide b/gui/src/test/resources/ide-projects/testProject/_ide/bin/ide new file mode 100644 index 0000000000..01f20642fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/bin/ide @@ -0,0 +1,2 @@ +#!/bin/bash +echo "ide $*" diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/software/default/az/az/testVersion/.ide.software.version b/gui/src/test/resources/ide-projects/testProject/_ide/software/default/az/az/testVersion/.ide.software.version new file mode 100644 index 0000000000..62ec2f6393 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/software/default/az/az/testVersion/.ide.software.version @@ -0,0 +1 @@ +testVersion diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/software/readme b/gui/src/test/resources/ide-projects/testProject/_ide/software/readme new file mode 100644 index 0000000000..c5be1dc4fd --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/software/readme @@ -0,0 +1 @@ +this is the tool repository \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/linux_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/linux_x64.urls new file mode 100644 index 0000000000..979afbc06f --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.tgz diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/mac_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/mac_x64.urls new file mode 100644 index 0000000000..1697e0ff2d --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.dmg diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/windows_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/windows_x64.urls new file mode 100644 index 0000000000..e43fbf1dc6 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.10/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10/java-17.0.10.zip diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/linux_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/linux_x64.urls new file mode 100644 index 0000000000..f500d7d6f5 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.tgz diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/mac_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/mac_x64.urls new file mode 100644 index 0000000000..36094258c3 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.dmg diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/windows_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/windows_x64.urls new file mode 100644 index 0000000000..8c9ad7e518 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/17.0.6/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.6/java-17.0.6.zip diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/linux_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/linux_x64.urls new file mode 100644 index 0000000000..2f0e744d44 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/linux_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.tgz diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/mac_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/mac_x64.urls new file mode 100644 index 0000000000..e2c2050871 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/mac_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.dmg diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/windows_x64.urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/windows_x64.urls new file mode 100644 index 0000000000..81e4b0c021 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/java/java/21.0.8_9/windows_x64.urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.zip diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/status.json b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/urls new file mode 100644 index 0000000000..2d5a377122 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.0.5/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/status.json b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/status.json new file mode 100644 index 0000000000..efe228f91b --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/status.json @@ -0,0 +1,10 @@ +{ + "manual": false, + "urls": { + "-997329125": { + "success": { + "timestamp": "2023-04-28T07:12:26.601818Z" + } + } + } +} diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/urls new file mode 100644 index 0000000000..10aea51a47 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.1.0/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/status.json b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/urls b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/urls new file mode 100644 index 0000000000..82d63fe842 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/mvn/3.2.1/urls @@ -0,0 +1 @@ +https://archive.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json new file mode 100644 index 0000000000..e66f9ed767 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json @@ -0,0 +1,10 @@ + + "manual" : false, + "urls" : { + "-997329125" : { + "success" : { + "timestamp" : "2023-04-28T07:12:26.601818Z" + } + } + } +} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/_ide/urls/readme b/gui/src/test/resources/ide-projects/testProject/_ide/urls/readme new file mode 100644 index 0000000000..befcdfa755 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/_ide/urls/readme @@ -0,0 +1 @@ +this is the download metadata \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/conf/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-0/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/testProject/project-0/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/home/readme b/gui/src/test/resources/ide-projects/testProject/project-0/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/settings/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-0/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/testProject/project-0/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/setup b/gui/src/test/resources/ide-projects/testProject/project-0/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/software/java/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-0/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/testProject/project-0/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/software/node/npm b/gui/src/test/resources/ide-projects/testProject/project-0/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/workspaces/foo-test/readme b/gui/src/test/resources/ide-projects/testProject/project-0/workspaces/foo-test/readme new file mode 100644 index 0000000000..948f8cfea2 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/workspaces/foo-test/readme @@ -0,0 +1 @@ +this is the foo-test workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-0/workspaces/main/readme b/gui/src/test/resources/ide-projects/testProject/project-0/workspaces/main/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-0/workspaces/main/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/conf/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-1/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/testProject/project-1/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/home/readme b/gui/src/test/resources/ide-projects/testProject/project-1/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/settings/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-1/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/testProject/project-1/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/setup b/gui/src/test/resources/ide-projects/testProject/project-1/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/software/java/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-1/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/testProject/project-1/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/software/node/npm b/gui/src/test/resources/ide-projects/testProject/project-1/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/workspaces/foo-test/readme b/gui/src/test/resources/ide-projects/testProject/project-1/workspaces/foo-test/readme new file mode 100644 index 0000000000..948f8cfea2 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/workspaces/foo-test/readme @@ -0,0 +1 @@ +this is the foo-test workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-1/workspaces/main/readme b/gui/src/test/resources/ide-projects/testProject/project-1/workspaces/main/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-1/workspaces/main/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/conf/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-2/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/testProject/project-2/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/home/readme b/gui/src/test/resources/ide-projects/testProject/project-2/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/settings/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-2/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/testProject/project-2/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/setup b/gui/src/test/resources/ide-projects/testProject/project-2/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/software/java/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-2/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/testProject/project-2/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/software/node/npm b/gui/src/test/resources/ide-projects/testProject/project-2/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/workspaces/foo-test/readme b/gui/src/test/resources/ide-projects/testProject/project-2/workspaces/foo-test/readme new file mode 100644 index 0000000000..948f8cfea2 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/workspaces/foo-test/readme @@ -0,0 +1 @@ +this is the foo-test workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-2/workspaces/main/readme b/gui/src/test/resources/ide-projects/testProject/project-2/workspaces/main/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-2/workspaces/main/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/conf/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-3/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/testProject/project-3/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/home/readme b/gui/src/test/resources/ide-projects/testProject/project-3/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/settings/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-3/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/testProject/project-3/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/setup b/gui/src/test/resources/ide-projects/testProject/project-3/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/software/java/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-3/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/testProject/project-3/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/software/node/npm b/gui/src/test/resources/ide-projects/testProject/project-3/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/workspaces/foo-test/readme b/gui/src/test/resources/ide-projects/testProject/project-3/workspaces/foo-test/readme new file mode 100644 index 0000000000..948f8cfea2 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/workspaces/foo-test/readme @@ -0,0 +1 @@ +this is the foo-test workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-3/workspaces/main/readme b/gui/src/test/resources/ide-projects/testProject/project-3/workspaces/main/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-3/workspaces/main/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/conf/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-4/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/testProject/project-4/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/home/readme b/gui/src/test/resources/ide-projects/testProject/project-4/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/settings/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-4/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/testProject/project-4/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/setup b/gui/src/test/resources/ide-projects/testProject/project-4/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/software/java/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-4/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/testProject/project-4/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/software/node/npm b/gui/src/test/resources/ide-projects/testProject/project-4/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/workspaces/foo-test/readme b/gui/src/test/resources/ide-projects/testProject/project-4/workspaces/foo-test/readme new file mode 100644 index 0000000000..948f8cfea2 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/workspaces/foo-test/readme @@ -0,0 +1 @@ +this is the foo-test workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-4/workspaces/main/readme b/gui/src/test/resources/ide-projects/testProject/project-4/workspaces/main/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-4/workspaces/main/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/conf/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-5/conf/ide.properties new file mode 100644 index 0000000000..c041e43ae1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/conf/ide.properties @@ -0,0 +1,6 @@ +#******************************************************************************** +# This file contains project specific environment variables defined by the user +#******************************************************************************** +M2_REPO=~/.m2/repository +MVN_VERSION=3.9.1 +SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/ide.properties new file mode 100644 index 0000000000..c532faa1aa --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/ide.properties @@ -0,0 +1,13 @@ +#******************************************************************************** +# This file contains the global configuration from the user HOME directory. +#******************************************************************************** +DOCKER_EDITION=docker +FOO=foo-${BAR} +TEST_ARGS1=${TEST_ARGS1} user1 +TEST_ARGS2=${TEST_ARGS2} user2 +TEST_ARGS3=${TEST_ARGS3} user3 +TEST_ARGS7=user7 +TEST_ARGS10=user10 +TEST_ARGSb=userb +TEST_ARGSc=${TEST_ARGS1} userc +TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..eb298f3bbc --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/home/.ide/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=false diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/testProject/project-5/home/Downloads/ide/readme new file mode 100644 index 0000000000..f0dc29025a --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/home/Downloads/ide/readme @@ -0,0 +1 @@ +this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/home/readme b/gui/src/test/resources/ide-projects/testProject/project-5/home/readme new file mode 100644 index 0000000000..5e8bc178cf --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/home/readme @@ -0,0 +1 @@ +this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/anyedit.properties new file mode 100644 index 0000000000..09a94b1160 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/anyedit.properties @@ -0,0 +1,3 @@ +plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ +plugin_id=AnyEditTools.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/checkstyle.properties new file mode 100644 index 0000000000..6e402c7c5d --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/settings/eclipse/plugins/checkstyle.properties @@ -0,0 +1,3 @@ +plugin_url=https://checkstyle.org/eclipse-cs-update-site +plugin_id=net.sf.eclipsecs.feature.group +plugin_active=true diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/settings/ide.properties b/gui/src/test/resources/ide-projects/testProject/project-5/settings/ide.properties new file mode 100644 index 0000000000..1ccf228f98 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/settings/ide.properties @@ -0,0 +1,9 @@ +#******************************************************************************** +# This file contains project specific environment variables +#******************************************************************************** +JAVA_VERSION=17* +MVN_VERSION=3.9.0 +ECLIPSE_VERSION=2023-03 +INTELLIJ_EDITION=ultimate +IDE_TOOLS=mvn,eclipse +BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/testProject/project-5/settings/workspace/update/.editorconfig new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/setup b/gui/src/test/resources/ide-projects/testProject/project-5/setup new file mode 100644 index 0000000000..9c5d4b1be1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/setup @@ -0,0 +1 @@ +just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/software/java/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-5/software/java/bin/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/software/java/bin/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/.devon.software.version new file mode 100644 index 0000000000..e0d61b5b06 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/.devon.software.version @@ -0,0 +1 @@ +3.9.4 diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/mvn new file mode 100644 index 0000000000..4a97b4f4a1 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/mvn @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "$1" == "-h" ]; then + echo "usage: mvn [options] [] []" +fi +echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/readme new file mode 100644 index 0000000000..2d2cc36674 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/software/mvn/bin/readme @@ -0,0 +1 @@ +this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/testProject/project-5/software/node/.ide.software.version new file mode 100644 index 0000000000..0c4da74167 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/software/node/.ide.software.version @@ -0,0 +1 @@ +17.0.6 diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/software/node/npm b/gui/src/test/resources/ide-projects/testProject/project-5/software/node/npm new file mode 100644 index 0000000000..b547b61509 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/software/node/npm @@ -0,0 +1,6 @@ +#!/bin/bash +echo "npm $*" + +if [ "$*" == "list -g npm --depth=0" ]; then + echo "11.0.0" +fi diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/workspaces/foo-test/readme b/gui/src/test/resources/ide-projects/testProject/project-5/workspaces/foo-test/readme new file mode 100644 index 0000000000..948f8cfea2 --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/workspaces/foo-test/readme @@ -0,0 +1 @@ +this is the foo-test workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/testProject/project-5/workspaces/main/readme b/gui/src/test/resources/ide-projects/testProject/project-5/workspaces/main/readme new file mode 100644 index 0000000000..7146c2ad6c --- /dev/null +++ b/gui/src/test/resources/ide-projects/testProject/project-5/workspaces/main/readme @@ -0,0 +1 @@ +this is the main workspace of basic \ No newline at end of file From 9978ce9fcea2214cd279080c83776cb9ed712e6d Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 28 Apr 2026 18:04:46 +0200 Subject: [PATCH 28/31] #1802: Updated UI logic to: - not automatically select a workspace - to seperate concerns of which functions update the workspace combobox and which the project combobox --- .../main/java/com/devonfw/ide/gui/App.java | 2 +- .../com/devonfw/ide/gui/MainController.java | 25 ++++++++----------- .../com/devonfw/ide/gui/main-view.fxml | 2 +- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/gui/src/main/java/com/devonfw/ide/gui/App.java b/gui/src/main/java/com/devonfw/ide/gui/App.java index 4809e232c9..f6f715fe7d 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/App.java +++ b/gui/src/main/java/com/devonfw/ide/gui/App.java @@ -31,7 +31,7 @@ public class App extends Application { public void start(Stage primaryStage) throws IOException { Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { - LOG.info("Uncaught exception in thread {}: {}", thread.getName(), throwable.getMessage(), throwable); + LOG.error("Uncaught exception in thread {}: {}", thread.getName(), throwable.getMessage(), throwable); Platform.runLater(() -> new IdeDialog(IdeDialog.AlertType.ERROR, throwable.getMessage()).showAndWait()); } ); diff --git a/gui/src/main/java/com/devonfw/ide/gui/MainController.java b/gui/src/main/java/com/devonfw/ide/gui/MainController.java index 333ae4a494..8b0d42b6d3 100644 --- a/gui/src/main/java/com/devonfw/ide/gui/MainController.java +++ b/gui/src/main/java/com/devonfw/ide/gui/MainController.java @@ -13,7 +13,6 @@ import com.devonfw.ide.gui.context.IdeGuiStateManager; import com.devonfw.ide.gui.context.ProjectManager; import com.devonfw.ide.gui.modal.IdeDialog; -import com.devonfw.tools.ide.context.IdeContext; /** * Controller of the main screen of the dashboard GUI. @@ -88,7 +87,6 @@ private void openVsCode() { openIDE("vscode"); } - private void setProjectsComboBox() { assert (directoryPath != null) : "directoryPath is null! Please check the setup of your environment variables (IDE_ROOT)"; @@ -100,28 +98,27 @@ private void setProjectsComboBox() { selectedProject.setOnAction(actionEvent -> { - projectValue = Path.of(selectedProject.getValue()).resolve(IdeContext.FOLDER_WORKSPACES); + setWorkspaceComboBox(); + selectedWorkspace.setDisable(false); - androidStudioOpen.setDisable(false); - eclipseOpen.setDisable(false); - intellijOpen.setDisable(false); - vsCodeOpen.setDisable(false); - selectedWorkspace.setValue("main"); - this.workspaceValue = Path.of("main"); - updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); }); } - @FXML - private void setWorkspaceValue() { + private void setWorkspaceComboBox() { List workspaces = projectManager.getWorkspaceNames(selectedProject.getValue()); selectedWorkspace.getItems().clear(); selectedWorkspace.getItems().addAll(workspaces); - this.workspaceValue = Path.of(selectedWorkspace.getValue()); - updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); + selectedWorkspace.setOnAction(actionEvent -> { + updateContext(selectedProject.getValue(), selectedWorkspace.getValue()); + + androidStudioOpen.setDisable(false); + eclipseOpen.setDisable(false); + intellijOpen.setDisable(false); + vsCodeOpen.setDisable(false); + }); } private void openIDE(String inIde) { diff --git a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml index 6a19d8b517..7bcb75e3fb 100644 --- a/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml +++ b/gui/src/main/resources/com/devonfw/ide/gui/main-view.fxml @@ -40,7 +40,7 @@ From ac3a0457e6441edee7c654b04ccb693b38597ab1 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 28 Apr 2026 18:52:43 +0200 Subject: [PATCH 29/31] #1802: cleaned up ProjectManagerTest, fixed AppBaseTest to follow new Select-Project-Then-Select-Workspace UI logic (previous commit) --- .../java/com/devonfw/ide/gui/AppBaseTest.java | 17 +- .../ide/gui/context/ProjectManagerTest.java | 239 +++++------------- .../ide-projects/emptyProjects/_ide/bin/ide | 2 - .../az/az/testVersion/.ide.software.version | 1 - .../emptyProjects/_ide/software/readme | 1 - .../urls/java/java/17.0.10/linux_x64.urls | 1 - .../_ide/urls/java/java/17.0.10/mac_x64.urls | 1 - .../urls/java/java/17.0.10/windows_x64.urls | 1 - .../_ide/urls/java/java/17.0.6/linux_x64.urls | 1 - .../_ide/urls/java/java/17.0.6/mac_x64.urls | 1 - .../urls/java/java/17.0.6/windows_x64.urls | 1 - .../urls/java/java/21.0.8_9/linux_x64.urls | 1 - .../_ide/urls/java/java/21.0.8_9/mac_x64.urls | 1 - .../urls/java/java/21.0.8_9/windows_x64.urls | 1 - .../_ide/urls/mvn/mvn/3.0.5/status.json | 10 - .../_ide/urls/mvn/mvn/3.0.5/urls | 1 - .../_ide/urls/mvn/mvn/3.1.0/status.json | 10 - .../_ide/urls/mvn/mvn/3.1.0/urls | 1 - .../_ide/urls/mvn/mvn/3.2.1/status.json | 10 - .../_ide/urls/mvn/mvn/3.2.1/urls | 1 - .../mvn/secondMvnEdition/3.2.1/status.json | 10 - .../emptyProjects/_ide/urls/readme | 1 - .../emptyWorkspaceFolders/_ide/bin/ide | 2 - .../az/az/testVersion/.ide.software.version | 1 - .../_ide/software/readme | 1 - .../urls/java/java/17.0.10/linux_x64.urls | 1 - .../_ide/urls/java/java/17.0.10/mac_x64.urls | 1 - .../urls/java/java/17.0.10/windows_x64.urls | 1 - .../_ide/urls/java/java/17.0.6/linux_x64.urls | 1 - .../_ide/urls/java/java/17.0.6/mac_x64.urls | 1 - .../urls/java/java/17.0.6/windows_x64.urls | 1 - .../urls/java/java/21.0.8_9/linux_x64.urls | 1 - .../_ide/urls/java/java/21.0.8_9/mac_x64.urls | 1 - .../urls/java/java/21.0.8_9/windows_x64.urls | 1 - .../_ide/urls/mvn/mvn/3.0.5/status.json | 10 - .../_ide/urls/mvn/mvn/3.0.5/urls | 1 - .../_ide/urls/mvn/mvn/3.1.0/status.json | 10 - .../_ide/urls/mvn/mvn/3.1.0/urls | 1 - .../_ide/urls/mvn/mvn/3.2.1/status.json | 10 - .../_ide/urls/mvn/mvn/3.2.1/urls | 1 - .../mvn/secondMvnEdition/3.2.1/status.json | 10 - .../emptyWorkspaceFolders/_ide/urls/readme | 1 - .../project-0/conf/ide.properties | 6 - .../project-0/home/.ide/ide.properties | 13 - .../eclipse/plugins/anyedit.properties | 3 - .../project-0/home/Downloads/ide/readme | 1 - .../project-0/home/readme | 1 - .../eclipse/plugins/anyedit.properties | 3 - .../eclipse/plugins/checkstyle.properties | 3 - .../project-0/settings/ide.properties | 9 - .../settings/workspace/update/.editorconfig | 0 .../emptyWorkspaceFolders/project-0/setup | 1 - .../project-0/software/java/bin/readme | 1 - .../software/mvn/.devon.software.version | 1 - .../project-0/software/mvn/bin/mvn | 5 - .../project-0/software/mvn/bin/readme | 1 - .../software/node/.ide.software.version | 1 - .../project-0/software/node/npm | 6 - .../ide-projects/noWorkspaces/_ide/bin/ide | 2 - .../az/az/testVersion/.ide.software.version | 1 - .../noWorkspaces/_ide/software/readme | 1 - .../urls/java/java/17.0.10/linux_x64.urls | 1 - .../_ide/urls/java/java/17.0.10/mac_x64.urls | 1 - .../urls/java/java/17.0.10/windows_x64.urls | 1 - .../_ide/urls/java/java/17.0.6/linux_x64.urls | 1 - .../_ide/urls/java/java/17.0.6/mac_x64.urls | 1 - .../urls/java/java/17.0.6/windows_x64.urls | 1 - .../urls/java/java/21.0.8_9/linux_x64.urls | 1 - .../_ide/urls/java/java/21.0.8_9/mac_x64.urls | 1 - .../urls/java/java/21.0.8_9/windows_x64.urls | 1 - .../_ide/urls/mvn/mvn/3.0.5/status.json | 10 - .../noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls | 1 - .../_ide/urls/mvn/mvn/3.1.0/status.json | 10 - .../noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls | 1 - .../_ide/urls/mvn/mvn/3.2.1/status.json | 10 - .../noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls | 1 - .../mvn/secondMvnEdition/3.2.1/status.json | 10 - .../noWorkspaces/_ide/urls/readme | 1 - .../conf/ide.properties | 6 - .../home/.ide/ide.properties | 13 - .../eclipse/plugins/anyedit.properties | 3 - .../home/Downloads/ide/readme | 1 - .../projectWithoutWorkspaces/home/readme | 1 - .../eclipse/plugins/anyedit.properties | 3 - .../eclipse/plugins/checkstyle.properties | 3 - .../settings/ide.properties | 9 - .../settings/workspace/update/.editorconfig | 0 .../projectWithoutWorkspaces/setup | 1 - .../software/java/bin/readme | 1 - .../software/mvn/.devon.software.version | 1 - .../software/mvn/bin/mvn | 5 - .../software/mvn/bin/readme | 1 - .../software/node/.ide.software.version | 1 - .../software/node/npm | 6 - 94 files changed, 67 insertions(+), 470 deletions(-) delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/workspace/update/.editorconfig delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version delete mode 100644 gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/workspace/update/.editorconfig delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version delete mode 100644 gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm diff --git a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java index 1ee15816d0..bb2f9062ac 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/AppBaseTest.java @@ -75,14 +75,14 @@ protected static void generateProjectFolderStructure() throws IOException { * This test ensures that all IDE open buttons are disabled when no project is selected. */ @Test - public void testIdeOpenButtonsDisabledWhenNoProjectSelected() { + public void testIdeOpenButtonsDisabledWhenNoWorkspaceSelected() { // assert that no project is selected - assertThat(selectedProject.getValue()).isNull(); + assertThat(selectedWorkspace.getValue()).isNull(); // assert all IDE open buttons are disabled for (Button button : new Button[] { androidStudioOpen, eclipseOpen, intellijOpen, vsCodeOpen }) { - assertThat(button.isDisabled()).as(button.getId() + " button should be disabled when no project has been selected").isTrue(); + assertThat(button.isDisabled()).as(button.getId() + " button should be disabled when no workspace has been selected").isTrue(); } } @@ -90,14 +90,15 @@ public void testIdeOpenButtonsDisabledWhenNoProjectSelected() { * This test ensures that all IDE open buttons are enabled when a project is selected. */ @Test - public void testIdeOpenButtonsEnabledWhenProjectSelected() { + public void testIdeOpenButtonsEnabledWhenWorkspaceSelected() { - // assert that a project is selected + // assert that a project and workspace is selected interact(() -> selectedProject.getSelectionModel().select("project-1")); + interact(() -> selectedWorkspace.getSelectionModel().select("main")); - // assert all IDE open buttons are disabled + // assert all IDE open buttons are enabled for (Button button : new Button[] { androidStudioOpen, eclipseOpen, intellijOpen, vsCodeOpen }) { - assertThat(!button.isDisabled()).as(button.getId() + " button should be enabled when a project has been selected").isTrue(); + assertThat(button.isDisabled()).as(button.getId() + " button should be enabled when a workspace has been selected").isFalse(); } } @@ -118,7 +119,7 @@ public void testWorkspaceComboBoxDisabledWhenNoProjectSelected() { * Tests that the workspace {@link ComboBox} is enabled when a project is selected. */ @Test - public void testWorkspaceComboboxEnabledEnabledWhenProjectSelected() { + public void testWorkspaceComboBoxEnabledEnabledWhenProjectSelected() { // assert that a project is selected interact(() -> selectedProject.getSelectionModel().select("project-1")); diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java index 98056cd77f..6dec8d8451 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java @@ -4,9 +4,8 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.StandardCopyOption; +import java.util.stream.Stream; -import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.Logger; @@ -35,10 +34,15 @@ void resetContext() { } @Test - void testConstructorWithValidDirectory() { + void testProjectManagerFull() { - //No exception should be thrown projectManager = new ProjectManager(ideRoot); + + assertThat(projectManager).isNotNull(); + assertThat(projectManager.getProjectNames()).containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); + for (String projectName : projectManager.getProjectNames()) { + assertThat(projectManager.getWorkspaceNames(projectName)).containsExactlyInAnyOrder("foo-test", "main"); + } } @Test @@ -83,214 +87,87 @@ void testConstructorWithFile() throws IOException { } } - // ============ readProjects() Tests ============ - @Test - void testReadProjectsWithEmptyProjectDirectory() { + void testRefreshProjects() throws IOException { - context = newContext("emptyProjects", ""); projectManager = new ProjectManager(ideRoot); - projectManager.refreshProjects(); + assertThat(projectManager.getProjectNames()).containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); - assertThat(projectManager.getProjectNames()).isEmpty(); - } + Path project0 = ideRoot.resolve("project-0"); + Path project6 = ideRoot.resolve("project-6"); + copyDirectory(project0, project6); - @Test - void testReadProjectsWithValidProjects() { + projectManager.refreshProjects(); - projectManager = new ProjectManager(ideRoot); + // Verify that project-6 is now recognized + assertThat(projectManager.getProjectNames()).containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5", + "project-6"); + assertThat(projectManager.getWorkspaceNames("project-6")).containsExactlyInAnyOrder("foo-test", "main"); - //test folder contains baseProject to project-5 - assertThat(projectManager.getProjectNames()).hasSize(6).as("Should have 6 projects") - .containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); + // Cleanup + deleteDirectory(project6); } @Test - void testReadProjectsIgnoresUnderscorePrefixed() throws Exception { + void testReadProjectsExcludesFoldersWithoutWorkspaces() throws IOException { - // Create a project with underscore prefix - Path underscoreProject = ideRoot.resolve("_project"); - Files.createDirectories(underscoreProject); - Files.copy(ideRoot.resolve("project-0"), underscoreProject, StandardCopyOption.REPLACE_EXISTING); + // Create a project folder without a workspaces subdirectory + Path testProject = ideRoot.resolve("test-project-no-workspaces"); + Files.createDirectory(testProject); projectManager = new ProjectManager(ideRoot); - // Should not include _project, same as _ide directory should be ignored - assertThat(projectManager.getProjectNames()).doesNotContain("_project").hasSize(6); + // Verify that test-project-no-workspaces is not recognized + assertThat(projectManager.getProjectNames()).doesNotContain("test-project-no-workspaces"); + assertThat(projectManager.getProjectNames()).containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); - //clean up - Files.delete(underscoreProject); + // Cleanup + deleteDirectory(testProject); } @Test - void testReadProjectsIgnoresDirectoriesWithoutWorkspacesFolder() { + void testReadProjectsExcludesUnderscorePrefixedFolders() { - context = newContext("noWorkspaces", "projectWithoutWorkspaces"); projectManager = new ProjectManager(ideRoot); - // Should not include projectNoWorkspaces - assertThat(projectManager.getProjectNames()).doesNotContain("projectWithoutWorkspaces"); + // Verify that _ide folder is not in the project names + assertThat(projectManager.getProjectNames()).doesNotContain("_ide"); + assertThat(projectManager.getProjectNames()).containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); } - // ============ readWorkspaces() Tests ============ - - @Test - void testReadWorkspacesWithMultipleWorkspaces() throws Exception { - - Path project = ideRoot.resolve("project-0"); - Path workspacesDir = project.resolve("workspaces"); - - // Create additional workspaces besides existing - Files.createDirectory(workspacesDir.resolve("dev")); - Files.createDirectory(workspacesDir.resolve("prod")); - - projectManager = new ProjectManager(ideRoot); - - // Should have main, dev, prod workspaces - assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(4) - .containsExactlyInAnyOrder("main", "foo-test", "dev", "prod"); - } - - @Test - void testReadWorkspacesEmptyWorkspaceDirectory() { - - context = newContext("emptyWorkspaceFolders", "project-0"); - - projectManager = new ProjectManager(ideRoot); - - // Should return empty list for empty workspaces directory - assertThat(projectManager.getWorkspaceNames("project-0")).isEmpty(); - } + private void copyDirectory(Path source, Path destination) throws IOException { - // ============ refreshProjects() Tests ============ - - @Test - void testRefreshProjectsClearsExistingData() throws Exception { - - projectManager = new ProjectManager(ideRoot); - - // Get initial projects - assertThat(projectManager.getProjectNames()).hasSize(6); - - // Delete a project - try (var stream = Files.walk(ideRoot.resolve("project-0"))) { - stream.forEach(p -> { + Files.createDirectory(destination); + try (Stream stream = Files.list(source)) { + stream.forEach(sourcePath -> { try { - FileUtils.deleteDirectory(p.toFile()); - } catch (Exception e) { - fail("Error deleting project for test case: {}", p, e); + if (Files.isDirectory(sourcePath)) { + copyDirectory(sourcePath, destination.resolve(sourcePath.getFileName())); + } else { + Files.copy(sourcePath, destination.resolve(sourcePath.getFileName())); + } + } catch (IOException e) { + throw new RuntimeException("Failed to copy directory", e); } }); } - - // Refresh should clear old data and reload - projectManager.refreshProjects(); - - assertThat(projectManager.getProjectNames()).hasSize(5).doesNotContain("project-0"); - } - - @Test - void testRefreshProjectsReloadsAll() throws Exception { - - projectManager = new ProjectManager(ideRoot); - - assertThat(projectManager.getProjectNames()).isEmpty(); - - Path newProject = ideRoot.resolve("newProject"); - Files.createDirectories(newProject.resolve("workspaces").resolve("main")); - - projectManager.refreshProjects(); - - assertThat(projectManager.getProjectNames()).hasSize(1).contains("newProject"); - - //clean up - Files.delete(newProject); - } - - @Test - void testGetWorkspaceNamesReturnsValidList() { - - projectManager = new ProjectManager(ideRoot); - - assertThat(projectManager.getWorkspaceNames("project-0")).containsExactly("foo-test", "main"); - } - - @Test - void testGetWorkspaceNamesWithInvalidProject() { - - projectManager = new ProjectManager(ideRoot); - - // Should return null for unknown project - assertThat(projectManager.getWorkspaceNames("unknownProject")).isNull(); - } - - - @Test - void testProjectWithMultipleWorkspaces() throws Exception { - - Path project = ideRoot.resolve("project-0"); - Path workspacesDir = project.resolve("workspaces"); - - // Create multiple workspaces - for (String workspace : new String[] { "dev", "test", "staging", "production" }) { - Files.createDirectory(workspacesDir.resolve(workspace)); - } - - projectManager = new ProjectManager(ideRoot); - - // Should have all workspaces including main - assertThat(projectManager.getWorkspaceNames("project-0")).hasSize(5) - .contains("main", "dev", "test", "staging", "production"); } - @Test - void testMultipleProjectsWithWorkspaces() throws Exception { + private void deleteDirectory(Path directory) throws IOException { - // Create different workspace structures for different projects - for (int i = 0; i < 6; i++) { - Path project = ideRoot.resolve("project-" + i); - Path workspacesDir = project.resolve("workspaces"); - - // Add additional workspaces to each project - for (int j = 1; j <= i; j++) { - Files.createDirectory(workspacesDir.resolve("workspace-" + j)); - } - } - - projectManager = new ProjectManager(ideRoot); - - // Verify each project has correct number of workspaces - for (int i = 0; i < 6; i++) { - String projectName = "project-" + i; - // Each project has "main" + i additional workspaces - assertThat(projectManager.getWorkspaceNames(projectName)).hasSize(i + 1); + try (Stream stream = Files.list(directory)) { + stream.forEach(path -> { + try { + if (Files.isDirectory(path)) { + deleteDirectory(path); + } else { + Files.delete(path); + } + } catch (IOException e) { + throw new RuntimeException("Failed to delete directory", e); + } + }); } - } - - @Test - void testProjectNamesWithSpecialCharacters() throws Exception { - - Path specialProject = ideRoot.resolve("project-dash_underscore&"); - Files.createDirectories(specialProject.resolve("workspaces").resolve("main")); - - projectManager = new ProjectManager(ideRoot); - - assertThat(projectManager.getProjectNames()).contains("project-dash_underscore&"); - } - - @Test - void testWorkspaceNamesWithSpecialCharacters() throws Exception { - - Path project = ideRoot.resolve("project-0"); - Path workspacesDir = project.resolve("workspaces"); - - // Create workspaces with special characters - Files.createDirectory(workspacesDir.resolve("dev-environment")); - Files.createDirectory(workspacesDir.resolve("test_workspace")); - - projectManager = new ProjectManager(ideRoot); - - assertThat(projectManager.getWorkspaceNames("project-0")) - .contains("dev-environment", "test_workspace", "main"); + Files.delete(directory); } } diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide b/gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide deleted file mode 100644 index 01f20642fd..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/bin/ide +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -echo "ide $*" diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version b/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version deleted file mode 100644 index 62ec2f6393..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/default/az/az/testVersion/.ide.software.version +++ /dev/null @@ -1 +0,0 @@ -testVersion diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme b/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme deleted file mode 100644 index c5be1dc4fd..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/software/readme +++ /dev/null @@ -1 +0,0 @@ -this is the tool repository \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls deleted file mode 100644 index 979afbc06f..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.tgz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls deleted file mode 100644 index 1697e0ff2d..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.dmg diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls deleted file mode 100644 index e43fbf1dc6..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.10/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.zip diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls deleted file mode 100644 index f500d7d6f5..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.tgz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls deleted file mode 100644 index 36094258c3..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.dmg diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls deleted file mode 100644 index 8c9ad7e518..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/17.0.6/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.zip diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls deleted file mode 100644 index 2f0e744d44..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.tgz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls deleted file mode 100644 index e2c2050871..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.dmg diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls deleted file mode 100644 index 81e4b0c021..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/java/java/21.0.8_9/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.zip diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json deleted file mode 100644 index efe228f91b..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/status.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "manual": false, - "urls": { - "-997329125": { - "success": { - "timestamp": "2023-04-28T07:12:26.601818Z" - } - } - } -} diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls deleted file mode 100644 index 2d5a377122..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.0.5/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json deleted file mode 100644 index efe228f91b..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/status.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "manual": false, - "urls": { - "-997329125": { - "success": { - "timestamp": "2023-04-28T07:12:26.601818Z" - } - } - } -} diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls deleted file mode 100644 index 10aea51a47..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.1.0/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json deleted file mode 100644 index e66f9ed767..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/status.json +++ /dev/null @@ -1,10 +0,0 @@ - - "manual" : false, - "urls" : { - "-997329125" : { - "success" : { - "timestamp" : "2023-04-28T07:12:26.601818Z" - } - } - } -} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls deleted file mode 100644 index 82d63fe842..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/mvn/3.2.1/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json deleted file mode 100644 index e66f9ed767..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json +++ /dev/null @@ -1,10 +0,0 @@ - - "manual" : false, - "urls" : { - "-997329125" : { - "success" : { - "timestamp" : "2023-04-28T07:12:26.601818Z" - } - } - } -} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme b/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme deleted file mode 100644 index befcdfa755..0000000000 --- a/gui/src/test/resources/ide-projects/emptyProjects/_ide/urls/readme +++ /dev/null @@ -1 +0,0 @@ -this is the download metadata \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide deleted file mode 100644 index 01f20642fd..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/bin/ide +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -echo "ide $*" diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version deleted file mode 100644 index 62ec2f6393..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/default/az/az/testVersion/.ide.software.version +++ /dev/null @@ -1 +0,0 @@ -testVersion diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme deleted file mode 100644 index c5be1dc4fd..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/software/readme +++ /dev/null @@ -1 +0,0 @@ -this is the tool repository \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls deleted file mode 100644 index 979afbc06f..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.tgz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls deleted file mode 100644 index 1697e0ff2d..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.dmg diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls deleted file mode 100644 index e43fbf1dc6..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.10/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.zip diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls deleted file mode 100644 index f500d7d6f5..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.tgz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls deleted file mode 100644 index 36094258c3..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.dmg diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls deleted file mode 100644 index 8c9ad7e518..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/17.0.6/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.zip diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls deleted file mode 100644 index 2f0e744d44..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.tgz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls deleted file mode 100644 index e2c2050871..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.dmg diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls deleted file mode 100644 index 81e4b0c021..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/java/java/21.0.8_9/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.zip diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json deleted file mode 100644 index efe228f91b..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/status.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "manual": false, - "urls": { - "-997329125": { - "success": { - "timestamp": "2023-04-28T07:12:26.601818Z" - } - } - } -} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls deleted file mode 100644 index 2d5a377122..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.0.5/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json deleted file mode 100644 index efe228f91b..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/status.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "manual": false, - "urls": { - "-997329125": { - "success": { - "timestamp": "2023-04-28T07:12:26.601818Z" - } - } - } -} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls deleted file mode 100644 index 10aea51a47..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.1.0/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json deleted file mode 100644 index e66f9ed767..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/status.json +++ /dev/null @@ -1,10 +0,0 @@ - - "manual" : false, - "urls" : { - "-997329125" : { - "success" : { - "timestamp" : "2023-04-28T07:12:26.601818Z" - } - } - } -} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls deleted file mode 100644 index 82d63fe842..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/mvn/3.2.1/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json deleted file mode 100644 index e66f9ed767..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json +++ /dev/null @@ -1,10 +0,0 @@ - - "manual" : false, - "urls" : { - "-997329125" : { - "success" : { - "timestamp" : "2023-04-28T07:12:26.601818Z" - } - } - } -} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme deleted file mode 100644 index befcdfa755..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/_ide/urls/readme +++ /dev/null @@ -1 +0,0 @@ -this is the download metadata \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties deleted file mode 100644 index c041e43ae1..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/conf/ide.properties +++ /dev/null @@ -1,6 +0,0 @@ -#******************************************************************************** -# This file contains project specific environment variables defined by the user -#******************************************************************************** -M2_REPO=~/.m2/repository -MVN_VERSION=3.9.1 -SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties deleted file mode 100644 index c532faa1aa..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/ide.properties +++ /dev/null @@ -1,13 +0,0 @@ -#******************************************************************************** -# This file contains the global configuration from the user HOME directory. -#******************************************************************************** -DOCKER_EDITION=docker -FOO=foo-${BAR} -TEST_ARGS1=${TEST_ARGS1} user1 -TEST_ARGS2=${TEST_ARGS2} user2 -TEST_ARGS3=${TEST_ARGS3} user3 -TEST_ARGS7=user7 -TEST_ARGS10=user10 -TEST_ARGSb=userb -TEST_ARGSc=${TEST_ARGS1} userc -TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties deleted file mode 100644 index eb298f3bbc..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/.ide/settings/eclipse/plugins/anyedit.properties +++ /dev/null @@ -1,3 +0,0 @@ -plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ -plugin_id=AnyEditTools.feature.group -plugin_active=false diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme deleted file mode 100644 index f0dc29025a..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/Downloads/ide/readme +++ /dev/null @@ -1 +0,0 @@ -this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme deleted file mode 100644 index 5e8bc178cf..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/home/readme +++ /dev/null @@ -1 +0,0 @@ -this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties deleted file mode 100644 index 09a94b1160..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/anyedit.properties +++ /dev/null @@ -1,3 +0,0 @@ -plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ -plugin_id=AnyEditTools.feature.group -plugin_active=true diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties deleted file mode 100644 index 6e402c7c5d..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/eclipse/plugins/checkstyle.properties +++ /dev/null @@ -1,3 +0,0 @@ -plugin_url=https://checkstyle.org/eclipse-cs-update-site -plugin_id=net.sf.eclipsecs.feature.group -plugin_active=true diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties deleted file mode 100644 index 1ccf228f98..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/ide.properties +++ /dev/null @@ -1,9 +0,0 @@ -#******************************************************************************** -# This file contains project specific environment variables -#******************************************************************************** -JAVA_VERSION=17* -MVN_VERSION=3.9.0 -ECLIPSE_VERSION=2023-03 -INTELLIJ_EDITION=ultimate -IDE_TOOLS=mvn,eclipse -BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/settings/workspace/update/.editorconfig deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup deleted file mode 100644 index 9c5d4b1be1..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/setup +++ /dev/null @@ -1 +0,0 @@ -just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme deleted file mode 100644 index 7146c2ad6c..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/java/bin/readme +++ /dev/null @@ -1 +0,0 @@ -this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version deleted file mode 100644 index e0d61b5b06..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/.devon.software.version +++ /dev/null @@ -1 +0,0 @@ -3.9.4 diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn deleted file mode 100644 index 4a97b4f4a1..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/mvn +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -if [ "$1" == "-h" ]; then - echo "usage: mvn [options] [] []" -fi -echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme deleted file mode 100644 index 2d2cc36674..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/mvn/bin/readme +++ /dev/null @@ -1 +0,0 @@ -this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version deleted file mode 100644 index 0c4da74167..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/.ide.software.version +++ /dev/null @@ -1 +0,0 @@ -17.0.6 diff --git a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm b/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm deleted file mode 100644 index b547b61509..0000000000 --- a/gui/src/test/resources/ide-projects/emptyWorkspaceFolders/project-0/software/node/npm +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -echo "npm $*" - -if [ "$*" == "list -g npm --depth=0" ]; then - echo "11.0.0" -fi diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide deleted file mode 100644 index 01f20642fd..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/bin/ide +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -echo "ide $*" diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version deleted file mode 100644 index 62ec2f6393..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/default/az/az/testVersion/.ide.software.version +++ /dev/null @@ -1 +0,0 @@ -testVersion diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme deleted file mode 100644 index c5be1dc4fd..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/software/readme +++ /dev/null @@ -1 +0,0 @@ -this is the tool repository \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls deleted file mode 100644 index 979afbc06f..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.tgz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls deleted file mode 100644 index 1697e0ff2d..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.dmg diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls deleted file mode 100644 index e43fbf1dc6..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.10/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.10/java-17.0.10.zip diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls deleted file mode 100644 index f500d7d6f5..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.tgz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls deleted file mode 100644 index 36094258c3..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.dmg diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls deleted file mode 100644 index 8c9ad7e518..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/17.0.6/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/17.0.6/java-17.0.6.zip diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls deleted file mode 100644 index 2f0e744d44..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/linux_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.tgz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls deleted file mode 100644 index e2c2050871..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/mac_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.dmg diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls deleted file mode 100644 index 81e4b0c021..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/java/java/21.0.8_9/windows_x64.urls +++ /dev/null @@ -1 +0,0 @@ -${testbaseurl}/download/java/java/21.0.8_9/java-21.0.8_9.zip diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json deleted file mode 100644 index efe228f91b..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/status.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "manual": false, - "urls": { - "-997329125": { - "success": { - "timestamp": "2023-04-28T07:12:26.601818Z" - } - } - } -} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls deleted file mode 100644 index 2d5a377122..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.0.5/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json deleted file mode 100644 index efe228f91b..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/status.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "manual": false, - "urls": { - "-997329125": { - "success": { - "timestamp": "2023-04-28T07:12:26.601818Z" - } - } - } -} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls deleted file mode 100644 index 10aea51a47..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.1.0/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json deleted file mode 100644 index e66f9ed767..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/status.json +++ /dev/null @@ -1,10 +0,0 @@ - - "manual" : false, - "urls" : { - "-997329125" : { - "success" : { - "timestamp" : "2023-04-28T07:12:26.601818Z" - } - } - } -} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls deleted file mode 100644 index 82d63fe842..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/mvn/3.2.1/urls +++ /dev/null @@ -1 +0,0 @@ -https://archive.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json deleted file mode 100644 index e66f9ed767..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/mvn/secondMvnEdition/3.2.1/status.json +++ /dev/null @@ -1,10 +0,0 @@ - - "manual" : false, - "urls" : { - "-997329125" : { - "success" : { - "timestamp" : "2023-04-28T07:12:26.601818Z" - } - } - } -} \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme b/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme deleted file mode 100644 index befcdfa755..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/_ide/urls/readme +++ /dev/null @@ -1 +0,0 @@ -this is the download metadata \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties deleted file mode 100644 index c041e43ae1..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/conf/ide.properties +++ /dev/null @@ -1,6 +0,0 @@ -#******************************************************************************** -# This file contains project specific environment variables defined by the user -#******************************************************************************** -M2_REPO=~/.m2/repository -MVN_VERSION=3.9.1 -SOME=some-${UNDEFINED} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties deleted file mode 100644 index c532faa1aa..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/ide.properties +++ /dev/null @@ -1,13 +0,0 @@ -#******************************************************************************** -# This file contains the global configuration from the user HOME directory. -#******************************************************************************** -DOCKER_EDITION=docker -FOO=foo-${BAR} -TEST_ARGS1=${TEST_ARGS1} user1 -TEST_ARGS2=${TEST_ARGS2} user2 -TEST_ARGS3=${TEST_ARGS3} user3 -TEST_ARGS7=user7 -TEST_ARGS10=user10 -TEST_ARGSb=userb -TEST_ARGSc=${TEST_ARGS1} userc -TEST_ARGSd=${TEST_ARGS1} userd diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties deleted file mode 100644 index eb298f3bbc..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/.ide/settings/eclipse/plugins/anyedit.properties +++ /dev/null @@ -1,3 +0,0 @@ -plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ -plugin_id=AnyEditTools.feature.group -plugin_active=false diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme deleted file mode 100644 index f0dc29025a..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/Downloads/ide/readme +++ /dev/null @@ -1 +0,0 @@ -this is the download cache \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme deleted file mode 100644 index 5e8bc178cf..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/home/readme +++ /dev/null @@ -1 +0,0 @@ -this is the users HOME directory \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties deleted file mode 100644 index 09a94b1160..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/anyedit.properties +++ /dev/null @@ -1,3 +0,0 @@ -plugin_url=https://raw.githubusercontent.com/iloveeclipse/plugins/latest/ -plugin_id=AnyEditTools.feature.group -plugin_active=true diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties deleted file mode 100644 index 6e402c7c5d..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/eclipse/plugins/checkstyle.properties +++ /dev/null @@ -1,3 +0,0 @@ -plugin_url=https://checkstyle.org/eclipse-cs-update-site -plugin_id=net.sf.eclipsecs.feature.group -plugin_active=true diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties deleted file mode 100644 index 1ccf228f98..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/ide.properties +++ /dev/null @@ -1,9 +0,0 @@ -#******************************************************************************** -# This file contains project specific environment variables -#******************************************************************************** -JAVA_VERSION=17* -MVN_VERSION=3.9.0 -ECLIPSE_VERSION=2023-03 -INTELLIJ_EDITION=ultimate -IDE_TOOLS=mvn,eclipse -BAR=bar-${SOME} diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/workspace/update/.editorconfig b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/settings/workspace/update/.editorconfig deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup deleted file mode 100644 index 9c5d4b1be1..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/setup +++ /dev/null @@ -1 +0,0 @@ -just a marker for detection of IDE_HOME \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme deleted file mode 100644 index 7146c2ad6c..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/java/bin/readme +++ /dev/null @@ -1 +0,0 @@ -this is the main workspace of basic \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version deleted file mode 100644 index e0d61b5b06..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/.devon.software.version +++ /dev/null @@ -1 +0,0 @@ -3.9.4 diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn deleted file mode 100644 index 4a97b4f4a1..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/mvn +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -if [ "$1" == "-h" ]; then - echo "usage: mvn [options] [] []" -fi -echo "mvn $*" diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme deleted file mode 100644 index 2d2cc36674..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/mvn/bin/readme +++ /dev/null @@ -1 +0,0 @@ -this is the java bin folder \ No newline at end of file diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version deleted file mode 100644 index 0c4da74167..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/.ide.software.version +++ /dev/null @@ -1 +0,0 @@ -17.0.6 diff --git a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm b/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm deleted file mode 100644 index b547b61509..0000000000 --- a/gui/src/test/resources/ide-projects/noWorkspaces/projectWithoutWorkspaces/software/node/npm +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -echo "npm $*" - -if [ "$*" == "list -g npm --depth=0" ]; then - echo "11.0.0" -fi From 6c444329e7a2997e27b8d5dd4cf532470973c167 Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 28 Apr 2026 18:58:06 +0200 Subject: [PATCH 30/31] #1802: cleaned up IdeGuiStateManagerTest --- .../gui/context/IdeGuiStateManagerTest.java | 25 +++++++++++-------- .../ide/gui/context/ProjectManagerTest.java | 4 --- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java index 7668971ef7..ac374dc3e7 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/IdeGuiStateManagerTest.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.stream.Stream; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -29,8 +30,8 @@ public class IdeGuiStateManagerTest extends AbstractIdeContextTest { @BeforeAll static void setup() throws FileNotFoundException { - context = newContext("testProject", "project"); - LOG.warn("root: {}", context.getIdeRoot()); + context = newContext("testProject", "project-0"); + LOG.debug("root: {}", context.getIdeRoot()); guiStateManager = IdeGuiStateManager.getInstanceOverrideRootDir(context.getIdeRoot().toString()); projectManager = guiStateManager.getProjectManager(); @@ -96,14 +97,18 @@ void testThrowsIfNonExistentProjectSelected() { @Test void testThrowsIfNonExistentWorkspaceSelected() throws IOException { - Files.list(context.getIdeRoot()).forEach((projectPath) -> { - try { - guiStateManager.switchContext(projectPath.getFileName().toString(), "test"); - } catch (FileNotFoundException e) { - assertThat(e.getMessage()).contains("Workspace " + projectPath.resolve("workspaces").resolve("test") + " does not exist!") - .as("GuiStateManager.switchContext should throw an exception, if a non-existent workspace is selected"); - } - }); + try (Stream stream = Files.list(context.getIdeRoot())) { + stream.forEach((projectPath) -> { + Path fakeWorkspacePath = projectPath.resolve("workspaces").resolve("nonExistingWorkspace"); + + try { + guiStateManager.switchContext(projectPath.getFileName().toString(), fakeWorkspacePath.getFileName().toString()); + } catch (FileNotFoundException e) { + assertThat(e.getMessage()).contains("Workspace " + fakeWorkspacePath + " does not exist!") + .as("GuiStateManager.switchContext should throw an exception, if a non-existent workspace is selected"); + } + }); + } } } diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java index 6dec8d8451..6ce2ce13aa 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java @@ -8,8 +8,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.devonfw.tools.ide.context.AbstractIdeContextTest; import com.devonfw.tools.ide.context.IdeTestContext; @@ -19,8 +17,6 @@ */ public class ProjectManagerTest extends AbstractIdeContextTest { - private static final Logger LOG = LoggerFactory.getLogger(ProjectManagerTest.class); - private static ProjectManager projectManager; private static IdeTestContext context; From 1e8b556ed7c05f10d17804ce026a46902be5b0fc Mon Sep 17 00:00:00 2001 From: laim2003 Date: Tue, 28 Apr 2026 19:46:53 +0200 Subject: [PATCH 31/31] #1802: cleaned up ProjectManagerTest to use FileUtils instead of own implementation --- .../ide/gui/context/ProjectManagerTest.java | 44 ++----------------- 1 file changed, 4 insertions(+), 40 deletions(-) diff --git a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java index 6ce2ce13aa..8408abe892 100644 --- a/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java +++ b/gui/src/test/java/com/devonfw/ide/gui/context/ProjectManagerTest.java @@ -4,8 +4,8 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.stream.Stream; +import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -91,7 +91,7 @@ void testRefreshProjects() throws IOException { Path project0 = ideRoot.resolve("project-0"); Path project6 = ideRoot.resolve("project-6"); - copyDirectory(project0, project6); + FileUtils.copyDirectory(project0.toFile(), project6.toFile()); projectManager.refreshProjects(); @@ -101,7 +101,7 @@ void testRefreshProjects() throws IOException { assertThat(projectManager.getWorkspaceNames("project-6")).containsExactlyInAnyOrder("foo-test", "main"); // Cleanup - deleteDirectory(project6); + FileUtils.deleteDirectory(project0.toFile()); } @Test @@ -118,7 +118,7 @@ void testReadProjectsExcludesFoldersWithoutWorkspaces() throws IOException { assertThat(projectManager.getProjectNames()).containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); // Cleanup - deleteDirectory(testProject); + FileUtils.deleteDirectory(testProject.toFile()); } @Test @@ -130,40 +130,4 @@ void testReadProjectsExcludesUnderscorePrefixedFolders() { assertThat(projectManager.getProjectNames()).doesNotContain("_ide"); assertThat(projectManager.getProjectNames()).containsExactlyInAnyOrder("project-0", "project-1", "project-2", "project-3", "project-4", "project-5"); } - - private void copyDirectory(Path source, Path destination) throws IOException { - - Files.createDirectory(destination); - try (Stream stream = Files.list(source)) { - stream.forEach(sourcePath -> { - try { - if (Files.isDirectory(sourcePath)) { - copyDirectory(sourcePath, destination.resolve(sourcePath.getFileName())); - } else { - Files.copy(sourcePath, destination.resolve(sourcePath.getFileName())); - } - } catch (IOException e) { - throw new RuntimeException("Failed to copy directory", e); - } - }); - } - } - - private void deleteDirectory(Path directory) throws IOException { - - try (Stream stream = Files.list(directory)) { - stream.forEach(path -> { - try { - if (Files.isDirectory(path)) { - deleteDirectory(path); - } else { - Files.delete(path); - } - } catch (IOException e) { - throw new RuntimeException("Failed to delete directory", e); - } - }); - } - Files.delete(directory); - } }