/*******************************************************************************
* 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 static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.e4.ui.internal.workbench.swt.CSSConstants;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder;
import org.eclipse.e4.ui.model.application.ui.basic.MBasicFactory;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.workbench.UIEvents;
import org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.TabStateHandler;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Widget;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.service.event.Event;
public class TabStateHandlerTest {
private StackRendererTestable renderer;
private TabStateHandler handler;
private Shell shell;
@Before
public void setUp() throws Exception {
shell = new Shell();
renderer = new StackRendererTestable();
handler = renderer.new TabStateHandler();
}
@After
public void tearDown() throws Exception {
shell.dispose();
}
@Test
public void testValidateElement() throws Exception {
assertTrue(handler.validateElement(MBasicFactory.INSTANCE.createPart()));
assertTrue(handler.validateElement(MBasicFactory.INSTANCE
.createPartStack()));
}
@Test
public void testValidateElementWhenInvalidElement() throws Exception {
assertFalse(handler.validateElement(MBasicFactory.INSTANCE
.createTrimBar()));
assertFalse(handler.validateElement(null));
}
@Test
public void testValidateValues() throws Exception {
assertTrue(handler.validateValues(null,
placeHolder(MBasicFactory.INSTANCE.createPart())));
assertTrue(handler.validateValues(null, CSSConstants.CSS_BUSY_CLASS));
assertTrue(handler.validateValues(CSSConstants.CSS_BUSY_CLASS, null));
assertTrue(handler.validateValues(null,
CSSConstants.CSS_CONTENT_CHANGE_CLASS));
}
@Test
public void testValidateValuesWhenInvalidValue() throws Exception {
assertFalse(handler.validateValues(null,
MBasicFactory.INSTANCE.createPart()));
assertFalse(handler.validateValues(null, "new not supported tag"));
}
@Test
public void testHandleEventWhenTabBusyEvent() throws Exception {
// given
MPart part = MBasicFactory.INSTANCE.createPart();
CTabFolder tabFolder = new CTabFolder(shell, SWT.NONE);
CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
renderer.tabItemForPart = tabItem;
// when
handler.handleEvent(event(new EventParam(UIEvents.EventTags.ELEMENT,
part), new EventParam(UIEvents.EventTags.NEW_VALUE,
CSSConstants.CSS_BUSY_CLASS), new EventParam(
UIEvents.EventTags.OLD_VALUE, null)));
// then
assertEquals(0, part.getTags().size());
assertTrue(renderer.setCSSInfoExecuted);
assertTrue(renderer.reapplyStylesExecuted);
tabItem.dispose();
tabFolder.dispose();
}
@Test
public void testHandleEventWhenTabIdleEvent() throws Exception {
// given
MPart part = MBasicFactory.INSTANCE.createPart();
CTabFolder tabFolder = new CTabFolder(shell, SWT.NONE);
CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
renderer.tabItemForPart = tabItem;
// when
handler.handleEvent(event(new EventParam(UIEvents.EventTags.ELEMENT,
part), new EventParam(UIEvents.EventTags.NEW_VALUE, null),
new EventParam(UIEvents.EventTags.OLD_VALUE,
CSSConstants.CSS_BUSY_CLASS)));
// then
assertEquals(0, part.getTags().size());
assertTrue(renderer.setCSSInfoExecuted);
assertTrue(renderer.reapplyStylesExecuted);
tabItem.dispose();
tabFolder.dispose();
}
@Test
public void testHandleEventWhenTabContentChangedEventAndTabInactive()
throws Exception {
// given
MPart part = MBasicFactory.INSTANCE.createPart();
CTabFolder tabFolder = new CTabFolder(shell, SWT.NONE);
CTabItem tabItem1 = new CTabItem(tabFolder, SWT.NONE);
CTabItem tabItem2 = new CTabItem(tabFolder, SWT.NONE);
part.getTags().add(CSSConstants.CSS_CONTENT_CHANGE_CLASS);
tabFolder.setSelection(tabItem2);
renderer.tabItemForPart = tabItem1;
// when
handler.handleEvent(event(new EventParam(UIEvents.EventTags.ELEMENT,
part), new EventParam(UIEvents.EventTags.NEW_VALUE,
CSSConstants.CSS_CONTENT_CHANGE_CLASS), new EventParam(
UIEvents.EventTags.OLD_VALUE, null)));
// then
assertTrue(part.getTags().contains(CSSConstants.CSS_HIGHLIGHTED_CLASS));
assertFalse(part.getTags().contains(
CSSConstants.CSS_CONTENT_CHANGE_CLASS));
assertTrue(renderer.setCSSInfoExecuted);
assertTrue(renderer.reapplyStylesExecuted);
tabItem1.dispose();
tabItem2.dispose();
tabFolder.dispose();
}
@Test
public void testHandleEventWhenTabContentChangedEventAndTabActive()
throws Exception {
// given
MPart part = MBasicFactory.INSTANCE.createPart();
CTabFolder tabFolder = new CTabFolder(shell, SWT.NONE);
CTabItem tabItem1 = new CTabItem(tabFolder, SWT.NONE);
CTabItem tabItem2 = new CTabItem(tabFolder, SWT.NONE);
part.getTags().add(CSSConstants.CSS_CONTENT_CHANGE_CLASS);
tabFolder.setSelection(tabItem1);
renderer.tabItemForPart = tabItem1;
// when
handler.handleEvent(event(new EventParam(UIEvents.EventTags.ELEMENT,
part), new EventParam(UIEvents.EventTags.NEW_VALUE,
CSSConstants.CSS_CONTENT_CHANGE_CLASS), new EventParam(
UIEvents.EventTags.OLD_VALUE, null)));
// then
assertFalse(part.getTags().contains(CSSConstants.CSS_HIGHLIGHTED_CLASS));
assertFalse(part.getTags().contains(
CSSConstants.CSS_CONTENT_CHANGE_CLASS));
assertTrue(renderer.setCSSInfoExecuted);
assertTrue(renderer.reapplyStylesExecuted);
tabItem1.dispose();
tabItem2.dispose();
tabFolder.dispose();
}
@Test
public void testHandleEventWhenTabActivateEventAndItsContentChanged()
throws Exception {
// given
MPart part = MBasicFactory.INSTANCE.createPart();
CTabFolder tabFolder = new CTabFolder(shell, SWT.NONE);
CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
part.getTags().add(CSSConstants.CSS_HIGHLIGHTED_CLASS);
renderer.tabItemForPart = tabItem;
// when
handler.handleEvent(event(new EventParam(UIEvents.EventTags.ELEMENT,
part), new EventParam(UIEvents.EventTags.NEW_VALUE,
placeHolder(part)), new EventParam(
UIEvents.EventTags.OLD_VALUE, null)));
// then
assertFalse(part.getTags().contains(CSSConstants.CSS_HIGHLIGHTED_CLASS));
assertTrue(renderer.setCSSInfoExecuted);
assertTrue(renderer.reapplyStylesExecuted);
tabItem.dispose();
tabFolder.dispose();
}
@Test
public void testHandleEventWhenTabActivateEventAndTabItemForPartNotFound()
throws Exception {
// given
MPart part = MBasicFactory.INSTANCE.createPart();
CTabFolder tabFolder = new CTabFolder(shell, SWT.NONE);
CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
part.getTags().add(CSSConstants.CSS_HIGHLIGHTED_CLASS);
renderer.tabItemForPart = null; // just to expose the scenario condition
// when
handler.handleEvent(event(new EventParam(UIEvents.EventTags.ELEMENT,
part), new EventParam(UIEvents.EventTags.NEW_VALUE,
placeHolder(part)), new EventParam(
UIEvents.EventTags.OLD_VALUE, null)));
// then
assertTrue(part.getTags().contains(CSSConstants.CSS_HIGHLIGHTED_CLASS));
assertFalse(renderer.setCSSInfoExecuted);
assertFalse(renderer.reapplyStylesExecuted);
tabItem.dispose();
tabFolder.dispose();
}
// helper functions
private static class StackRendererTestable extends StackRenderer {
boolean setCSSInfoExecuted;
boolean reapplyStylesExecuted;
CTabItem tabItemForPart;
@Override
public void setCSSInfo(MUIElement me, Object widget) {
setCSSInfoExecuted = true;
}
@Override
protected void reapplyStyles(Widget widget) {
reapplyStylesExecuted = true;
}
@Override
public CTabItem findItemForPart(MPart part) {
return tabItemForPart;
}
}
private MPlaceholder placeHolder(final MPart part) {
return (MPlaceholder) Proxy.newProxyInstance(getClass()
.getClassLoader(), new Class<?>[] { MPlaceholder.class },
new InvocationHandler() {
@Override
public Object invoke(Object arg0, Method method,
Object[] arg2) throws Throwable {
if ("getRef".equals(method.getName())) {
return part;
}
return null;
}
});
}
private class EventParam implements Map.Entry<String, Object> {
private String key;
private Object value;
public EventParam(String key, Object value) {
this.key = key;
this.value = value;
}
@Override
public String getKey() {
return key;
}
@Override
public Object getValue() {
return value;
}
@Override
public Object setValue(Object arg0) {
return null;
}
}
private Event event(EventParam... params) {
HashMap<String, Object> paramsMap = new HashMap<String, Object>();
for (EventParam param : params) {
paramsMap.put(param.getKey(), param.getValue());
}
return new Event("topic", paramsMap);
}
}