/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.v7.tests.server;
import java.util.EventObject;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
import com.vaadin.event.ContextClickEvent;
import com.vaadin.event.ContextClickEvent.ContextClickListener;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.v7.ui.Grid.GridContextClickEvent;
import com.vaadin.v7.ui.Table.TableContextClickEvent;
/**
* Server-side unit tests to see that context click events are sent to listeners
* correctly.
*
* If a listener is listening to a super type of an event, it should get the
* event. i.e. Listening to ContextClickEvent, it should get the specialized
* GridContextClickEvent as well.
*
* If a listener is listening to a sub-type of an event, it should not get the
* super version. i.e. Listening to GridContextClickEvent, it should not get a
* plain ContextClickEvent.
*/
public class ContextClickListenerTest extends AbstractComponent {
private final static ContextClickEvent contextClickEvent = EasyMock
.createMock(ContextClickEvent.class);
private final static GridContextClickEvent gridContextClickEvent = EasyMock
.createMock(GridContextClickEvent.class);
private final static TableContextClickEvent tableContextClickEvent = EasyMock
.createMock(TableContextClickEvent.class);
private final AssertListener contextListener = new AssertListener();
private final AssertListener ctxtListener2 = new AssertListener();
public static class AssertListener implements ContextClickListener {
private Class<?> expected = null;
private String error = null;
@Override
public void contextClick(ContextClickEvent event) {
if (expected == null) {
error = "Unexpected context click event.";
return;
}
if (!expected.isAssignableFrom(event.getClass())) {
error = "Expected event type did not match the actual event.";
}
expected = null;
}
public <T extends ContextClickEvent> void expect(Class<T> clazz) {
validate();
expected = clazz;
}
public void validate() {
if (expected != null) {
Assert.fail("Expected context click never happened.");
} else if (error != null) {
Assert.fail(error);
}
}
}
@Test
public void testListenerGetsASubClass() {
addContextClickListener(contextListener);
contextListener.expect(GridContextClickEvent.class);
fireEvent(gridContextClickEvent);
}
@Test
public void testListenerGetsExactClass() {
addContextClickListener(contextListener);
contextListener.expect(ContextClickEvent.class);
fireEvent(contextClickEvent);
}
/**
* Multiple listeners should get fitting events.
*/
@Test
public void testMultipleListenerGetEvents() {
addContextClickListener(ctxtListener2);
addContextClickListener(contextListener);
ctxtListener2.expect(GridContextClickEvent.class);
contextListener.expect(GridContextClickEvent.class);
fireEvent(gridContextClickEvent);
}
@Test
public void testAddAndRemoveListener() {
addContextClickListener(contextListener);
contextListener.expect(ContextClickEvent.class);
fireEvent(contextClickEvent);
removeContextClickListener(contextListener);
fireEvent(contextClickEvent);
}
@Test
public void testAddAndRemoveMultipleListeners() {
addContextClickListener(ctxtListener2);
addContextClickListener(contextListener);
ctxtListener2.expect(GridContextClickEvent.class);
contextListener.expect(GridContextClickEvent.class);
fireEvent(gridContextClickEvent);
removeContextClickListener(ctxtListener2);
contextListener.expect(GridContextClickEvent.class);
fireEvent(gridContextClickEvent);
}
@Test(expected = AssertionError.class)
public void testExpectedEventNotReceived() {
addContextClickListener(contextListener);
contextListener.expect(GridContextClickEvent.class);
fireEvent(contextClickEvent);
}
@Test(expected = AssertionError.class)
public void testUnexpectedEventReceived() {
addContextClickListener(contextListener);
fireEvent(gridContextClickEvent);
}
@Override
protected void fireEvent(EventObject event) {
super.fireEvent(event);
// Validate listeners automatically.
ctxtListener2.validate();
contextListener.validate();
}
}