com.rcpcompany.uibindings.extests.bindingMessages.LabelDecoratorTest.java Source code

Java tutorial

Introduction

Here is the source code for com.rcpcompany.uibindings.extests.bindingMessages.LabelDecoratorTest.java

Source

/*******************************************************************************
 * Copyright (c) 2006-2013 The RCP Company 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:
 *     The RCP Company - initial API and implementation
 *******************************************************************************/
package com.rcpcompany.uibindings.extests.bindingMessages;

import static com.rcpcompany.test.utils.ui.UITestUtils.*;
import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Comparator;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DecorationContext;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.IDecorationContext;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.rcpcompany.uibindings.IManager;
import com.rcpcompany.uibindings.bindingMessages.ValidationLabelDecorator;
import com.rcpcompany.uibindings.bindingMessages.ValidationLabelDecorator.IPropagationAdapter;
import com.rcpcompany.uibindings.tests.shop.Country;
import com.rcpcompany.uibindings.tests.shop.Shop;
import com.rcpcompany.uibindings.tests.shop.ShopFactory;
import com.rcpcompany.uibindings.tests.utils.BaseUIBTestUtils;
import com.rcpcompany.uibindings.validators.EValidatorAdapter;
import com.rcpcompany.uibindings.validators.IValidatorAdapterManager;

/**
 * Test of {@link ValidationLabelDecorator}.
 * <p>
 * Tests that the provider reacts on changes in the model.
 * <p>
 * Both the events and the values are tested
 * 
 * @author Tonny Madsen, The RCP Company
 * 
 */
public class LabelDecoratorTest {
    private static final int VD = 200;

    private Shop myShop;
    private Country c0;
    private Country c1;

    final private IValidatorAdapterManager myValidatorManager = IValidatorAdapterManager.Factory.getManager();
    private ValidationLabelDecorator myLabelDecorator;

    @Before
    public void before() {
        BaseUIBTestUtils.resetAll();
        IValidatorAdapterManager.Factory.getManager().reset();
        IManager.Factory.getManager().setValidationDelay(VD);

        createModel();

        myValidatorManager.addRoot(myShop, new EValidatorAdapter());

        myLabelDecorator = new ValidationLabelDecorator();
    }

    private void createModel() {
        myShop = ShopFactory.eINSTANCE.createShop();
        myShop.setName("Hello");

        c0 = ShopFactory.eINSTANCE.createCountry();
        c0.setName("DK");
        c0.setAbbreviation("DK");
        myShop.getCountries().add(c0);

        c1 = ShopFactory.eINSTANCE.createCountry();
        c1.setName("NO");
        c1.setAbbreviation("NO");
        myShop.getCountries().add(c1);
    }

    @After
    public void after() {
        if (myLabelDecorator != null) {
            myLabelDecorator.dispose();
        }

        myValidatorManager.removeRoot(myShop);
    }

    /**
     * Test with no propagation of status
     */
    @Test
    public void decoratorNoPropagateTest() {
        // Reset to no errors
        c0.setAbbreviation("AA");
        c1.setAbbreviation("BB");
        sleepWithEvents(myLabelDecorator, 2 * VD);

        testLD(myLabelDecorator, c0, IMessageProvider.NONE, -1);
        testLD(myLabelDecorator, c1, IMessageProvider.NONE, -1);

        // Change with no event
        c0.setAbbreviation("CC");
        c1.setAbbreviation("BB");
        sleepWithEvents(myLabelDecorator, 2 * VD);

        testLD(myLabelDecorator, c0, IMessageProvider.NONE, -1);
        testLD(myLabelDecorator, c1, IMessageProvider.NONE, -1);

        // !uppercase => warning
        c0.setAbbreviation("aa");
        c1.setAbbreviation("BB");
        sleepWithEvents(myLabelDecorator, 2 * VD, c0);

        testLD(myLabelDecorator, c0, IMessageProvider.WARNING, -1);
        testLD(myLabelDecorator, c1, IMessageProvider.NONE, -1);

        // length != 2 => error
        c0.setAbbreviation("ABC");
        c1.setAbbreviation("BB");
        sleepWithEvents(myLabelDecorator, 2 * VD, c0);

        testLD(myLabelDecorator, c0, IMessageProvider.ERROR, -1);
        testLD(myLabelDecorator, c1, IMessageProvider.NONE, -1);

        // length != 2 & !uppercase => error
        c0.setAbbreviation("abc");
        c1.setAbbreviation("BB");
        sleepWithEvents(myLabelDecorator, 2 * VD); // no change!

        testLD(myLabelDecorator, c0, IMessageProvider.ERROR, -1);
        testLD(myLabelDecorator, c1, IMessageProvider.NONE, -1);

        // Reset to no errors
        c0.setAbbreviation("AA");
        c1.setAbbreviation("DD");
        sleepWithEvents(myLabelDecorator, 2 * VD, c0);

        testLD(myLabelDecorator, c0, IMessageProvider.NONE, -1);
        testLD(myLabelDecorator, c1, IMessageProvider.NONE, -1);
    }

