package org.wordpress.android.editor; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.CharacterStyle; import android.text.style.ForegroundColorSpan; import android.text.style.RelativeSizeSpan; import android.text.style.StyleSpan; import android.text.style.UnderlineSpan; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import static org.junit.Assert.assertEquals; @Config(sdk = 18) @RunWith(RobolectricTestRunner.class) public class HtmlStyleUtilsTest { @Test public void testBulkStyling() { // -- Test bulk styling Spannable content = new SpannableStringBuilder("text <b>bold</b> & <!--a comment--> <a href=\"website\">link</a>"); HtmlStyleUtils.styleHtmlForDisplay(content); assertEquals(0, content.getSpans(0, 5, CharacterStyle.class).length); // 'text ' assertEquals(1, content.getSpans(5, 8, ForegroundColorSpan.class).length); // '<b>' assertEquals(1, content.getSpans(12, 16, ForegroundColorSpan.class).length); // '</b>' assertEquals(1, content.getSpans(17, 22, ForegroundColorSpan.class).length); // '&' assertEquals(1, content.getSpans(17, 22, StyleSpan.class).length); // '&' assertEquals(1, content.getSpans(17, 22, RelativeSizeSpan.class).length); // '&' assertEquals(1, content.getSpans(23, 39, ForegroundColorSpan.class).length); // '<!--a comment-->' assertEquals(1, content.getSpans(23, 39, StyleSpan.class).length); // '<!--a comment-->' assertEquals(1, content.getSpans(23, 39, RelativeSizeSpan.class).length); // '<!--a comment-->' assertEquals(2, content.getSpans(40, 58, ForegroundColorSpan.class).length); // '<a href="website">' assertEquals(1, content.getSpans(40, 48, ForegroundColorSpan.class).length); // '<a href=' // Attribute span is applied on top of tag span, so there should be 2 ForegroundColorSpans present assertEquals(2, content.getSpans(48, 57, ForegroundColorSpan.class).length); // '"website"' assertEquals(1, content.getSpans(57, 58, ForegroundColorSpan.class).length); // '>' assertEquals(0, content.getSpans(58, 62, CharacterStyle.class).length); // 'link' assertEquals(1, content.getSpans(62, 66, ForegroundColorSpan.class).length); // '</a>' } @Test public void testClearSpans() { Spannable content = new SpannableStringBuilder("<b>text &"); HtmlStyleUtils.styleHtmlForDisplay(content); assertEquals(1, content.getSpans(0, 3, ForegroundColorSpan.class).length); // '<b>' assertEquals(1, content.getSpans(9, 14, ForegroundColorSpan.class).length); // '&' assertEquals(1, content.getSpans(9, 14, StyleSpan.class).length); // '&' assertEquals(1, content.getSpans(9, 14, RelativeSizeSpan.class).length); // '&' HtmlStyleUtils.clearSpans(content, 9, 14); assertEquals(1, content.getSpans(0, 3, ForegroundColorSpan.class).length); assertEquals(0, content.getSpans(9, 14, ForegroundColorSpan.class).length); assertEquals(0, content.getSpans(9, 14, StyleSpan.class).length); assertEquals(0, content.getSpans(9, 14, RelativeSizeSpan.class).length); HtmlStyleUtils.clearSpans(content, 0, 3); assertEquals(0, content.getSpans(0, 3, ForegroundColorSpan.class).length); } @Test public void testClearSpansShouldIgnoreUnderline() { // clearSpans() should ignore UnderlineSpan as it's used by the system for spelling suggestions Spannable content = new SpannableStringBuilder("test"); content.setSpan(new UnderlineSpan(), 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); HtmlStyleUtils.clearSpans(content, 0, 4); assertEquals(1, content.getSpans(0, 4, UnderlineSpan.class).length); } }