diff --git a/src/net/java/sip/communicator/impl/protocol/irc/ChatRoomMemberIrcImpl.java b/src/net/java/sip/communicator/impl/protocol/irc/ChatRoomMemberIrcImpl.java index f295af6a0..a6b9a0b15 100644 --- a/src/net/java/sip/communicator/impl/protocol/irc/ChatRoomMemberIrcImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/irc/ChatRoomMemberIrcImpl.java @@ -17,10 +17,6 @@ public class ChatRoomMemberIrcImpl implements ChatRoomMember { - // TODO Since we instantiate new instances for every chat room, we should - // override equals() and hashCode() to make sure that we can compare users - // that are actually the same. - /** * The ChatRoom. */ @@ -34,7 +30,7 @@ public class ChatRoomMemberIrcImpl /** * The provider that created us. */ - private final ProtocolProviderServiceIrcImpl parentProvider; + private final ProtocolProviderService parentProvider; /** * The role of this member. @@ -54,14 +50,24 @@ public class ChatRoomMemberIrcImpl * @param chatRoomMemberRole the role that this member has in the * corresponding chat room */ - public ChatRoomMemberIrcImpl(ProtocolProviderServiceIrcImpl parentProvider, + public ChatRoomMemberIrcImpl(ProtocolProviderService parentProvider, ChatRoom chatRoom, String contactID, ChatRoomMemberRole chatRoomMemberRole) { + if (parentProvider == null) + throw new IllegalArgumentException( + "parent protocol provider cannot be null"); this.parentProvider = parentProvider; + if (chatRoom == null) + throw new IllegalArgumentException( + "chat room instance cannot be null"); this.chatRoom = chatRoom; + if (contactID == null) + throw new IllegalArgumentException("contact ID cannot be null"); this.contactID = contactID; + if (chatRoomMemberRole == null) + throw new IllegalArgumentException("member role cannot be null"); this.chatRoomMemberRole = chatRoomMemberRole; } @@ -92,7 +98,7 @@ public ProtocolProviderService getProtocolProvider() * this method returns the same as getName(). * * @return a String (contact address), uniquely representing the contact - * over the service being used by the associated protocol provider instance/ + * over the service being used by the associated protocol provider instance */ public String getContactAddress() { @@ -103,7 +109,7 @@ public String getContactAddress() * Returns the name of this member as it is known in its containing * chat room (i.e. a nickname). The name returned by this method, may * sometimes match the string returned by getContactID() which is actually - * the address of a contact in the realm of the corresponding protocol. + * the address of a contact in the realm of the corresponding protocol. * * @return the name of this member as it is known in the containing chat * room (i.e. a nickname). @@ -112,7 +118,7 @@ public String getName() { return this.contactID; } - + /** * Set a new name for this ChatRoomMember. * @@ -143,6 +149,8 @@ public ChatRoomMemberRole getRole() */ public void setRole(ChatRoomMemberRole chatRoomMemberRole) { + if (chatRoomMemberRole == null) + throw new IllegalArgumentException("role cannot be null"); this.chatRoomMemberRole = chatRoomMemberRole; } @@ -152,19 +160,61 @@ public void setRole(ChatRoomMemberRole chatRoomMemberRole) * * @return null */ - public byte[] getAvatar() - { - return null; - } - - /** - * Returns null to indicate that there's no contact corresponding to the - * IRC member. - * - * @return null - */ - public Contact getContact() - { - return null; - } + public byte[] getAvatar() + { + return null; + } + + /** + * Returns null to indicate that there's no contact corresponding to the + * IRC member. + * + * @return null + */ + public Contact getContact() + { + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = + prime * result + ((contactID == null) ? 0 : contactID.hashCode()); + result = + prime * result + + ((parentProvider == null) ? 0 : parentProvider.hashCode()); + return result; + } + + /** + * equality by provider protocol instance and contact ID. + * + * Enables the possibility to check if chat room member is same member in + * different chat rooms. Values are only reliable for the same connection, + * so also check protocol provider instance. + * + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ChatRoomMemberIrcImpl other = (ChatRoomMemberIrcImpl) obj; + if (!contactID.equals(other.contactID)) + return false; + if (!parentProvider.equals(other.parentProvider)) + return false; + return true; + } } diff --git a/test/net/java/sip/communicator/impl/protocol/irc/ChatRoomMemberIrcImplTest.java b/test/net/java/sip/communicator/impl/protocol/irc/ChatRoomMemberIrcImplTest.java new file mode 100644 index 000000000..d853fe0d2 --- /dev/null +++ b/test/net/java/sip/communicator/impl/protocol/irc/ChatRoomMemberIrcImplTest.java @@ -0,0 +1,253 @@ +package net.java.sip.communicator.impl.protocol.irc; + +import org.easymock.*; + +import net.java.sip.communicator.service.protocol.*; +import junit.framework.*; + +public class ChatRoomMemberIrcImplTest + extends TestCase +{ + + public void testConstructorNullProvider() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + try + { + new ChatRoomMemberIrcImpl(null, chatroom, "user", + ChatRoomMemberRole.SILENT_MEMBER); + Assert.fail("should throw IAE for parent provider instance"); + } + catch (IllegalArgumentException e) + { + // this is good + } + } + + public void testConstructorNullChatRoom() + { + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + try + { + new ChatRoomMemberIrcImpl(provider, null, "user", + ChatRoomMemberRole.SILENT_MEMBER); + Assert.fail("should throw IAE for ChatRoom instance"); + } + catch (IllegalArgumentException e) + { + // this is good + } + } + + public void testConstructorNullContactId() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + try + { + new ChatRoomMemberIrcImpl(provider, chatroom, null, + ChatRoomMemberRole.SILENT_MEMBER); + Assert.fail("should throw IAE for ChatRoom instance"); + } + catch (IllegalArgumentException e) + { + // this is good + } + } + + public void testConstructorNullRole() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + try + { + new ChatRoomMemberIrcImpl(provider, chatroom, "user", null); + Assert.fail("should throw IAE for ChatRoom instance"); + } + catch (IllegalArgumentException e) + { + // this is good + } + } + + public void testConstructorSuccessful() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + Assert.assertNotNull(new ChatRoomMemberIrcImpl(provider, chatroom, + "user", ChatRoomMemberRole.SILENT_MEMBER)); + } + + public void testCheckGetters() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + ChatRoomMemberIrcImpl member = new ChatRoomMemberIrcImpl(provider, chatroom, + "user", ChatRoomMemberRole.SILENT_MEMBER); + Assert.assertEquals(provider, member.getProtocolProvider()); + Assert.assertEquals(chatroom, member.getChatRoom()); + Assert.assertEquals("user", member.getContactAddress()); + Assert.assertEquals("user", member.getName()); + Assert.assertSame(ChatRoomMemberRole.SILENT_MEMBER, member.getRole()); + } + + public void testNameNull() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + ChatRoomMemberIrcImpl member = + new ChatRoomMemberIrcImpl(provider, chatroom, "user", + ChatRoomMemberRole.SILENT_MEMBER); + Assert.assertEquals("user", member.getContactAddress()); + Assert.assertEquals("user", member.getName()); + try + { + member.setName(null); + Assert.fail("expected IAE to be thrown"); + } + catch (IllegalArgumentException e) + { + // this is good + } + } + + public void testNameChange() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + ChatRoomMemberIrcImpl member = new ChatRoomMemberIrcImpl(provider, chatroom, + "user", ChatRoomMemberRole.SILENT_MEMBER); + Assert.assertEquals("user", member.getContactAddress()); + Assert.assertEquals("user", member.getName()); + member.setName("myNewName"); + Assert.assertEquals("myNewName", member.getContactAddress()); + Assert.assertEquals("myNewName", member.getName()); + } + + public void testRoleNull() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + ChatRoomMemberIrcImpl member = + new ChatRoomMemberIrcImpl(provider, chatroom, "user", + ChatRoomMemberRole.SILENT_MEMBER); + Assert.assertSame(ChatRoomMemberRole.SILENT_MEMBER, member.getRole()); + try + { + member.setRole(null); + Assert.fail("expected IAE because of null role"); + } + catch (IllegalArgumentException e) + { + // this is good + } + } + + public void testRoleChange() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + ChatRoomMemberIrcImpl member = new ChatRoomMemberIrcImpl(provider, chatroom, + "user", ChatRoomMemberRole.SILENT_MEMBER); + Assert.assertSame(ChatRoomMemberRole.SILENT_MEMBER, member.getRole()); + member.setRole(ChatRoomMemberRole.ADMINISTRATOR); + Assert.assertSame(ChatRoomMemberRole.ADMINISTRATOR, member.getRole()); + } + + public void testGetContact() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + ChatRoomMemberIrcImpl member = new ChatRoomMemberIrcImpl(provider, chatroom, + "user", ChatRoomMemberRole.SILENT_MEMBER); + Assert.assertNull(member.getContact()); + } + + public void testGetAvatar() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + ChatRoomMemberIrcImpl member = new ChatRoomMemberIrcImpl(provider, chatroom, + "user", ChatRoomMemberRole.SILENT_MEMBER); + Assert.assertNull(member.getAvatar()); + } + + public void testEqualsSame() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + ChatRoomMemberIrcImpl member = new ChatRoomMemberIrcImpl(provider, chatroom, + "user", ChatRoomMemberRole.SILENT_MEMBER); + Assert.assertTrue(member.equals(member)); + } + + public void testEqualsNull() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + ChatRoomMemberIrcImpl member = new ChatRoomMemberIrcImpl(provider, chatroom, + "user", ChatRoomMemberRole.SILENT_MEMBER); + Assert.assertFalse(member.equals(null)); + } + + public void testEqualsObject() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + ChatRoomMemberIrcImpl member = new ChatRoomMemberIrcImpl(provider, chatroom, + "user", ChatRoomMemberRole.SILENT_MEMBER); + Assert.assertFalse(member.equals(new Object())); + } + + public void testEqualsSameUserDifferentProvider() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + ChatRoomMemberIrcImpl member1 = new ChatRoomMemberIrcImpl(provider, chatroom, + "user", ChatRoomMemberRole.SILENT_MEMBER); + ProtocolProviderService provider2 = + EasyMock.createMock(ProtocolProviderService.class); + ChatRoomMemberIrcImpl member2 = new ChatRoomMemberIrcImpl(provider2, chatroom, + "user", ChatRoomMemberRole.SILENT_MEMBER); + Assert.assertFalse(member1.equals(member2)); + } + + public void testEqualsSameProviderDifferentUser() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + ChatRoomMemberIrcImpl member1 = new ChatRoomMemberIrcImpl(provider, chatroom, + "user", ChatRoomMemberRole.SILENT_MEMBER); + ChatRoomMemberIrcImpl member2 = new ChatRoomMemberIrcImpl(provider, chatroom, + "susy", ChatRoomMemberRole.SILENT_MEMBER); + Assert.assertFalse(member1.equals(member2)); + } + + public void testEqualsTrue() + { + ChatRoom chatroom = EasyMock.createMock(ChatRoom.class); + ProtocolProviderService provider = + EasyMock.createMock(ProtocolProviderService.class); + ChatRoomMemberIrcImpl member1 = new ChatRoomMemberIrcImpl(provider, chatroom, + "susy", ChatRoomMemberRole.SILENT_MEMBER); + ChatRoomMemberIrcImpl member2 = new ChatRoomMemberIrcImpl(provider, chatroom, + "susy", ChatRoomMemberRole.SILENT_MEMBER); + Assert.assertTrue(member1.equals(member2)); + } +}