blob: 394128f9cd97a268c5d4da25f92e48f115a6d443 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Lars Vogel <Lars.Vogel@gmail.com> - Bug 433228
******************************************************************************/
package org.eclipse.e4.ui.tests.application;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.internal.workbench.swt.E4Application;
import org.eclipse.e4.ui.model.application.MAddon;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.MApplicationElement;
import org.eclipse.e4.ui.model.application.MApplicationFactory;
import org.eclipse.e4.ui.model.application.commands.MBindingTable;
import org.eclipse.e4.ui.model.application.commands.MHandler;
import org.eclipse.e4.ui.model.application.commands.MKeyBinding;
import org.eclipse.e4.ui.model.application.ui.MDirtyable;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspectiveStack;
import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainer;
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBarElement;
import org.eclipse.e4.ui.model.application.ui.menu.MToolControl;
import org.eclipse.e4.ui.workbench.Selector;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class EModelServiceFindTest {
private IEclipseContext applicationContext;
MApplication app = null;
@Before
public void setUp() throws Exception {
applicationContext = E4Application.createDefaultContext();
}
@After
public void tearDown() throws Exception {
applicationContext.dispose();
}
private MApplication createApplication() {
EModelService modelService = applicationContext.get(EModelService.class);
MApplication app = modelService.createModelElement(MApplication.class);
app.setContext(applicationContext);
MWindow window = modelService.createModelElement(MWindow.class);
window.setElementId("singleValidId");
app.getChildren().add(window);
MMenu mainMenu = modelService.createModelElement(MMenu.class);
window.setMainMenu(mainMenu);
MMenu mainMenuItem = modelService.createModelElement(MMenu.class);
mainMenu.getChildren().add(mainMenuItem);
MPartSashContainer psc = modelService.createModelElement(MPartSashContainer.class);
psc.setElementId("twoValidIds");
psc.getTags().add("oneValidTag");
window.getChildren().add(psc);
MPartStack stack = modelService.createModelElement(MPartStack.class);
stack.getTags().add("twoValidTags");
psc.getChildren().add(stack);
MPart part1 = modelService.createModelElement(MPart.class);
part1.setElementId("twoValidIds");
stack.getChildren().add(part1);
MPart part2 = modelService.createModelElement(MPart.class);
part2.getTags().add("twoValidTags");
part2.getTags().add("secondTag");
stack.getChildren().add(part2);
MPart part3 = modelService.createModelElement(MPart.class);
psc.getChildren().add(part3);
MMenu menu = modelService.createModelElement(MMenu.class);
menu.setElementId("menuId");
part1.getMenus().add(menu);
MMenu menuItem1 = modelService.createModelElement(MMenu.class);
menuItem1.setElementId("menuItem1Id");
menu.getChildren().add(menuItem1);
MMenu menuItem2 = modelService.createModelElement(MMenu.class);
menuItem2.setElementId("menuItem2Id");
menu.getChildren().add(menuItem2);
MToolBar toolBar = modelService.createModelElement(MToolBar.class);
toolBar.setElementId("toolBarId");
part2.setToolbar(toolBar);
MToolControl toolControl1 = modelService.createModelElement(MToolControl.class);
toolControl1.setElementId("toolControl1Id");
toolBar.getChildren().add(toolControl1);
MToolControl toolControl2 = modelService.createModelElement(MToolControl.class);
toolControl2.setElementId("toolControl2Id");
toolBar.getChildren().add(toolControl2);
return app;
}
@Test
public void testFindElementsIdOnly() {
MApplication application = createApplication();
EModelService modelService = application.getContext().get(EModelService.class);
assertNotNull(modelService);
List<MUIElement> elements1 = modelService.findElements(application, "singleValidId", null, null);
assertEquals(elements1.size(), 1);
List<MUIElement> elements2 = modelService.findElements(application, "twoValidIds", null, null);
assertEquals(elements2.size(), 2);
List<MUIElement> elements3 = modelService.findElements(application, "invalidId", null, null);
assertEquals(elements3.size(), 0);
List<MUIElement> elements4 = modelService.findElements(application, "menuItem1Id", null, null,
EModelService.ANYWHERE | EModelService.IN_MAIN_MENU | EModelService.IN_PART);
assertEquals(1, elements4.size());
List<MUIElement> elements5 = modelService.findElements(application, "toolControl1Id", null, null,
EModelService.ANYWHERE | EModelService.IN_MAIN_MENU | EModelService.IN_PART);
assertEquals(1, elements5.size());
}
@Test
public void testFindElementsTypeOnly() {
MApplication application = createApplication();
EModelService modelService = application.getContext().get(EModelService.class);
assertNotNull(modelService);
List<MPart> parts = modelService.findElements(application, null, MPart.class, null);
assertEquals(parts.size(), 3);
List<MPartStack> stacks = modelService.findElements(application, null, MPartStack.class, null);
assertEquals(stacks.size(), 1);
List<MDirtyable> dirtyableElements = modelService.findElements(application, null, MDirtyable.class, null);
assertEquals(dirtyableElements.size(), 3);
List<MMenuElement> menuElements = modelService.findElements(application, null, MMenuElement.class, null,
EModelService.ANYWHERE | EModelService.IN_MAIN_MENU | EModelService.IN_PART);
assertEquals(5, menuElements.size());
List<MToolBarElement> toolBarElements = modelService.findElements(application, null, MToolBarElement.class,
null, EModelService.ANYWHERE | EModelService.IN_MAIN_MENU | EModelService.IN_PART);
assertEquals(2, toolBarElements.size());
// Should find all the elements
List<MUIElement> uiElements = modelService.findElements(application, null, null, null,
EModelService.ANYWHERE | EModelService.IN_MAIN_MENU | EModelService.IN_PART);
assertEquals(15, uiElements.size());
// Should match 0 since String is not an MUIElement
List<String> strings = modelService.findElements(application, null, String.class, null);
assertEquals(strings.size(), 0);
}
@Test
public void testFindElementsTagsOnly() {
MApplication application = createApplication();
EModelService modelService = application.getContext().get(EModelService.class);
assertNotNull(modelService);
List<String> tags = new ArrayList<String>();
tags.add("oneValidTag");
List<MUIElement> oneTags = modelService.findElements(application, null, null, tags);
assertEquals(oneTags.size(), 1);
tags.clear();
tags.add("twoValidTags");
List<MUIElement> twoTags = modelService.findElements(application, null, null, tags);
assertEquals(twoTags.size(), 2);
tags.clear();
tags.add("invalidTag");
List<MUIElement> invalidTags = modelService.findElements(application, null, null, tags);
assertEquals(invalidTags.size(), 0);
tags.clear();
tags.add("twoValidTags");
tags.add("secondTag");
List<MUIElement> combinedTags = modelService.findElements(application, null, null, tags);
assertEquals(combinedTags.size(), 1);
tags.clear();
tags.add("oneValidTag");
tags.add("secondTag");
List<MUIElement> unmatchedTags = modelService.findElements(application, null, null, tags);
assertEquals(unmatchedTags.size(), 0);
}
@Test
public void testFindElementsCombinations() {
MApplication application = createApplication();
EModelService modelService = application.getContext().get(EModelService.class);
assertNotNull(modelService);
List<String> tags = new ArrayList<String>();
tags.add("oneValidTag");
List<MPartSashContainer> idAndType = modelService.findElements(application, "twoValidIds",
MPartSashContainer.class, tags);
assertEquals(idAndType.size(), 1);
List<MPartSashContainer> typeAndTag = modelService.findElements(application, null, MPartSashContainer.class,
tags);
assertEquals(typeAndTag.size(), 1);
List<MUIElement> idAndTag = modelService.findElements(application, "twoValidIds", null, tags);
assertEquals(idAndTag.size(), 1);
List<MPartSashContainer> idAndTypeAndTags = modelService.findElements(application, "twoValidIds",
MPartSashContainer.class, null);
assertEquals(idAndTypeAndTags.size(), 1);
List<MPartSashContainer> badIdAndTypeAndTags = modelService.findElements(application, "invalidId",
MPartSashContainer.class, null);
assertEquals(badIdAndTypeAndTags.size(), 0);
}
@Test
public void testFindElements_NullCheck() {
MApplication application = createApplication();
EModelService modelService = application.getContext().get(EModelService.class);
assertNotNull(modelService);
try {
modelService.find("a", null);
fail("An exception should have prevented a null parameter to find(*)");
} catch (IllegalArgumentException e) {
// expected
}
try {
modelService.findElements(null, null, null, null);
fail("An exception should have prevented a null parameter to findElements(*)");
} catch (IllegalArgumentException e) {
// expected
}
try {
modelService.findElements(null, null, null, null, EModelService.ANYWHERE);
fail("An exception should have prevented a null parameter to findElements(*)");
} catch (IllegalArgumentException e) {
// expected
}
}
@Test
public void testFlags() {
MApplication application = createApplication();
EModelService modelService = application.getContext().get(EModelService.class);
assertNotNull(modelService);
List<MToolBarElement> toolBarElements = modelService.findElements(application, null, MToolBarElement.class,
null, EModelService.IN_ANY_PERSPECTIVE);
assertEquals(0, toolBarElements.size());
toolBarElements = modelService.findElements(application, null, MToolBarElement.class, null,
EModelService.IN_ANY_PERSPECTIVE | EModelService.IN_PART);
assertEquals(2, toolBarElements.size());
List<MMenuElement> menuElements = modelService.findElements(application, null, MMenuElement.class, null,
EModelService.IN_ANY_PERSPECTIVE);
assertEquals(0, menuElements.size());
menuElements = modelService.findElements(application, null, MMenuElement.class, null,
EModelService.IN_ANY_PERSPECTIVE | EModelService.IN_PART);
assertEquals(3, menuElements.size());
menuElements = modelService.findElements(application, null, MMenuElement.class, null,
EModelService.IN_ANY_PERSPECTIVE | EModelService.IN_MAIN_MENU);
assertEquals(2, menuElements.size());
}
private MHandler findHandler(EModelService ms, MApplicationElement searchRoot, final String id) {
if (searchRoot == null || id == null)
return null;
List<MHandler> handlers = ms.findElements(searchRoot, MHandler.class, EModelService.ANYWHERE, new Selector() {
@Override
public boolean select(MApplicationElement element) {
return element instanceof MHandler && id.equals(element.getElementId());
}
});
if (handlers.size() > 0) {
return handlers.get(0);
}
return null;
}
@Test
public void testFindHandler() {
MApplication application = createApplication();
EModelService modelService = application.getContext().get(EModelService.class);
assertNotNull(modelService);
MHandler handler1 = modelService.createModelElement(MHandler.class);
handler1.setElementId("handler1");
application.getHandlers().add(handler1);
MHandler handler2 = modelService.createModelElement(MHandler.class);
handler2.setElementId("handler2");
application.getHandlers().add(handler2);
MHandler foundHandler = null;
foundHandler = findHandler(modelService, application, "handler1");
assertNotNull(foundHandler);
assertSame(handler1, foundHandler);
foundHandler = findHandler(modelService, application, "invalidId");
assertNull(foundHandler);
foundHandler = findHandler(modelService, null, "handler1");
assertNull(foundHandler);
foundHandler = findHandler(modelService, application, "");
assertNull(foundHandler);
foundHandler = findHandler(modelService, application, null);
assertNull(foundHandler);
}
@Test
public void testFindMKeyBindings() {
MApplication application = createApplication();
EModelService modelService = application.getContext().get(EModelService.class);
assertNotNull(modelService);
MBindingTable bindingTable = modelService.createModelElement(MBindingTable.class);
MKeyBinding keyBinding = modelService.createModelElement(MKeyBinding.class);
bindingTable.getBindings().add(keyBinding);
application.getBindingTables().add(bindingTable);
List<MKeyBinding> elements = modelService.findElements(application, MKeyBinding.class, EModelService.ANYWHERE,
element -> (element instanceof MKeyBinding));
assertEquals(1, elements.size());
assertEquals(keyBinding, elements.get(0));
}
@Test
public void testFindAddons() {
MApplication application = createApplication();
EModelService modelService = (EModelService) application.getContext()
.get(EModelService.class.getName());
assertNotNull(modelService);
MAddon addon = MApplicationFactory.INSTANCE.createAddon();
application.getAddons().add(addon);
List<MAddon> elements = modelService.findElements(application,
MAddon.class, EModelService.ANYWHERE, new Selector() {
@Override
public boolean select(MApplicationElement element) {
return (element instanceof MAddon);
}
});
assertEquals(1, elements.size());
assertEquals(addon, elements.get(0));
}
@Test
public void testBug314685() {
MApplication application = createApplication();
application.setContext(applicationContext);
EModelService modelService = application.getContext().get(EModelService.class);
assertNotNull(modelService);
MWindow window = modelService.createModelElement(MWindow.class);
application.getChildren().add(window);
MPerspectiveStack perspectiveStack = modelService.createModelElement(MPerspectiveStack.class);
window.getChildren().add(perspectiveStack);
MPerspective perspectiveA = modelService.createModelElement(MPerspective.class);
perspectiveStack.getChildren().add(perspectiveA);
MPerspective perspectiveB = modelService.createModelElement(MPerspective.class);
perspectiveStack.getChildren().add(perspectiveB);
MPartStack partStack = modelService.createModelElement(MPartStack.class);
window.getSharedElements().add(partStack);
MPart part = modelService.createModelElement(MPart.class);
partStack.getChildren().add(part);
MPlaceholder placeholderA = modelService.createModelElement(MPlaceholder.class);
placeholderA.setRef(partStack);
perspectiveA.getChildren().add(placeholderA);
MPlaceholder placeholderB = modelService.createModelElement(MPlaceholder.class);
placeholderB.setRef(partStack);
perspectiveB.getChildren().add(placeholderB);
List<MPart> elements = modelService.findElements(window, null, MPart.class, null);
assertNotNull(elements);
assertEquals(1, elements.size());
assertEquals(part, elements.get(0));
}
}