/* @VaadinApache2LicenseForJavaFiles@ */ package com.vaadin.tests.server.clientconnector; import org.easymock.EasyMock; import org.easymock.IArgumentMatcher; import org.easymock.IMocksControl; import org.junit.Before; import org.junit.Test; import com.vaadin.event.ConnectorEvent; import com.vaadin.server.ClientConnector.AttachEvent; import com.vaadin.server.ClientConnector.AttachListener; import com.vaadin.server.ClientConnector.DetachEvent; import com.vaadin.server.ClientConnector.DetachListener; import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinService; import com.vaadin.server.VaadinSession; import com.vaadin.tests.util.AlwaysLockedVaadinSession; import com.vaadin.ui.Component; import com.vaadin.ui.CssLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Layout; import com.vaadin.ui.UI; public class AttachDetachListenersTest { private IMocksControl control; private VaadinSession session; private UI ui; private Layout content; private Component component; AttachListener attachListener; DetachListener detachListener; @Before public void setUp() { control = EasyMock.createStrictControl(); session = new AlwaysLockedVaadinSession( control.createMock(VaadinService.class)); ui = new UI() { @Override protected void init(VaadinRequest request) { } }; content = new CssLayout(); component = new Label(); attachListener = control.createMock(AttachListener.class); detachListener = control.createMock(DetachListener.class); } @Test public void attachListeners_setSessionLast() { attachListener.attach(eventEquals(new AttachEvent(component))); attachListener.attach(eventEquals(new AttachEvent(content))); attachListener.attach(eventEquals(new AttachEvent(ui))); control.replay(); ui.addAttachListener(attachListener); content.addAttachListener(attachListener); component.addAttachListener(attachListener); ui.setContent(content); content.addComponent(component); ui.setSession(session); control.verify(); } @Test public void attachListeners_setSessionFirst() { attachListener.attach(eventEquals(new AttachEvent(ui))); attachListener.attach(eventEquals(new AttachEvent(content))); attachListener.attach(eventEquals(new AttachEvent(component))); control.replay(); ui.addAttachListener(attachListener); content.addAttachListener(attachListener); component.addAttachListener(attachListener); ui.setSession(session); ui.setContent(content); content.addComponent(component); control.verify(); } @Test public void attachListeners_setSessionBetween() { attachListener.attach(eventEquals(new AttachEvent(content))); attachListener.attach(eventEquals(new AttachEvent(ui))); attachListener.attach(eventEquals(new AttachEvent(component))); control.replay(); ui.addAttachListener(attachListener); content.addAttachListener(attachListener); component.addAttachListener(attachListener); ui.setContent(content); ui.setSession(session); content.addComponent(component); control.verify(); } @Test public void detachListeners_setSessionNull() { setupDetachListeners(); ui.setContent(content); content.addComponent(component); ui.setSession(null); control.verify(); } @Test public void detachListeners_removeComponent() { setupDetachListeners(); ui.setContent(content); content.addComponent(component); content.removeAllComponents(); ui.setSession(null); control.verify(); } @Test public void detachListeners_setContentNull() { setupDetachListeners(); ui.setContent(content); content.addComponent(component); ui.setContent(null); ui.setSession(null); control.verify(); } public static class EventEquals<E extends ConnectorEvent> implements IArgumentMatcher { private final E expected; public EventEquals(E expected) { this.expected = expected; } @Override public void appendTo(StringBuffer buffer) { buffer.append("EventEquals("); buffer.append("expected ") .append(expected.getClass().getSimpleName()) .append(" with connector ").append(expected.getConnector()); buffer.append(")"); } @Override public boolean matches(Object argument) { return expected.getClass().isInstance(argument) && ((ConnectorEvent) argument).getConnector() == expected .getConnector(); } } public static <E extends ConnectorEvent> E eventEquals(E expected) { EasyMock.reportMatcher(new EventEquals<>(expected)); return null; } private void setupDetachListeners() { detachListener.detach(eventEquals(new DetachEvent(component))); detachListener.detach(eventEquals(new DetachEvent(content))); detachListener.detach(eventEquals(new DetachEvent(ui))); control.replay(); ui.addDetachListener(detachListener); content.addDetachListener(detachListener); component.addDetachListener(detachListener); ui.setSession(session); } }