Skip to main content
aboutsummaryrefslogblamecommitdiffstats
blob: 23113c85492214398e580822a0b6c0a98620bbec (plain) (tree)
1
2
                                                                                
                                                 






















































































                                                                                                                 



                                                                             

                                                         
                                                      






















                                                                                                                 
                                                                            
































                                                                                                                 
                                                                            















                                                                                  


                                                              


                 
/*******************************************************************************
 * Copyright (c) 2013 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.mockito.Matchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.ui.css.core.engine.CSSEngine;
import org.eclipse.e4.ui.css.core.resources.IResourcesRegistry;
import org.eclipse.e4.ui.css.swt.resources.ResourceByDefinitionKey;
import org.eclipse.e4.ui.css.swt.resources.SWTResourcesRegistry;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.impl.ApplicationFactoryImpl;
import org.eclipse.e4.ui.model.application.ui.basic.MBasicFactory;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.e4.ui.workbench.renderers.swt.WBWRenderer.ThemeDefinitionChangedHandler;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Resource;
import org.osgi.service.event.Event;

/**
 *
 */
public class ThemeDefinitionChangedHandlerTest extends TestCase {
	public void testHandleEventWhenThemeChanged() throws Exception {
		// given
		final MApplication application = ApplicationFactoryImpl.eINSTANCE
				.createApplication();
		application.getChildren().add(MBasicFactory.INSTANCE.createWindow());
		application.getChildren().add(MBasicFactory.INSTANCE.createWindow());

		HashMap<String, Object> params = new HashMap<String, Object>();
		params.put(IEventBroker.DATA, application);

		Event event = new Event("topic", params);

		// resources removed from registry that have to be disposed
		Resource resource1 = mock(Resource.class);
		doReturn(false).when(resource1).isDisposed();

		Resource resource2 = mock(Resource.class);
		doReturn(true).when(resource2).isDisposed();

		Object resource3 = new Object();

		List<Object> removedResources = new ArrayList<Object>();
		removedResources.add(resource1);
		removedResources.add(resource2);
		removedResources.add(resource3);
		//

		SWTResourcesRegistry registry = mock(SWTResourcesRegistry.class);
		doReturn(removedResources).when(registry)
				.removeResourcesByKeyTypeAndType(ResourceByDefinitionKey.class,
						Font.class, Color.class);

		CSSEngine engine = mock(CSSEngine.class);
		doReturn(registry).when(engine).getResourcesRegistry();

		ThemeDefinitionChangedHandlerTestable handler = spy(new ThemeDefinitionChangedHandlerTestable());
		doReturn(engine).when(handler).getEngine(any(MWindow.class));

		// when
		handler.handleEvent(event);

		// then
		verify(engine, times(1)).reapply();

		verify(handler, times(1)).removeResources(registry);
		verify(handler, times(3)).disposeResource(any(Object.class));
		verify(handler, times(1)).disposeResource(resource1);
		verify(handler, times(1)).disposeResource(resource2);
		verify(handler, times(1)).disposeResource(resource3);

		verify(resource1, times(1)).isDisposed();
		verify(resource1, times(1)).dispose();

		verify(resource2, times(1)).isDisposed();
		verify(resource2, never()).dispose();
	}

	public void testHandleEventWhenElementIsNotMApplication() throws Exception {
		// given
		HashMap<String, Object> params = new HashMap<String, Object>();
		params.put(IEventBroker.DATA, MBasicFactory.INSTANCE.createWindow());

		Event event = new Event("topic", params);

		CSSEngine engine = mock(CSSEngine.class);

		ThemeDefinitionChangedHandlerTestable handler = spy(new ThemeDefinitionChangedHandlerTestable());
		doReturn(engine).when(handler).getEngine(any(MWindow.class));

		// when
		handler.handleEvent(event);

		// then
		verify(engine, never()).reapply();
		verify(handler, never()).removeResources(any(IResourcesRegistry.class));
		verify(handler, never()).disposeResource(any(Object.class));
	}

	public void testHandleEventWhenCSSEngineNotFoundForWidget()
			throws Exception {
		// given
		MWindow window1 = MBasicFactory.INSTANCE.createWindow();
		MWindow window2 = MBasicFactory.INSTANCE.createWindow();

		final MApplication application = ApplicationFactoryImpl.eINSTANCE
				.createApplication();
		application.getChildren().add(window1);
		application.getChildren().add(window2);

		HashMap<String, Object> params = new HashMap<String, Object>();
		params.put(IEventBroker.DATA, application);

		Event event = new Event("topic", params);

		SWTResourcesRegistry registry = mock(SWTResourcesRegistry.class);

		CSSEngine engine = mock(CSSEngine.class);
		doReturn(registry).when(engine).getResourcesRegistry();

		ThemeDefinitionChangedHandlerTestable handler = spy(new ThemeDefinitionChangedHandlerTestable());
		doReturn(null).when(handler).getEngine(window1);
		doReturn(engine).when(handler).getEngine(window2);

		// when
		handler.handleEvent(event);

		// then
		verify(engine, times(1)).reapply();
		verify(handler, times(1)).removeResources(registry);
		verify(handler, never()).disposeResource(any(Object.class));
	}

	protected static class ThemeDefinitionChangedHandlerTestable extends
			ThemeDefinitionChangedHandler {
		List<Object> processedRemovedResources;

		@Override
		public CSSEngine getEngine(MWindow window) {
			return super.getEngine(window);
		}

		@Override
		public List<Object> removeResources(IResourcesRegistry registry) {
			return super.removeResources(registry);
		}

		@Override
		public void disposeResource(Object resource) {
			super.disposeResource(resource);
		}
	}
}

Back to the top