package net.jxta.endpoint; import org.jmock.Expectations; import org.jmock.Sequence; import org.jmock.integration.junit4.JMock; import org.jmock.integration.junit4.JUnit4Mockery; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(JMock.class) public class MessengerStateListenerListTest { private MessengerStateListenerSet list; private final JUnit4Mockery mockContext = new JUnit4Mockery(); @Before public void setUp() throws Exception { list = new MessengerStateListenerSet(); } @Test public void testNotifiesAllListeners() { final MessengerStateListener listener1 = mockContext.mock(MessengerStateListener.class, "listener1"); final MessengerStateListener listener2 = mockContext.mock(MessengerStateListener.class, "listener2"); final MessengerStateListener listener3 = mockContext.mock(MessengerStateListener.class, "listener3"); list.addStateListener(listener1); list.addStateListener(listener2); list.addStateListener(listener3); mockContext.checking(new Expectations() {{ one(listener1).messengerStateChanged(Messenger.CLOSED); one(listener2).messengerStateChanged(Messenger.CLOSED); one(listener3).messengerStateChanged(Messenger.CLOSED); }}); list.notifyNewState(Messenger.CLOSED); } @Test public void testListenerAutomaticRemoval() { final MessengerStateListener listener1 = mockContext.mock(MessengerStateListener.class, "listener1"); final MessengerStateListener listener2 = mockContext.mock(MessengerStateListener.class, "listener2"); final MessengerStateListener listener3 = mockContext.mock(MessengerStateListener.class, "listener3"); list.addStateListener(listener1); list.addStateListener(listener2); list.addStateListener(listener3); final Sequence expectedOrder = mockContext.sequence("listener1seq"); mockContext.checking(new Expectations() {{ one(listener1).messengerStateChanged(Messenger.RECONNECTING); inSequence(expectedOrder); will(returnValue(true)); one(listener2).messengerStateChanged(Messenger.RECONNECTING); will(returnValue(false)); one(listener3).messengerStateChanged(Messenger.RECONNECTING); will(returnValue(false)); one(listener1).messengerStateChanged(Messenger.CONNECTED); inSequence(expectedOrder); will(returnValue(false)); }}); list.notifyNewState(Messenger.RECONNECTING); list.notifyNewState(Messenger.CONNECTED); // no one should receive the idle state list.notifyNewState(Messenger.IDLE); } @Test public void testRemoveStateListener() { final MessengerStateListener listener1 = mockContext.mock(MessengerStateListener.class, "listener1"); final MessengerStateListener listener2 = mockContext.mock(MessengerStateListener.class, "listener2"); final MessengerStateListener listener3 = mockContext.mock(MessengerStateListener.class, "listener3"); list.addStateListener(listener1); list.addStateListener(listener2); list.addStateListener(listener3); list.removeStateListener(listener1); mockContext.checking(new Expectations() {{ never(listener1); one(listener2).messengerStateChanged(Messenger.RECONNECTING); will(returnValue(false)); one(listener3).messengerStateChanged(Messenger.RECONNECTING); will(returnValue(false)); }}); list.notifyNewState(Messenger.RECONNECTING); } @Test public void testAddListenerTwice() { final MessengerStateListener listener = mockContext.mock(MessengerStateListener.class, "listener1"); list.addStateListener(listener); // the second attempt to add should have no effect list.addStateListener(listener); mockContext.checking(new Expectations() {{ one(listener).messengerStateChanged(Messenger.RECONNECTING); will(returnValue(true)); }}); list.notifyNewState(Messenger.RECONNECTING); } }