/******************************************************************************* * Copyright (c) 2013, 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 ******************************************************************************/ package org.eclipse.e4.ui.workbench.renderers.swt; import static org.junit.Assert.assertEquals; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.ui.internal.workbench.E4Workbench; import org.eclipse.e4.ui.internal.workbench.swt.CSSConstants; import org.eclipse.e4.ui.internal.workbench.swt.E4Application; import org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine; import org.eclipse.e4.ui.model.application.MApplication; 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.MPartStack; import org.eclipse.e4.ui.model.application.ui.basic.MWindow; import org.eclipse.e4.ui.services.IStylingEngine; import org.eclipse.e4.ui.services.internal.events.EventBroker; import org.eclipse.e4.ui.workbench.UIEvents; import org.eclipse.e4.ui.workbench.modeling.EModelService; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.widgets.Display; import org.junit.After; import org.junit.Before; import org.junit.Test; public class StackRendererTest { private IEclipseContext context; private E4Workbench wb; private MPart part; private CTabItemStylingMethodsListener executedMethodsListener; private MPartStack partStack; private EModelService ems; @Before public void setUp() throws Exception { context = E4Application.createDefaultContext(); context.set(E4Workbench.PRESENTATION_URI_ARG, PartRenderingEngine.engineURI); ems = context.get(EModelService.class); MApplication application = ems.createModelElement(MApplication.class); MWindow window = ems.createModelElement(MWindow.class); partStack = ems.createModelElement(MPartStack.class); part = ems.createModelElement(MPart.class); part.setLabel("some title"); application.getChildren().add(window); application.setSelectedElement(window); window.getChildren().add(partStack); partStack.getChildren().add(part); application.setContext(context); context.set(MApplication.class, application); executedMethodsListener = new CTabItemStylingMethodsListener(part); wb = new E4Workbench(application, context); wb.getContext().set( IStylingEngine.class, (IStylingEngine) Proxy.newProxyInstance(getClass() .getClassLoader(), new Class<?>[] { IStylingEngine.class }, executedMethodsListener)); wb.createAndRunUI(window); while (Display.getDefault().readAndDispatch()) ; } @After public void tearDown() throws Exception { if (wb != null) { wb.close(); } context.dispose(); } @Test public void testTabStateHandlerWhenOneOfSupportedTagChangeEvents() throws Exception { // given HashMap<String, Object> params = new HashMap<String, Object>(); params.put(UIEvents.EventTags.ELEMENT, part); params.put(UIEvents.EventTags.NEW_VALUE, CSSConstants.CSS_BUSY_CLASS); params.put(UIEvents.EventTags.OLD_VALUE, null); // when context.get(EventBroker.class).send( UIEvents.ApplicationElement.TOPIC_TAGS.replace( UIEvents.ALL_SUB_TOPICS, UIEvents.EventTypes.SET), params); // then assertEquals(1, executedMethodsListener .getMethodExecutionCount("setClassnameAndId(.+)")); } @Test public void testTabStateHandlerWhenSelectionChangedEvent() throws Exception { // given MPlaceholder placeHolder = ems.createModelElement(MPlaceholder.class); placeHolder.setRef(part); HashMap<String, Object> params = new HashMap<String, Object>(); params.put(UIEvents.EventTags.ELEMENT, partStack); params.put(UIEvents.EventTags.NEW_VALUE, placeHolder); params.put(UIEvents.EventTags.OLD_VALUE, null); // when context.get(EventBroker.class).send( UIEvents.ElementContainer.TOPIC_SELECTEDELEMENT.replace( UIEvents.ALL_SUB_TOPICS, UIEvents.EventTypes.SET), params); // then assertEquals(1, executedMethodsListener .getMethodExecutionCount("setClassnameAndId(.+)")); } // helper functions private static class CTabItemStylingMethodsListener implements InvocationHandler { private MPart part; private List<String> methods; public CTabItemStylingMethodsListener(MPart part) { this.part = part; methods = new ArrayList<String>(); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (isTabItemForPart(args[0])) { methods.add(String.format("%s(%s)", method.getName(), Arrays.toString(args))); } return null; } private boolean isTabItemForPart(Object obj) { return obj instanceof CTabItem && part.getLabel().equals(((CTabItem) obj).getText()); } public int getMethodExecutionCount(String methodPattern) { int result = 0; for (String method : methods) { if (method.matches(methodPattern)) { result++; } } return result; } } }