    /**
     * Test with propagation of status
     * <p>
     * The tree is given as shop->folder->{c0, c1}
     */
    @Test
    public void testDecoratorePropagateTest() {
        final Object folder = new Object() {
            @Override
            public String toString() {
                return "FOLDER";
            }
        };
        final IPropagationAdapter myAdapter = new IPropagationAdapter() {
            @Override
            public Object getParent(Object object) {
                if (object == c0 || object == c1)
                    return folder;
                if (object == folder)
                    return myShop;
                return null;
            }
        };

        myLabelDecorator.setPropagationAdapter(myAdapter);

        // Reset to no errors
        c0.setAbbreviation("AA");
        c1.setAbbreviation("BB");
        sleepWithEvents(myLabelDecorator, 2 * VD);

        testLD(myLabelDecorator, myShop, IMessageProvider.NONE, IMessageProvider.NONE);
        testLD(myLabelDecorator, folder, IMessageProvider.NONE, IMessageProvider.NONE);
        testLD(myLabelDecorator, c0, IMessageProvider.NONE, IMessageProvider.NONE);
        testLD(myLabelDecorator, c1, IMessageProvider.NONE, IMessageProvider.NONE);

        // Change with no event
        c0.setAbbreviation("CC");
        c1.setAbbreviation("BB");
        sleepWithEvents(myLabelDecorator, 2 * VD);

        testLD(myLabelDecorator, myShop, IMessageProvider.NONE, IMessageProvider.NONE);
        testLD(myLabelDecorator, folder, IMessageProvider.NONE, IMessageProvider.NONE);
        testLD(myLabelDecorator, c0, IMessageProvider.NONE, IMessageProvider.NONE);
        testLD(myLabelDecorator, c1, IMessageProvider.NONE, IMessageProvider.NONE);

        // !uppercase => warning
        c0.setAbbreviation("aa");
        c1.setAbbreviation("BB");
        sleepWithEvents(myLabelDecorator, 2 * VD, myShop, folder, c0);

        testLD(myLabelDecorator, myShop, IMessageProvider.NONE, IMessageProvider.WARNING);
        testLD(myLabelDecorator, folder, IMessageProvider.NONE, IMessageProvider.WARNING);
        testLD(myLabelDecorator, c0, IMessageProvider.WARNING, IMessageProvider.WARNING);
        testLD(myLabelDecorator, c1, IMessageProvider.NONE, IMessageProvider.NONE);

        // !uppercase && length != 2 => error
        c0.setAbbreviation("aa");
        c1.setAbbreviation("ABC");
        sleepWithEvents(myLabelDecorator, 2 * VD, myShop, folder, c1);

        testLD(myLabelDecorator, myShop, IMessageProvider.NONE, IMessageProvider.ERROR);
        testLD(myLabelDecorator, folder, IMessageProvider.NONE, IMessageProvider.ERROR);
        testLD(myLabelDecorator, c0, IMessageProvider.WARNING, IMessageProvider.WARNING);
        testLD(myLabelDecorator, c1, IMessageProvider.ERROR, IMessageProvider.ERROR);

        // shop no name && !uppercase => warning+error
        myShop.setName("");
        c0.setAbbreviation("aa");
        c1.setAbbreviation("BB");
        sleepWithEvents(myLabelDecorator, 2 * VD, folder, c1);

        testLD(myLabelDecorator, myShop, IMessageProvider.ERROR, IMessageProvider.ERROR);
        testLD(myLabelDecorator, folder, IMessageProvider.NONE, IMessageProvider.WARNING);
        testLD(myLabelDecorator, c0, IMessageProvider.WARNING, IMessageProvider.WARNING);
        testLD(myLabelDecorator, c1, IMessageProvider.NONE, IMessageProvider.NONE);

        // length != 2 => error
        myShop.setName("hello");
        c0.setAbbreviation("ABC");
        c1.setAbbreviation("BB");
        sleepWithEvents(myLabelDecorator, 2 * VD, folder, c0);

        testLD(myLabelDecorator, myShop, IMessageProvider.NONE, IMessageProvider.ERROR);
        testLD(myLabelDecorator, folder, IMessageProvider.NONE, IMessageProvider.ERROR);
        testLD(myLabelDecorator, c0, IMessageProvider.ERROR, IMessageProvider.ERROR);
        testLD(myLabelDecorator, c1, IMessageProvider.NONE, IMessageProvider.NONE);

        // length != 2 & !uppercase => error
        c0.setAbbreviation("abc");
        c1.setAbbreviation("BB");
        sleepWithEvents(myLabelDecorator, 2 * VD); // no change!

        testLD(myLabelDecorator, myShop, IMessageProvider.NONE, IMessageProvider.ERROR);
        testLD(myLabelDecorator, folder, IMessageProvider.NONE, IMessageProvider.ERROR);
        testLD(myLabelDecorator, c0, IMessageProvider.ERROR, IMessageProvider.ERROR);
        testLD(myLabelDecorator, c1, IMessageProvider.NONE, IMessageProvider.NONE);

        // Reset to no errors
        c0.setAbbreviation("AA");
        c1.setAbbreviation("DD");
        sleepWithEvents(myLabelDecorator, 2 * VD, myShop, folder, c0);

        testLD(myLabelDecorator, myShop, IMessageProvider.NONE, IMessageProvider.NONE);
        testLD(myLabelDecorator, folder, IMessageProvider.NONE, IMessageProvider.NONE);
        testLD(myLabelDecorator, c0, IMessageProvider.NONE, IMessageProvider.NONE);
        testLD(myLabelDecorator, c1, IMessageProvider.NONE, IMessageProvider.NONE);
    }

