diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/tx3g/Tx3gDecoderTest.java b/library/core/src/test/java/com/google/android/exoplayer2/text/tx3g/Tx3gDecoderTest.java index 58b9a853e7..ca84f901d8 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/text/tx3g/Tx3gDecoderTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/text/tx3g/Tx3gDecoderTest.java @@ -15,24 +15,18 @@ */ package com.google.android.exoplayer2.text.tx3g; +import static com.google.android.exoplayer2.testutil.truth.SpannedSubject.assertThat; import static com.google.common.truth.Truth.assertThat; -import static org.junit.Assert.fail; import android.graphics.Color; -import android.graphics.Typeface; import android.text.SpannedString; -import android.text.style.ForegroundColorSpan; -import android.text.style.StyleSpan; -import android.text.style.TypefaceSpan; -import android.text.style.UnderlineSpan; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.Subtitle; -import com.google.android.exoplayer2.text.SubtitleDecoderException; -import java.io.IOException; +import com.google.common.collect.ImmutableList; import java.util.Collections; import org.junit.Test; import org.junit.runner.RunWith; @@ -57,197 +51,184 @@ public final class Tx3gDecoderTest { "media/tx3g/initialization_all_defaults"; @Test - public void decodeNoSubtitle() throws IOException, SubtitleDecoderException { - Tx3gDecoder decoder = new Tx3gDecoder(Collections.emptyList()); + public void decodeNoSubtitle() throws Exception { + Tx3gDecoder decoder = new Tx3gDecoder(ImmutableList.of()); byte[] bytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), NO_SUBTITLE); + Subtitle subtitle = decoder.decode(bytes, bytes.length, false); + assertThat(subtitle.getCues(0)).isEmpty(); } @Test - public void decodeJustText() throws IOException, SubtitleDecoderException { - Tx3gDecoder decoder = new Tx3gDecoder(Collections.emptyList()); + public void decodeJustText() throws Exception { + Tx3gDecoder decoder = new Tx3gDecoder(ImmutableList.of()); byte[] bytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), SAMPLE_JUST_TEXT); + Subtitle subtitle = decoder.decode(bytes, bytes.length, false); + SpannedString text = new SpannedString(subtitle.getCues(0).get(0).text); assertThat(text.toString()).isEqualTo("CC Test"); - assertThat(text.getSpans(0, text.length(), Object.class)).hasLength(0); + assertThat(text).hasNoSpans(); assertFractionalLinePosition(subtitle.getCues(0).get(0), 0.85f); } @Test - public void decodeWithStyl() throws IOException, SubtitleDecoderException { - Tx3gDecoder decoder = new Tx3gDecoder(Collections.emptyList()); + public void decodeWithStyl() throws Exception { + Tx3gDecoder decoder = new Tx3gDecoder(ImmutableList.of()); byte[] bytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), SAMPLE_WITH_STYL); + Subtitle subtitle = decoder.decode(bytes, bytes.length, false); + SpannedString text = new SpannedString(subtitle.getCues(0).get(0).text); assertThat(text.toString()).isEqualTo("CC Test"); - assertThat(text.getSpans(0, text.length(), Object.class)).hasLength(3); - StyleSpan styleSpan = findSpan(text, 0, 6, StyleSpan.class); - assertThat(styleSpan.getStyle()).isEqualTo(Typeface.BOLD_ITALIC); - findSpan(text, 0, 6, UnderlineSpan.class); - ForegroundColorSpan colorSpan = findSpan(text, 0, 6, ForegroundColorSpan.class); - assertThat(colorSpan.getForegroundColor()).isEqualTo(Color.GREEN); + assertThat(text).hasBoldItalicSpanBetween(0, 6); + assertThat(text).hasUnderlineSpanBetween(0, 6); + assertThat(text).hasForegroundColorSpanBetween(0, 6).withColor(Color.GREEN); assertFractionalLinePosition(subtitle.getCues(0).get(0), 0.85f); } @Test - public void decodeWithStylAllDefaults() throws IOException, SubtitleDecoderException { - Tx3gDecoder decoder = new Tx3gDecoder(Collections.emptyList()); + public void decodeWithStylAllDefaults() throws Exception { + Tx3gDecoder decoder = new Tx3gDecoder(ImmutableList.of()); byte[] bytes = TestUtil.getByteArray( ApplicationProvider.getApplicationContext(), SAMPLE_WITH_STYL_ALL_DEFAULTS); + Subtitle subtitle = decoder.decode(bytes, bytes.length, false); + SpannedString text = new SpannedString(subtitle.getCues(0).get(0).text); assertThat(text.toString()).isEqualTo("CC Test"); - assertThat(text.getSpans(0, text.length(), Object.class)).hasLength(0); + assertThat(text).hasNoSpans(); assertFractionalLinePosition(subtitle.getCues(0).get(0), 0.85f); } @Test - public void decodeUtf16BeNoStyl() throws IOException, SubtitleDecoderException { - Tx3gDecoder decoder = new Tx3gDecoder(Collections.emptyList()); + public void decodeUtf16BeNoStyl() throws Exception { + Tx3gDecoder decoder = new Tx3gDecoder(ImmutableList.of()); byte[] bytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), SAMPLE_UTF16_BE_NO_STYL); + Subtitle subtitle = decoder.decode(bytes, bytes.length, false); + SpannedString text = new SpannedString(subtitle.getCues(0).get(0).text); assertThat(text.toString()).isEqualTo("你好"); - assertThat(text.getSpans(0, text.length(), Object.class)).hasLength(0); + assertThat(text).hasNoSpans(); assertFractionalLinePosition(subtitle.getCues(0).get(0), 0.85f); } @Test - public void decodeUtf16LeNoStyl() throws IOException, SubtitleDecoderException { - Tx3gDecoder decoder = new Tx3gDecoder(Collections.emptyList()); + public void decodeUtf16LeNoStyl() throws Exception { + Tx3gDecoder decoder = new Tx3gDecoder(ImmutableList.of()); byte[] bytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), SAMPLE_UTF16_LE_NO_STYL); Subtitle subtitle = decoder.decode(bytes, bytes.length, false); + SpannedString text = new SpannedString(subtitle.getCues(0).get(0).text); + assertThat(text.toString()).isEqualTo("你好"); - assertThat(text.getSpans(0, text.length(), Object.class)).hasLength(0); + assertThat(text).hasNoSpans(); assertFractionalLinePosition(subtitle.getCues(0).get(0), 0.85f); } @Test - public void decodeWithMultipleStyl() throws IOException, SubtitleDecoderException { - Tx3gDecoder decoder = new Tx3gDecoder(Collections.emptyList()); + public void decodeWithMultipleStyl() throws Exception { + Tx3gDecoder decoder = new Tx3gDecoder(ImmutableList.of()); byte[] bytes = TestUtil.getByteArray( ApplicationProvider.getApplicationContext(), SAMPLE_WITH_MULTIPLE_STYL); + Subtitle subtitle = decoder.decode(bytes, bytes.length, false); + SpannedString text = new SpannedString(subtitle.getCues(0).get(0).text); assertThat(text.toString()).isEqualTo("Line 2\nLine 3"); - assertThat(text.getSpans(0, text.length(), Object.class)).hasLength(4); - StyleSpan styleSpan = findSpan(text, 0, 5, StyleSpan.class); - assertThat(styleSpan.getStyle()).isEqualTo(Typeface.ITALIC); - findSpan(text, 7, 12, UnderlineSpan.class); - ForegroundColorSpan colorSpan = findSpan(text, 0, 5, ForegroundColorSpan.class); - assertThat(colorSpan.getForegroundColor()).isEqualTo(Color.GREEN); - colorSpan = findSpan(text, 7, 12, ForegroundColorSpan.class); - assertThat(colorSpan.getForegroundColor()).isEqualTo(Color.GREEN); + assertThat(text).hasItalicSpanBetween(0, 5); + assertThat(text).hasUnderlineSpanBetween(7, 12); + assertThat(text).hasForegroundColorSpanBetween(0, 5).withColor(Color.GREEN); + assertThat(text).hasForegroundColorSpanBetween(7, 12).withColor(Color.GREEN); assertFractionalLinePosition(subtitle.getCues(0).get(0), 0.85f); } @Test - public void decodeWithOtherExtension() throws IOException, SubtitleDecoderException { - Tx3gDecoder decoder = new Tx3gDecoder(Collections.emptyList()); + public void decodeWithOtherExtension() throws Exception { + Tx3gDecoder decoder = new Tx3gDecoder(ImmutableList.of()); byte[] bytes = TestUtil.getByteArray( ApplicationProvider.getApplicationContext(), SAMPLE_WITH_OTHER_EXTENSION); + Subtitle subtitle = decoder.decode(bytes, bytes.length, false); + SpannedString text = new SpannedString(subtitle.getCues(0).get(0).text); assertThat(text.toString()).isEqualTo("CC Test"); - assertThat(text.getSpans(0, text.length(), Object.class)).hasLength(2); - StyleSpan styleSpan = findSpan(text, 0, 6, StyleSpan.class); - assertThat(styleSpan.getStyle()).isEqualTo(Typeface.BOLD); - ForegroundColorSpan colorSpan = findSpan(text, 0, 6, ForegroundColorSpan.class); - assertThat(colorSpan.getForegroundColor()).isEqualTo(Color.GREEN); + assertThat(text).hasBoldSpanBetween(0, 6); + assertThat(text).hasForegroundColorSpanBetween(0, 6).withColor(Color.GREEN); assertFractionalLinePosition(subtitle.getCues(0).get(0), 0.85f); } @Test - public void initializationDecodeWithStyl() throws IOException, SubtitleDecoderException { + public void initializationDecodeWithStyl() throws Exception { byte[] initBytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), INITIALIZATION); Tx3gDecoder decoder = new Tx3gDecoder(Collections.singletonList(initBytes)); byte[] bytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), SAMPLE_WITH_STYL); + Subtitle subtitle = decoder.decode(bytes, bytes.length, false); + SpannedString text = new SpannedString(subtitle.getCues(0).get(0).text); assertThat(text.toString()).isEqualTo("CC Test"); - assertThat(text.getSpans(0, text.length(), Object.class)).hasLength(5); - StyleSpan styleSpan = findSpan(text, 0, text.length(), StyleSpan.class); - assertThat(styleSpan.getStyle()).isEqualTo(Typeface.BOLD_ITALIC); - findSpan(text, 0, text.length(), UnderlineSpan.class); - TypefaceSpan typefaceSpan = findSpan(text, 0, text.length(), TypefaceSpan.class); - assertThat(typefaceSpan.getFamily()).isEqualTo(C.SERIF_NAME); - ForegroundColorSpan colorSpan = findSpan(text, 0, text.length(), ForegroundColorSpan.class); - assertThat(colorSpan.getForegroundColor()).isEqualTo(Color.RED); - colorSpan = findSpan(text, 0, 6, ForegroundColorSpan.class); - assertThat(colorSpan.getForegroundColor()).isEqualTo(Color.GREEN); + assertThat(text).hasBoldItalicSpanBetween(0, 7); + assertThat(text).hasUnderlineSpanBetween(0, 7); + assertThat(text).hasTypefaceSpanBetween(0, 7).withFamily(C.SERIF_NAME); + // TODO(internal b/171984212): Fix Tx3gDecoder to avoid overlapping spans of the same type. + assertThat(text).hasForegroundColorSpanBetween(0, 7).withColor(Color.RED); + assertThat(text).hasForegroundColorSpanBetween(0, 6).withColor(Color.GREEN); assertFractionalLinePosition(subtitle.getCues(0).get(0), 0.1f); } @Test - public void initializationDecodeWithTbox() throws IOException, SubtitleDecoderException { + public void initializationDecodeWithTbox() throws Exception { byte[] initBytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), INITIALIZATION); Tx3gDecoder decoder = new Tx3gDecoder(Collections.singletonList(initBytes)); byte[] bytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), SAMPLE_WITH_TBOX); + Subtitle subtitle = decoder.decode(bytes, bytes.length, false); + SpannedString text = new SpannedString(subtitle.getCues(0).get(0).text); assertThat(text.toString()).isEqualTo("CC Test"); - assertThat(text.getSpans(0, text.length(), Object.class)).hasLength(4); - StyleSpan styleSpan = findSpan(text, 0, text.length(), StyleSpan.class); - assertThat(styleSpan.getStyle()).isEqualTo(Typeface.BOLD_ITALIC); - findSpan(text, 0, text.length(), UnderlineSpan.class); - TypefaceSpan typefaceSpan = findSpan(text, 0, text.length(), TypefaceSpan.class); - assertThat(typefaceSpan.getFamily()).isEqualTo(C.SERIF_NAME); - ForegroundColorSpan colorSpan = findSpan(text, 0, text.length(), ForegroundColorSpan.class); - assertThat(colorSpan.getForegroundColor()).isEqualTo(Color.RED); + assertThat(text).hasBoldItalicSpanBetween(0, 7); + assertThat(text).hasUnderlineSpanBetween(0, 7); + assertThat(text).hasTypefaceSpanBetween(0, 7).withFamily(C.SERIF_NAME); + assertThat(text).hasForegroundColorSpanBetween(0, 7).withColor(Color.RED); assertFractionalLinePosition(subtitle.getCues(0).get(0), 0.1875f); } @Test - public void initializationAllDefaultsDecodeWithStyl() - throws IOException, SubtitleDecoderException { + public void initializationAllDefaultsDecodeWithStyl() throws Exception { byte[] initBytes = TestUtil.getByteArray( ApplicationProvider.getApplicationContext(), INITIALIZATION_ALL_DEFAULTS); Tx3gDecoder decoder = new Tx3gDecoder(Collections.singletonList(initBytes)); byte[] bytes = TestUtil.getByteArray(ApplicationProvider.getApplicationContext(), SAMPLE_WITH_STYL); + Subtitle subtitle = decoder.decode(bytes, bytes.length, false); + SpannedString text = new SpannedString(subtitle.getCues(0).get(0).text); assertThat(text.toString()).isEqualTo("CC Test"); - assertThat(text.getSpans(0, text.length(), Object.class)).hasLength(3); - StyleSpan styleSpan = findSpan(text, 0, 6, StyleSpan.class); - assertThat(styleSpan.getStyle()).isEqualTo(Typeface.BOLD_ITALIC); - findSpan(text, 0, 6, UnderlineSpan.class); - ForegroundColorSpan colorSpan = findSpan(text, 0, 6, ForegroundColorSpan.class); - assertThat(colorSpan.getForegroundColor()).isEqualTo(Color.GREEN); + assertThat(text).hasBoldItalicSpanBetween(0, 6); + assertThat(text).hasUnderlineSpanBetween(0, 6); + assertThat(text).hasForegroundColorSpanBetween(0, 6).withColor(Color.GREEN); assertFractionalLinePosition(subtitle.getCues(0).get(0), 0.85f); } - private static T findSpan( - SpannedString testObject, int expectedStart, int expectedEnd, Class expectedType) { - T[] spans = testObject.getSpans(0, testObject.length(), expectedType); - for (T span : spans) { - if (testObject.getSpanStart(span) == expectedStart - && testObject.getSpanEnd(span) == expectedEnd) { - return span; - } - } - fail("Span not found."); - return null; - } - private static void assertFractionalLinePosition(Cue cue, float expectedFraction) { assertThat(cue.lineType).isEqualTo(Cue.LINE_TYPE_FRACTION); assertThat(cue.lineAnchor).isEqualTo(Cue.ANCHOR_TYPE_START); - assertThat(Math.abs(expectedFraction - cue.line) < 1e-6).isTrue(); + assertThat(cue.line).isWithin(1e-6f).of(expectedFraction); } }