package yuku.alkitab.test; import android.support.annotation.NonNull; import android.text.SpannableStringBuilder; import junit.framework.TestCase; import yuku.alkitab.base.widget.FormattedTextRenderer; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; public class FormattedTextRendererTest extends TestCase { SpannableStringBuilder mockSb() { return new SpannableStringBuilder() { String chars = ""; List<Object[]> spans = new ArrayList<>(); @NonNull @Override public SpannableStringBuilder append(final CharSequence text) { chars += text; return this; } @NonNull @Override public SpannableStringBuilder append(final CharSequence text, final int start, final int end) { chars += text.subSequence(start, end); return this; } @NonNull @Override public SpannableStringBuilder append(final char text) { chars += text; return this; } @NonNull @Override public String toString() { return chars; } @Override public int length() { return chars.length(); } @Override public void setSpan(final Object what, final int start, final int end, final int flags) { spans.add(new Object[]{what, start, end, flags}); } @Override public <T> T[] getSpans(final int queryStart, final int queryEnd, final Class<T> kind) { final List<T> list = new ArrayList<>(); for (final Object[] span : spans) { if (kind.isInstance(span[0])) { //noinspection unchecked list.add((T) span[0]); } } @SuppressWarnings("unchecked") final T[] res = (T[]) Array.newInstance(kind, list.size()); for (int i = 0; i < res.length; i++) { res[i] = list.get(i); } return res; } @Override public int getSpanStart(final Object what) { for (final Object[] span : spans) { if (span[0].equals(what)) { return (int) span[1]; } } return -1; } @Override public int getSpanEnd(final Object what) { for (final Object[] span : spans) { if (span[0].equals(what)) { return (int) span[2]; } } return -1; } }; } SpannableStringBuilder mockSb(String prefix) { final SpannableStringBuilder res = mockSb(); res.append(prefix); return res; } public void testPericopeRenderer() { // test robustness assertEquals("123", FormattedTextRenderer.render("123", mockSb()).toString()); assertEquals("23", FormattedTextRenderer.render("@123", mockSb()).toString()); assertEquals("123", FormattedTextRenderer.render("@@123", mockSb()).toString()); // test italic assertEquals("ab", FormattedTextRenderer.render("@@@9ab@7", mockSb()).toString()); assertEquals("abcd", FormattedTextRenderer.render("@@@9ab@7cd", mockSb()).toString()); assertEquals("abcd", FormattedTextRenderer.render("@@ab@9cd@7", mockSb()).toString()); // required vs optional formatting header assertEquals("ab", FormattedTextRenderer.render("@9ab@7", false, mockSb()).toString()); assertEquals("@9ab@7", FormattedTextRenderer.render("@9ab@7", true, mockSb()).toString()); assertEquals("ab", FormattedTextRenderer.render("@@@9ab@7", true, mockSb()).toString()); // appending test final SpannableStringBuilder prefix = mockSb("prefix"); assertEquals("prefixab", FormattedTextRenderer.render("@9ab@7", false, prefix).toString()); assertEquals("prefixab@9ab@7", FormattedTextRenderer.render("@9ab@7", true, prefix).toString()); assertEquals("prefixab@9ab@7ab", FormattedTextRenderer.render("@@@9ab@7", true, prefix).toString()); final SpannableStringBuilder text = FormattedTextRenderer.render("@@ab@9cd@7ef@9gh@7ij", mockSb()); final Object[] spans = text.getSpans(0, text.length(), Object.class); assertEquals(2, spans.length); assertEquals(2, text.getSpanStart(spans[0])); assertEquals(4, text.getSpanEnd(spans[0])); assertEquals(6, text.getSpanStart(spans[1])); assertEquals(8, text.getSpanEnd(spans[1])); assertTrue(FormattedTextRenderer.render("@@rr@@ab@9cd@9@@9@9@@&@&7&77@@7@7@7", mockSb()).toString().startsWith("rr@@abcd")); } }