196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/*
296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * you may not use this file except in compliance with the License.
696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * You may obtain a copy of the License at
796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See the License for the specific language governing permissions and
1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * limitations under the License.
1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
172193962ca2b3157e79f731736afa2a0c972e778aMarc Blankpackage com.android.emailcommon.mail;
182193962ca2b3157e79f731736afa2a0c972e778aMarc Blank
1996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.test.AndroidTestCase;
2096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.test.suitebuilder.annotation.SmallTest;
21629e18ad866917523599ed059898f4d986e49e26Mihai Predaimport org.apache.james.mime4j.decoder.DecoderUtil;
2296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
23e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Predaimport java.io.UnsupportedEncodingException;
242577842269f035856b877eb990567c7a32e81252Ben Komaloimport java.net.URLEncoder;
25e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda
2696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/**
2796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * This is a series of unit tests for the Address class.  These tests must be locally
2896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * complete - no server(s) required.
2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project@SmallTest
3196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpublic class AddressUnitTests extends AndroidTestCase {
32a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
33a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki    private static final String MULTI_ADDRESSES_LIST =
34deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project            "noname1@dom1.com, "
35deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project            + "<noname2@dom2.com>, "
36deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project            + "simple name <address3@dom3.org>, "
37deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project            + "\"name,4\" <address4@dom4.org>,"
38deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project            + "\"big \\\"G\\\"\" <bigG@dom5.net>,"
39deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project            + "\u65E5\u672C\u8A9E <address6@co.jp>,"
40deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project            + "\"\u65E5\u672C\u8A9E\" <address7@co.jp>,"
41deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project            + "\uD834\uDF01\uD834\uDF46 <address8@ne.jp>,"
42a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki            + "\"\uD834\uDF01\uD834\uDF46\" <address9@ne.jp>,"
43a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki            + "noname@dom.com <noname@dom.com>" // personal == address
44a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki            ;
45a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki    private static final int MULTI_ADDRESSES_COUNT = 10;
46e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda
47e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda    private static final Address PACK_ADDR_1 = new Address("john@gmail.com", "John Doe");
48e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda    private static final Address PACK_ADDR_2 = new Address("foo@bar.com", null);
492577842269f035856b877eb990567c7a32e81252Ben Komalo    private static final Address PACK_ADDR_3 = new Address(
502577842269f035856b877eb990567c7a32e81252Ben Komalo            "mar.y+test@gmail.com", "Mar-y, B; B*arr");
51e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda    private static final Address[][] PACK_CASES = {
52a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        {PACK_ADDR_2}, {PACK_ADDR_1},
53a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        {PACK_ADDR_1, PACK_ADDR_2}, {PACK_ADDR_2, PACK_ADDR_1},
54a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        {PACK_ADDR_1, PACK_ADDR_3}, {PACK_ADDR_2, PACK_ADDR_2},
55e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        {PACK_ADDR_1, PACK_ADDR_2, PACK_ADDR_3}, {PACK_ADDR_3, PACK_ADDR_1, PACK_ADDR_2}
56e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda    };
57a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    Address mAddress1;
5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    Address mAddress2;
6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    Address mAddress3;
6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Setup code.  We generate a handful of Address objects
6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    protected void setUp() throws Exception {
6796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        super.setUp();
6896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAddress1 = new Address("address1", "personal1");
7096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAddress2 = new Address("address2", "");
7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mAddress3 = new Address("address3", null);
7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
7396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
74629e18ad866917523599ed059898f4d986e49e26Mihai Preda    // see documentation of DecoderUtil.decodeEncodedWords() for details
75629e18ad866917523599ed059898f4d986e49e26Mihai Preda    private String padEncoded(String s) {
76629e18ad866917523599ed059898f4d986e49e26Mihai Preda        return "=?UTF-8?B?" + s + "?=";
77629e18ad866917523599ed059898f4d986e49e26Mihai Preda    }
78629e18ad866917523599ed059898f4d986e49e26Mihai Preda
79629e18ad866917523599ed059898f4d986e49e26Mihai Preda    /**
80629e18ad866917523599ed059898f4d986e49e26Mihai Preda     * Generate strings of incresing lenght by taking prefix substrings.
81629e18ad866917523599ed059898f4d986e49e26Mihai Preda     * For each of them, compare with the decoding of the precomputed base-64 encoding.
82629e18ad866917523599ed059898f4d986e49e26Mihai Preda     */
83629e18ad866917523599ed059898f4d986e49e26Mihai Preda    public void testBase64Decode() {
84629e18ad866917523599ed059898f4d986e49e26Mihai Preda        String testString = "xyza\0\"";
85629e18ad866917523599ed059898f4d986e49e26Mihai Preda        String base64Encoded[] = {"", "eA==", "eHk=", "eHl6", "eHl6YQ==", "eHl6YQA=", "eHl6YQAi"};
86629e18ad866917523599ed059898f4d986e49e26Mihai Preda        int len = testString.length();
87629e18ad866917523599ed059898f4d986e49e26Mihai Preda        for (int i = 1; i <= len; ++i) {
88629e18ad866917523599ed059898f4d986e49e26Mihai Preda            String encoded = padEncoded(base64Encoded[i]);
89629e18ad866917523599ed059898f4d986e49e26Mihai Preda            String decoded = DecoderUtil.decodeEncodedWords(encoded);
90629e18ad866917523599ed059898f4d986e49e26Mihai Preda            String prefix = testString.substring(0, i);
91629e18ad866917523599ed059898f4d986e49e26Mihai Preda            assertEquals(""+i, prefix, decoded);
92629e18ad866917523599ed059898f4d986e49e26Mihai Preda        }
93629e18ad866917523599ed059898f4d986e49e26Mihai Preda    }
94629e18ad866917523599ed059898f4d986e49e26Mihai Preda
9596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
96deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test for setAddress().
97deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
98deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testSetAddress() {
99deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        String bareAddress = "user1@dom1.com";
100deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        String bracketAddress = "<user2@dom2.com>";
101a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
102deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address address = new Address(bareAddress);
103deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("bare address", "user1@dom1.com", address.getAddress());
104a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
105deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        address.setAddress(bracketAddress);
106deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("bracket address", "user2@dom2.com", address.getAddress());
107deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
108a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
109deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
110deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test for empty setPersonal().
111deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
112deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testNullPersonal() {
113deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address address = new Address("user1@dom1.org");
114deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertNull("no name", address.getPersonal());
115a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
116deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        address.setPersonal(null);
117deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertNull("null name", address.getPersonal());
118a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
119deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        address.setPersonal("");
120deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertNull("empty name", address.getPersonal());
121a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
122deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        address.setPersonal("\"\"");
123deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertNull("quoted empty address", address.getPersonal());
124deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
125a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
126deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
127deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test for setPersonal().
128deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
129deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testSetPersonal() {
130deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address address = new Address("user1@dom1.net", "simple name");
131deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("simple name", "simple name", address.getPersonal());
132a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
133deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        address.setPersonal("big \\\"G\\\"");
134deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("quoted name", "big \"G\"", address.getPersonal());
135a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
136deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        address.setPersonal("=?UTF-8?Q?big \"G\"?=");
137deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("quoted printable name", "big \"G\"", address.getPersonal());
138a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
139deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        address.setPersonal("=?UTF-8?B?YmlnICJHIg==?=");
140deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("base64 encoded name", "big \"G\"", address.getPersonal());
141deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
142a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
143deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
144deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test for setPersonal() with utf-16 and utf-32.
145deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
146deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testSetPersonalMultipleEncodings() {
147deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address address = new Address("user1@dom1.co.jp", "=?UTF-8?B?5bK45pys?=");
148deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("base64 utf-16 name", "\u5CB8\u672C", address.getPersonal());
149a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
150deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        address.setPersonal("\"=?UTF-8?Q?=E5=B2=B8=E6=9C=AC?=\"");
151deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("quoted printable utf-16 name", "\u5CB8\u672C", address.getPersonal());
152a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
153deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        address.setPersonal("=?ISO-2022-JP?B?GyRCNF9LXBsoQg==?=");
154deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("base64 jis encoded name", "\u5CB8\u672C", address.getPersonal());
155a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
156deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        address.setPersonal("\"=?UTF-8?B?8J2MgfCdjYY=?=\"");
157deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("base64 utf-32 name", "\uD834\uDF01\uD834\uDF46", address.getPersonal());
158deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
159deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        address.setPersonal("=?UTF-8?Q?=F0=9D=8C=81=F0=9D=8D=86?=");
160deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("quoted printable utf-32 name",
161deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "\uD834\uDF01\uD834\uDF46", address.getPersonal());
162deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
163a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
164deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
1653469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project     * TODO: more in-depth tests for parse()
16696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
167a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
16896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
1693469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project     * Simple quick checks of empty-input edge conditions for parse()
170a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki     *
1713469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project     * NOTE:  This is not a claim that these edge cases are "correct", only to maintain consistent
1723469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project     * behavior while I am changing some of the code in the function under test.
1733469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project     */
1743469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project    public void testEmptyParse() {
1753469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        Address[] result;
176a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
1773469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        // null input => empty array
1783469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        result = Address.parse(null);
1793469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        assertTrue("parsing null address", result != null && result.length == 0);
180a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
1813469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        // empty string input => empty array
1823469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        result = Address.parse("");
1833469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        assertTrue("parsing zero-length", result != null && result.length == 0);
184a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
185deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        // spaces
186deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        result = Address.parse("   ");
187deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertTrue("parsing spaces", result != null && result.length == 0);
188deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
189deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        // spaces with comma
190deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        result = Address.parse("  ,  ");
191deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertTrue("parsing spaces with comma", result != null && result.length == 0);
192deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
193a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
194deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
195deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test parsing for single address.
196deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
197deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testSingleParse() {
198deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] address1 = Address.parse("address1@dom1.com");
199deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("bare address count", 1, address1.length);
200deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("bare address", "address1@dom1.com", address1[0].getAddress());
201deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertNull("name of bare address", address1[0].getPersonal());
202deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
203deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] address2 = Address.parse("<address2@dom2.com>");
204deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("bracket address count", 1, address2.length);
205deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("bracket address", "address2@dom2.com", address2[0].getAddress());
206deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertNull("name of bracket address", address2[0].getPersonal());
207deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
208deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] address3 = Address.parse("first last <address3@dom3.org>");
209deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("address with name count", 1, address3.length);
210deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("address with name", "address3@dom3.org", address3[0].getAddress());
211deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("name of address with name", "first last", address3[0].getPersonal());
212deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
213deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] address4 = Address.parse("\"first,last\" <address4@dom4.org>");
214deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("address with quoted name count", 1, address4.length);
215deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("address with quoted name", "address4@dom4.org", address4[0].getAddress());
216deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("name of address with quoted name", "first,last", address4[0].getPersonal());
217deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
218a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
219deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
220deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test parsing for illegal address.
221deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
222deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testIllegalParse() {
223deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] address1 = Address.parse("address1");
224deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("no atmark", 0, address1.length);
225deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
226deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] address2 = Address.parse("address2@");
227deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("no domain", 0, address2.length);
228a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
229deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] address3 = Address.parse("@dom3.com");
230deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("no local part", 0, address3.length);
231deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
232deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] address4 = Address.parse("address4@sub@dom4.org");
233deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("more than one atmark", 0, address4.length);
234deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
235deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] address5 = Address.parse("address5@dom5");
236deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("not dot in domain part", 0, address5.length);
237deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
238deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] address6 = Address.parse("address6@dom6.com.");
239deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("domain ends with dot", 0, address6.length);
240deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
241deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] address7 = Address.parse("address7@.dom7.org");
242deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("domain starts with dot", 0, address7.length);
243deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
244a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
245deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
246deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test parsing for address part.
247deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
248deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testParsingAddress() {
249deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] addresses = Address.parse("address1@dom1.net, <address2@dom2.com>");
250deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("address count", 2, addresses.length);
251deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
252deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("bare address", "address1@dom1.net", addresses[0].getAddress());
253deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertNull("bare address name", addresses[0].getPersonal());
254deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
255deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("bracket address", "address2@dom2.com", addresses[1].getAddress());
256deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertNull("bracket address name", addresses[1].getPersonal());
2573469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project    }
258a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
2593469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project    /**
260deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test parsing for simple name part.
26196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
262deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testParsingSimpleName() {
263deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] addresses = Address.parse(
264deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "name 1 <address1@dom1.net>, " +
265deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "\"name,2\" <address2@dom2.org>");
266deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("address count", 2, addresses.length);
267a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
268deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("bare name address", "address1@dom1.net", addresses[0].getAddress());
269deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("bare name", "name 1", addresses[0].getPersonal());
270deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
271deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("double quoted name address", "address2@dom2.org", addresses[1].getAddress());
272deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("double quoted name", "name,2", addresses[1].getPersonal());
273deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
274a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
275deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
276deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test parsing for utf-16 name part.
277deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
278deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testParsingUtf16Name() {
279deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] addresses = Address.parse(
280deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "\u3042\u3044\u3046 \u3048\u304A <address1@dom1.jp>, " +
281deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "\"\u3042\u3044\u3046,\u3048\u304A\" <address2@dom2.jp>");
282deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("address count", 2, addresses.length);
283a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
284deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("bare utf-16 name address", "address1@dom1.jp", addresses[0].getAddress());
285deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("bare utf-16 name",
286deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "\u3042\u3044\u3046 \u3048\u304A", addresses[0].getPersonal());
287deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
288deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("double quoted utf-16 name address",
289deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "address2@dom2.jp", addresses[1].getAddress());
290deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("double quoted utf-16 name",
291deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "\u3042\u3044\u3046,\u3048\u304A", addresses[1].getPersonal());
292deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
293a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
294deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
295deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test parsing for utf-32 name part.
296deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
297deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testParsingUtf32Name() {
298deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] addresses = Address.parse(
299deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "\uD834\uDF01\uD834\uDF46 \uD834\uDF22 <address1@dom1.net>, " +
300deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "\"\uD834\uDF01\uD834\uDF46,\uD834\uDF22\" <address2@dom2.com>");
301deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("address count", 2, addresses.length);
302a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
303deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("bare utf-32 name address", "address1@dom1.net", addresses[0].getAddress());
304deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("bare utf-32 name",
305deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "\uD834\uDF01\uD834\uDF46 \uD834\uDF22", addresses[0].getPersonal());
306deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
307deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("double quoted utf-32 name address",
308deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "address2@dom2.com", addresses[1].getAddress());
309deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("double quoted utf-32 name",
310deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "\uD834\uDF01\uD834\uDF46,\uD834\uDF22", addresses[1].getPersonal());
311deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
312a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
313deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
314deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test parsing for multi addresses.
315deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
316deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testParseMulti() {
317deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] addresses = Address.parse(MULTI_ADDRESSES_LIST);
318a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
319deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("multi addrsses count", MULTI_ADDRESSES_COUNT, addresses.length);
320a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
321deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("no name 1 address", "noname1@dom1.com", addresses[0].getAddress());
322deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertNull("no name 1 name", addresses[0].getPersonal());
323deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("no name 2 address", "noname2@dom2.com", addresses[1].getAddress());
324deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertNull("no name 2 name", addresses[1].getPersonal());
325deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("simple name address", "address3@dom3.org", addresses[2].getAddress());
326deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("simple name name", "simple name", addresses[2].getPersonal());
327deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("double quoted name address", "address4@dom4.org", addresses[3].getAddress());
328deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("double quoted name name", "name,4", addresses[3].getPersonal());
329deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("quoted name address", "bigG@dom5.net", addresses[4].getAddress());
330deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("quoted name name", "big \"G\"", addresses[4].getPersonal());
331a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("utf-16 name address", "address6@co.jp", addresses[5].getAddress());
332a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("utf-16 name name", "\u65E5\u672C\u8A9E", addresses[5].getPersonal());
333a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("utf-16 quoted name address", "address7@co.jp", addresses[6].getAddress());
334deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("utf-16 quoted name name", "\u65E5\u672C\u8A9E",
335a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki                addresses[6].getPersonal());
336a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("utf-32 name address", "address8@ne.jp", addresses[7].getAddress());
337a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("utf-32 name name", "\uD834\uDF01\uD834\uDF46", addresses[7].getPersonal());
338a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("utf-32 quoted name address", "address9@ne.jp", addresses[8].getAddress());
339deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("utf-32 quoted name name", "\uD834\uDF01\uD834\uDF46",
340a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki                addresses[8].getPersonal());
341deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
342a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
343deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
344deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test various combinations of the toString (single) method
345deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
346deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testToStringSingle() {
347deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] addresses = Address.parse(MULTI_ADDRESSES_LIST);
348a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
349deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("multi addrsses count", MULTI_ADDRESSES_COUNT, addresses.length);
350deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
351deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        // test for toString() results.
352deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("no name 1", "noname1@dom1.com", addresses[0].toString());
353deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("no name 2", "noname2@dom2.com", addresses[1].toString());
354deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("simple name", "simple name <address3@dom3.org>", addresses[2].toString());
3552577842269f035856b877eb990567c7a32e81252Ben Komalo        assertEquals("double quoted name",
3562577842269f035856b877eb990567c7a32e81252Ben Komalo                "\"name,4\" <address4@dom4.org>", addresses[3].toString());
357deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("quoted name", "\"big \"G\"\" <bigG@dom5.net>", addresses[4].toString());
358deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("utf-16 name", "\u65E5\u672C\u8A9E <address6@co.jp>",
359a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki                addresses[5].toString());
360deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("utf-16 quoted name", "\u65E5\u672C\u8A9E <address7@co.jp>",
361a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki                addresses[6].toString());
362deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("utf-32 name", "\uD834\uDF01\uD834\uDF46 <address8@ne.jp>",
363a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki                addresses[7].toString());
364deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("utf-32 quoted name", "\uD834\uDF01\uD834\uDF46 <address9@ne.jp>",
365a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki                addresses[8].toString());
366a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("name==address", "noname@dom.com", addresses[9].toString());
367deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
368a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
369deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
370deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test various combinations of the toString (multi) method
371deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
372deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testToStringMulti() {
373f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki        final Address[] address = Address.parse("noname1@dom1.com");
374f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki        final Address[] addresses = Address.parse(MULTI_ADDRESSES_LIST);
375a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
376deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("multi addrsses count", MULTI_ADDRESSES_COUNT, addresses.length);
377deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
378f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki        {
379f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki            String line = Address.toString(address);
380f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki            assertEquals("toString multi-1",
381f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    "noname1@dom1.com",
382f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    line);
383f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki        }
384f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki        {
385f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki            String line = Address.toString(addresses);
386f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki            assertEquals("toString multi-n",
387f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    "noname1@dom1.com,"
388f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "noname2@dom2.com,"
389f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "simple name <address3@dom3.org>,"
390f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "\"name,4\" <address4@dom4.org>,"
391f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "\"big \"G\"\" <bigG@dom5.net>,"
392f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "\u65E5\u672C\u8A9E <address6@co.jp>,"
393f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "\u65E5\u672C\u8A9E <address7@co.jp>,"
394f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "\uD834\uDF01\uD834\uDF46 <address8@ne.jp>,"
395f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "\uD834\uDF01\uD834\uDF46 <address9@ne.jp>,"
396f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "noname@dom.com",
397f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    line);
398f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki        }
399f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki
400f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki        // With custom separator
401f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki        {
402f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki            String line = Address.toString(address, "$");
403f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki            assertEquals("toString multi-1",
404f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    "noname1@dom1.com",
405f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    line);
406f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki        }
407f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki
408f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki        {
409f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki            String line = Address.toString(addresses, "$");
410f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki            assertEquals("toString multi-n",
411f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    "noname1@dom1.com$"
412f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "noname2@dom2.com$"
413f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "simple name <address3@dom3.org>$"
414f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "\"name,4\" <address4@dom4.org>$"
415f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "\"big \"G\"\" <bigG@dom5.net>$"
416f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "\u65E5\u672C\u8A9E <address6@co.jp>$"
417f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "\u65E5\u672C\u8A9E <address7@co.jp>$"
418f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "\uD834\uDF01\uD834\uDF46 <address8@ne.jp>$"
419f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "\uD834\uDF01\uD834\uDF46 <address9@ne.jp>$"
420f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    + "noname@dom.com",
421f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki                    line);
422f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki        }
423deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
424deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
425deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
426deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test parsing for quoted and encoded name part.
427deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
428deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testParsingQuotedEncodedName() {
429deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] addresses = Address.parse(
430deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "\"big \\\"G\\\"\" <bigG@dom1.com>, =?UTF-8?B?5pel5pys6Kqe?= <address2@co.jp>");
431deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
432deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("address count", 2, addresses.length);
433deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
434deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("quoted name address", "bigG@dom1.com", addresses[0].getAddress());
435deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("quoted name", "big \"G\"", addresses[0].getPersonal());
436deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
437deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("encoded name address", "address2@co.jp", addresses[1].getAddress());
438deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("encoded name", "\u65E5\u672C\u8A9E", addresses[1].getPersonal());
439deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
440deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
441deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
442deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test various combinations of the toHeader (single) method
443deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
444deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testToHeaderSingle() {
445deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address noName1 = new Address("noname1@dom1.com");
446deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address noName2 = new Address("<noname2@dom2.com>", "");
447deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address simpleName = new Address("address3@dom3.org", "simple name");
448deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address dquoteName = new Address("address4@dom4.org", "name,4");
449deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address quotedName = new Address("bigG@dom5.net", "big \"G\"");
450deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address utf16Name = new Address("<address6@co.jp>", "\"\u65E5\u672C\u8A9E\"");
451deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address utf32Name = new Address("<address8@ne.jp>", "\uD834\uDF01\uD834\uDF46");
452a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        Address sameName = new Address("address@dom.org", "address@dom.org");
453a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
454deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        // test for internal states.
455deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("no name 1 address", "noname1@dom1.com", noName1.getAddress());
456deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertNull("no name 1 name", noName1.getPersonal());
457deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("no name 2 address", "noname2@dom2.com", noName2.getAddress());
458deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertNull("no name 2 name", noName2.getPersonal());
459deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("simple name address", "address3@dom3.org", simpleName.getAddress());
460deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("simple name name", "simple name", simpleName.getPersonal());
461deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("double quoted name address", "address4@dom4.org", dquoteName.getAddress());
462deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("double quoted name name", "name,4", dquoteName.getPersonal());
463deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("quoted name address", "bigG@dom5.net", quotedName.getAddress());
464deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("quoted name name", "big \"G\"", quotedName.getPersonal());
465a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("utf-16 name address", "address6@co.jp", utf16Name.getAddress());
466a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("utf-16 name name", "\u65E5\u672C\u8A9E", utf16Name.getPersonal());
467a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("utf-32 name address", "address8@ne.jp", utf32Name.getAddress());
468a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("utf-32 name name", "\uD834\uDF01\uD834\uDF46", utf32Name.getPersonal());
469a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("name == address address", "address@dom.org", sameName.getAddress());
470a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("name == address name", "address@dom.org", sameName.getPersonal());
471deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
472deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        // Test for toHeader() results.
473deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("no name 1", "noname1@dom1.com", noName1.toHeader());
474deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("no name 2", "noname2@dom2.com", noName2.toHeader());
475deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("simple name", "simple name <address3@dom3.org>", simpleName.toHeader());
476deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("double quoted name", "\"name,4\" <address4@dom4.org>", dquoteName.toHeader());
477deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("quoted name", "\"big \\\"G\\\"\" <bigG@dom5.net>", quotedName.toHeader());
478deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("utf-16 name", "=?UTF-8?B?5pel5pys6Kqe?= <address6@co.jp>",
479a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki                utf16Name.toHeader());
480deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("utf-32 name", "=?UTF-8?B?8J2MgfCdjYY=?= <address8@ne.jp>",
481a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki                utf32Name.toHeader());
482a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("name == address", "\"address@dom.org\" <address@dom.org>",
483a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki                sameName.toHeader());
484deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
485a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
486deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    /**
487deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     * Test various combinations of the toHeader (multi) method
488deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project     */
489deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    public void testToHeaderMulti() {
490deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address noName1 = new Address("noname1@dom1.com");
491deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address noName2 = new Address("<noname2@dom2.com>", "");
492deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address simpleName = new Address("address3@dom3.org", "simple name");
493deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address dquoteName = new Address("address4@dom4.org", "name,4");
494deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address quotedName = new Address("bigG@dom5.net", "big \"G\"");
495deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address utf16Name = new Address("<address6@co.jp>", "\"\u65E5\u672C\u8A9E\"");
496deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address utf32Name = new Address("<address8@ne.jp>", "\uD834\uDF01\uD834\uDF46");
497a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
498deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        // test for internal states.
499deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("no name 1 address", "noname1@dom1.com", noName1.getAddress());
500deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertNull("no name 1 name", noName1.getPersonal());
501deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("no name 2 address", "noname2@dom2.com", noName2.getAddress());
502deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertNull("no name 2 name", noName2.getPersonal());
503deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("simple name address", "address3@dom3.org", simpleName.getAddress());
504deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("simple name name", "simple name", simpleName.getPersonal());
505deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("double quoted name address", "address4@dom4.org", dquoteName.getAddress());
506deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("double quoted name name", "name,4", dquoteName.getPersonal());
507deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("quoted name address", "bigG@dom5.net", quotedName.getAddress());
508deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("quoted name name", "big \"G\"", quotedName.getPersonal());
509a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("utf-16 name address", "address6@co.jp", utf16Name.getAddress());
510a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("utf-16 name name", "\u65E5\u672C\u8A9E", utf16Name.getPersonal());
511a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("utf-32 name address", "address8@ne.jp", utf32Name.getAddress());
512a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki        assertEquals("utf-32 name name", "\uD834\uDF01\uD834\uDF46", utf32Name.getPersonal());
513deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project
514deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        Address[] addresses = new Address[] {
515deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                noName1, noName2, simpleName, dquoteName, quotedName, utf16Name, utf32Name,
516deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        };
517deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        String line = Address.toHeader(addresses);
518f33420e68f75c93ac8aa3c645c771c877c0b0b7cMakoto Onuki
519deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project        assertEquals("toHeader() multi",
520deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                "noname1@dom1.com, "
521deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                + "noname2@dom2.com, "
522deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                + "simple name <address3@dom3.org>, "
523deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                + "\"name,4\" <address4@dom4.org>, "
524deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                + "\"big \\\"G\\\"\" <bigG@dom5.net>, "
525deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                + "=?UTF-8?B?5pel5pys6Kqe?= <address6@co.jp>, "
526deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                + "=?UTF-8?B?8J2MgfCdjYY=?= <address8@ne.jp>",
527deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project                line);
528deabfc0cb513d1becdb557e3a8a853839992bb5cThe Android Open Source Project    }
529a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
53096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
53196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Test various combinations of the toFriendly (single) method
53296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
533a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki    public void testToFriendlySingle() {
53496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        assertEquals("personal1", mAddress1.toFriendly());
53596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        assertEquals("address2", mAddress2.toFriendly());
53696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        assertEquals("address3", mAddress3.toFriendly());
53796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
538a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
53996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
54096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Test various combinations of the toFriendly (array) method
54196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
542a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki    public void testToFriendlyArray() {
54396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Address[] list1 = null;
54496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Address[] list2 = new Address[0];
54596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Address[] list3 = new Address[] { mAddress1 };
54696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Address[] list4 = new Address[] { mAddress1, mAddress2, mAddress3 };
547a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
54896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        assertEquals(null, Address.toFriendly(list1));
54996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        assertEquals(null, Address.toFriendly(list2));
55096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        assertEquals("personal1", Address.toFriendly(list3));
551358a8157015c7cfe9ca219a9f516656f5975666dAndy Huang        assertEquals("personal1, address2, address3", Address.toFriendly(list4));
55296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
553a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
55496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
5553469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project     * Simple quick checks of empty-input edge conditions for pack()
556a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki     *
5573469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project     * NOTE:  This is not a claim that these edge cases are "correct", only to maintain consistent
5583469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project     * behavior while I am changing some of the code in the function under test.
5593469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project     */
5603469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project    public void testEmptyPack() {
5613469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        String result;
562a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
5633469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        // null input => null string
5643469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        result = Address.pack(null);
5653469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        assertNull("packing null", result);
566a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
5673469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        // zero-length input => empty string
5683469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        result = Address.pack(new Address[] { });
5693469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        assertEquals("packing empty array", "", result);
5703469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project    }
571a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
5723469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project    /**
5733469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project     * Simple quick checks of empty-input edge conditions for unpack()
574a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki     *
5753469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project     * NOTE:  This is not a claim that these edge cases are "correct", only to maintain consistent
5763469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project     * behavior while I am changing some of the code in the function under test.
5773469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project     */
5783469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project    public void testEmptyUnpack() {
5793469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        Address[] result;
580a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
5813469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        // null input => empty array
5823469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        result = Address.unpack(null);
5833469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        assertTrue("unpacking null address", result != null && result.length == 0);
584a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
5853469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        // empty string input => empty array
5863469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        result = Address.unpack("");
5873469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project        assertTrue("unpacking zero-length", result != null && result.length == 0);
5883469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project    }
5893469902379242c723b871d1dcb09b02d0998d538The Android Open Source Project
590e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda    private static boolean addressEquals(Address a1, Address a2) {
591e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        if (!a1.equals(a2)) {
592e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            return false;
593e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        }
594e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        final String displayName1 = a1.getPersonal();
595e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        final String displayName2 = a2.getPersonal();
596e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        if (displayName1 == null) {
597e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            return displayName2 == null;
598e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        } else {
599e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            return displayName1.equals(displayName2);
600e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        }
601e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda    }
602e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda
603e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda    private static boolean addressArrayEquals(Address[] array1, Address[] array2) {
604e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        if (array1.length != array2.length) {
605e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            return false;
606e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        }
607e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        for (int i = array1.length - 1; i >= 0; --i) {
608e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            if (!addressEquals(array1[i], array2[i])) {
609e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda                return false;
610e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            }
611e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        }
612e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        return true;
613e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda    }
614e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda
615e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda    public void testPackUnpack() {
616e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        for (Address[] list : PACK_CASES) {
617e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            String packed = Address.pack(list);
618e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            assertTrue(packed, addressArrayEquals(list, Address.unpack(packed)));
619e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        }
620e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda    }
621e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda
62221ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda    /**
62321ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda     * Tests that unpackToString() returns the same result as toString(unpack()).
62421ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda     */
62521ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda    public void testUnpackToString() {
626ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda        assertNull(Address.unpackToString(null));
627ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda        assertNull(Address.unpackToString(""));
628ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda
62921ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda        for (Address[] list : PACK_CASES) {
63021ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda            String packed = Address.pack(list);
63121ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda            String s1 = Address.unpackToString(packed);
63221ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda            String s2 = Address.toString(Address.unpack(packed));
63321ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda            assertEquals(s2, s2, s1);
63421ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda        }
63521ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda    }
63621ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda
63721ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda    /**
63821ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda     * Tests that parseAndPack() returns the same result as pack(parse()).
63921ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda     */
64021ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda    public void testParseAndPack() {
64121ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda        String s1 = Address.parseAndPack(MULTI_ADDRESSES_LIST);
64221ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda        String s2 = Address.pack(Address.parse(MULTI_ADDRESSES_LIST));
64321ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda        assertEquals(s2, s1);
64421ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda    }
64521ace307e07cb4c363c4183f4d62f4049f5d92fdMihai Preda
646c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda    public void testSinglePack() {
647c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        Address[] addrArray = new Address[1];
648c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        for (Address address : new Address[]{PACK_ADDR_1, PACK_ADDR_2, PACK_ADDR_3}) {
649c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda            String packed1 = address.pack();
650c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda            addrArray[0] = address;
651c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda            String packed2 = Address.pack(addrArray);
652c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda            assertEquals(packed1, packed2);
653c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda        }
654c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda    }
655c6893ddf0fc1a647ca13a2b3aac2c68ca345de37Mihai Preda
656ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda    /**
657ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda     * Tests that:
658ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda     * 1. unpackFirst() with empty list returns null.
659ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda     * 2. unpackFirst() with non-empty returns the same as unpack()[0]
660ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda     */
661ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda    public void testUnpackFirst() {
662ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda        assertNull(Address.unpackFirst(null));
663ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda        assertNull(Address.unpackFirst(""));
664ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda
665ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda        for (Address[] list : PACK_CASES) {
666ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda            String packed = Address.pack(list);
667ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda            Address[] array = Address.unpack(packed);
668ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda            Address first = Address.unpackFirst(packed);
669ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda            assertTrue(packed, addressEquals(array[0], first));
670ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda        }
671ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda    }
672ff683a5b98eb0cc9c3e18bd022aa00c617b2eae1Mihai Preda
673ed0e683d86d27aecb39347b1749b5c572594ba6cMihai Preda    public void testIsValidAddress() {
674ed0e683d86d27aecb39347b1749b5c572594ba6cMihai Preda        String notValid[] = {"", "foo", "john@", "x@y", "x@y.", "foo.com"};
675ed0e683d86d27aecb39347b1749b5c572594ba6cMihai Preda        String valid[] = {"x@y.z", "john@gmail.com", "a@b.c.d"};
676ed0e683d86d27aecb39347b1749b5c572594ba6cMihai Preda        for (String address : notValid) {
677ed0e683d86d27aecb39347b1749b5c572594ba6cMihai Preda            assertTrue(address, !Address.isValidAddress(address));
678ed0e683d86d27aecb39347b1749b5c572594ba6cMihai Preda        }
679ed0e683d86d27aecb39347b1749b5c572594ba6cMihai Preda        for (String address : valid) {
680ed0e683d86d27aecb39347b1749b5c572594ba6cMihai Preda            assertTrue(address, Address.isValidAddress(address));
681ed0e683d86d27aecb39347b1749b5c572594ba6cMihai Preda        }
682a826d3fb03f29a07ea12e44237b2c02ea1926c74Makoto Onuki
683ed0e683d86d27aecb39347b1749b5c572594ba6cMihai Preda        // isAllValid() must accept empty address list as valid
684ed0e683d86d27aecb39347b1749b5c572594ba6cMihai Preda        assertTrue("Empty address list is valid", Address.isAllValid(""));
685ed0e683d86d27aecb39347b1749b5c572594ba6cMihai Preda    }
686e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda
687e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda    /**
688e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda     * Legacy pack() used for testing legacyUnpack().
689e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda     * The packed list is a comma separated list of:
690e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda     * URLENCODE(address)[;URLENCODE(personal)]
691e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda     * @See pack()
692e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda     */
693e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda    private static String legacyPack(Address[] addresses) {
694e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        if (addresses == null) {
695e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            return null;
696e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        } else if (addresses.length == 0) {
697e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            return "";
698e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        }
699e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        StringBuffer sb = new StringBuffer();
700e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        for (int i = 0, count = addresses.length; i < count; i++) {
701e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            Address address = addresses[i];
702e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            try {
703e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda                sb.append(URLEncoder.encode(address.getAddress(), "UTF-8"));
704e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda                if (address.getPersonal() != null) {
705e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda                    sb.append(';');
706e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda                    sb.append(URLEncoder.encode(address.getPersonal(), "UTF-8"));
707e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda                }
708e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda                if (i < count - 1) {
709e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda                    sb.append(',');
710e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda                }
711e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            }
712e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            catch (UnsupportedEncodingException uee) {
713e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda                return null;
714e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda            }
715e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        }
716e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda        return sb.toString();
717e8d58c01ec3f5f783bbca6841d95ca44570c6fd9Mihai Preda    }
71896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project}
719