Skip to content

Commit 7445acd

Browse files
committed
Migrate WorkbenchContextRule to WorkbenchContextExtension and update tests
1. Created WorkbenchContextExtension as a JUnit 5 replacement for WorkbenchContextRule. 2. Updated MANIFEST.MF to include org.junit.jupiter.api.extension in Import-Package. 3. Migrated CompositePartClosingTest, MSaveablePartTest, ModelServiceImplTest, MMenuItemTest, and MToolItemTest to JUnit 5. 4. Verified all migrated tests pass via Maven Tycho.
1 parent 8e47cc1 commit 7445acd

File tree

7 files changed

+132
-29
lines changed

7 files changed

+132
-29
lines changed

tests/org.eclipse.e4.ui.tests/META-INF/MANIFEST.MF

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ Import-Package: jakarta.annotation,
4040
jakarta.inject,
4141
org.osgi.service.event,
4242
org.junit.jupiter.api;version="[5.14.0,6.0.0)",
43+
org.junit.jupiter.api.extension;version="[5.14.0,6.0.0)",
4344
org.junit.platform.suite.api;version="[1.14.0,2.0.0)"
4445
Eclipse-BundleShape: dir
4546
Automatic-Module-Name: org.eclipse.e4.ui.tests
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2019, 2026 Rolf Theunissen and others.
3+
*
4+
* This program and the accompanying materials
5+
* are made available under the terms of the Eclipse Public License 2.0
6+
* which accompanies this distribution, and is available at
7+
* https://www.eclipse.org/legal/epl-2.0/
8+
*
9+
* SPDX-License-Identifier: EPL-2.0
10+
*
11+
* Contributors:
12+
* Rolf Theunissen <[email protected]> - initial API and implementation
13+
* Christoph Läubrich - adjust unit test
14+
******************************************************************************/
15+
16+
package org.eclipse.e4.ui.tests.rules;
17+
18+
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
19+
import org.eclipse.e4.core.contexts.IEclipseContext;
20+
import org.eclipse.e4.core.di.suppliers.ExtendedObjectSupplier;
21+
import org.eclipse.e4.core.internal.di.osgi.ProviderHelper;
22+
import org.eclipse.e4.ui.di.UIEventTopic;
23+
import org.eclipse.e4.ui.di.UISynchronize;
24+
import org.eclipse.e4.ui.internal.workbench.E4Workbench;
25+
import org.eclipse.e4.ui.internal.workbench.swt.E4Application;
26+
import org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine;
27+
import org.eclipse.e4.ui.model.application.MApplication;
28+
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
29+
import org.eclipse.e4.ui.workbench.IWorkbench;
30+
import org.eclipse.e4.ui.workbench.modeling.EModelService;
31+
import org.eclipse.e4.ui.workbench.swt.DisplayUISynchronize;
32+
import org.eclipse.swt.widgets.Display;
33+
import org.junit.jupiter.api.extension.AfterEachCallback;
34+
import org.junit.jupiter.api.extension.BeforeEachCallback;
35+
import org.junit.jupiter.api.extension.ExtensionContext;
36+
37+
public class WorkbenchContextExtension implements BeforeEachCallback, AfterEachCallback {
38+
39+
private IEclipseContext context;
40+
private E4Workbench wb;
41+
42+
public void createAndRunWorkbench(MWindow window) {
43+
if (wb == null) {
44+
wb = new E4Workbench(context.get(MApplication.class), context);
45+
}
46+
wb.createAndRunUI(window);
47+
}
48+
49+
public void spinEventLoop() {
50+
while (Display.getDefault().readAndDispatch()) {
51+
}
52+
}
53+
54+
@Override
55+
public void beforeEach(ExtensionContext extensionContext) throws Exception {
56+
try {
57+
createContext();
58+
} catch (Throwable e) {
59+
throw new Exception(e);
60+
}
61+
ContextInjectionFactory.inject(extensionContext.getRequiredTestInstance(), context);
62+
}
63+
64+
@Override
65+
public void afterEach(ExtensionContext extensionContext) throws Exception {
66+
dispose();
67+
}
68+
69+
protected void createContext() throws Throwable {
70+
context = E4Application.createDefaultContext();
71+
context.set(IWorkbench.PRESENTATION_URI_ARG, PartRenderingEngine.engineURI);
72+
73+
final Display display = Display.getDefault();
74+
context.set(UISynchronize.class, new DisplayUISynchronize(display));
75+
76+
ContextInjectionFactory.setDefault(context);
77+
78+
// Workaround, enforce injection on UIEventTopic provider with current context
79+
ExtendedObjectSupplier supplier = ProviderHelper.findProvider(UIEventTopic.class.getName(), null);
80+
ContextInjectionFactory.inject(supplier, context);
81+
82+
EModelService ems = context.get(EModelService.class);
83+
MApplication application = ems.createModelElement(MApplication.class);
84+
application.setContext(context);
85+
context.set(MApplication.class, application);
86+
}
87+
88+
protected void dispose() {
89+
if (wb != null) {
90+
wb.close();
91+
}
92+
93+
ContextInjectionFactory.setDefault(null);
94+
95+
// Workaround, enforce uninjection on the UIEventTopic provider from context
96+
ExtendedObjectSupplier supplier = ProviderHelper.findProvider(UIEventTopic.class.getName(), null);
97+
ContextInjectionFactory.uninject(supplier, context);
98+
99+
context.dispose();
100+
}
101+
102+
}

tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/CompositePartClosingTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,16 @@
2525
import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainer;
2626
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
2727
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
28-
import org.eclipse.e4.ui.tests.rules.WorkbenchContextRule;
28+
import org.eclipse.e4.ui.tests.rules.WorkbenchContextExtension;
2929
import org.eclipse.e4.ui.workbench.modeling.EModelService;
3030
import org.eclipse.e4.ui.workbench.modeling.EPartService;
31-
import org.junit.Rule;
32-
import org.junit.Test;
31+
import org.junit.jupiter.api.Test;
32+
import org.junit.jupiter.api.extension.RegisterExtension;
3333

3434
public class CompositePartClosingTest {
3535

36-
@Rule
37-
public WorkbenchContextRule contextRule = new WorkbenchContextRule();
36+
@RegisterExtension
37+
public WorkbenchContextExtension contextRule = new WorkbenchContextExtension();
3838

3939
@Inject
4040
private EModelService ems;

tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/MMenuItemTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
import org.eclipse.e4.ui.model.application.ui.menu.MMenuItem;
4949
import org.eclipse.e4.ui.model.application.ui.menu.MMenuSeparator;
5050
import org.eclipse.e4.ui.services.ContextServiceAddon;
51-
import org.eclipse.e4.ui.tests.rules.WorkbenchContextRule;
51+
import org.eclipse.e4.ui.tests.rules.WorkbenchContextExtension;
5252
import org.eclipse.e4.ui.workbench.modeling.EModelService;
5353
import org.eclipse.e4.ui.workbench.modeling.EPartService;
5454
import org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer;
@@ -60,14 +60,14 @@
6060
import org.eclipse.swt.widgets.Menu;
6161
import org.eclipse.swt.widgets.MenuItem;
6262
import org.eclipse.swt.widgets.Widget;
63-
import org.junit.Before;
64-
import org.junit.Rule;
65-
import org.junit.Test;
63+
import org.junit.jupiter.api.BeforeEach;
64+
import org.junit.jupiter.api.Test;
65+
import org.junit.jupiter.api.extension.RegisterExtension;
6666

6767
public class MMenuItemTest {
6868

69-
@Rule
70-
public WorkbenchContextRule contextRule = new WorkbenchContextRule();
69+
@RegisterExtension
70+
public WorkbenchContextExtension contextRule = new WorkbenchContextExtension();
7171

7272
@Inject
7373
private EModelService ems;
@@ -78,7 +78,7 @@ public class MMenuItemTest {
7878
@Inject
7979
private MApplication application;
8080

81-
@Before
81+
@BeforeEach
8282
public void setUp() {
8383
ContextInjectionFactory.make(CommandServiceAddon.class, appContext);
8484
ContextInjectionFactory.make(ContextServiceAddon.class, appContext);

tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/MSaveablePartTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,17 @@
2424
import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainer;
2525
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
2626
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
27-
import org.eclipse.e4.ui.tests.rules.WorkbenchContextRule;
27+
import org.eclipse.e4.ui.tests.rules.WorkbenchContextExtension;
2828
import org.eclipse.e4.ui.workbench.modeling.EModelService;
2929
import org.eclipse.swt.custom.CTabFolder;
3030
import org.eclipse.swt.custom.CTabItem;
31-
import org.junit.Rule;
32-
import org.junit.Test;
31+
import org.junit.jupiter.api.Test;
32+
import org.junit.jupiter.api.extension.RegisterExtension;
3333

3434
public class MSaveablePartTest {
3535

36-
@Rule
37-
public WorkbenchContextRule contextRule = new WorkbenchContextRule();
36+
@RegisterExtension
37+
public WorkbenchContextExtension contextRule = new WorkbenchContextExtension();
3838

3939
@Inject
4040
private EModelService ems;

tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/MToolItemTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,18 @@
2828
import org.eclipse.e4.ui.model.application.ui.menu.MDirectToolItem;
2929
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
3030
import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
31-
import org.eclipse.e4.ui.tests.rules.WorkbenchContextRule;
31+
import org.eclipse.e4.ui.tests.rules.WorkbenchContextExtension;
3232
import org.eclipse.e4.ui.workbench.modeling.EModelService;
3333
import org.eclipse.swt.SWT;
3434
import org.eclipse.swt.widgets.Event;
3535
import org.eclipse.swt.widgets.ToolItem;
36-
import org.junit.Rule;
37-
import org.junit.Test;
36+
import org.junit.jupiter.api.Test;
37+
import org.junit.jupiter.api.extension.RegisterExtension;
3838

3939
public class MToolItemTest {
4040

41-
@Rule
42-
public WorkbenchContextRule contextRule = new WorkbenchContextRule();
41+
@RegisterExtension
42+
public WorkbenchContextExtension contextRule = new WorkbenchContextExtension();
4343

4444
@Inject
4545
private EModelService ems;

tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/ModelServiceImplTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,25 @@
2929
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
3030
import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
3131
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
32-
import org.eclipse.e4.ui.tests.rules.WorkbenchContextRule;
32+
import org.eclipse.e4.ui.tests.rules.WorkbenchContextExtension;
3333
import org.eclipse.e4.ui.workbench.modeling.EModelService;
34-
import org.junit.Before;
35-
import org.junit.Rule;
36-
import org.junit.Test;
34+
import org.junit.jupiter.api.BeforeEach;
35+
import org.junit.jupiter.api.Test;
36+
import org.junit.jupiter.api.extension.RegisterExtension;
3737
import org.mockito.Mockito;
3838

3939
public class ModelServiceImplTest {
4040
private static final String DUMMY_EDITOR_ID = "dummyEditor";
4141

42-
@Rule
43-
public WorkbenchContextRule contextRule = new WorkbenchContextRule();
42+
@RegisterExtension
43+
public WorkbenchContextExtension contextRule = new WorkbenchContextExtension();
4444

4545
@Inject
4646
private EModelService modelService;
4747

4848
private MPart editor;
4949

50-
@Before
50+
@BeforeEach
5151
public void setUp() throws Exception {
5252
editor = modelService.createModelElement(MPart.class);
5353
editor.setElementId(DUMMY_EDITOR_ID);

0 commit comments

Comments
 (0)