1a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng/*
2a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng * Copyright (C) 2011 The Android Open Source Project
3a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng *
4a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng * Licensed under the Apache License, Version 2.0 (the "License");
5a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng * you may not use this file except in compliance with the License.
6a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng * You may obtain a copy of the License at
7a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng *
8a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng *      http://www.apache.org/licenses/LICENSE-2.0
9a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng *
10a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng * Unless required by applicable law or agreed to in writing, software
11a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng * distributed under the License is distributed on an "AS IS" BASIS,
12a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng * See the License for the specific language governing permissions and
14a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng * limitations under the License.
15a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng */
16a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng
17a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Chengpackage com.android.contacts.common.format;
18a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng
19a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Chengimport android.test.suitebuilder.annotation.SmallTest;
20a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Chengimport android.text.Html;
21f99a990be713ed35afe64ba8133c5428816390c6Christine Chenimport android.text.SpannableString;
22a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Chengimport android.text.Spanned;
23a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Chengimport android.text.TextUtils;
24a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Chengimport android.text.style.ForegroundColorSpan;
25a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Chengimport android.widget.TextView;
26a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng
27a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Chengimport junit.framework.Assert;
28a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng
29a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng/**
30a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng * Utility class to check the value of spanned text in text views.
31a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng */
32a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng@SmallTest
33a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Chengpublic class SpannedTestUtils {
34a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng    /**
35a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     * Checks that the text contained in the text view matches the given HTML text.
36a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     *
37a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     * @param expectedHtmlText the expected text to be in the text view
38a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     * @param textView the text view from which to get the text
39a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     */
40a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng    public static void checkHtmlText(String expectedHtmlText, TextView textView) {
41a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng        String actualHtmlText = Html.toHtml((Spanned) textView.getText());
42a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng        if (TextUtils.isEmpty(expectedHtmlText)) {
43a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng            // If the text is empty, it does not add the <p></p> bits to it.
44a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng            Assert.assertEquals("", actualHtmlText);
45a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng        } else {
46a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng            Assert.assertEquals("<p dir=ltr>" + expectedHtmlText + "</p>\n", actualHtmlText);
47a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng        }
48a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng    }
49a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng
50a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng
51a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng    /**
52a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     * Assert span exists in the correct location.
53a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     *
54a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     * @param seq The spannable string to check.
55a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     * @param start The starting index.
56a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     * @param end The ending index.
57a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     */
58a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng    public static void assertPrefixSpan(CharSequence seq, int start, int end) {
59a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng        Assert.assertTrue(seq instanceof Spanned);
60a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng        Spanned spannable = (Spanned) seq;
61a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng
62a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng        if (start > 0) {
63a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng            Assert.assertEquals(0, getNumForegroundColorSpansBetween(spannable, 0, start - 1));
64a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng        }
65a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng        Assert.assertEquals(1, getNumForegroundColorSpansBetween(spannable, start, end));
66a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng        Assert.assertEquals(0, getNumForegroundColorSpansBetween(spannable, end + 1,
67a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng                spannable.length() - 1));
68a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng    }
69a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng
70a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng    private static int getNumForegroundColorSpansBetween(Spanned value, int start, int end) {
71a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng        return value.getSpans(start, end, ForegroundColorSpan.class).length;
72a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng    }
73a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng
74a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng    /**
75a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     * Asserts that the given character sequence is not a Spanned object and text is correct.
76a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     *
77a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     * @param seq The sequence to check.
78a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     * @param expected The expected text.
79a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng     */
80a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng    public static void assertNotSpanned(CharSequence seq, String expected) {
81a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng        Assert.assertFalse(seq instanceof Spanned);
82a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng        Assert.assertEquals(expected, seq);
83a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng    }
84a81953a2b1818066ef5e44817f374ac288bab343Christine Chen
85f99a990be713ed35afe64ba8133c5428816390c6Christine Chen    public static int getNextTransition(SpannableString seq, int start) {
86f99a990be713ed35afe64ba8133c5428816390c6Christine Chen        return seq.nextSpanTransition(start, seq.length(), ForegroundColorSpan.class);
87a81953a2b1818066ef5e44817f374ac288bab343Christine Chen    }
88a8feb7b88f2f67d8a80762dc54d336f1ea3a22d3Chiao Cheng}
89