org.eclipse.riena.internal.ui.ridgets.swt.TreeRidgetLabelProviderTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.riena.internal.ui.ridgets.swt.TreeRidgetLabelProviderTest.java

Source

/*******************************************************************************
 * Copyright (c) 2007, 2013 compeople AG 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:
 *    compeople AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.riena.internal.ui.ridgets.swt;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;

import junit.framework.TestCase;

import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.databinding.observable.map.ObservableMap;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.observable.set.WritableSet;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;

import org.eclipse.riena.beans.common.WordNode;
import org.eclipse.riena.core.util.ReflectionUtils;
import org.eclipse.riena.internal.core.test.collect.UITestCase;
import org.eclipse.riena.ui.ridgets.IColumnFormatter;
import org.eclipse.riena.ui.ridgets.swt.ColumnFormatter;

/**
 * Tests for the class {@link TreeRidgetLabelProvider}.
 */
@UITestCase
public class TreeRidgetLabelProviderTest extends TestCase {

    private final static String ICON_ECLIPSE = "eclipse.gif";
    private static final String[] COLUMN_PROPERTIES = { "word", "upperCase" };

    private Shell shell;
    private TreeViewer viewer;
    private TreeRidgetLabelProvider labelProvider;
    private WordNode node;
    private WordNode leaf;
    private WordNode alpha;
    private Color colorA;
    private Color colorB;
    private Font fontA;
    private Font fontB;
    private IColumnFormatter[] formatters;
    private IColumnFormatter[] noFormatters;

    @Override
    protected void setUp() throws Exception {
        final Display display = Display.getDefault();
        final Realm realm = SWTObservables.getRealm(display);
        ReflectionUtils.invokeHidden(realm, "setDefault", realm);
        colorA = display.getSystemColor(SWT.COLOR_RED);
        colorB = display.getSystemColor(SWT.COLOR_GREEN);
        fontA = new Font(display, "Arial", 12, SWT.NORMAL);
        fontB = new Font(display, "Courier", 12, SWT.NORMAL);

        shell = new Shell(display);
        viewer = new TreeViewer(createTree(shell));

        final IObservableSet elements = createElements();
        formatters = new IColumnFormatter[] { new TestColumnFormatter(), null };
        noFormatters = new IColumnFormatter[COLUMN_PROPERTIES.length];
        labelProvider = TreeRidgetLabelProvider.createLabelProvider(viewer, WordNode.class, elements,
                COLUMN_PROPERTIES, null, null, null, noFormatters);

        viewer.setContentProvider(new FTTreeContentProvider());
        viewer.setLabelProvider(labelProvider);
        viewer.setInput(elements.toArray());
    }

    @Override
    protected void tearDown() throws Exception {
        shell.dispose();
        fontA.dispose();
        fontB.dispose();
    }

    public void testGetText() {
        assertEquals("Node", labelProvider.getText(node));
        assertEquals("LEAF", labelProvider.getText(leaf));
    }

    @SuppressWarnings("rawtypes")
    public void testGetColumnText() {
        assertEquals("Node", labelProvider.getColumnText(node, 0));
        assertEquals("LEAF", labelProvider.getColumnText(leaf, 0));

        assertEquals("false", labelProvider.getColumnText(node, 1));
        assertEquals("true", labelProvider.getColumnText(leaf, 1));

        assertNull(labelProvider.getColumnText(node, 99));

        ReflectionUtils.invokeHidden(labelProvider, "setFormatters",
                (Object) new IColumnFormatter[] { null, null });
        ReflectionUtils.setHidden(labelProvider, "attributeMaps",
                new IObservableMap[] { new ObservableMap(new HashMap()), new ObservableMap(new HashMap()) });
        final String[] valuesAccessors = new String[] { "aCount" };
        ReflectionUtils.setHidden(labelProvider, "valueAccessors", valuesAccessors);
        node = new WordNode("AAAaaaa");
        assertEquals("7", labelProvider.getColumnText(node, 0));
    }

