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("&copy; &gt; &lt").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 &lt;&amp;&gt; world</p>\n");
1750dc59e78e18493aecd37427531d093e800846c3eBrett Chabot
1760dc59e78e18493aecd37427531d093e800846c3eBrett Chabot        s = new SpannableString("Hello \u03D5 world");
1770dc59e78e18493aecd37427531d093e800846c3eBrett Chabot        assertEquals(Html.toHtml(s), "<p>Hello &#981; world</p>\n");
1780dc59e78e18493aecd37427531d093e800846c3eBrett Chabot
1790dc59e78e18493aecd37427531d093e800846c3eBrett Chabot        s = new SpannableString("Hello  world");
1800dc59e78e18493aecd37427531d093e800846c3eBrett Chabot        assertEquals(Html.toHtml(s), "<p>Hello&nbsp; 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>&#292;&#235;&#322;&#322;o, world!</p>\n", Html.toHtml(s));
2450dc59e78e18493aecd37427531d093e800846c3eBrett Chabot    }
2460dc59e78e18493aecd37427531d093e800846c3eBrett Chabot
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
248