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 17 package android.text; 18 19 import android.content.res.ColorStateList; 20 import android.content.res.Resources; 21 import android.graphics.Typeface; 22 import android.test.suitebuilder.annotation.SmallTest; 23 import android.text.style.ForegroundColorSpan; 24 import android.text.style.QuoteSpan; 25 import android.text.style.StrikethroughSpan; 26 import android.text.style.StyleSpan; 27 import android.text.style.SubscriptSpan; 28 import android.text.style.SuperscriptSpan; 29 import android.text.style.TextAppearanceSpan; 30 import android.text.style.TypefaceSpan; 31 import android.text.style.URLSpan; 32 import android.text.style.UnderlineSpan; 33 34 import junit.framework.TestCase; 35 36 public 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("© > <").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 <&> world</p>\n"); 175 176 s = new SpannableString("Hello \u03D5 world"); 177 assertEquals(Html.toHtml(s), "<p>Hello ϕ world</p>\n"); 178 179 s = new SpannableString("Hello world"); 180 assertEquals(Html.toHtml(s), "<p>Hello 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>Ĥëłło, world!</p>\n", Html.toHtml(s)); 245 } 246 247 } 248