package com.fsck.k9.activity;
import com.fsck.k9.K9RobolectricTestRunner;
import com.fsck.k9.mail.Flag;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertNotNull;
@RunWith(K9RobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class MessageReferenceTest {
@Test
public void checkIdentityStringFromMessageReferenceWithoutFlag() {
MessageReference messageReference = createMessageReference("o hai!", "folder", "10101010");
assertEquals("!:byBoYWkh:Zm9sZGVy:MTAxMDEwMTA=", messageReference.toIdentityString());
}
@Test
public void checkIdentityStringFromMessageReferenceWithFlag() {
MessageReference messageReference =
createMessageReferenceWithFlag("o hai!", "folder", "10101010", Flag.ANSWERED);
assertEquals("!:byBoYWkh:Zm9sZGVy:MTAxMDEwMTA=:ANSWERED", messageReference.toIdentityString());
}
@Test
public void parseIdentityStringWithoutFlag() {
MessageReference messageReference = MessageReference.parse("!:byBoYWkh:Zm9sZGVy:MTAxMDEwMTA=");
assertNotNull(messageReference);
assertEquals("o hai!", messageReference.getAccountUuid());
assertEquals("folder", messageReference.getFolderName());
assertEquals("10101010", messageReference.getUid());
assertNull(messageReference.getFlag());
}
@Test
public void parseIdentityStringWithFlag() {
MessageReference messageReference = MessageReference.parse("!:byBoYWkh:Zm9sZGVy:MTAxMDEwMTA=:ANSWERED");
assertNotNull(messageReference);
assertEquals("o hai!", messageReference.getAccountUuid());
assertEquals("folder", messageReference.getFolderName());
assertEquals("10101010", messageReference.getUid());
assertEquals(Flag.ANSWERED, messageReference.getFlag());
}
@Test
public void checkMessageReferenceWithChangedUid() {
MessageReference messageReferenceOne = createMessageReferenceWithFlag(
"account", "folder", "uid", Flag.ANSWERED);
MessageReference messageReferenceTwo = messageReferenceOne.withModifiedUid("---");
assertEquals("account", messageReferenceTwo.getAccountUuid());
assertEquals("folder", messageReferenceTwo.getFolderName());
assertEquals("---", messageReferenceTwo.getUid());
assertEquals(Flag.ANSWERED, messageReferenceTwo.getFlag());
}
@Test
public void checkMessageReferenceWithChangedFlag() {
MessageReference messageReferenceOne = createMessageReferenceWithFlag(
"account", "folder", "uid", Flag.ANSWERED);
MessageReference messageReferenceTwo = messageReferenceOne.withModifiedFlag(Flag.DELETED);
assertEquals("account", messageReferenceTwo.getAccountUuid());
assertEquals("folder", messageReferenceTwo.getFolderName());
assertEquals("uid", messageReferenceTwo.getUid());
assertEquals(Flag.DELETED, messageReferenceTwo.getFlag());
}
@Test
public void parseIdentityStringContainingBadVersionNumber() {
MessageReference messageReference = MessageReference.parse("@:byBoYWkh:Zm9sZGVy:MTAxMDEwMTA=:ANSWERED");
assertNull(messageReference);
}
@Test
public void parseNullIdentityString() {
MessageReference messageReference = MessageReference.parse(null);
assertNull(messageReference);
}
@Test
public void parseIdentityStringWithCorruptFlag() {
MessageReference messageReference =
MessageReference.parse("!:%^&%^*$&$by&(BYWkh:Zm9%^@sZGVy:MT-35#$AxMDEwMTA=:ANSWE!RED");
assertNull(messageReference);
}
@Test
public void equalsWithAnObjectShouldReturnFalse() {
MessageReference messageReference = new MessageReference("a", "b", "c", null);
Object object = new Object();
assertFalse(messageReference.equals(object));
}
@SuppressWarnings("ObjectEqualsNull")
@Test
public void equalsWithNullShouldReturnFalse() {
MessageReference messageReference = createMessageReference("account", "folder", "uid");
assertFalse(messageReference.equals(null));
}
@Test
public void equalsWithSameMessageReferenceShouldReturnTrue() {
MessageReference messageReference = createMessageReference("account", "folder", "uid");
assertTrue(messageReference.equals(messageReference));
}
@Test
public void equalsWithMessageReferenceContainingSameDataShouldReturnTrue() {
MessageReference messageReferenceOne = createMessageReference("account", "folder", "uid");
MessageReference messageReferenceTwo = createMessageReference("account", "folder", "uid");
assertEqualsReturnsTrueSymmetrically(messageReferenceOne, messageReferenceTwo);
}
@Test
public void equalsWithMessageReferenceContainingDifferentAccountUuidShouldReturnFalse() {
MessageReference messageReferenceOne = createMessageReference("account", "folder", "uid");
MessageReference messageReferenceTwo = createMessageReference("-------", "folder", "uid");
assertEqualsReturnsFalseSymmetrically(messageReferenceOne, messageReferenceTwo);
}
@Test
public void equalsWithMessageReferenceContainingDifferentFolderNameShouldReturnFalse() {
MessageReference messageReferenceOne = createMessageReference("account", "folder", "uid");
MessageReference messageReferenceTwo = createMessageReference("account", "------", "uid");
assertEqualsReturnsFalseSymmetrically(messageReferenceOne, messageReferenceTwo);
}
@Test
public void equalsWithMessageReferenceContainingDifferentUidShouldReturnFalse() {
MessageReference messageReferenceOne = createMessageReference("account", "folder", "uid");
MessageReference messageReferenceTwo = createMessageReference("account", "folder", "---");
assertEqualsReturnsFalseSymmetrically(messageReferenceOne, messageReferenceTwo);
}
@Test
public void alternativeEquals() {
MessageReference messageReference = createMessageReference("account", "folder", "uid");
boolean equalsResult = messageReference.equals("account", "folder", "uid");
assertTrue(equalsResult);
}
@Test
public void equals_withNullAccount_shouldReturnFalse() {
MessageReference messageReference = createMessageReference("account", "folder", "uid");
boolean equalsResult = messageReference.equals(null, "folder", "uid");
assertFalse(equalsResult);
}
@Test
public void equals_withNullFolder_shouldReturnFalse() {
MessageReference messageReference = createMessageReference("account", "folder", "uid");
boolean equalsResult = messageReference.equals("account", null, "uid");
assertFalse(equalsResult);
}
@Test
public void equals_withNullUid_shouldReturnFalse() {
MessageReference messageReference = createMessageReference("account", "folder", "uid");
boolean equalsResult = messageReference.equals("account", "folder", null);
assertFalse(equalsResult);
}
@Test(expected = NullPointerException.class)
public void constructor_withNullAccount_shouldThrow() throws Exception {
createMessageReference(null, "folder", "uid");
}
@Test(expected = NullPointerException.class)
public void constructor_withNullFolder_shouldThrow() throws Exception {
createMessageReference("account", null, "uid");
}
@Test(expected = NullPointerException.class)
public void constructor_withNullUid_shouldThrow() throws Exception {
createMessageReference("account", "folder", null);
}
private MessageReference createMessageReference(String accountUuid, String folderName, String uid) {
return new MessageReference(accountUuid, folderName, uid, null);
}
private MessageReference createMessageReferenceWithFlag(String accountUuid, String folderName, String uid,
Flag flag) {
return new MessageReference(accountUuid, folderName, uid, flag);
}
private void assertEqualsReturnsTrueSymmetrically(MessageReference referenceOne, MessageReference referenceTwo) {
assertTrue(referenceOne.equals(referenceTwo));
assertTrue(referenceTwo.equals(referenceOne));
}
private void assertEqualsReturnsFalseSymmetrically(MessageReference referenceOne, MessageReference referenceTwo) {
assertFalse(referenceOne.equals(referenceTwo));
assertFalse(referenceTwo.equals(referenceOne));
}
}