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 92b20bb
Show file tree
Hide file tree
Showing 8 changed files with 298 additions and 14 deletions.
2 changes: 2 additions & 0 deletions debug/org.eclipse.debug.tests/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ Export-Package: org.eclipse.debug.tests,
org.eclipse.debug.tests.statushandlers,
org.eclipse.debug.tests.stepfilters,
org.eclipse.debug.tests.ui,
org.eclipse.debug.tests.ui.launchconfigurations,
org.eclipse.debug.tests.ui.launchconfigurations.tabs,
org.eclipse.debug.tests.view.memory,
org.eclipse.debug.tests.viewer.model
Eclipse-BundleShape: dir
Expand Down
1 change: 1 addition & 0 deletions debug/org.eclipse.debug.tests/plugin.properties
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ launchConfigurationType.name = Test Launch Type
extension.name = Debug File System
launchConfigurationType.name.0 = Cancelling Launch Type
launchConfigurationType.name.1 = Throwing Launch Type
launchConfigurationType.name.2 = Spy Launch Type
testBreakpoint.name = Test Breakpoint
26 changes: 22 additions & 4 deletions debug/org.eclipse.debug.tests/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,25 +35,29 @@
<renderingBindings
primaryId="rendering_type_1">
<enablement>
<instanceof value="org.eclipse.debug.tests.view.memory.MemoryBlockOne"/>
<instanceof
value="org.eclipse.debug.tests.view.memory.MemoryBlockOne" />
</enablement>
</renderingBindings>
<renderingBindings
renderingIds="rendering_type_1, rendering_type_2">
<enablement>
<instanceof value="org.eclipse.debug.tests.view.memory.MemoryBlockTwo"/>
<instanceof
value="org.eclipse.debug.tests.view.memory.MemoryBlockTwo" />
</enablement>
</renderingBindings>
<renderingBindings
defaultIds="rendering_type_3">
<enablement>
<instanceof value="org.eclipse.debug.tests.view.memory.MemoryBlockThree"/>
<instanceof
value="org.eclipse.debug.tests.view.memory.MemoryBlockThree" />
</enablement>
</renderingBindings>
<renderingBindings
class="org.eclipse.debug.tests.view.memory.DynamicRenderingBindings">
<enablement>
<instanceof value="org.eclipse.debug.tests.view.memory.MemoryBlockDynamic"/>
<instanceof
value="org.eclipse.debug.tests.view.memory.MemoryBlockDynamic" />
</enablement>
</renderingBindings>
</extension>
Expand All @@ -77,7 +81,20 @@
modes="run"
name="%launchConfigurationType.name.1">
</launchConfigurationType>
<launchConfigurationType
name="%launchConfigurationType.name.2"
modes="run, debug"
id="spy.type">
</launchConfigurationType>
</extension>
<extension
point="org.eclipse.debug.ui.launchConfigurationTabGroups">
<launchConfigurationTabGroup
class="org.eclipse.debug.tests.ui.launchconfigurations.tabs.SpyTabGroup"
id="org.eclipse.debug.tests.ui.launchconfigurations.launchConfigurationTabGroup"
type="spy.type">
</launchConfigurationTabGroup>
</extension>
<extension
id="debugFS"
name="%extension.name"
Expand Down Expand Up @@ -163,4 +180,5 @@
priority="-1"
class="org.eclipse.debug.tests.ui.TestVariableValueEditor3"/>
</extension>

</plugin>
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import org.eclipse.debug.tests.statushandlers.StatusHandlerTests;
import org.eclipse.debug.tests.stepfilters.StepFiltersTests;
import org.eclipse.debug.tests.ui.VariableValueEditorManagerTests;
import org.eclipse.debug.tests.ui.launchconfigurations.LaunchConfigurationTabGroupViewerTest;
import org.eclipse.debug.tests.view.memory.MemoryRenderingTests;
import org.eclipse.debug.tests.view.memory.TableRenderingTests;
import org.eclipse.debug.tests.viewer.model.ChildrenUpdateTests;
Expand Down Expand Up @@ -131,9 +132,11 @@

// Launch Groups
LaunchGroupTests.class,
LaunchConfigurationTabGroupViewerTest.class,

// Logical structure
LogicalStructureCacheTest.class,

})
public class AutomatedSuite {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
package org.eclipse.debug.tests.ui.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.tests.AbstractDebugTest;
import org.eclipse.debug.tests.ui.launchconfigurations.tabs.SpyTab;
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.swt.widgets.Display;
import org.junit.Before;
import org.junit.Test;

public class LaunchConfigurationTabGroupViewerTest extends AbstractDebugTest {

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

private static final String LAUNCH_CONFIG_TYPE_ID = "spy.type";
private static final String LAUNCH_CONFIG_MODE = ILaunchManager.RUN_MODE;
private ILaunchConfigurationType fLaunchConfigurationType;
private LaunchConfigurationsDialog fLaunchConfigurationsDialog;

@Before
public 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
public void tesAllTabsAreInitializedByDefault() {
// Create a launch configuration with a unique name
ThrowingRunnable<CoreException> createAndSelect1LaunchConfig = () -> {
fLaunchConfigurationsDialog.getTabViewer().setInput(createLaunchConfigurationInstance());
};

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

@Test
public void testFirstTabIsActivatedByDefault() {
// 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
public void testOtherTabInOtherConfigIsActivated() {
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
public void testOtherTabIsActivated() {
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();
}

protected ILaunchConfigurationTabGroup getLaunchConfigurationTabGroup(ILaunchConfigurationType launchConfigurationType) throws CoreException {
return LaunchConfigurationPresentationManager.getDefault().getTabGroup(launchConfigurationType, LAUNCH_CONFIG_MODE);
}

protected ILaunchConfigurationDialog createLaunchConfigurationDialog() {
return new LaunchConfigurationsDialog(null, DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP));
}

protected ILaunchManager getLaunchManager() {
return DebugPlugin.getDefault().getLaunchManager();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package org.eclipse.debug.tests.ui.launchconfigurations.tabs;

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

/**
* 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.tests.ui.launchconfigurations.tabs;

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

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 92b20bb

Please sign in to comment.