    public void testGetImage() {
        viewer.collapseAll();

        final Image siCollapsed = Activator.getSharedImage(SharedImages.IMG_NODE_COLLAPSED);
        assertNotNull(siCollapsed);
        final Image nodeCollapsed = labelProvider.getImage(node);
        assertSame(siCollapsed, nodeCollapsed);

        viewer.expandAll();

        final Image siExpanded = Activator.getSharedImage(SharedImages.IMG_NODE_EXPANDED);
        assertNotNull(siExpanded);
        final Image nodeExpanded = labelProvider.getImage(node);
        assertSame(siExpanded, nodeExpanded);

        viewer.collapseToLevel(node, 1);

        assertSame(siCollapsed, labelProvider.getImage(node));

        viewer.expandToLevel(node, 1);

        assertSame(siExpanded, labelProvider.getImage(node));

        final Image siLeaf = Activator.getSharedImage(SharedImages.IMG_LEAF);
        assertNotNull(siLeaf);
        final Image imgLeaf = labelProvider.getImage(leaf);
        assertSame(siLeaf, imgLeaf);

        // sanity check
        assertNotSame(nodeExpanded, nodeCollapsed);
        assertNotSame(nodeExpanded, imgLeaf);
        assertNotSame(nodeCollapsed, imgLeaf);
    }

    public void testGetImageFromProviderMethod() {
        final WordNodeWithIcon nodeWithIcon = new WordNodeWithIcon("nwi");
        nodeWithIcon.setIcon("closed_16.gif");
        nodeWithIcon.setOpenIcon("open_16.gif");
        final WordNodeWithIcon leafWithIcon = new WordNodeWithIcon(nodeWithIcon, "lwi");
        leafWithIcon.setIcon("eclipse.gif");
        final IObservableSet elements = new WritableSet(Realm.getDefault(),
                Arrays.asList(new WordNode[] { nodeWithIcon, leafWithIcon }), WordNodeWithIcon.class);
        labelProvider = TreeRidgetLabelProvider.createLabelProvider(viewer, WordNodeWithIcon.class, elements,
                COLUMN_PROPERTIES, null, "icon", "openIcon", noFormatters);
        viewer.setLabelProvider(labelProvider);
        viewer.setInput(elements.toArray());

        viewer.collapseAll();

        final Image siCollapsed = Activator.getSharedImage("closed_16.gif");
        assertNotNull(siCollapsed);
        final Image nodeCollapsed = labelProvider.getImage(nodeWithIcon);
        assertSame(siCollapsed, nodeCollapsed);

        viewer.expandAll();

        final Image siExpanded = Activator.getSharedImage("open_16.gif");
        assertNotNull(siExpanded);
        final Image nodeExpanded = labelProvider.getImage(nodeWithIcon);
        assertSame(siExpanded, nodeExpanded);

        final Image siLeaf = Activator.getSharedImage("eclipse.gif");
        assertNotNull(siLeaf);
        final Image imgLeaf = labelProvider.getImage(leafWithIcon);
        assertSame(siLeaf, imgLeaf);

        // sanity check
        assertNotSame(nodeExpanded, nodeCollapsed);
        assertNotSame(nodeExpanded, imgLeaf);
        assertNotSame(nodeCollapsed, imgLeaf);
    }

    public void testGetColumnImage() {
        viewer.collapseAll();

        final Image siCollapsed = Activator.getSharedImage(SharedImages.IMG_NODE_COLLAPSED);
        assertNotNull(siCollapsed);
        assertSame(siCollapsed, labelProvider.getColumnImage(node, 0));

        final Image siLeaf = Activator.getSharedImage(SharedImages.IMG_LEAF);
        assertNotNull(siLeaf);
        assertSame(siLeaf, labelProvider.getColumnImage(leaf, 0));
        assertNotSame(siLeaf, siCollapsed);

        final Image siUnchecked = Activator.getSharedImage(SharedImages.IMG_UNCHECKED);
        assertNotNull(siUnchecked);
        assertEquals(siUnchecked, labelProvider.getColumnImage(node, 1));

        final Image siChecked = Activator.getSharedImage(SharedImages.IMG_CHECKED);
        assertNotNull(siChecked);
        assertEquals(siChecked, labelProvider.getColumnImage(leaf, 1));

        assertNotSame(siChecked, siUnchecked);

        assertNull(labelProvider.getColumnImage(node, 99));
    }

