Commit 38e9213a by ibaker Committed by Ian Baker

Use SpannedSubject in WebvttCueParserTest

This is a useful test to see if it works well in a real situation.

PiperOrigin-RevId: 285386471
parent 1ddac0c7
...@@ -15,14 +15,10 @@ ...@@ -15,14 +15,10 @@
*/ */
package com.google.android.exoplayer2.text.webvtt; package com.google.android.exoplayer2.text.webvtt;
import static android.graphics.Typeface.BOLD; import static com.google.android.exoplayer2.testutil.truth.SpannedSubject.assertThat;
import static android.graphics.Typeface.ITALIC;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import android.graphics.Typeface;
import android.text.Spanned; import android.text.Spanned;
import android.text.style.StyleSpan;
import android.text.style.UnderlineSpan;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import java.util.Collections; import java.util.Collections;
import org.junit.Test; import org.junit.Test;
...@@ -38,29 +34,22 @@ public final class WebvttCueParserTest { ...@@ -38,29 +34,22 @@ public final class WebvttCueParserTest {
+ "This <u.style1.style2 some stuff>is</u> text with <b.foo><i.bar>html</i></b> tags"); + "This <u.style1.style2 some stuff>is</u> text with <b.foo><i.bar>html</i></b> tags");
assertThat(text.toString()).isEqualTo("This is text with html tags"); assertThat(text.toString()).isEqualTo("This is text with html tags");
assertThat(text)
UnderlineSpan[] underlineSpans = getSpans(text, UnderlineSpan.class); .hasUnderlineSpan("This ".length(), "This is".length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
StyleSpan[] styleSpans = getSpans(text, StyleSpan.class); assertThat(text)
assertThat(underlineSpans).hasLength(1); .hasBoldItalicSpan(
assertThat(styleSpans).hasLength(2); "This is text with ".length(),
assertThat(styleSpans[0].getStyle()).isEqualTo(ITALIC); "This is text with html".length(),
assertThat(styleSpans[1].getStyle()).isEqualTo(BOLD); Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
assertThat(text.getSpanStart(underlineSpans[0])).isEqualTo(5);
assertThat(text.getSpanEnd(underlineSpans[0])).isEqualTo(7);
assertThat(text.getSpanStart(styleSpans[0])).isEqualTo(18);
assertThat(text.getSpanStart(styleSpans[1])).isEqualTo(18);
assertThat(text.getSpanEnd(styleSpans[0])).isEqualTo(22);
assertThat(text.getSpanEnd(styleSpans[1])).isEqualTo(22);
} }
@Test @Test
public void testParseStrictValidUnsupportedTagsStrippedOut() throws Exception { public void testParseStrictValidUnsupportedTagsStrippedOut() throws Exception {
Spanned text = parseCueText("<v.first.loud Esme>This <unsupported>is</unsupported> text with " Spanned text = parseCueText("<v.first.loud Esme>This <unsupported>is</unsupported> text with "
+ "<notsupp><invalid>html</invalid></notsupp> tags"); + "<notsupp><invalid>html</invalid></notsupp> tags");
assertThat(text.toString()).isEqualTo("This is text with html tags"); assertThat(text.toString()).isEqualTo("This is text with html tags");
assertThat(getSpans(text, UnderlineSpan.class)).hasLength(0); assertThat(text).hasNoSpans();
assertThat(getSpans(text, StyleSpan.class)).hasLength(0);
} }
@Test @Test
...@@ -69,80 +58,67 @@ public final class WebvttCueParserTest { ...@@ -69,80 +58,67 @@ public final class WebvttCueParserTest {
+ "<i>italic</i> inside"); + "<i>italic</i> inside");
assertThat(text.toString()).isEqualTo("An unclosed u tag with italic inside"); assertThat(text.toString()).isEqualTo("An unclosed u tag with italic inside");
assertThat(text)
UnderlineSpan[] underlineSpans = getSpans(text, UnderlineSpan.class); .hasUnderlineSpan(
StyleSpan[] styleSpans = getSpans(text, StyleSpan.class); "An ".length(),
assertThat(underlineSpans).hasLength(1); "An unclosed u tag with italic inside".length(),
assertThat(styleSpans).hasLength(1); Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
assertThat(styleSpans[0].getStyle()).isEqualTo(ITALIC); assertThat(text)
.hasItalicSpan(
assertThat(text.getSpanStart(underlineSpans[0])).isEqualTo(3); "An unclosed u tag with ".length(),
assertThat(text.getSpanStart(styleSpans[0])).isEqualTo(23); "An unclosed u tag with italic".length(),
assertThat(text.getSpanEnd(styleSpans[0])).isEqualTo(29); Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
assertThat(text.getSpanEnd(underlineSpans[0])).isEqualTo(36);
} }
@Test @Test
public void testParseWellFormedUnclosedEndAtParent() throws Exception { public void testParseWellFormedUnclosedEndAtParent() throws Exception {
Spanned text = parseCueText("An unclosed u tag with <i><u>underline and italic</i> inside"); Spanned text = parseCueText("An italic tag with unclosed <i><u>underline</i> inside");
assertThat(text.toString()).isEqualTo("An unclosed u tag with underline and italic inside");
UnderlineSpan[] underlineSpans = getSpans(text, UnderlineSpan.class); assertThat(text.toString()).isEqualTo("An italic tag with unclosed underline inside");
StyleSpan[] styleSpans = getSpans(text, StyleSpan.class); assertThat(text)
assertThat(underlineSpans).hasLength(1); .hasItalicSpan(
assertThat(styleSpans).hasLength(1); "An italic tag with unclosed ".length(),
"An italic tag with unclosed underline".length(),
assertThat(text.getSpanStart(underlineSpans[0])).isEqualTo(23); Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
assertThat(text.getSpanStart(styleSpans[0])).isEqualTo(23); assertThat(text)
assertThat(text.getSpanEnd(underlineSpans[0])).isEqualTo(43); .hasUnderlineSpan(
assertThat(text.getSpanEnd(styleSpans[0])).isEqualTo(43); "An italic tag with unclosed ".length(),
"An italic tag with unclosed underline".length(),
assertThat(styleSpans[0].getStyle()).isEqualTo(ITALIC); Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} }
@Test @Test
public void testParseMalformedNestedElements() throws Exception { public void testParseMalformedNestedElements() throws Exception {
Spanned text = parseCueText("<b><u>An unclosed u tag with <i>italic</u> inside</i></b>"); Spanned text = parseCueText("<b><u>Overlapping u <i>and</u> i tags</i></b>");
assertThat(text.toString()).isEqualTo("An unclosed u tag with italic inside");
UnderlineSpan[] underlineSpans = getSpans(text, UnderlineSpan.class); String expectedText = "Overlapping u and i tags";
StyleSpan[] styleSpans = getSpans(text, StyleSpan.class); assertThat(text.toString()).isEqualTo(expectedText);
assertThat(underlineSpans).hasLength(1); assertThat(text).hasBoldSpan(0, expectedText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
assertThat(styleSpans).hasLength(2); // Text between the <u> tags is underlined.
assertThat(text)
// all tags applied until matching start tag found .hasUnderlineSpan(0, "Overlapping u and".length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
assertThat(text.getSpanStart(underlineSpans[0])).isEqualTo(0); // Only text from <i> to <\\u> is italic (unexpected - but simplifies the parsing).
assertThat(text.getSpanEnd(underlineSpans[0])).isEqualTo(29); assertThat(text)
if (styleSpans[0].getStyle() == Typeface.BOLD) { .hasItalicSpan(
assertThat(text.getSpanStart(styleSpans[0])).isEqualTo(0); "Overlapping u ".length(),
assertThat(text.getSpanStart(styleSpans[1])).isEqualTo(23); "Overlapping u and".length(),
assertThat(text.getSpanEnd(styleSpans[1])).isEqualTo(29); Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
assertThat(text.getSpanEnd(styleSpans[0])).isEqualTo(36);
} else {
assertThat(text.getSpanStart(styleSpans[1])).isEqualTo(0);
assertThat(text.getSpanStart(styleSpans[0])).isEqualTo(23);
assertThat(text.getSpanEnd(styleSpans[0])).isEqualTo(29);
assertThat(text.getSpanEnd(styleSpans[1])).isEqualTo(36);
}
} }
@Test @Test
public void testParseCloseNonExistingTag() throws Exception { public void testParseCloseNonExistingTag() throws Exception {
Spanned text = parseCueText("blah<b>blah</i>blah</b>blah"); Spanned text = parseCueText("foo<b>bar</i>baz</b>buzz");
assertThat(text.toString()).isEqualTo("blahblahblahblah"); assertThat(text.toString()).isEqualTo("foobarbazbuzz");
StyleSpan[] spans = getSpans(text, StyleSpan.class); // endIndex should be 9 when valid (i.e. "foobarbaz".length()
assertThat(spans).hasLength(1); assertThat(text)
assertThat(spans[0].getStyle()).isEqualTo(BOLD); .hasBoldSpan("foo".length(), "foobar".length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
assertThat(text.getSpanStart(spans[0])).isEqualTo(4);
assertThat(text.getSpanEnd(spans[0])).isEqualTo(8); // should be 12 when valid
} }
@Test @Test
public void testParseEmptyTagName() throws Exception { public void testParseEmptyTagName() throws Exception {
Spanned text = parseCueText("An unclosed u tag with <>italic inside"); Spanned text = parseCueText("An empty <>tag");
assertThat(text.toString()).isEqualTo("An unclosed u tag with italic inside"); assertThat(text.toString()).isEqualTo("An empty tag");
} }
@Test @Test
...@@ -186,14 +162,13 @@ public final class WebvttCueParserTest { ...@@ -186,14 +162,13 @@ public final class WebvttCueParserTest {
Spanned text = parseCueText("blah <b>blah</b> blah <b>foo</b>"); Spanned text = parseCueText("blah <b>blah</b> blah <b>foo</b>");
assertThat(text.toString()).isEqualTo("blah blah blah foo"); assertThat(text.toString()).isEqualTo("blah blah blah foo");
StyleSpan[] spans = getSpans(text, StyleSpan.class); assertThat(text)
assertThat(spans).hasLength(2); .hasBoldSpan("blah ".length(), "blah blah".length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
assertThat(text.getSpanStart(spans[0])).isEqualTo(5); assertThat(text)
assertThat(text.getSpanEnd(spans[0])).isEqualTo(9); .hasBoldSpan(
assertThat(text.getSpanStart(spans[1])).isEqualTo(15); "blah blah blah ".length(),
assertThat(text.getSpanEnd(spans[1])).isEqualTo(18); "blah blah blah foo".length(),
assertThat(spans[0].getStyle()).isEqualTo(BOLD); Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
assertThat(spans[1].getStyle()).isEqualTo(BOLD);
} }
@Test @Test
...@@ -201,8 +176,7 @@ public final class WebvttCueParserTest { ...@@ -201,8 +176,7 @@ public final class WebvttCueParserTest {
Spanned text = parseCueText("blah <b/.st1.st2 trailing stuff> blah"); Spanned text = parseCueText("blah <b/.st1.st2 trailing stuff> blah");
assertThat(text.toString()).isEqualTo("blah blah"); assertThat(text.toString()).isEqualTo("blah blah");
StyleSpan[] spans = getSpans(text, StyleSpan.class); assertThat(text).hasNoSpans();
assertThat(spans).hasLength(0);
} }
@Test @Test
......
...@@ -58,6 +58,16 @@ public final class SpannedSubject extends Subject { ...@@ -58,6 +58,16 @@ public final class SpannedSubject extends Subject {
return assertAbout(spanned()).that(spanned); return assertAbout(spanned()).that(spanned);
} }
public void hasNoSpans() {
Object[] spans = actual.getSpans(0, actual.length(), Object.class);
if (spans.length > 0) {
failWithoutActual(
simpleFact("Expected no spans"),
fact("in text", actual),
fact("but found", actualSpansString()));
}
}
/** /**
* Checks that the subject has an italic span from {@code startIndex} to {@code endIndex}. * Checks that the subject has an italic span from {@code startIndex} to {@code endIndex}.
* *
......
...@@ -36,6 +36,24 @@ import org.junit.runner.RunWith; ...@@ -36,6 +36,24 @@ import org.junit.runner.RunWith;
public class SpannedSubjectTest { public class SpannedSubjectTest {
@Test @Test
public void hasNoSpans_success() {
SpannableString spannable = SpannableString.valueOf("test with no spans");
assertThat(spannable).hasNoSpans();
}
@Test
public void hasNoSpans_failure() {
SpannableString spannable = SpannableString.valueOf("test with underlined section");
spannable.setSpan(new UnderlineSpan(), 5, 10, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
AssertionError expected =
expectFailure(whenTesting -> whenTesting.that(spannable).hasNoSpans());
assertThat(expected).factKeys().contains("Expected no spans");
assertThat(expected).factValue("but found").contains("start=" + 5);
}
@Test
public void italicSpan_success() { public void italicSpan_success() {
SpannableString spannable = SpannableString.valueOf("test with italic section"); SpannableString spannable = SpannableString.valueOf("test with italic section");
int start = "test with ".length(); int start = "test with ".length();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment