Skip to content

Commit

Permalink
Call the "activated" method of the default tab in a Launch Config Dialog
Browse files Browse the repository at this point in the history
Also add a new test bundle that contains the proper regression test.

Bundle: org.eclipse.debug.ui.tests
Class: LaunchConfigurationTabGroupViewerTest

This class also contains a regression test for
eclipse-platform#766

Fixes: eclipse-platform#859
  • Loading branch information
fedejeanne committed Nov 16, 2023
1 parent b345854 commit 3717efa
Show file tree
Hide file tree
Showing 16 changed files with 461 additions and 12 deletions.
11 changes: 11 additions & 0 deletions debug/org.eclipse.debug.ui.tests/.classpath
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src">
<attributes>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="bin"/>
</classpath>
28 changes: 28 additions & 0 deletions debug/org.eclipse.debug.ui.tests/.project
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.eclipse.debug.ui.tests</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
org.eclipse.jdt.core.compiler.compliance=17
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=17
17 changes: 17 additions & 0 deletions debug/org.eclipse.debug.ui.tests/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: org.eclipse.debug.ui.tests;singleton:=true
Bundle-Vendor: %Bundle-Vendor
Bundle-Version: 1.0.123.qualifier
Import-Package: org.junit.jupiter.api,
org.junit.jupiter.api.function;version="5.10.1",
org.junit.platform.suite.api
Require-Bundle: org.eclipse.jface;bundle-version="[3.32.0,4.0.0)",
org.eclipse.debug.core;bundle-version="3.21.200",
org.eclipse.debug.ui;bundle-version="3.18.200",
org.eclipse.core.runtime;bundle-version="3.30.0",
org.junit,
org.eclipse.jdt.launching
Automatic-Module-Name: org.eclipse.debug.ui.tests
Bundle-RequiredExecutionEnvironment: JavaSE-17
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Bundle-Vendor = Eclipse.org
Bundle-Name =Debug UI Test Plugin
5 changes: 5 additions & 0 deletions debug/org.eclipse.debug.ui.tests/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
plugin.xml
21 changes: 21 additions & 0 deletions debug/org.eclipse.debug.ui.tests/plugin.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension point="org.eclipse.debug.core.launchConfigurationTypes">
<launchConfigurationType
name="Example launch"
modes="run, debug"
id="org.eclipse.debug.ui.tests.launchConfigurationType1">
</launchConfigurationType>
</extension>

<extension
point="org.eclipse.debug.ui.launchConfigurationTabGroups">
<launchConfigurationTabGroup
class="org.eclipse.debug.ui.tests.tabs.SpyTabGroup"
id="org.eclipse.debug.ui.tests.launchConfigurationTabGroup"
type="org.eclipse.debug.ui.tests.launchConfigurationType1">
</launchConfigurationTabGroup>
</extension>

</plugin>
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
package org.eclipse.debug.internal.ui.tests.launchConfigurations;

import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;