    public void testGetForeground() {
        final IObservableSet elements = createElements();
        final WordNode wordNode = leaf;
        // using upperCase as the enablement accessor; true => enabled; false => disabled
        labelProvider = TreeRidgetLabelProvider.createLabelProvider(viewer, WordNode.class, elements,
                COLUMN_PROPERTIES, "upperCase", null, null, noFormatters);

        wordNode.setUpperCase(true);
        final Color colorEnabled = labelProvider.getForeground(wordNode);
        assertNull(colorEnabled);

        wordNode.setUpperCase(false);
        final Color colorDisabled = labelProvider.getForeground(wordNode);
        assertNotNull(colorDisabled);
    }

    /**
     * Tests the <i>private</i> method {@code getImageKey(String)}.
     */
    public void testGetImageKey() {
        String key = ReflectionUtils.invokeHidden(labelProvider, "getImageKey", leaf);
        assertEquals(SharedImages.IMG_LEAF, key);

        viewer.collapseAll();
        key = ReflectionUtils.invokeHidden(labelProvider, "getImageKey", node);
        assertEquals(SharedImages.IMG_NODE_COLLAPSED, key);

        viewer.expandAll();
        key = ReflectionUtils.invokeHidden(labelProvider, "getImageKey", node);
        assertEquals(SharedImages.IMG_NODE_EXPANDED, key);

        final WordNodeWithIcon nodeWithIcon1 = new WordNodeWithIcon("node");
        final WordNodeWithIcon nodeWithIcon2 = new WordNodeWithIcon("node");
        final WordNodeWithIcon nodeWithIcon3 = new WordNodeWithIcon("node");
        final IObservableSet elements = new WritableSet(Realm.getDefault(),
                Arrays.asList(new WordNode[] { nodeWithIcon1, nodeWithIcon2, nodeWithIcon3 }), WordNode.class);
        labelProvider = TreeRidgetLabelProvider.createLabelProvider(viewer, WordNodeWithIcon.class, elements,
                COLUMN_PROPERTIES, null, "icon", null, noFormatters);

        key = ReflectionUtils.invokeHidden(labelProvider, "getImageKey", nodeWithIcon1);
        assertEquals(SharedImages.IMG_LEAF, key);

        nodeWithIcon2.setIcon("unkown");
        key = ReflectionUtils.invokeHidden(labelProvider, "getImageKey", nodeWithIcon2);
        assertEquals(SharedImages.IMG_LEAF, key);

        // skip this, if not running as a plug-in junit test
        if (Activator.getDefault() != null) {
            nodeWithIcon3.setIcon(ICON_ECLIPSE);
            key = ReflectionUtils.invokeHidden(labelProvider, "getImageKey", nodeWithIcon3);
            assertEquals(ICON_ECLIPSE, key);
        }
    }

    public void testGetColumnTextWithFormatter() {
        ReflectionUtils.invokeHidden(labelProvider, "setFormatters", (Object) formatters);

        assertEquals("no", labelProvider.getColumnText(node, 0));
        assertEquals("yes", labelProvider.getColumnText(leaf, 0));
        assertEquals("Alpha", labelProvider.getColumnText(alpha, 0));

        assertEquals("false", labelProvider.getColumnText(node, 1));
        assertEquals("true", labelProvider.getColumnText(leaf, 1));
        assertEquals("false", labelProvider.getColumnText(alpha, 1));

        assertNull(labelProvider.getColumnText(node, 99));
    }