    boolean eventSeen;

    /**
     * Sleeps for a specified time and will then test if the specified label decorator fired an
     * event with the specified objects as the changed elements
     * 
     * @param labelDecorator the decorator
     * @param period the period to sleep
     * @param objects the expected changed objects
     */
    private void sleepWithEvents(ValidationLabelDecorator labelDecorator, int period, final Object... objects) {
        final ILabelProviderListener l = new ILabelProviderListener() {
            Comparator<Object> comparator = new Comparator<Object>() {
                @Override
                public int compare(Object o1, Object o2) {
                    return o1.hashCode() - o2.hashCode();
                }
            };

            @Override
            public void labelProviderChanged(LabelProviderChangedEvent event) {
                assertEquals(false, eventSeen);
                eventSeen = true;
                Arrays.sort(objects, comparator);
                Arrays.sort(event.getElements(), comparator);

                assertArrayEquals(objects, event.getElements());
            }
        };

        eventSeen = false;
        labelDecorator.addListener(l);
        sleep(period);
        labelDecorator.removeListener(l);
        if (objects.length > 0) {
            assertEquals(true, eventSeen);
        } else {
            assertEquals(false, eventSeen);
        }
    }

    /**
     * The overlay of the last label decorator
     */
    protected ImageDescriptor myCurrentOverlay;

    /**
     * Tests whether the element - if it is an {@link EObject} - has the specified message type and
     * whether the specified decorator has the specified decoration.
     * 
     * @param labelDecorator the decorator
     * @param element the element in question
     * @param messageType the expected message for the element
     * @param decorationType the expected decoration for the element
     */
    private void testLD(ValidationLabelDecorator labelDecorator, Object element, int messageType,
            int decorationType) {
        if (element instanceof EObject) {
            assertEquals(messageType, myValidatorManager.getObjectSeverity((EObject) element));
        }
        if (decorationType == -1) {
            decorationType = messageType;
        }

        myCurrentOverlay = null;
        final IDecoration decoration = new IDecoration() {

            @Override
            public void setForegroundColor(Color color) {
                fail();
            }

            @Override
            public void setFont(Font font) {
                fail();
            }

            @Override
            public void setBackgroundColor(Color color) {
                fail();
            }

            @Override
            public IDecorationContext getDecorationContext() {
                return DecorationContext.DEFAULT_CONTEXT;
            }

            @Override
            public void addSuffix(String suffix) {
                fail();
            }

            @Override
            public void addPrefix(String prefix) {
                fail();
            }

            @Override
            public void addOverlay(ImageDescriptor overlay, int quadrant) {
                fail();
            }

            @Override
            public void addOverlay(ImageDescriptor overlay) {
                assertEquals(null, myCurrentOverlay);
                assertNotNull(overlay);
                myCurrentOverlay = overlay;
            }
        };
        labelDecorator.decorate(element, decoration);
        assertEquals(decorationType, labelDecorator.getElementSeverity(element));
        switch (decorationType) {
        case IMessageProvider.NONE:
            // No overlay expected
            assertEquals(null, myCurrentOverlay);
            break;
        case IMessageProvider.INFORMATION:
            // No overlay expected
            assertEquals(null, myCurrentOverlay);
            break;
        case IMessageProvider.WARNING:
            assertEquals(ValidationLabelDecorator.WARNING_IMAGE, myCurrentOverlay);
            break;
        case IMessageProvider.ERROR:
            assertEquals(ValidationLabelDecorator.ERROR_IMAGE, myCurrentOverlay);
            break;
        }
    }
}