19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 171d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyenpackage android.text; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 190dc59e78e18493aecd37427531d093e800846c3eBrett Chabotimport android.content.res.ColorStateList; 200dc59e78e18493aecd37427531d093e800846c3eBrett Chabotimport android.content.res.Resources; 210dc59e78e18493aecd37427531d093e800846c3eBrett Chabotimport android.graphics.Typeface; 220dc59e78e18493aecd37427531d093e800846c3eBrett Chabotimport android.test.suitebuilder.annotation.SmallTest; 230dc59e78e18493aecd37427531d093e800846c3eBrett Chabotimport android.text.style.ForegroundColorSpan; 240dc59e78e18493aecd37427531d093e800846c3eBrett Chabotimport android.text.style.QuoteSpan; 250dc59e78e18493aecd37427531d093e800846c3eBrett Chabotimport android.text.style.StrikethroughSpan; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.style.StyleSpan; 270dc59e78e18493aecd37427531d093e800846c3eBrett Chabotimport android.text.style.SubscriptSpan; 280dc59e78e18493aecd37427531d093e800846c3eBrett Chabotimport android.text.style.SuperscriptSpan; 290dc59e78e18493aecd37427531d093e800846c3eBrett Chabotimport android.text.style.TextAppearanceSpan; 300dc59e78e18493aecd37427531d093e800846c3eBrett Chabotimport android.text.style.TypefaceSpan; 310dc59e78e18493aecd37427531d093e800846c3eBrett Chabotimport android.text.style.URLSpan; 320dc59e78e18493aecd37427531d093e800846c3eBrett Chabotimport android.text.style.UnderlineSpan; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 340dc59e78e18493aecd37427531d093e800846c3eBrett Chabotimport junit.framework.TestCase; 350dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 360dc59e78e18493aecd37427531d093e800846c3eBrett Chabotpublic class HtmlTest extends TestCase { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @SmallTest 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testSingleTagOnWhileString() { 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Spanned spanned = Html.fromHtml("<b>hello</b>"); 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object[] spans = spanned.getSpans(-1, 100, Object.class); 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertEquals(1, spans.length); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object span = spans[0]; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertEquals(0, spanned.getSpanStart(span)); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertEquals(5, spanned.getSpanEnd(span)); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @SmallTest 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testEmptyFontTag() { 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Spanned spanned = Html.fromHtml("Hello <font color=\"#ff00ff00\"></font>"); 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object[] spans = spanned.getSpans(0, 100, Object.class); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: figure out what the spans should be after the crashes are fixed and assert them. 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Tests that the parser can handle mal-formed HTML. */ 56f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @SmallTest 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testBadHtml() { 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Spanned spanned = Html.fromHtml("Hello <b>b<i>bi</b>i</i>"); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object[] spans = spanned.getSpans(0, 100, Object.class); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertEquals(Typeface.ITALIC, ((StyleSpan) spans[0]).getStyle()); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertEquals(7, spanned.getSpanStart(spans[0])); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertEquals(9, spanned.getSpanEnd(spans[0])); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertEquals(Typeface.BOLD, ((StyleSpan) spans[1]).getStyle()); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertEquals(6, spanned.getSpanStart(spans[1])); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertEquals(9, spanned.getSpanEnd(spans[1])); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertEquals(Typeface.ITALIC, ((StyleSpan) spans[2]).getStyle()); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertEquals(9, spanned.getSpanStart(spans[2])); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertEquals(10, spanned.getSpanEnd(spans[2])); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 71f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @SmallTest 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testSymbols() { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String spanned = Html.fromHtml("© > <").toString(); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertEquals("\u00a9 > <", spanned); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 760dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 77f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @SmallTest 780dc59e78e18493aecd37427531d093e800846c3eBrett Chabot public void testColor() throws Exception { 790dc59e78e18493aecd37427531d093e800846c3eBrett Chabot Spanned s; 800dc59e78e18493aecd37427531d093e800846c3eBrett Chabot ForegroundColorSpan[] colors; 810dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 820dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = Html.fromHtml("<font color=\"#00FF00\">something</font>"); 830dc59e78e18493aecd37427531d093e800846c3eBrett Chabot colors = s.getSpans(0, s.length(), ForegroundColorSpan.class); 840dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(1, colors.length); 850dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(0xFF00FF00, colors[0].getForegroundColor()); 860dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 870dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = Html.fromHtml("<font color=\"navy\">something</font>"); 880dc59e78e18493aecd37427531d093e800846c3eBrett Chabot colors = s.getSpans(0, s.length(), ForegroundColorSpan.class); 890dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(1, colors.length); 900dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(0xFF000080, colors[0].getForegroundColor()); 910dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 920dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = Html.fromHtml("<font color=\"gibberish\">something</font>"); 930dc59e78e18493aecd37427531d093e800846c3eBrett Chabot colors = s.getSpans(0, s.length(), ForegroundColorSpan.class); 940dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(0, colors.length); 950dc59e78e18493aecd37427531d093e800846c3eBrett Chabot } 960dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 97f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @SmallTest 980dc59e78e18493aecd37427531d093e800846c3eBrett Chabot public void testResourceColor() throws Exception { 990dc59e78e18493aecd37427531d093e800846c3eBrett Chabot ColorStateList c = 1000dc59e78e18493aecd37427531d093e800846c3eBrett Chabot Resources.getSystem().getColorStateList(android.R.color.primary_text_dark); 1010dc59e78e18493aecd37427531d093e800846c3eBrett Chabot Spanned s; 1020dc59e78e18493aecd37427531d093e800846c3eBrett Chabot TextAppearanceSpan[] colors; 1030dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1040dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = Html.fromHtml("<font color=\"@android:color/primary_text_dark\">something</font>"); 1050dc59e78e18493aecd37427531d093e800846c3eBrett Chabot colors = s.getSpans(0, s.length(), TextAppearanceSpan.class); 1060dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(1, colors.length); 1070dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(c.toString(), colors[0].getTextColor().toString()); 1080dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1090dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = Html.fromHtml("<font color=\"@android:primary_text_dark\">something</font>"); 1100dc59e78e18493aecd37427531d093e800846c3eBrett Chabot colors = s.getSpans(0, s.length(), TextAppearanceSpan.class); 1110dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(1, colors.length); 1120dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(c.toString(), colors[0].getTextColor().toString()); 1130dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1140dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = Html.fromHtml("<font color=\"@color/primary_text_dark\">something</font>"); 1150dc59e78e18493aecd37427531d093e800846c3eBrett Chabot colors = s.getSpans(0, s.length(), TextAppearanceSpan.class); 1160dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(1, colors.length); 1170dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(c.toString(), colors[0].getTextColor().toString()); 1180dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1190dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = Html.fromHtml("<font color=\"@primary_text_dark\">something</font>"); 1200dc59e78e18493aecd37427531d093e800846c3eBrett Chabot colors = s.getSpans(0, s.length(), TextAppearanceSpan.class); 1210dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(1, colors.length); 1220dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(c.toString(), colors[0].getTextColor().toString()); 1230dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1240dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = Html.fromHtml("<font color=\"@" + android.R.color.primary_text_dark 1250dc59e78e18493aecd37427531d093e800846c3eBrett Chabot + "\">something</font>"); 1260dc59e78e18493aecd37427531d093e800846c3eBrett Chabot colors = s.getSpans(0, s.length(), TextAppearanceSpan.class); 1270dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(1, colors.length); 1280dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(c.toString(), colors[0].getTextColor().toString()); 1290dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1300dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = Html.fromHtml("<font color=\"gibberish\">something</font>"); 1310dc59e78e18493aecd37427531d093e800846c3eBrett Chabot colors = s.getSpans(0, s.length(), TextAppearanceSpan.class); 1320dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(colors.length, 0); 1330dc59e78e18493aecd37427531d093e800846c3eBrett Chabot } 1340dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1350dc59e78e18493aecd37427531d093e800846c3eBrett Chabot @SmallTest 1360dc59e78e18493aecd37427531d093e800846c3eBrett Chabot public void testParagraphs() throws Exception { 1370dc59e78e18493aecd37427531d093e800846c3eBrett Chabot SpannableString s; 1380dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1390dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello world"); 1400dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<p>Hello world</p>\n"); 1410dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1420dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello world\nor something"); 1430dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<p>Hello world<br>\nor something</p>\n"); 1440dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1450dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello world\n\nor something"); 1460dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<p>Hello world</p>\n<p>or something</p>\n"); 1470dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1480dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello world\n\n\nor something"); 1490dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<p>Hello world<br></p>\n<p>or something</p>\n"); 1500dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1510dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals("foo\nbar", Html.fromHtml("foo<br>bar").toString()); 1520dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals("foo\nbar", Html.fromHtml("foo<br>\nbar").toString()); 1530dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals("foo\nbar", Html.fromHtml("foo<br>\n \nbar").toString()); 1540dc59e78e18493aecd37427531d093e800846c3eBrett Chabot } 1550dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1560dc59e78e18493aecd37427531d093e800846c3eBrett Chabot @SmallTest 1570dc59e78e18493aecd37427531d093e800846c3eBrett Chabot public void testBlockquote() throws Exception { 1580dc59e78e18493aecd37427531d093e800846c3eBrett Chabot SpannableString s; 1590dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1600dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello world"); 1610dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s.setSpan(new QuoteSpan(), 0, s.length(), Spannable.SPAN_PARAGRAPH); 1620dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<blockquote><p>Hello world</p>\n</blockquote>\n"); 1630dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1640dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello\n\nworld"); 1650dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s.setSpan(new QuoteSpan(), 0, 7, Spannable.SPAN_PARAGRAPH); 1660dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<blockquote><p>Hello</p>\n</blockquote>\n<p>world</p>\n"); 1670dc59e78e18493aecd37427531d093e800846c3eBrett Chabot } 1680dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1690dc59e78e18493aecd37427531d093e800846c3eBrett Chabot @SmallTest 1700dc59e78e18493aecd37427531d093e800846c3eBrett Chabot public void testEntities() throws Exception { 1710dc59e78e18493aecd37427531d093e800846c3eBrett Chabot SpannableString s; 1720dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1730dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello <&> world"); 1740dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<p>Hello <&> world</p>\n"); 1750dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1760dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello \u03D5 world"); 1770dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<p>Hello ϕ world</p>\n"); 1780dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1790dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello world"); 1800dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<p>Hello world</p>\n"); 1810dc59e78e18493aecd37427531d093e800846c3eBrett Chabot } 1820dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1830dc59e78e18493aecd37427531d093e800846c3eBrett Chabot @SmallTest 1840dc59e78e18493aecd37427531d093e800846c3eBrett Chabot public void testMarkup() throws Exception { 1850dc59e78e18493aecd37427531d093e800846c3eBrett Chabot SpannableString s; 1860dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1870dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello bold world"); 1880dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s.setSpan(new StyleSpan(Typeface.BOLD), 6, s.length() - 6, 1890dc59e78e18493aecd37427531d093e800846c3eBrett Chabot Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 1900dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<p>Hello <b>bold</b> world</p>\n"); 1910dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1920dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello italic world"); 1930dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s.setSpan(new StyleSpan(Typeface.ITALIC), 6, s.length() - 6, 1940dc59e78e18493aecd37427531d093e800846c3eBrett Chabot Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 1950dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<p>Hello <i>italic</i> world</p>\n"); 1960dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 1970dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello monospace world"); 1980dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s.setSpan(new TypefaceSpan("monospace"), 6, s.length() - 6, 1990dc59e78e18493aecd37427531d093e800846c3eBrett Chabot Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 2000dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<p>Hello <tt>monospace</tt> world</p>\n"); 2010dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 2020dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello superscript world"); 2030dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s.setSpan(new SuperscriptSpan(), 6, s.length() - 6, 2040dc59e78e18493aecd37427531d093e800846c3eBrett Chabot Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 2050dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<p>Hello <sup>superscript</sup> world</p>\n"); 2060dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 2070dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello subscript world"); 2080dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s.setSpan(new SubscriptSpan(), 6, s.length() - 6, 2090dc59e78e18493aecd37427531d093e800846c3eBrett Chabot Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 2100dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<p>Hello <sub>subscript</sub> world</p>\n"); 2110dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 2120dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello underline world"); 2130dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s.setSpan(new UnderlineSpan(), 6, s.length() - 6, 2140dc59e78e18493aecd37427531d093e800846c3eBrett Chabot Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 2150dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<p>Hello <u>underline</u> world</p>\n"); 2160dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 2170dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello struck world"); 2180dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s.setSpan(new StrikethroughSpan(), 6, s.length() - 6, 2190dc59e78e18493aecd37427531d093e800846c3eBrett Chabot Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 2200dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), "<p>Hello <strike>struck</strike> world</p>\n"); 2210dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 2220dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = new SpannableString("Hello linky world"); 2230dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s.setSpan(new URLSpan("http://www.google.com"), 6, s.length() - 6, 2240dc59e78e18493aecd37427531d093e800846c3eBrett Chabot Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 2250dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals(Html.toHtml(s), 2260dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "<p>Hello <a href=\"http://www.google.com\">linky</a> world</p>\n"); 2270dc59e78e18493aecd37427531d093e800846c3eBrett Chabot } 2280dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 2290dc59e78e18493aecd37427531d093e800846c3eBrett Chabot @SmallTest 2300dc59e78e18493aecd37427531d093e800846c3eBrett Chabot public void testImg() throws Exception { 2310dc59e78e18493aecd37427531d093e800846c3eBrett Chabot Spanned s; 2320dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 2330dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = Html.fromHtml("yes<img src=\"http://example.com/foo.gif\">no"); 2340dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 2350dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals("<p>yes<img src=\"http://example.com/foo.gif\">no</p>\n", 2360dc59e78e18493aecd37427531d093e800846c3eBrett Chabot Html.toHtml(s)); 2370dc59e78e18493aecd37427531d093e800846c3eBrett Chabot } 2380dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 2390dc59e78e18493aecd37427531d093e800846c3eBrett Chabot @SmallTest 2400dc59e78e18493aecd37427531d093e800846c3eBrett Chabot public void testUtf8() throws Exception { 2410dc59e78e18493aecd37427531d093e800846c3eBrett Chabot Spanned s; 2420dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 2430dc59e78e18493aecd37427531d093e800846c3eBrett Chabot s = Html.fromHtml("<p>\u0124\u00eb\u0142\u0142o, world!</p>"); 2440dc59e78e18493aecd37427531d093e800846c3eBrett Chabot assertEquals("<p>Ĥëłło, world!</p>\n", Html.toHtml(s)); 2450dc59e78e18493aecd37427531d093e800846c3eBrett Chabot } 2460dc59e78e18493aecd37427531d093e800846c3eBrett Chabot 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 248