14199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/*
24199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Copyright (C) 2009 The Android Open Source Project
34199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
44199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License");
54199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * you may not use this file except in compliance with the License.
64199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * You may obtain a copy of the License at
74199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
84199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *      http://www.apache.org/licenses/LICENSE-2.0
94199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software
114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS,
124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * See the License for the specific language governing permissions and
144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * limitations under the License.
154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */
164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawapackage com.android.vcard.tests;
174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
182bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawaimport android.text.TextUtils;
192bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa
204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport com.android.vcard.VCardUtils;
214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport junit.framework.TestCase;
234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.List;
254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawapublic class VCardUtilsTests extends TestCase {
274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testContainsOnlyPrintableAscii() {
284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyPrintableAscii((String)null));
294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyPrintableAscii((String[])null));
304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyPrintableAscii((List<String>)null));
314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyPrintableAscii(""));
324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyPrintableAscii("abcdefghijklmnopqrstuvwxyz"));
334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyPrintableAscii("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        StringBuilder builder = new StringBuilder();
354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        for (int i = 0x20; i < 0x7F; i++) {
364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.append((char)i);
374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyPrintableAscii(builder.toString()));
394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyPrintableAscii("\r\n"));
404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertFalse(VCardUtils.containsOnlyPrintableAscii("\u0019"));
414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertFalse(VCardUtils.containsOnlyPrintableAscii("\u007F"));
424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testContainsOnlyNonCrLfPrintableAscii() {
454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyNonCrLfPrintableAscii((String)null));
464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyNonCrLfPrintableAscii((String[])null));
474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyNonCrLfPrintableAscii((List<String>)null));
484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyNonCrLfPrintableAscii(""));
494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyNonCrLfPrintableAscii("abcdefghijklmnopqrstuvwxyz"));
504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyNonCrLfPrintableAscii("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        StringBuilder builder = new StringBuilder();
524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        for (int i = 0x20; i < 0x7F; i++) {
534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            builder.append((char)i);
544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyNonCrLfPrintableAscii(builder.toString()));
564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertFalse(VCardUtils.containsOnlyNonCrLfPrintableAscii("\u0019"));
574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertFalse(VCardUtils.containsOnlyNonCrLfPrintableAscii("\u007F"));
584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertFalse(VCardUtils.containsOnlyNonCrLfPrintableAscii("\r"));
594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertFalse(VCardUtils.containsOnlyNonCrLfPrintableAscii("\n"));
604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public void testContainsOnlyAlphaDigitHyphen() {
634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyAlphaDigitHyphen((String)null));
644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyAlphaDigitHyphen((String[])null));
654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyAlphaDigitHyphen((List<String>)null));
664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyAlphaDigitHyphen(""));
674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyNonCrLfPrintableAscii("abcdefghijklmnopqrstuvwxyz"));
684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyNonCrLfPrintableAscii("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        assertTrue(VCardUtils.containsOnlyNonCrLfPrintableAscii("0123456789-"));
704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        for (int i = 0; i < 0x30; i++) {
714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (i == 0x2D) {  // -
724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                continue;
734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            assertFalse(VCardUtils.containsOnlyAlphaDigitHyphen(String.valueOf((char)i)));
754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        for (int i = 0x3A; i < 0x41; i++) {
774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            assertFalse(VCardUtils.containsOnlyAlphaDigitHyphen(String.valueOf((char)i)));
784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        for (int i = 0x5B; i < 0x61; i++) {
804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            assertFalse(VCardUtils.containsOnlyAlphaDigitHyphen(String.valueOf((char)i)));
814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        for (int i = 0x7B; i < 0x100; i++) {
834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            assertFalse(VCardUtils.containsOnlyAlphaDigitHyphen(String.valueOf((char)i)));
844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
862bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa
872bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa    public void testToStringAvailableAsV30ParamValue() {
882bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        // Smoke tests.
893d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa        assertEquals("HOME", VCardUtils.toStringAsV30ParamValue("HOME"));
903d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa        assertEquals("TEL", VCardUtils.toStringAsV30ParamValue("TEL"));
913d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa        assertEquals("PAGER", VCardUtils.toStringAsV30ParamValue("PAGER"));
922bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa
933d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa        assertTrue(TextUtils.isEmpty(VCardUtils.toStringAsV30ParamValue("")));
943d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa        assertTrue(TextUtils.isEmpty(VCardUtils.toStringAsV30ParamValue(null)));
953d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa        assertTrue(TextUtils.isEmpty(VCardUtils.toStringAsV30ParamValue(" \t")));
962bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa
972bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        // non-Ascii must be allowed
982bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        assertEquals("\u4E8B\u52D9\u6240",
993d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa                VCardUtils.toStringAsV30ParamValue("\u4E8B\u52D9\u6240"));
1002bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        // Reported as bug report.
1013d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa        assertEquals("\u8D39", VCardUtils.toStringAsV30ParamValue("\u8D39"));
1022bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        assertEquals("\"comma,separated\"",
1033d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa                VCardUtils.toStringAsV30ParamValue("comma,separated"));
1042bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        assertEquals("\"colon:aware\"",
1053d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa                VCardUtils.toStringAsV30ParamValue("colon:aware"));
1062bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        // CTL characters.
1072bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        assertEquals("CTLExample",
1083d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa                VCardUtils.toStringAsV30ParamValue("CTL\u0001Example"));
1092bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        assertTrue(TextUtils.isEmpty(
1103d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa                VCardUtils.toStringAsV30ParamValue("\u0001\u0002\u0003")));
1112bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        // DQUOTE must be removed.
1122bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        assertEquals("quoted",
1133d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa                VCardUtils.toStringAsV30ParamValue("\"quoted\""));
1142bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        // DQUOTE must be removed basically, but we should detect a space, which
1152bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        // require us to use DQUOTE again.
1162bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        // Right-side has one more illegal dquote to test quote-handle code thoroughly.
1172bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa        assertEquals("\"Already quoted\"",
1183d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa                VCardUtils.toStringAsV30ParamValue("\"Already quoted\"\""));
1192bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa    }
1208aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng
1218aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng    public void testAppearsLikeAndroidVCardQuotedPrintableByLength() {
1228aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertFalse(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("="));
1238aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertFalse(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("=1"));
1248aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertTrue(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("=12"));
1258aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertTrue(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("=12="));
1268aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertFalse(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("=12=1"));
1278aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertTrue(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("=12=12"));
1288aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertTrue(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("=12=12="));
1298aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng    }
1308aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng
1318aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng    public void testAppearsLikeAndroidVCardQuotedPrintableByContent() {
1328aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertTrue(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("==="));
1338aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertTrue(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("===="));
1348aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertTrue(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("======="));
1358aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertTrue(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("=12=12="));
1368aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertTrue(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("=12=34="));
1378aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng
1388aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertFalse(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("=123"));
1398aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertFalse(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("=123="));
1408aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertFalse(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("_12="));
1418aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertFalse(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("=12_"));
1428aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng        assertFalse(VCardUtils.appearsLikeAndroidVCardQuotedPrintable("=12=34_56="));
1438aa2ab8a2f4284cdbc9392e8597ab6d4fd302c50Chiao Cheng    }
1444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
145