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