/* * MessageHandlerManagerTest.java * Copyright James Dempsey, 2014 * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Created on 01/03/2014 10:09:59 pm * * $Id$ */ package pcgen.pluginmgr; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import org.junit.Test; /** * The Class <code>MessageHandlerManagerTest</code> checks that MessageHandlerManager is * working correctly. * * <br/> * * @author James Dempsey <jdempsey@users.sourceforge.net> */ public class MessageHandlerManagerTest { /** * Test method for {@link pcgen.pluginmgr.MessageHandlerManager#addMember(pcgen.pluginmgr.PCGenMessageHandler)}. */ @Test public void testAddMember() { MessageHandlerManager cor = new MessageHandlerManager(); MessageRecorder mr = new MessageRecorder(); assertEquals("No messages exepected before add", 0, mr.messageCount); cor.addMember(mr); assertNotNull("MessageHandlerManager should have sent out message", mr.lastMsg); assertEquals("MessageHandlerManager should have sent out message", cor, mr.lastMsg.getSource()); assertEquals("One messages expected after add", 1, mr.messageCount); int prevCount = mr.messageCount; mr.lastMsg = null; PCGenMessage msg = new PCGenMessage(this); cor.getPostbox().handleMessage(msg); assertEquals("Expected message to be delivered", msg, mr.lastMsg); assertEquals("Expected one further message", prevCount+1, mr.messageCount); } /** * Test method for {@link pcgen.pluginmgr.MessageHandlerManager#removeMember(pcgen.pluginmgr.PCGenMessageHandler)}. */ @Test public void testRemoveMember() { MessageHandlerManager cor = new MessageHandlerManager(); MessageRecorder mr = new MessageRecorder(); assertEquals("No messages exepected before add", 0, mr.messageCount); cor.addMember(mr); int prevCount = mr.messageCount; mr.lastMsg = null; cor.removeMember(mr); assertNotNull("MessageHandlerManager should have sent out message", mr.lastMsg); assertEquals("MessageHandlerManager should have sent out message", cor, mr.lastMsg.getSource()); assertEquals("One extra message expected after add", prevCount+1, mr.messageCount); mr.lastMsg = null; cor.getPostbox().handleMessage(new PCGenMessage(this)); assertNull("Expected no further messages to removed handler", mr.lastMsg); assertEquals("Expected no further messages to removed handler", prevCount+1, mr.messageCount); } /** * Check that the postbox used by MessageHandlerManager send out messages in the right order. */ @Test public void testPostboxMessageDistributionOrder() { MessageHandlerManager cor = new MessageHandlerManager(); assertNotNull("Postbox should be available", cor.getPostbox()); MessageRecorder firstMr = new MessageRecorder(); MessageConsumer consumer = new MessageConsumer(); MessageRecorder secondMr = new MessageRecorder(); cor.addMember(firstMr); cor.addMember(consumer); cor.addMember(secondMr); // Check messages are delivered in order int prevFirstMrCount = firstMr.messageCount; int prevConsumerCount = consumer.messageCount; int prevSecondMrCount = secondMr.messageCount; cor.getPostbox().handleMessage( new PCGenMessage(this)); assertEquals("Single extra message expected by first handler", prevFirstMrCount + 1, firstMr.messageCount); assertEquals("Single extra message expected by consumer", prevConsumerCount + 1, consumer.messageCount); assertEquals("No extra message expected by second handler", prevSecondMrCount, secondMr.messageCount); assertTrue( "First recorder should have received message before consumer (different source)", firstMr.lastMessageOrder < consumer.lastMessageOrder); // Check source receives message last prevFirstMrCount = firstMr.messageCount; prevConsumerCount = consumer.messageCount; prevSecondMrCount = secondMr.messageCount; cor.getPostbox().handleMessage( new PCGenMessage(firstMr)); assertEquals("Single extra message expected by consumer", prevConsumerCount + 1, consumer.messageCount); assertEquals("No extra message expected by second handler", prevSecondMrCount, secondMr.messageCount); assertEquals("No extra message expected by first handler", prevFirstMrCount, firstMr.messageCount); } /** * Check that the postbox used by MessageHandlerManager send out messages in the right order. */ @Test public void testPostboxMessageDistributionConsumption() { MessageHandlerManager cor = new MessageHandlerManager(); assertNotNull("Postbox should be available", cor.getPostbox()); MessageRecorder firstMr = new MessageRecorder(); MessageRecorder secondMr = new MessageRecorder(); cor.addMember(firstMr); cor.addMember(secondMr); // Check messages are delivered in order int prevFirstMrCount = firstMr.messageCount; int prevSecondMrCount = secondMr.messageCount; cor.getPostbox().handleMessage( new PCGenMessage(this)); assertEquals("Single extra message expected by first handler", prevFirstMrCount + 1, firstMr.messageCount); assertEquals("Single extra message expected by second handler", prevSecondMrCount + 1, secondMr.messageCount); assertTrue( "First recorder should have received message before second (different source)", firstMr.lastMessageOrder < secondMr.lastMessageOrder); // Check source receives message last prevFirstMrCount = firstMr.messageCount; prevSecondMrCount = secondMr.messageCount; cor.getPostbox().handleMessage( new PCGenMessage(firstMr)); assertEquals("Single extra message expected by first handler", prevFirstMrCount + 1, firstMr.messageCount); assertEquals("Single extra message expected by second handler", prevSecondMrCount + 1, secondMr.messageCount); assertTrue( "Second recorder should have received message before first (source)", firstMr.lastMessageOrder > secondMr.lastMessageOrder); } /** * The Class <code>MessageRecorder</code> is a message handler that * simply tracks the messages is receives, allowing testing of message distribution. */ private static class MessageRecorder implements PCGenMessageHandler { static int messageOrderCounter = 0; int messageCount = 0; int lastMessageOrder = 0; PCGenMessage lastMsg = null; /** * @{inheritdoc} */ @Override public void handleMessage(PCGenMessage msg) { lastMsg = msg; messageCount++; lastMessageOrder = messageOrderCounter++; } } /** * The Class <code>MessageConsumer</code> will consume any message it receives. */ private static class MessageConsumer extends MessageRecorder { /** * @{inheritdoc} */ @Override public void handleMessage(PCGenMessage msg) { super.handleMessage(msg); msg.consume(); } } }