package com.fsck.k9.mail;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@RunWith(K9LibRobolectricTestRunner.class)
public class AddressTest {
/**
* test the possibility to parse "From:" fields with no email.
* for example: From: News for Vector Limited - Google Finance
* http://code.google.com/p/k9mail/issues/detail?id=3814
*/
@Test
public void parse_withMissingEmail__shouldSetPersonal() {
Address[] addresses = Address.parse("NAME ONLY");
assertEquals(1, addresses.length);
assertEquals(null, addresses[0].getAddress());
assertEquals("NAME ONLY", addresses[0].getPersonal());
}
/**
* test name + valid email
*/
@Test
public void parse_withValidEmailAndPersonal_shouldSetBoth() {
Address[] addresses = Address.parse("Max Mustermann <maxmuster@mann.com>");
assertEquals(1, addresses.length);
assertEquals("maxmuster@mann.com", addresses[0].getAddress());
assertEquals("Max Mustermann", addresses[0].getPersonal());
}
@Test
public void parse_withUnusualEmails_shouldSetAddress() {
String[] testEmails = new String [] {
"prettyandsimple@example.com",
"very.common@example.com",
"disposable.style.email.with+symbol@example.com",
"other.email-with-dash@example.com",
//TODO: Handle addresses with quotes
/*
"\"much.more unusual\"@example.com",
"\"very.unusual.@.unusual.com\"@example.com",
//"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com
"\"very.(),:;<>[]\\\".VERY.\\\"very@\\\\ \\\"very\\\".unusual\"@strange.example.com",
"\"()<>[]:,;@\\\\\\\"!#$%&'*+-/=?^_`{}| ~.a\"@example.org",
"\" \"@example.org",
*/
"admin@mailserver1",
"#!$%&'*+-/=?^_`{}|~@example.org",
"example@localhost",
"example@s.solutions",
"user@com",
"user@localserver",
"user@[IPv6:2001:db8::1]"
};
for(String testEmail: testEmails) {
Address[] addresses = Address.parse("Anonymous <"+testEmail+">");
assertEquals(1, addresses.length);
assertEquals(testEmail, addresses[0].getAddress());
}
}
@Test
public void parse_withEncodedPersonal_shouldDecode() {
Address[] addresses = Address.parse(
"=?UTF-8?B?WWFob28h44OA44Kk44Os44Kv44OI44Kq44OV44Kh44O8?= <directoffer-master@mail.yahoo.co.jp>");
assertEquals("Yahoo!ダイレクトオファー", addresses[0].getPersonal());
assertEquals("directoffer-master@mail.yahoo.co.jp", addresses[0].getAddress());
}
@Test
public void parse_withQuotedEncodedPersonal_shouldDecode() {
Address[] addresses = Address.parse(
"\"=?UTF-8?B?WWFob28h44OA44Kk44Os44Kv44OI44Kq44OV44Kh44O8?= \"<directoffer-master@mail.yahoo.co.jp>");
assertEquals("Yahoo!ダイレクトオファー ", addresses[0].getPersonal());
assertEquals("directoffer-master@mail.yahoo.co.jp", addresses[0].getAddress());
}
/**
* test with multi email addresses
*/
@Test
public void parse_withMultipleEmails_shouldDecodeBoth() {
Address[] addresses = Address.parse("lorem@ipsum.us,mark@twain.com");
assertEquals(2, addresses.length);
assertEquals("lorem@ipsum.us", addresses[0].getAddress());
assertEquals(null, addresses[0].getPersonal());
assertEquals("mark@twain.com", addresses[1].getAddress());
assertEquals(null, addresses[1].getPersonal());
}
@Test
public void stringQuotationShouldCorrectlyQuote() {
assertEquals("\"sample\"", Address.quoteString("sample"));
assertEquals("\"\"sample\"\"", Address.quoteString("\"\"sample\"\""));
assertEquals("\"sample\"", Address.quoteString("\"sample\""));
assertEquals("\"sa\"mp\"le\"", Address.quoteString("sa\"mp\"le"));
assertEquals("\"sa\"mp\"le\"", Address.quoteString("\"sa\"mp\"le\""));
assertEquals("\"\"\"", Address.quoteString("\""));
}
@Test
public void hashCode_withoutAddress() throws Exception {
Address address = Address.parse("name only")[0];
assertNull(address.getAddress());
address.hashCode();
}
@Test
public void hashCode_withoutPersonal() throws Exception {
Address address = Address.parse("alice@example.org")[0];
assertNull(address.getPersonal());
address.hashCode();
}
@Test
public void equals_withoutAddress_matchesSame() throws Exception {
Address address = Address.parse("name only")[0];
Address address2 = Address.parse("name only")[0];
assertNull(address.getAddress());
boolean result = address.equals(address2);
assertTrue(result);
}
@Test
public void equals_withoutAddress_doesNotMatchWithAddress() throws Exception {
Address address = Address.parse("name only")[0];
Address address2 = Address.parse("name <alice.example.com>")[0];
boolean result = address.equals(address2);
assertFalse(result);
}
@Test
public void equals_withoutPersonal_matchesSame() throws Exception {
Address address = Address.parse("alice@example.org")[0];
Address address2 = Address.parse("alice@example.org")[0];
assertNull(address.getPersonal());
boolean result = address.equals(address2);
assertTrue(result);
}
@Test
public void equals_withoutPersonal_doesNotMatchWithAddress() throws Exception {
Address address = Address.parse("alice@example.org")[0];
Address address2 = Address.parse("Alice <alice@example.org>")[0];
boolean result = address.equals(address2);
assertFalse(result);
}
@Test
public void getHostname_withoutAddress_isNull() throws Exception {
Address address = Address.parse("Alice")[0];
String result = address.getHostname();
assertNull(result);
}
}