    public void testGetColumnImageWithFormatter() {
        final IColumnFormatter[] formatters2 = new IColumnFormatter[] { new TestColumnFormatter(),
                new TestColumnFormatter() };
        ReflectionUtils.invokeHidden(labelProvider, "setFormatters", (Object) formatters2);
        final Image siNode = Activator.getSharedImage(SharedImages.IMG_NODE_COLLAPSED);
        final Image siLeaf = Activator.getSharedImage(SharedImages.IMG_LEAF);
        final Image siError = Activator.getSharedImage(SharedImages.IMG_ERROR_DECO);

        assertSame(siNode, labelProvider.getColumnImage(node, 0));
        assertSame(siError, labelProvider.getColumnImage(leaf, 0));
        assertSame(siLeaf, labelProvider.getColumnImage(alpha, 0));

        final Image siUnchecked = Activator.getSharedImage(SharedImages.IMG_UNCHECKED);
        assertSame(siUnchecked, labelProvider.getColumnImage(alpha, 1));

        assertNull(labelProvider.getColumnImage(node, 99));
    }

    /**
     * As per Bug 316103
     */
    public void testUpdateColumnImageWithFormatter() {
        final Image image = ImageDescriptor.getMissingImageDescriptor().createImage(); // dummy image
        try {
            final ColumnFormatter formatter = new ColumnFormatter() {
                @Override
                public Image getImage(final Object element) {
                    return image;
                }
            };
            final IColumnFormatter[] formatters = new IColumnFormatter[] { formatter, null };
            final TreeRidgetLabelProvider labelProvider = TreeRidgetLabelProvider.createLabelProvider(viewer,
                    WordNode.class, createElements(), COLUMN_PROPERTIES, null, null, null, formatters);

            final TreeItem treeItem = new TreeItem(viewer.getTree(), SWT.NONE);
            new TreeItem(treeItem, SWT.NONE);

            assertTrue(treeItem.getItemCount() > 0); // has children
            assertNull(treeItem.getImage());

            ReflectionUtils.invokeHidden(labelProvider, "updateNodeImage", treeItem, true);

            assertSame(image, treeItem.getImage());

            ReflectionUtils.invokeHidden(labelProvider, "updateNodeImage", treeItem, false);

            assertSame(image, treeItem.getImage());
        } finally {
            image.dispose();
        }
    }

    public void testGetForegroundWithFormatter() {
        ReflectionUtils.invokeHidden(labelProvider, "setFormatters", (Object) formatters);

        assertSame(colorA, labelProvider.getForeground(node, 0));
        assertSame(colorB, labelProvider.getForeground(leaf, 0));
        assertNull(labelProvider.getForeground(alpha, 0));

        assertNull(labelProvider.getForeground(node, 1));
        assertNull(labelProvider.getForeground(leaf, 1));
        assertNull(labelProvider.getForeground(alpha, 1));

        assertNull(labelProvider.getForeground(node, 99));
    }

    public void testGetBackgroundWithFormatter() {
        ReflectionUtils.invokeHidden(labelProvider, "setFormatters", (Object) formatters);

        assertSame(colorA, labelProvider.getBackground(node, 0));
        assertSame(colorB, labelProvider.getBackground(leaf, 0));
        assertNull(labelProvider.getBackground(alpha, 0));

        assertNull(labelProvider.getBackground(node, 1));
        assertNull(labelProvider.getBackground(leaf, 1));
        assertNull(labelProvider.getBackground(alpha, 1));

        assertNull(labelProvider.getBackground(node, 99));
    }

