1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.text;
18
19import android.content.res.ColorStateList;
20import android.content.res.Resources;
21import android.graphics.Typeface;
22import android.test.suitebuilder.annotation.SmallTest;
23import android.text.style.ForegroundColorSpan;
24import android.text.style.QuoteSpan;
25import android.text.style.StrikethroughSpan;
26import android.text.style.StyleSpan;
27import android.text.style.SubscriptSpan;
28import android.text.style.SuperscriptSpan;
29import android.text.style.TextAppearanceSpan;
30import android.text.style.TypefaceSpan;
31import android.text.style.URLSpan;
32import android.text.style.UnderlineSpan;
33
34import junit.framework.TestCase;
35
36public class HtmlTest extends TestCase {
37
38    @SmallTest
39    public void testSingleTagOnWhileString() {
40        Spanned spanned = Html.fromHtml("<b>hello</b>");
41        Object[] spans = spanned.getSpans(-1, 100, Object.class);
42        assertEquals(1, spans.length);
43        Object span = spans[0];
44        assertEquals(0, spanned.getSpanStart(span));
45        assertEquals(5, spanned.getSpanEnd(span));
46    }
47
48    @SmallTest
49    public void testEmptyFontTag() {
50        Spanned spanned = Html.fromHtml("Hello <font color=\"#ff00ff00\"></font>");
51        Object[] spans = spanned.getSpans(0, 100, Object.class);
52        // TODO: figure out what the spans should be after the crashes are fixed and assert them.
53    }
54
55    /** Tests that the parser can handle mal-formed HTML. */
56    @SmallTest
57    public void testBadHtml() {
58        Spanned spanned = Html.fromHtml("Hello <b>b<i>bi</b>i</i>");
59        Object[] spans = spanned.getSpans(0, 100, Object.class);
60        assertEquals(Typeface.ITALIC, ((StyleSpan) spans[0]).getStyle());
61        assertEquals(7, spanned.getSpanStart(spans[0]));
62        assertEquals(9, spanned.getSpanEnd(spans[0]));
63        assertEquals(Typeface.BOLD, ((StyleSpan) spans[1]).getStyle());
64        assertEquals(6, spanned.getSpanStart(spans[1]));
65        assertEquals(9, spanned.getSpanEnd(spans[1]));
66        assertEquals(Typeface.ITALIC, ((StyleSpan) spans[2]).getStyle());
67        assertEquals(9, spanned.getSpanStart(spans[2]));
68        assertEquals(10, spanned.getSpanEnd(spans[2]));
69    }
70
71    @SmallTest
72    public void testSymbols() {
73        String spanned = Html.fromHtml("&copy; &gt; &lt").toString();
74        assertEquals("\u00a9 > <", spanned);
75    }
76
77    @SmallTest
78    public void testColor() throws Exception {
79        Spanned s;
80        ForegroundColorSpan[] colors;
81
82        s = Html.fromHtml("<font color=\"#00FF00\">something</font>");
83        colors = s.getSpans(0, s.length(), ForegroundColorSpan.class);
84        assertEquals(1, colors.length);
85        assertEquals(0xFF00FF00, colors[0].getForegroundColor());
86
87        s = Html.fromHtml("<font color=\"navy\">something</font>");
88        colors = s.getSpans(0, s.length(), ForegroundColorSpan.class);
89        assertEquals(1, colors.length);
90        assertEquals(0xFF000080, colors[0].getForegroundColor());
91
92        s = Html.fromHtml("<font color=\"gibberish\">something</font>");
93        colors = s.getSpans(0, s.length(), ForegroundColorSpan.class);
94        assertEquals(0, colors.length);
95    }
96
97    @SmallTest
98    public void testResourceColor() throws Exception {
99        ColorStateList c =
100                Resources.getSystem().getColorStateList(android.R.color.primary_text_dark);
101        Spanned s;
102        TextAppearanceSpan[] colors;
103
104        s = Html.fromHtml("<font color=\"@android:color/primary_text_dark\">something</font>");
105        colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
106        assertEquals(1, colors.length);
107        assertEquals(c.toString(), colors[0].getTextColor().toString());
108
109        s = Html.fromHtml("<font color=\"@android:primary_text_dark\">something</font>");
110        colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
111        assertEquals(1, colors.length);
112        assertEquals(c.toString(), colors[0].getTextColor().toString());
113
114        s = Html.fromHtml("<font color=\"@color/primary_text_dark\">something</font>");
115        colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
116        assertEquals(1, colors.length);
117        assertEquals(c.toString(), colors[0].getTextColor().toString());
118
119        s = Html.fromHtml("<font color=\"@primary_text_dark\">something</font>");
120        colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
121        assertEquals(1, colors.length);
122        assertEquals(c.toString(), colors[0].getTextColor().toString());
123
124        s = Html.fromHtml("<font color=\"@" + android.R.color.primary_text_dark
125                + "\">something</font>");
126        colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
127        assertEquals(1, colors.length);
128        assertEquals(c.toString(), colors[0].getTextColor().toString());
129
130        s = Html.fromHtml("<font color=\"gibberish\">something</font>");
131        colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
132        assertEquals(colors.length, 0);
133    }
134
135    @SmallTest
136    public void testParagraphs() throws Exception {
137        SpannableString s;
138
139        s = new SpannableString("Hello world");
140        assertEquals(Html.toHtml(s), "<p>Hello world</p>\n");
141
142        s = new SpannableString("Hello world\nor something");
143        assertEquals(Html.toHtml(s), "<p>Hello world<br>\nor something</p>\n");
144
145        s = new SpannableString("Hello world\n\nor something");
146        assertEquals(Html.toHtml(s), "<p>Hello world</p>\n<p>or something</p>\n");
147
148        s = new SpannableString("Hello world\n\n\nor something");
149        assertEquals(Html.toHtml(s), "<p>Hello world<br></p>\n<p>or something</p>\n");
150
151        assertEquals("foo\nbar", Html.fromHtml("foo<br>bar").toString());
152        assertEquals("foo\nbar", Html.fromHtml("foo<br>\nbar").toString());
153        assertEquals("foo\nbar", Html.fromHtml("foo<br>\n \nbar").toString());
154    }
155
156    @SmallTest
157    public void testBlockquote() throws Exception {
158        SpannableString s;
159
160        s = new SpannableString("Hello world");
161        s.setSpan(new QuoteSpan(), 0, s.length(), Spannable.SPAN_PARAGRAPH);
162        assertEquals(Html.toHtml(s), "<blockquote><p>Hello world</p>\n</blockquote>\n");
163
164        s = new SpannableString("Hello\n\nworld");
165        s.setSpan(new QuoteSpan(), 0, 7, Spannable.SPAN_PARAGRAPH);
166        assertEquals(Html.toHtml(s), "<blockquote><p>Hello</p>\n</blockquote>\n<p>world</p>\n");
167    }
168
169    @SmallTest
170    public void testEntities() throws Exception {
171        SpannableString s;
172
173        s = new SpannableString("Hello <&> world");
174        assertEquals(Html.toHtml(s), "<p>Hello &lt;&amp;&gt; world</p>\n");
175
176        s = new SpannableString("Hello \u03D5 world");
177        assertEquals(Html.toHtml(s), "<p>Hello &#981; world</p>\n");
178
179        s = new SpannableString("Hello  world");
180        assertEquals(Html.toHtml(s), "<p>Hello&nbsp; world</p>\n");
181    }
182
183    @SmallTest
184    public void testMarkup() throws Exception {
185        SpannableString s;
186
187        s = new SpannableString("Hello bold world");
188        s.setSpan(new StyleSpan(Typeface.BOLD), 6, s.length() - 6,
189                  Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
190        assertEquals(Html.toHtml(s), "<p>Hello <b>bold</b> world</p>\n");
191
192        s = new SpannableString("Hello italic world");
193        s.setSpan(new StyleSpan(Typeface.ITALIC), 6, s.length() - 6,
194                  Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
195        assertEquals(Html.toHtml(s), "<p>Hello <i>italic</i> world</p>\n");
196
197        s = new SpannableString("Hello monospace world");
198        s.setSpan(new TypefaceSpan("monospace"), 6, s.length() - 6,
199                  Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
200        assertEquals(Html.toHtml(s), "<p>Hello <tt>monospace</tt> world</p>\n");
201
202        s = new SpannableString("Hello superscript world");
203        s.setSpan(new SuperscriptSpan(), 6, s.length() - 6,
204                  Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
205        assertEquals(Html.toHtml(s), "<p>Hello <sup>superscript</sup> world</p>\n");
206
207        s = new SpannableString("Hello subscript world");
208        s.setSpan(new SubscriptSpan(), 6, s.length() - 6,
209                  Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
210        assertEquals(Html.toHtml(s), "<p>Hello <sub>subscript</sub> world</p>\n");
211
212        s = new SpannableString("Hello underline world");
213        s.setSpan(new UnderlineSpan(), 6, s.length() - 6,
214                  Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
215        assertEquals(Html.toHtml(s), "<p>Hello <u>underline</u> world</p>\n");
216
217        s = new SpannableString("Hello struck world");
218        s.setSpan(new StrikethroughSpan(), 6, s.length() - 6,
219                  Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
220        assertEquals(Html.toHtml(s), "<p>Hello <strike>struck</strike> world</p>\n");
221
222        s = new SpannableString("Hello linky world");
223        s.setSpan(new URLSpan("http://www.google.com"), 6, s.length() - 6,
224                  Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
225        assertEquals(Html.toHtml(s),
226                     "<p>Hello <a href=\"http://www.google.com\">linky</a> world</p>\n");
227    }
228
229    @SmallTest
230    public void testImg() throws Exception {
231        Spanned s;
232
233        s = Html.fromHtml("yes<img src=\"http://example.com/foo.gif\">no");
234
235        assertEquals("<p>yes<img src=\"http://example.com/foo.gif\">no</p>\n",
236                     Html.toHtml(s));
237    }
238
239    @SmallTest
240    public void testUtf8() throws Exception {
241        Spanned s;
242
243        s = Html.fromHtml("<p>\u0124\u00eb\u0142\u0142o, world!</p>");
244        assertEquals("<p>&#292;&#235;&#322;&#322;o, world!</p>\n", Html.toHtml(s));
245    }
246
247}
248