import java.util.concurrent.atomic.AtomicReference;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPresentationManager;
import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
import org.eclipse.debug.ui.ILaunchConfigurationTab;
import org.eclipse.debug.ui.ILaunchConfigurationTabGroup;
import org.eclipse.debug.ui.tests.tabs.SpyTab;
import org.eclipse.swt.widgets.Display;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class LaunchConfigurationTabGroupViewerTest {

private static interface ThrowingRunnable<T extends Exception> {
void run() throws T;
}

private static final String LAUNCH_CONFIG_TYPE_ID = "org.eclipse.debug.ui.tests.launchConfigurationType1";
private static final String LAUNCH_CONFIG_MODE = ILaunchManager.RUN_MODE;
private ILaunchConfigurationType fLaunchConfigurationType;
private LaunchConfigurationsDialog fLaunchConfigurationsDialog;

@BeforeEach
private void createDialog() throws CoreException {
fLaunchConfigurationType = getLaunchManager().getLaunchConfigurationType(LAUNCH_CONFIG_TYPE_ID);
ILaunchConfigurationTabGroup tabGroup = getLaunchConfigurationTabGroup(fLaunchConfigurationType);

fLaunchConfigurationsDialog = (LaunchConfigurationsDialog) createLaunchConfigurationDialog();
tabGroup.createTabs(fLaunchConfigurationsDialog, ILaunchManager.RUN_MODE);
}

@Test
void tesAllTabsAreInitializedByDefault() throws CoreException {
// Create a launch configuration with a unique name
ThrowingRunnable<CoreException> createAndSelect1LaunchConfig = () -> {
fLaunchConfigurationsDialog.getTabViewer().setInput(createLaunchConfigurationInstance());
};

final ILaunchConfigurationTab[] tabs = runOnDialog(createAndSelect1LaunchConfig);
Assertions.assertAll(() -> {
for (int i = 0; i < tabs.length; i++) {
assertThat("Tab " + i + " was not initialized", ((SpyTab) tabs[i]).isInitialized());
}
});
}

@Test
void testFirstTabIsActivatedByDefault() throws CoreException {
// Create a launch configuration with a unique name
ThrowingRunnable<CoreException> createAndSelect1LaunchConfig = () -> {
fLaunchConfigurationsDialog.getTabViewer().setInput(createLaunchConfigurationInstance());
};

final ILaunchConfigurationTab[] tabs = runOnDialog(createAndSelect1LaunchConfig);
assertThat("The 1st tab was not activated", ((SpyTab) tabs[0]).isActivated());
}

@Test
void testOtherTabInOtherConfigIsActivated() throws CoreException {
int secondTabIndex = 1;

ThrowingRunnable<CoreException> setActiveTab = () -> {
// Create and select launch config
fLaunchConfigurationsDialog.getTabViewer().setInput(createLaunchConfigurationInstance());

// Select another tab
fLaunchConfigurationsDialog.getTabViewer().setActiveTab(secondTabIndex);

// Create a new launch config. This one should activate the same tab by default.
fLaunchConfigurationsDialog.getTabViewer().setInput(createLaunchConfigurationInstance());
};

final ILaunchConfigurationTab[] tabs = runOnDialog(setActiveTab);

assertThat("The 1st tab of the other launch configuration shouldn't have been activated",
not(((SpyTab) tabs[0]).isActivated()));
assertThat("The tab was not activated", ((SpyTab) tabs[secondTabIndex]).isActivated());
}

@Test
void testOtherTabIsActivated() throws CoreException {
int secondTabIndex = 1;

ThrowingRunnable<CoreException> setActiveTab = () -> {
// Create and select launch config
fLaunchConfigurationsDialog.getTabViewer().setInput(createLaunchConfigurationInstance());

// Select another tab
fLaunchConfigurationsDialog.getTabViewer().setActiveTab(secondTabIndex);
};

final ILaunchConfigurationTab[] tabs = runOnDialog(setActiveTab);

assertThat("The tab was not activated", ((SpyTab) tabs[secondTabIndex]).isActivated());
}

private ILaunchConfigurationWorkingCopy createLaunchConfigurationInstance() throws CoreException {
return fLaunchConfigurationType.newInstance(null, "MyLaunchConfiguration_" + System.currentTimeMillis());
}

private <T extends Exception> ILaunchConfigurationTab[] runOnDialog(ThrowingRunnable<T> runnable) {
AtomicReference<ILaunchConfigurationTab[]> tabsRef = new AtomicReference<>();
AtomicReference<Throwable> throwableRef = new AtomicReference<>();

Display.getCurrent().asyncExec(() -> {
try {

runnable.run();

// I need to store the tabs here because the tab viewer (and all its tabs) are
// gone as soon as the dialog is closed
tabsRef.set(fLaunchConfigurationsDialog.getTabs());

} catch (Throwable e) {
// neither calling "fail" not throwing an exception will let the test fail so I
// need to store this and check it outside of the runnable
throwableRef.set(e);
DebugPlugin.log(e);
} finally {
fLaunchConfigurationsDialog.close();
}
});

fLaunchConfigurationsDialog.open();

if (throwableRef.get() != null) {
throw new AssertionError("An exception occurred while executing the runnable.", throwableRef.get());
}

return tabsRef.get();
}

/**
* Returns the standard java launch tab group
*
* @return the standard java launch tab group
* @throws CoreException
*
*/
protected ILaunchConfigurationTabGroup getLaunchConfigurationTabGroup(
ILaunchConfigurationType launchConfigurationType) throws CoreException {
return LaunchConfigurationPresentationManager.getDefault().getTabGroup(launchConfigurationType,
LAUNCH_CONFIG_MODE);
}

/**
* Returns an instance of the launch configuration dialog on the the specified
* launch mode
*
* @return an new instance of <code>IlaunchConfigurationDialog</code>
*
*/
protected ILaunchConfigurationDialog createLaunchConfigurationDialog() {
return new LaunchConfigurationsDialog(null, DebugUIPlugin.getDefault().getLaunchConfigurationManager()
.getLaunchGroup(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP));
}

/**
* Returns the launch manager
*
* @return launch manager
*/
protected ILaunchManager getLaunchManager() {
return DebugPlugin.getDefault().getLaunchManager();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*******************************************************************************
* Copyright (c) 2018, 2019 SAP SE and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP SE - initial version
*******************************************************************************/
package org.eclipse.debug.ui.tests;

import org.eclipse.debug.internal.ui.tests.launchConfigurations.LaunchConfigurationTabGroupViewerTest;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

@Suite
@SelectClasses({ LaunchConfigurationTabGroupViewerTest.class})
public class AllTests {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package org.eclipse.debug.ui.tests.tabs;

import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;

/**
* A Tab whose sole purpose is to say if it was initialized and activated
* properly
*/
public abstract class SpyTab extends AbstractLaunchConfigurationTab {

private boolean initialized;
private boolean activated;

@Override
public void createControl(Composite parent) {
}

@Override
public String getName() {
return getClass().getSimpleName();
}

@Override
public void initializeFrom(ILaunchConfiguration configuration) {
initialized = true;
}

@Override
public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
activated = true;
}

@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
}

@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
}

public boolean isInitialized() {
return initialized;
}

public boolean isActivated() {
return activated;
}

// These 3 are necessary because I need 3 tabs in the launch config and using
// always the same kind of tab produces incorrect results
public static class SpyTabA extends SpyTab {
}

public static class SpyTabB extends SpyTab {
}

public static class SpyTabC extends SpyTab {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.eclipse.debug.ui.tests.tabs;

import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
import org.eclipse.debug.ui.ILaunchConfigurationTab;
import org.eclipse.debug.ui.tests.tabs.SpyTab.SpyTabA;
import org.eclipse.debug.ui.tests.tabs.SpyTab.SpyTabB;
import org.eclipse.debug.ui.tests.tabs.SpyTab.SpyTabC;;

public class SpyTabGroup extends AbstractLaunchConfigurationTabGroup {

@Override
public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
setTabs(new ILaunchConfigurationTab[] { new SpyTabA(), new SpyTabB(), new SpyTabC() });
}

}
Loading

0 comments on commit 3717efa

Please sign in to comment.