    public void testGetFontWithFormatter() {
        ReflectionUtils.invokeHidden(labelProvider, "setFormatters", (Object) formatters);

        assertSame(fontA, labelProvider.getFont(node, 0));
        assertSame(fontB, labelProvider.getFont(leaf, 0));
        assertNull(labelProvider.getFont(alpha, 0));

        assertNull(labelProvider.getFont(node, 1));
        assertNull(labelProvider.getFont(leaf, 1));
        assertNull(labelProvider.getFont(alpha, 1));

        assertNull(labelProvider.getFont(node, 99));
    }

    // helping methods
    // ////////////////

    private IObservableSet createElements() {
        final Collection<WordNode> collection = new ArrayList<WordNode>();
        node = new WordNode("Node");
        alpha = new WordNode(node, "Alpha");
        leaf = new WordNode("Leaf");
        leaf.setUpperCase(true);
        collection.add(node);
        collection.add(leaf);
        collection.add(alpha);
        final IObservableSet elements = new WritableSet(Realm.getDefault(), collection, WordNode.class);
        return elements;
    }

    private Tree createTree(final Shell shell) {
        shell.setLayout(new FillLayout());
        final Tree result = new Tree(shell, SWT.SINGLE | SWT.BORDER);
        final TreeColumn tc1 = new TreeColumn(result, SWT.NONE);
        tc1.setWidth(200);
        final TreeColumn tc2 = new TreeColumn(result, SWT.NONE);
        tc2.setWidth(200);
        return result;
    }

    // helping classes
    // ////////////////

    private static final class FTTreeContentProvider implements ITreeContentProvider {
        public Object[] getChildren(final Object element) {
            return ((WordNode) element).getChildren().toArray();
        }

        public Object getParent(final Object element) {
            return ((WordNode) element).getParent();
        }

        public boolean hasChildren(final Object element) {
            return ((WordNode) element).getChildren().size() > 0;
        }

        public Object[] getElements(final Object inputElement) {
            return (Object[]) inputElement;
        }

        public void dispose() {
            // unused
        }

        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
            // unused
        }
    }

    private class WordNodeWithIcon extends WordNode {
        private String icon;
        private String openIcon;

        public WordNodeWithIcon(final String word) {
            super(word);
        }

        public WordNodeWithIcon(final WordNodeWithIcon parent, final String word) {
            super(parent, word);
        }

        @SuppressWarnings("unused")
        public String getIcon() {
            return icon;
        }

        @SuppressWarnings("unused")
        public String getOpenIcon() {
            return openIcon;
        }

        public void setIcon(final String icon) {
            this.icon = icon;
        }

        public void setOpenIcon(final String openIcon) {
            this.openIcon = openIcon;
        }
    }

    private final class TestColumnFormatter extends ColumnFormatter {
        @Override
        public String getText(final Object element) {
            if (element == leaf || element == node) {
                final WordNode wordNode = (WordNode) element;
                return wordNode.isUpperCase() ? "yes" : "no";
            }
            return null;
        }

        @Override
        public Image getImage(final Object element) {
            final String word = ((WordNode) element).getWord();
            if ("Leaf".equalsIgnoreCase(word)) {
                return Activator.getSharedImage(SharedImages.IMG_ERROR_DECO);
            }
            return null;
        }

        @Override
        public Color getForeground(final Object element) {
            final String word = ((WordNode) element).getWord();
            if ("Node".equalsIgnoreCase(word)) {
                return colorA;
            }
            if ("Leaf".equalsIgnoreCase(word)) {
                return colorB;
            }
            return null;
        }

        @Override
        public Color getBackground(final Object element) {
            final String word = ((WordNode) element).getWord();
            if ("Node".equalsIgnoreCase(word)) {
                return colorA;
            }
            if ("Leaf".equalsIgnoreCase(word)) {
                return colorB;
            }
            return null;
        }

        @Override
        public Font getFont(final Object element) {
            final String word = ((WordNode) element).getWord();
            if ("Node".equalsIgnoreCase(word)) {
                return fontA;
            }
            if ("Leaf".equalsIgnoreCase(word)) {
                return fontB;
            }
            return null;
        }
    }

}