org.eclipse.e4.ui.tests.workbench.RenderingTestCase.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.e4.ui.tests.workbench.RenderingTestCase.java

Source

/*******************************************************************************
 * Copyright (c) 2009, 2010 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.tests.workbench;

import junit.framework.TestCase;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.runtime.RegistryFactory;
import org.eclipse.e4.core.contexts.EclipseContextFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.services.contributions.IContributionFactory;
import org.eclipse.e4.ui.internal.workbench.E4Workbench;
import org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory;
import org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine;
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.MWindow;
import org.eclipse.e4.ui.tests.Activator;
import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Widget;

/**
 * This is the base class for tests involving the interactions between the UI
 * Model and the SWT Renderer. It is optimized to reduce the overhead
 * <p>
 * It provides various utility methods but also enforces automatic tests to
 * ensure that all models rendered through it conform to the expected structural
 * result:
 * <ol>
 * <li>All visible UI Model elements result in a widget</li>
 * <li>The UI Model element and its SWT Widget are correctly 'bound'</li>
 * <li>The correct SWT widget is created for a given UI Model element</li>
 * <ul>
 * <li>MWindow -> Shell</li>
 * <li>MSashForm -> SashForm</li>
 * <li>MStack -> CTabFol2der</li>
 * <li>MContributedPart -> Composite</li>
 * </ul>
 * <li>The name of an MItem is correctly set in the resulting SWT widget</li>
 * <li>The Image of an MItem is correctly set in the resulting SWT widget</li>
 * <li>The Tooltip Text of an MItem is correctly set in the resulting SWT widget
 * </li>
 * </ol>
 * </p>
 */
public class RenderingTestCase extends TestCase {
    // 'constant' fields: static for all tests
    protected static IContributionFactory contributionFactory = new ReflectionContributionFactory(
            RegistryFactory.getRegistry());

    protected static IEclipseContext serviceContext = EclipseContextFactory
            .getServiceContext(Activator.getDefault().getBundle().getBundleContext());

    protected static MApplication app = ApplicationFactoryImpl.eINSTANCE.createApplication();

    protected static Display display = Display.getCurrent() != null ? Display.getCurrent() : new Display();

    // 'transient' fields: re-created for each test
    protected IPresentationEngine renderer;
    protected IEclipseContext appContext;
    protected Widget topWidget;

    protected long startTime;

    /**
     * Test cases derived from this class are used to test the Model <-> (SWT)
     * UI relationships. These tests will ensure that the correct controls are
     * created and that the various listeners (data bindings...) behave
     * correctly.
     */
    public RenderingTestCase() {
    }

    /*
     * (non-Javadoc)
     * 
     * @see junit.framework.TestCase#setUp()
     */
    @Override
    protected void setUp() throws Exception {
        System.out.println("Setup");
        startTime = System.currentTimeMillis();
        super.setUp();

        // Create a fresh org.eclipse.e4.ui.model.application context for each
        // test
        IEclipseContext serviceContext = EclipseContextFactory
                .getServiceContext(Activator.getDefault().getBundle().getBundleContext());

        appContext = E4Workbench.createWorkbenchContext(serviceContext, RegistryFactory.getRegistry(), null, null);
        MApplication app = ApplicationFactoryImpl.eINSTANCE.createApplication();

        appContext.set(MApplication.class.getName(), app);
        appContext.set(IContributionFactory.class.getName(), contributionFactory);

        app.setContext(appContext);
    }

    /*
     * (non-Javadoc)
     * 
     * @see junit.framework.TestCase#tearDown()
     */
    @Override
    protected void tearDown() throws Exception {
        System.out.print("tearDown");
        super.tearDown();

        // dispose the current context
        appContext = null;
        renderer = null;

        if (topWidget != null) {
            if (!topWidget.isDisposed())
                topWidget.dispose();

            // TBD: Should check the model to make sure it's been cleaned
            // here...
            topWidget = null;
        }
        System.out.println("  time: " + (System.currentTimeMillis() - startTime) + "ms");
    }

    protected void processEventLoop() {
        if (display != null) {
            while (display.readAndDispatch())
                ;
        }
    }

    protected Widget createModel(final MWindow window) {
        MApplication application = (MApplication) appContext.get(MApplication.class.getName());
        application.getChildren().add(window);

        final Widget[] renderedObject = new Widget[1];
        renderedObject[0] = null;
        Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
            public void run() {
                // Capture the expected 'invariant' results
                // SWTResult expectedResults = createSWTResultTree(modelRoot);

                renderer = (PartRenderingEngine) contributionFactory.create(PartRenderingEngine.engineURI,
                        appContext);
                Object o = renderer.createGui(window);
                assertTrue("No widget rendered for: " + window.toString(), o != null);
                assertTrue("Rendered object is not a Widget: " + o.getClass().getName(), o instanceof Widget);

                renderedObject[0] = (Widget) o;

                // Test the invariants
                // checkResults(expectedResults, renderedObject[0]);
            }
        });
        return renderedObject[0];
    }

    public void checkResults(SWTResult expected, Widget renderedObject) {
        // assertNotNull("The Control is Null " + expected.clazz.getName(),
        // renderedObject);
        // boolean classOK = (expected.clazz == renderedObject.getClass());
        // assertTrue("Class mismatch; expected: " + expected.clazz.getName()
        // + " actual: " + renderedObject.getClass().getName(), classOK);
        // if (expected.text != null) {
        // if (renderedObject instanceof Shell) {
        // String shellText = ((Shell) renderedObject).getText();
        // assertTrue("Text mismatch; expected: " + expected.text
        // + " actual: " + shellText, expected.text
        // .equals(shellText));
        // }
        // }
        // if (!expected.kids.isEmpty()) {
        // if (renderedObject instanceof Composite) {
        // Control[] controlKids = ((Composite) renderedObject)
        // .getChildren();
        // // Special check to remove the 'Sash' elements from a SashForm
        // if (renderedObject instanceof SashForm) {
        // List<Control> nonSashes = new ArrayList<Control>();
        // for (int i = 0; i < controlKids.length; i++) {
        // if (controlKids[i] instanceof Sash)
        // continue;
        // nonSashes.add(controlKids[i]);
        // }
        // controlKids = new Control[nonSashes.size()];
        // int count = 0;
        // for (Iterator<Control> iterator = nonSashes.iterator(); iterator
        // .hasNext();) {
        // Control ctrl = iterator.next();
        // controlKids[count++] = ctrl;
        // }
        // // controlKids = (Control[]) nonSashes.toArray();
        // }
        //
        // assertTrue("Child count mismatch; expected: "
        // + expected.kids.size() + "actual: "
        // + controlKids.length,
        // expected.kids.size() == controlKids.length);
        // Iterator kidIter = expected.kids.iterator();
        // for (Control kid : controlKids) {
        // SWTResult currKid = (SWTResult) kidIter.next();
        // checkResults(currKid, kid);
        // }
        // }
        // }
    }

    // public static SWTResult createSWTResultTree(MPart element) {
    // if (!element.isVisible())
    // return null;
    //
    // // Determine the expected control type based on the model's type
    // // NOTE: would be nice to get this from the various factories
    // Class elementClass = element.getClass();
    // Class expectedClass = null;
    // if (elementClass == WorkbenchWindowImpl.class) {
    // expectedClass = Shell.class;
    // } else if (elementClass == PartSashContainerImpl.class) {
    // expectedClass = SashForm.class;
    // } else if (elementClass == PartStackImpl.class) {
    // expectedClass = CTabFolder.class;
    // } else if (elementClass == PartImpl.class) {
    // expectedClass = Composite.class;
    // }
    //
    // // Capture the name
    // String theName = null;
    // if (element instanceof MItem) {
    // theName = ((MItem) element).getName();
    // }
    //
    // // Create a result entry for each child element
    // EList<?> list = element.getChildren();
    // SWTResult[] childList = null;
    // if (!list.isEmpty()) {
    // childList = new SWTResult[list.size()];
    // for (int i = 0; i < list.size(); i++) {
    // childList[i] = createSWTResultTree((MPart) list.get(i));
    // }
    // }
    // return new SWTResult(expectedClass, theName, childList);
    // }

}