diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/text/SubtitleExtractorTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/text/SubtitleExtractorTest.java index 9bbc2a0d24..cbe0fde5a5 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/text/SubtitleExtractorTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/text/SubtitleExtractorTest.java @@ -76,22 +76,26 @@ public class SubtitleExtractorTest { CuesWithTiming cues0 = decodeSample(trackOutput, 0); assertThat(cues0.startTimeUs).isEqualTo(0); assertThat(cues0.durationUs).isEqualTo(1_234_000); + assertThat(cues0.endTimeUs).isEqualTo(1_234_000); assertThat(cues0.cues).hasSize(1); assertThat(cues0.cues.get(0).text.toString()).isEqualTo("This is the first subtitle."); CuesWithTiming cues1 = decodeSample(trackOutput, 1); assertThat(cues1.startTimeUs).isEqualTo(2_345_000); assertThat(cues1.durationUs).isEqualTo(2_600_000 - 2_345_000); + assertThat(cues1.endTimeUs).isEqualTo(2_600_000); assertThat(cues1.cues).hasSize(1); assertThat(cues1.cues.get(0).text.toString()).isEqualTo("This is the second subtitle."); CuesWithTiming cues2 = decodeSample(trackOutput, 2); assertThat(cues2.startTimeUs).isEqualTo(2_600_000); assertThat(cues2.durationUs).isEqualTo(3_456_000 - 2_600_000); + assertThat(cues2.endTimeUs).isEqualTo(3_456_000); assertThat(cues2.cues).hasSize(2); assertThat(cues2.cues.get(0).text.toString()).isEqualTo("This is the second subtitle."); assertThat(cues2.cues.get(1).text.toString()).isEqualTo("This is the third subtitle."); CuesWithTiming cues3 = decodeSample(trackOutput, 3); assertThat(cues3.startTimeUs).isEqualTo(3_456_000); assertThat(cues3.durationUs).isEqualTo(4_567_000 - 3_456_000); + assertThat(cues3.endTimeUs).isEqualTo(4_567_000); assertThat(cues3.cues).hasSize(1); assertThat(cues3.cues.get(0).text.toString()).isEqualTo("This is the third subtitle."); } @@ -122,17 +126,20 @@ public class SubtitleExtractorTest { CuesWithTiming cues0 = decodeSample(trackOutput, 0); assertThat(cues0.startTimeUs).isEqualTo(2_345_000L); assertThat(cues0.durationUs).isEqualTo(2_600_000 - 2_345_000L); + assertThat(cues0.endTimeUs).isEqualTo(2_600_000); assertThat(cues0.cues).hasSize(1); assertThat(cues0.cues.get(0).text.toString()).isEqualTo("This is the second subtitle."); CuesWithTiming cues1 = decodeSample(trackOutput, 1); assertThat(cues1.startTimeUs).isEqualTo(2_600_000); assertThat(cues1.durationUs).isEqualTo(3_456_000 - 2_600_000); + assertThat(cues1.endTimeUs).isEqualTo(3_456_000); assertThat(cues1.cues).hasSize(2); assertThat(cues1.cues.get(0).text.toString()).isEqualTo("This is the second subtitle."); assertThat(cues1.cues.get(1).text.toString()).isEqualTo("This is the third subtitle."); CuesWithTiming cues2 = decodeSample(trackOutput, 2); assertThat(cues2.startTimeUs).isEqualTo(3_456_000); assertThat(cues2.durationUs).isEqualTo(4_567_000L - 3_456_000); + assertThat(cues2.endTimeUs).isEqualTo(4_567_000L); assertThat(cues2.cues).hasSize(1); assertThat(cues2.cues.get(0).text.toString()).isEqualTo("This is the third subtitle."); } @@ -163,17 +170,20 @@ public class SubtitleExtractorTest { CuesWithTiming cues0 = decodeSample(trackOutput, 0); assertThat(cues0.startTimeUs).isEqualTo(2_345_000L); assertThat(cues0.durationUs).isEqualTo(2_600_000 - 2_345_000L); + assertThat(cues0.endTimeUs).isEqualTo(2_600_000); assertThat(cues0.cues).hasSize(1); assertThat(cues0.cues.get(0).text.toString()).isEqualTo("This is the second subtitle."); CuesWithTiming cues1 = decodeSample(trackOutput, 1); assertThat(cues1.startTimeUs).isEqualTo(2_600_000); assertThat(cues1.durationUs).isEqualTo(3_456_000 - 2_600_000); + assertThat(cues1.endTimeUs).isEqualTo(3_456_000); assertThat(cues1.cues).hasSize(2); assertThat(cues1.cues.get(0).text.toString()).isEqualTo("This is the second subtitle."); assertThat(cues1.cues.get(1).text.toString()).isEqualTo("This is the third subtitle."); CuesWithTiming cues2 = decodeSample(trackOutput, 2); assertThat(cues2.startTimeUs).isEqualTo(3_456_000); assertThat(cues2.durationUs).isEqualTo(4_567_000L - 3_456_000); + assertThat(cues2.endTimeUs).isEqualTo(4_567_000L); assertThat(cues2.cues).hasSize(1); assertThat(cues2.cues.get(0).text.toString()).isEqualTo("This is the third subtitle."); } diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java index aab9bd0a37..f2bde68ae4 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/text/ssa/SsaParserTest.java @@ -164,6 +164,7 @@ public final class SsaParserTest { // Because of the length restriction, we only partially parse the third line of dialogue assertThat(allCues.get(1).startTimeUs).isEqualTo(4560000); assertThat(allCues.get(1).durationUs).isEqualTo(8900000 - 4560000); + assertThat(allCues.get(1).endTimeUs).isEqualTo(8900000); assertThat(allCues.get(1).cues.get(0).text.toString()).isEqualTo("This is the third subt"); } @@ -237,41 +238,49 @@ public final class SsaParserTest { assertThat(allCues).hasSize(8); assertThat(allCues.get(0).startTimeUs).isEqualTo(1_000_000); assertThat(allCues.get(0).durationUs).isEqualTo(1_000_000); + assertThat(allCues.get(0).endTimeUs).isEqualTo(2_000_000); assertThat(Iterables.transform(allCues.get(0).cues, cue -> cue.text.toString())) .containsExactly(firstSubtitleText); assertThat(allCues.get(1).startTimeUs).isEqualTo(2_000_000); assertThat(allCues.get(1).durationUs).isEqualTo(2_230_000); + assertThat(allCues.get(1).endTimeUs).isEqualTo(4_230_000); assertThat(Iterables.transform(allCues.get(1).cues, cue -> cue.text.toString())) .containsExactly(firstSubtitleText, secondSubtitleText); assertThat(allCues.get(2).startTimeUs).isEqualTo(4_230_000); assertThat(allCues.get(2).durationUs).isEqualTo(1_000_000); + assertThat(allCues.get(2).endTimeUs).isEqualTo(5_230_000); assertThat(Iterables.transform(allCues.get(2).cues, cue -> cue.text.toString())) .containsExactly(secondSubtitleText); assertThat(allCues.get(3).startTimeUs).isEqualTo(6_000_000); assertThat(allCues.get(3).durationUs).isEqualTo(2_440_000); + assertThat(allCues.get(3).endTimeUs).isEqualTo(8_440_000); assertThat(Iterables.transform(allCues.get(3).cues, cue -> cue.text.toString())) .containsExactly(thirdSubtitleText); assertThat(allCues.get(4).startTimeUs).isEqualTo(8_440_000); assertThat(allCues.get(4).durationUs).isEqualTo(1_000_000); + assertThat(allCues.get(4).endTimeUs).isEqualTo(9_440_000); assertThat(Iterables.transform(allCues.get(4).cues, cue -> cue.text.toString())) .containsExactly(fourthSubtitleText, fifthSubtitleText); assertThat(allCues.get(5).startTimeUs).isEqualTo(10_720_000); assertThat(allCues.get(5).durationUs).isEqualTo(2_500_000); + assertThat(allCues.get(5).endTimeUs).isEqualTo(13_220_000); assertThat(Iterables.transform(allCues.get(5).cues, cue -> cue.text.toString())) .containsExactly(sixthSubtitleText); assertThat(allCues.get(6).startTimeUs).isEqualTo(13_220_000); assertThat(allCues.get(6).durationUs).isEqualTo(1_000_000); + assertThat(allCues.get(6).endTimeUs).isEqualTo(14_220_000); assertThat(Iterables.transform(allCues.get(6).cues, cue -> cue.text.toString())) .containsExactly(sixthSubtitleText, seventhSubtitleText); assertThat(allCues.get(7).startTimeUs).isEqualTo(14_220_000); assertThat(allCues.get(7).durationUs).isEqualTo(1_430_000); + assertThat(allCues.get(7).endTimeUs).isEqualTo(15_650_000); assertThat(Iterables.transform(allCues.get(7).cues, cue -> cue.text.toString())) .containsExactly(sixthSubtitleText); } @@ -517,6 +526,7 @@ public final class SsaParserTest { private static void assertTypicalCue1(CuesWithTiming cuesWithTiming) { assertThat(cuesWithTiming.startTimeUs).isEqualTo(0); assertThat(cuesWithTiming.durationUs).isEqualTo(1230000); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(1230000); assertThat(cuesWithTiming.cues.get(0).text.toString()).isEqualTo("This is the first subtitle."); assertThat(Objects.requireNonNull(cuesWithTiming.cues.get(0).textAlignment)) .isEqualTo(Layout.Alignment.ALIGN_CENTER); @@ -525,6 +535,7 @@ public final class SsaParserTest { private static void assertTypicalCue2(CuesWithTiming cuesWithTiming) { assertThat(cuesWithTiming.startTimeUs).isEqualTo(2340000); assertThat(cuesWithTiming.durationUs).isEqualTo(3450000 - 2340000); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(3450000); assertThat(cuesWithTiming.cues.get(0).text.toString()) .isEqualTo("This is the second subtitle \nwith a newline \nand another."); } @@ -532,6 +543,7 @@ public final class SsaParserTest { private static void assertTypicalCue3(CuesWithTiming cuesWithTiming) { assertThat(cuesWithTiming.startTimeUs).isEqualTo(4560000); assertThat(cuesWithTiming.durationUs).isEqualTo(8900000 - 4560000); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(8900000); assertThat(cuesWithTiming.cues.get(0).text.toString()) .isEqualTo("This is the third subtitle, with a comma."); } diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/text/subrip/SubripParserTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/text/subrip/SubripParserTest.java index a9d0d95c32..c75de19fa1 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/text/subrip/SubripParserTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/text/subrip/SubripParserTest.java @@ -250,6 +250,7 @@ public final class SubripParserTest { assertTypicalCue1(allCues.get(0)); assertThat(allCues.get(1).startTimeUs).isEqualTo(2_000_000); assertThat(allCues.get(1).durationUs).isEqualTo(1_000_000); + assertThat(allCues.get(1).endTimeUs).isEqualTo(3_000_000); assertTypicalCue3(allCues.get(2)); } @@ -257,6 +258,7 @@ public final class SubripParserTest { assertThat(cuesWithTiming.startTimeUs).isEqualTo(0); assertThat(cuesWithTiming.cues.get(0).text.toString()).isEqualTo("This is the first subtitle."); assertThat(cuesWithTiming.durationUs).isEqualTo(1234000); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(1234000); } private static void assertTypicalCue2(CuesWithTiming cuesWithTiming) { @@ -264,6 +266,7 @@ public final class SubripParserTest { assertThat(cuesWithTiming.cues.get(0).text.toString()) .isEqualTo("This is the second subtitle.\nSecond subtitle with second line."); assertThat(cuesWithTiming.durationUs).isEqualTo(3456000 - 2345000); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(3456000); } private static void assertTypicalCue3(CuesWithTiming cuesWithTiming) { @@ -272,6 +275,7 @@ public final class SubripParserTest { assertThat(cuesWithTiming.cues.get(0).text.toString()).isEqualTo("This is the third subtitle."); long expectedEndTimeUs = (((2L * 60L * 60L) + 8L) * 1000L + 901L) * 1000L; assertThat(cuesWithTiming.durationUs).isEqualTo(expectedEndTimeUs - expectedStartTimeUs); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(expectedEndTimeUs); } private static void assertAlignmentCue( diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/text/ttml/TtmlParserTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/text/ttml/TtmlParserTest.java index 14b883756e..c66d9165ef 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/text/ttml/TtmlParserTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/text/ttml/TtmlParserTest.java @@ -486,8 +486,10 @@ public final class TtmlParserTest { assertThat(allCues).hasSize(2); assertThat(allCues.get(0).startTimeUs).isEqualTo(1_000_000); assertThat(allCues.get(0).durationUs).isEqualTo(10_000); + assertThat(allCues.get(0).endTimeUs).isEqualTo(1_010_000); assertThat((double) allCues.get(1).startTimeUs).isWithin(1000).of(1_001_000_000); assertThat((double) allCues.get(1).durationUs).isWithin(2000).of(1_001_000_000); + assertThat((double) allCues.get(1).endTimeUs).isWithin(2000).of(2_002_000_000); } @Test @@ -498,6 +500,7 @@ public final class TtmlParserTest { assertThat(allCues.get(0).startTimeUs).isEqualTo(200_000); assertThat(allCues.get(0).durationUs).isEqualTo(2_800_000); + assertThat(allCues.get(0).endTimeUs).isEqualTo(3_000_000); Cue cue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(cue.text).isNull(); assertThat(cue.bitmap).isNotNull(); @@ -508,6 +511,7 @@ public final class TtmlParserTest { assertThat(allCues.get(1).startTimeUs).isEqualTo(3_200_000); assertThat(allCues.get(1).durationUs).isEqualTo(3_737_000); + assertThat(allCues.get(1).endTimeUs).isEqualTo(6_937_000); cue = Iterables.getOnlyElement(allCues.get(1).cues); assertThat(cue.text).isNull(); assertThat(cue.bitmap).isNotNull(); diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/text/tx3g/Tx3gParserTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/text/tx3g/Tx3gParserTest.java index a946535855..bae64b0c52 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/text/tx3g/Tx3gParserTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/text/tx3g/Tx3gParserTest.java @@ -72,6 +72,7 @@ public final class Tx3gParserTest { assertThat(cuesWithTiming.cues).isEmpty(); assertThat(cuesWithTiming.startTimeUs).isEqualTo(C.TIME_UNSET); assertThat(cuesWithTiming.durationUs).isEqualTo(C.TIME_UNSET); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(C.TIME_UNSET); } @Test @@ -86,6 +87,7 @@ public final class Tx3gParserTest { assertThat(cuesWithTiming.startTimeUs).isEqualTo(C.TIME_UNSET); assertThat(cuesWithTiming.durationUs).isEqualTo(C.TIME_UNSET); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(C.TIME_UNSET); assertThat(text.toString()).isEqualTo("CC Test"); assertThat(text).hasNoSpans(); assertFractionalLinePosition(singleCue, 0.85f); @@ -103,6 +105,7 @@ public final class Tx3gParserTest { assertThat(cuesWithTiming.startTimeUs).isEqualTo(C.TIME_UNSET); assertThat(cuesWithTiming.durationUs).isEqualTo(C.TIME_UNSET); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(C.TIME_UNSET); assertThat(text.toString()).isEqualTo("CC Test"); assertThat(text).hasBoldItalicSpanBetween(0, 6); assertThat(text).hasUnderlineSpanBetween(0, 6); @@ -171,6 +174,7 @@ public final class Tx3gParserTest { assertThat(cuesWithTiming.startTimeUs).isEqualTo(C.TIME_UNSET); assertThat(cuesWithTiming.durationUs).isEqualTo(C.TIME_UNSET); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(C.TIME_UNSET); assertThat(text.toString()).isEqualTo("CC Test"); assertThat(text).hasNoSpans(); assertFractionalLinePosition(singleCue, 0.85f); @@ -188,6 +192,7 @@ public final class Tx3gParserTest { assertThat(cuesWithTiming.startTimeUs).isEqualTo(C.TIME_UNSET); assertThat(cuesWithTiming.durationUs).isEqualTo(C.TIME_UNSET); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(C.TIME_UNSET); assertThat(text.toString()).isEqualTo("你好"); assertThat(text).hasNoSpans(); assertFractionalLinePosition(singleCue, 0.85f); @@ -204,6 +209,7 @@ public final class Tx3gParserTest { assertThat(cuesWithTiming.startTimeUs).isEqualTo(C.TIME_UNSET); assertThat(cuesWithTiming.durationUs).isEqualTo(C.TIME_UNSET); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(C.TIME_UNSET); assertThat(text.toString()).isEqualTo("你好"); assertThat(text).hasNoSpans(); @@ -223,6 +229,7 @@ public final class Tx3gParserTest { assertThat(cuesWithTiming.startTimeUs).isEqualTo(C.TIME_UNSET); assertThat(cuesWithTiming.durationUs).isEqualTo(C.TIME_UNSET); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(C.TIME_UNSET); assertThat(text.toString()).isEqualTo("Line 2\nLine 3"); assertThat(text).hasItalicSpanBetween(0, 5); assertThat(text).hasUnderlineSpanBetween(7, 12); @@ -244,6 +251,7 @@ public final class Tx3gParserTest { assertThat(cuesWithTiming.startTimeUs).isEqualTo(C.TIME_UNSET); assertThat(cuesWithTiming.durationUs).isEqualTo(C.TIME_UNSET); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(C.TIME_UNSET); assertThat(text.toString()).isEqualTo("CC Test"); assertThat(text).hasBoldSpanBetween(0, 6); assertThat(text).hasForegroundColorSpanBetween(0, 6).withColor(Color.GREEN); @@ -264,6 +272,7 @@ public final class Tx3gParserTest { assertThat(cuesWithTiming.startTimeUs).isEqualTo(C.TIME_UNSET); assertThat(cuesWithTiming.durationUs).isEqualTo(C.TIME_UNSET); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(C.TIME_UNSET); assertThat(text.toString()).isEqualTo("CC Test"); assertThat(text).hasBoldItalicSpanBetween(0, 7); assertThat(text).hasUnderlineSpanBetween(0, 7); @@ -288,6 +297,7 @@ public final class Tx3gParserTest { assertThat(cuesWithTiming.startTimeUs).isEqualTo(C.TIME_UNSET); assertThat(cuesWithTiming.durationUs).isEqualTo(C.TIME_UNSET); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(C.TIME_UNSET); assertThat(text.toString()).isEqualTo("CC Test"); assertThat(text).hasBoldItalicSpanBetween(0, 7); assertThat(text).hasUnderlineSpanBetween(0, 7); @@ -311,6 +321,7 @@ public final class Tx3gParserTest { assertThat(cuesWithTiming.startTimeUs).isEqualTo(C.TIME_UNSET); assertThat(cuesWithTiming.durationUs).isEqualTo(C.TIME_UNSET); + assertThat(cuesWithTiming.endTimeUs).isEqualTo(C.TIME_UNSET); assertThat(text.toString()).isEqualTo("CC Test"); assertThat(text).hasBoldItalicSpanBetween(0, 6); assertThat(text).hasUnderlineSpanBetween(0, 6); diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/LegacySubtitleUtilWebvttTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/LegacySubtitleUtilWebvttTest.java index 6fed729f5c..fec89e5211 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/LegacySubtitleUtilWebvttTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/LegacySubtitleUtilWebvttTest.java @@ -72,10 +72,12 @@ public class LegacySubtitleUtilWebvttTest { assertThat(cuesWithTimingsList).hasSize(2); assertThat(cuesWithTimingsList.get(0).startTimeUs).isEqualTo(1_000_000); assertThat(cuesWithTimingsList.get(0).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(0).endTimeUs).isEqualTo(2_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(0).cues, c -> c.text)) .containsExactly(FIRST_SUBTITLE_STRING); assertThat(cuesWithTimingsList.get(1).startTimeUs).isEqualTo(3_000_000); assertThat(cuesWithTimingsList.get(1).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(1).endTimeUs).isEqualTo(4_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(1).cues, c -> c.text)) .containsExactly(SECOND_SUBTITLE_STRING); } @@ -88,15 +90,18 @@ public class LegacySubtitleUtilWebvttTest { assertThat(cuesWithTimingsList).hasSize(3); assertThat(cuesWithTimingsList.get(0).startTimeUs).isEqualTo(1_000_000); assertThat(cuesWithTimingsList.get(0).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(0).endTimeUs).isEqualTo(2_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(0).cues, c -> c.text)) .containsExactly(FIRST_SUBTITLE_STRING); assertThat(cuesWithTimingsList.get(1).startTimeUs).isEqualTo(2_000_000); assertThat(cuesWithTimingsList.get(1).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(1).endTimeUs).isEqualTo(3_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(1).cues, c -> c.text)) .containsExactly(FIRST_SUBTITLE_STRING, SECOND_SUBTITLE_STRING) .inOrder(); assertThat(cuesWithTimingsList.get(2).startTimeUs).isEqualTo(3_000_000); assertThat(cuesWithTimingsList.get(2).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(2).endTimeUs).isEqualTo(4_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(2).cues, c -> c.text)) .containsExactly(SECOND_SUBTITLE_STRING); } @@ -109,6 +114,7 @@ public class LegacySubtitleUtilWebvttTest { assertThat(cuesWithTimingsList).hasSize(1); assertThat(cuesWithTimingsList.get(0).startTimeUs).isEqualTo(3_000_000); assertThat(cuesWithTimingsList.get(0).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(0).endTimeUs).isEqualTo(4_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(0).cues, c -> c.text)) .containsExactly(SECOND_SUBTITLE_STRING); } @@ -121,6 +127,7 @@ public class LegacySubtitleUtilWebvttTest { assertThat(cuesWithTimingsList).hasSize(1); assertThat(cuesWithTimingsList.get(0).startTimeUs).isEqualTo(3_000_000); assertThat(cuesWithTimingsList.get(0).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(0).endTimeUs).isEqualTo(4_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(0).cues, c -> c.text)) .containsExactly(SECOND_SUBTITLE_STRING); } @@ -133,6 +140,7 @@ public class LegacySubtitleUtilWebvttTest { assertThat(cuesWithTimingsList).hasSize(1); assertThat(cuesWithTimingsList.get(0).startTimeUs).isEqualTo(3_000_000); assertThat(cuesWithTimingsList.get(0).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(0).endTimeUs).isEqualTo(4_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(0).cues, c -> c.text)) .containsExactly(SECOND_SUBTITLE_STRING); } @@ -145,10 +153,12 @@ public class LegacySubtitleUtilWebvttTest { assertThat(cuesWithTimingsList).hasSize(2); assertThat(cuesWithTimingsList.get(0).startTimeUs).isEqualTo(1_000_000); assertThat(cuesWithTimingsList.get(0).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(0).endTimeUs).isEqualTo(2_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(0).cues, c -> c.text)) .containsExactly(FIRST_SUBTITLE_STRING); assertThat(cuesWithTimingsList.get(1).startTimeUs).isEqualTo(3_000_000); assertThat(cuesWithTimingsList.get(1).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(1).endTimeUs).isEqualTo(4_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(1).cues, c -> c.text)) .containsExactly(SECOND_SUBTITLE_STRING); } @@ -162,11 +172,13 @@ public class LegacySubtitleUtilWebvttTest { assertThat(cuesWithTimingsList).hasSize(2); assertThat(cuesWithTimingsList.get(0).startTimeUs).isEqualTo(2_000_000); assertThat(cuesWithTimingsList.get(0).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(0).endTimeUs).isEqualTo(3_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(0).cues, c -> c.text)) .containsExactly(FIRST_SUBTITLE_STRING, SECOND_SUBTITLE_STRING) .inOrder(); assertThat(cuesWithTimingsList.get(1).startTimeUs).isEqualTo(3_000_000); assertThat(cuesWithTimingsList.get(1).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(1).endTimeUs).isEqualTo(4_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(1).cues, c -> c.text)) .containsExactly(SECOND_SUBTITLE_STRING); } @@ -181,10 +193,12 @@ public class LegacySubtitleUtilWebvttTest { assertThat(cuesWithTimingsList).hasSize(2); assertThat(cuesWithTimingsList.get(0).startTimeUs).isEqualTo(3_000_000); assertThat(cuesWithTimingsList.get(0).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(0).endTimeUs).isEqualTo(4_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(0).cues, c -> c.text)) .containsExactly(SECOND_SUBTITLE_STRING); assertThat(cuesWithTimingsList.get(1).startTimeUs).isEqualTo(1_000_000); assertThat(cuesWithTimingsList.get(1).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(1).endTimeUs).isEqualTo(2_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(1).cues, c -> c.text)) .containsExactly(FIRST_SUBTITLE_STRING); } @@ -199,15 +213,18 @@ public class LegacySubtitleUtilWebvttTest { assertThat(cuesWithTimingsList).hasSize(3); assertThat(cuesWithTimingsList.get(0).startTimeUs).isEqualTo(2_000_000); assertThat(cuesWithTimingsList.get(0).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(0).endTimeUs).isEqualTo(3_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(0).cues, c -> c.text)) .containsExactly(FIRST_SUBTITLE_STRING, SECOND_SUBTITLE_STRING) .inOrder(); assertThat(cuesWithTimingsList.get(1).startTimeUs).isEqualTo(3_000_000); assertThat(cuesWithTimingsList.get(1).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(1).endTimeUs).isEqualTo(4_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(1).cues, c -> c.text)) .containsExactly(SECOND_SUBTITLE_STRING); assertThat(cuesWithTimingsList.get(2).startTimeUs).isEqualTo(1_000_000); assertThat(cuesWithTimingsList.get(2).durationUs).isEqualTo(1_000_000); + assertThat(cuesWithTimingsList.get(2).endTimeUs).isEqualTo(2_000_000); assertThat(Lists.transform(cuesWithTimingsList.get(2).cues, c -> c.text)) .containsExactly(FIRST_SUBTITLE_STRING); } diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/Mp4WebvttParserTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/Mp4WebvttParserTest.java index 2d59bea071..f21623d56c 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/Mp4WebvttParserTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/Mp4WebvttParserTest.java @@ -196,6 +196,7 @@ public final class Mp4WebvttParserTest { assertThat(result.get(0).cues).isEmpty(); assertThat(result.get(0).startTimeUs).isEqualTo(C.TIME_UNSET); assertThat(result.get(0).durationUs).isEqualTo(C.TIME_UNSET); + assertThat(result.get(0).endTimeUs).isEqualTo(C.TIME_UNSET); } // Negative tests. diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/WebvttParserTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/WebvttParserTest.java index 47eb45aa3d..984eb6d1d5 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/WebvttParserTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/WebvttParserTest.java @@ -92,11 +92,13 @@ public class WebvttParserTest { assertThat(allCues.get(0).startTimeUs).isEqualTo(0L); assertThat(allCues.get(0).durationUs).isEqualTo(1_234_000L); + assertThat(allCues.get(0).endTimeUs).isEqualTo(1_234_000L); Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(firstCue.text.toString()).isEqualTo("This is the first subtitle."); assertThat(allCues.get(1).startTimeUs).isEqualTo(2_345_000L); assertThat(allCues.get(1).durationUs).isEqualTo(3_456_000L - 2_345_000L); + assertThat(allCues.get(1).endTimeUs).isEqualTo(3_456_000L); Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); assertThat(secondCue.text.toString()).isEqualTo("This is the second subtitle."); } @@ -110,6 +112,7 @@ public class WebvttParserTest { assertThat(allCues.get(0).startTimeUs).isEqualTo(2_345_000L); assertThat(allCues.get(0).durationUs).isEqualTo(3_456_000L - 2_345_000L); + assertThat(allCues.get(0).endTimeUs).isEqualTo(3_456_000L); Cue secondCue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(secondCue.text.toString()).isEqualTo("This is the second subtitle."); } @@ -124,11 +127,13 @@ public class WebvttParserTest { assertThat(allCues.get(0).startTimeUs).isEqualTo(2_345_000L); assertThat(allCues.get(0).durationUs).isEqualTo(3_456_000L - 2_345_000L); + assertThat(allCues.get(0).endTimeUs).isEqualTo(3_456_000L); Cue secondCue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(secondCue.text.toString()).isEqualTo("This is the second subtitle."); assertThat(allCues.get(1).startTimeUs).isEqualTo(0L); assertThat(allCues.get(1).durationUs).isEqualTo(1_234_000L); + assertThat(allCues.get(1).endTimeUs).isEqualTo(1_234_000L); Cue firstCue = Iterables.getOnlyElement(allCues.get(1).cues); assertThat(firstCue.text.toString()).isEqualTo("This is the first subtitle."); } @@ -141,11 +146,13 @@ public class WebvttParserTest { assertThat(allCues.get(0).startTimeUs).isEqualTo(0L); assertThat(allCues.get(0).durationUs).isEqualTo(1_234_000L); + assertThat(allCues.get(0).endTimeUs).isEqualTo(1_234_000L); Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(firstCue.text.toString()).isEqualTo("This is the first subtitle."); assertThat(allCues.get(1).startTimeUs).isEqualTo(2_345_000L); assertThat(allCues.get(1).durationUs).isEqualTo(3_456_000L - 2_345_000L); + assertThat(allCues.get(1).endTimeUs).isEqualTo(3_456_000L); Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); assertThat(secondCue.text.toString()).isEqualTo("This is the second subtitle."); } @@ -158,11 +165,13 @@ public class WebvttParserTest { assertThat(allCues.get(0).startTimeUs).isEqualTo(0L); assertThat(allCues.get(0).durationUs).isEqualTo(1_234_000L); + assertThat(allCues.get(0).endTimeUs).isEqualTo(1_234_000L); Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(firstCue.text.toString()).isEqualTo("This is the first subtitle."); assertThat(allCues.get(1).startTimeUs).isEqualTo(2_345_000L); assertThat(allCues.get(1).durationUs).isEqualTo(3_456_000L - 2_345_000L); + assertThat(allCues.get(1).endTimeUs).isEqualTo(3_456_000L); Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); assertThat(secondCue.text.toString()).isEqualTo("This is the second subtitle."); } @@ -175,11 +184,13 @@ public class WebvttParserTest { assertThat(allCues.get(0).startTimeUs).isEqualTo(0L); assertThat(allCues.get(0).durationUs).isEqualTo(1_234_000L); + assertThat(allCues.get(0).endTimeUs).isEqualTo(1_234_000L); Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(firstCue.text.toString()).isEqualTo("This is the first subtitle."); assertThat(allCues.get(1).startTimeUs).isEqualTo(2_345_000L); assertThat(allCues.get(1).durationUs).isEqualTo(3_456_000L - 2_345_000L); + assertThat(allCues.get(1).endTimeUs).isEqualTo(3_456_000L); Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); assertThat(secondCue.text.toString()).isEqualTo("This is the second subtitle."); } @@ -192,11 +203,13 @@ public class WebvttParserTest { assertThat(allCues.get(0).startTimeUs).isEqualTo(0L); assertThat(allCues.get(0).durationUs).isEqualTo(1_234_000L); + assertThat(allCues.get(0).endTimeUs).isEqualTo(1_234_000L); Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(firstCue.text.toString()).isEqualTo("This is the first subtitle."); assertThat(allCues.get(1).startTimeUs).isEqualTo(2_345_000L); assertThat(allCues.get(1).durationUs).isEqualTo(3_456_000L - 2_345_000L); + assertThat(allCues.get(1).endTimeUs).isEqualTo(3_456_000L); Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); assertThat(secondCue.text.toString()).isEqualTo("This is the second subtitle."); } @@ -209,21 +222,25 @@ public class WebvttParserTest { assertThat(allCues.get(0).startTimeUs).isEqualTo(0L); assertThat(allCues.get(0).durationUs).isEqualTo(1_234_000L); + assertThat(allCues.get(0).endTimeUs).isEqualTo(1_234_000L); Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(firstCue.text.toString()).isEqualTo("This is the first subtitle."); assertThat(allCues.get(1).startTimeUs).isEqualTo(2_345_000L); assertThat(allCues.get(1).durationUs).isEqualTo(3_456_000L - 2_345_000L); + assertThat(allCues.get(1).endTimeUs).isEqualTo(3_456_000L); Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); assertThat(secondCue.text.toString()).isEqualTo("This is the second subtitle."); assertThat(allCues.get(2).startTimeUs).isEqualTo(4_000_000L); assertThat(allCues.get(2).durationUs).isEqualTo(5_000_000L - 4_000_000L); + assertThat(allCues.get(2).endTimeUs).isEqualTo(5_000_000L); Cue thirdCue = Iterables.getOnlyElement(allCues.get(2).cues); assertThat(thirdCue.text.toString()).isEqualTo("This is the third subtitle."); assertThat(allCues.get(3).startTimeUs).isEqualTo(6_000_000L); assertThat(allCues.get(3).durationUs).isEqualTo(7_000_000L - 6_000_000L); + assertThat(allCues.get(3).endTimeUs).isEqualTo(7_000_000L); Cue fourthCue = Iterables.getOnlyElement(allCues.get(3).cues); assertThat(fourthCue.text.toString()).isEqualTo("This is the &subtitle."); } @@ -236,6 +253,7 @@ public class WebvttParserTest { assertThat(allCues.get(0).startTimeUs).isEqualTo(0L); assertThat(allCues.get(0).durationUs).isEqualTo(1_234_000L); + assertThat(allCues.get(0).endTimeUs).isEqualTo(1_234_000L); Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(firstCue.text.toString()).isEqualTo("This is the first subtitle."); assertThat(firstCue.position).isEqualTo(0.6f); @@ -250,6 +268,7 @@ public class WebvttParserTest { assertThat(allCues.get(1).startTimeUs).isEqualTo(2_345_000L); assertThat(allCues.get(1).durationUs).isEqualTo(3_456_000L - 2_345_000L); + assertThat(allCues.get(1).endTimeUs).isEqualTo(3_456_000L); Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); assertThat(secondCue.text.toString()).isEqualTo("This is the second subtitle."); // Position is invalid so defaults to 0.5 @@ -258,6 +277,7 @@ public class WebvttParserTest { assertThat(allCues.get(2).startTimeUs).isEqualTo(4_000_000L); assertThat(allCues.get(2).durationUs).isEqualTo(5_000_000L - 4_000_000L); + assertThat(allCues.get(2).endTimeUs).isEqualTo(5_000_000L); Cue thirdCue = Iterables.getOnlyElement(allCues.get(2).cues); assertThat(thirdCue.text.toString()).isEqualTo("This is the third subtitle."); assertThat(thirdCue.line).isEqualTo(0.45f); @@ -269,6 +289,7 @@ public class WebvttParserTest { assertThat(allCues.get(3).startTimeUs).isEqualTo(6_000_000L); assertThat(allCues.get(3).durationUs).isEqualTo(7_000_000L - 6_000_000L); + assertThat(allCues.get(3).endTimeUs).isEqualTo(7_000_000L); Cue fourthCue = Iterables.getOnlyElement(allCues.get(3).cues); assertThat(fourthCue.text.toString()).isEqualTo("This is the fourth subtitle."); assertThat(fourthCue.line).isEqualTo(-10f); @@ -280,6 +301,7 @@ public class WebvttParserTest { assertThat(allCues.get(4).startTimeUs).isEqualTo(8_000_000L); assertThat(allCues.get(4).durationUs).isEqualTo(9_000_000L - 8_000_000L); + assertThat(allCues.get(4).endTimeUs).isEqualTo(9_000_000L); Cue fifthCue = Iterables.getOnlyElement(allCues.get(4).cues); assertThat(fifthCue.text.toString()).isEqualTo("This is the fifth subtitle."); assertThat(fifthCue.textAlignment).isEqualTo(Alignment.ALIGN_OPPOSITE); @@ -289,6 +311,7 @@ public class WebvttParserTest { assertThat(allCues.get(5).startTimeUs).isEqualTo(10_000_000L); assertThat(allCues.get(5).durationUs).isEqualTo(11_000_000L - 10_000_000L); + assertThat(allCues.get(5).endTimeUs).isEqualTo(11_000_000L); Cue sixthCue = Iterables.getOnlyElement(allCues.get(5).cues); assertThat(sixthCue.text.toString()).isEqualTo("This is the sixth subtitle."); assertThat(sixthCue.textAlignment).isEqualTo(Alignment.ALIGN_CENTER); @@ -298,12 +321,14 @@ public class WebvttParserTest { assertThat(allCues.get(6).startTimeUs).isEqualTo(12_000_000L); assertThat(allCues.get(6).durationUs).isEqualTo(13_000_000L - 12_000_000L); + assertThat(allCues.get(6).endTimeUs).isEqualTo(13_000_000L); Cue seventhCue = Iterables.getOnlyElement(allCues.get(6).cues); assertThat(seventhCue.text.toString()).isEqualTo("This is the seventh subtitle."); assertThat(seventhCue.positionAnchor).isEqualTo(Cue.ANCHOR_TYPE_START); assertThat(allCues.get(7).startTimeUs).isEqualTo(14_000_000L); assertThat(allCues.get(7).durationUs).isEqualTo(15_000_000L - 14_000_000L); + assertThat(allCues.get(7).endTimeUs).isEqualTo(15_000_000L); Cue eighthCue = Iterables.getOnlyElement(allCues.get(7).cues); assertThat(eighthCue.text.toString()).isEqualTo("This is the eighth subtitle."); assertThat(eighthCue.positionAnchor).isEqualTo(Cue.ANCHOR_TYPE_END); @@ -317,6 +342,7 @@ public class WebvttParserTest { assertThat(allCues.get(0).startTimeUs).isEqualTo(0); assertThat(allCues.get(0).durationUs).isEqualTo(1_000_000); + assertThat(allCues.get(0).endTimeUs).isEqualTo(1_000_000); Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(firstCue.text.toString()).isEqualTo("Displayed at the bottom for 3 seconds."); assertThat(firstCue.line).isEqualTo(-1f); @@ -324,6 +350,7 @@ public class WebvttParserTest { assertThat(allCues.get(1).startTimeUs).isEqualTo(1_000_000); assertThat(allCues.get(1).durationUs).isEqualTo(1_000_000); + assertThat(allCues.get(1).endTimeUs).isEqualTo(2_000_000); ImmutableList firstAndSecondCue = allCues.get(1).cues; assertThat(firstAndSecondCue).hasSize(2); assertThat(firstAndSecondCue.get(0).text.toString()) @@ -337,6 +364,7 @@ public class WebvttParserTest { assertThat(allCues.get(2).startTimeUs).isEqualTo(2_000_000); assertThat(allCues.get(2).durationUs).isEqualTo(1_000_000); + assertThat(allCues.get(2).endTimeUs).isEqualTo(3_000_000); Cue thirdCue = Iterables.getOnlyElement(allCues.get(2).cues); assertThat(thirdCue.text.toString()).isEqualTo("Displayed at the bottom for 3 seconds."); assertThat(thirdCue.line).isEqualTo(-1f); @@ -344,6 +372,7 @@ public class WebvttParserTest { assertThat(allCues.get(3).startTimeUs).isEqualTo(4_000_000); assertThat(allCues.get(3).durationUs).isEqualTo(1_000_000); + assertThat(allCues.get(3).endTimeUs).isEqualTo(5_000_000); Cue fourthCue = Iterables.getOnlyElement(allCues.get(3).cues); assertThat(fourthCue.text.toString()).isEqualTo("Displayed at the bottom for 2 seconds."); assertThat(fourthCue.line).isEqualTo(-1f); @@ -351,6 +380,7 @@ public class WebvttParserTest { assertThat(allCues.get(4).startTimeUs).isEqualTo(5_000_000); assertThat(allCues.get(4).durationUs).isEqualTo(1_000_000); + assertThat(allCues.get(4).endTimeUs).isEqualTo(6_000_000); ImmutableList fourthAndFifth = allCues.get(4).cues; assertThat(fourthAndFifth).hasSize(2); assertThat(fourthAndFifth.get(0).text.toString()) @@ -364,6 +394,7 @@ public class WebvttParserTest { assertThat(allCues.get(5).startTimeUs).isEqualTo(6_000_000); assertThat(allCues.get(5).durationUs).isEqualTo(1_000_000); + assertThat(allCues.get(5).endTimeUs).isEqualTo(7_000_000); Cue sixthCue = Iterables.getOnlyElement(allCues.get(5).cues); assertThat(sixthCue.text.toString()) .isEqualTo("Appears directly above the previous cue, then replaces it after 1 second."); @@ -379,18 +410,21 @@ public class WebvttParserTest { assertThat(allCues.get(0).startTimeUs).isEqualTo(0L); assertThat(allCues.get(0).durationUs).isEqualTo(1_234_000L); + assertThat(allCues.get(0).endTimeUs).isEqualTo(1_234_000L); Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(firstCue.text.toString()).isEqualTo("Vertical right-to-left (e.g. Japanese)"); assertThat(firstCue.verticalType).isEqualTo(Cue.VERTICAL_TYPE_RL); assertThat(allCues.get(1).startTimeUs).isEqualTo(2_345_000L); assertThat(allCues.get(1).durationUs).isEqualTo(3_456_000L - 2_345_000L); + assertThat(allCues.get(1).endTimeUs).isEqualTo(3_456_000L); Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); assertThat(secondCue.text.toString()).isEqualTo("Vertical left-to-right (e.g. Mongolian)"); assertThat(secondCue.verticalType).isEqualTo(Cue.VERTICAL_TYPE_LR); assertThat(allCues.get(2).startTimeUs).isEqualTo(4_000_000L); assertThat(allCues.get(2).durationUs).isEqualTo(5_000_000L - 4_000_000L); + assertThat(allCues.get(2).endTimeUs).isEqualTo(5_000_000L); Cue thirdCue = Iterables.getOnlyElement(allCues.get(2).cues); assertThat(thirdCue.text.toString()).isEqualTo("No vertical setting (i.e. horizontal)"); assertThat(thirdCue.verticalType).isEqualTo(Cue.TYPE_UNSET); @@ -449,11 +483,13 @@ public class WebvttParserTest { assertThat(allCues.get(0).startTimeUs).isEqualTo(0L); assertThat(allCues.get(0).durationUs).isEqualTo(1_234_000L); + assertThat(allCues.get(0).endTimeUs).isEqualTo(1_234_000L); Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(firstCue.text.toString()).isEqualTo("This is the first subtitle."); assertThat(allCues.get(1).startTimeUs).isEqualTo(4_000_000L); assertThat(allCues.get(1).durationUs).isEqualTo(5_000_000L - 4_000_000L); + assertThat(allCues.get(1).endTimeUs).isEqualTo(5_000_000L); Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); assertThat(secondCue.text.toString()).isEqualTo("This is the third subtitle."); } @@ -466,6 +502,7 @@ public class WebvttParserTest { assertThat(allCues.get(0).startTimeUs).isEqualTo(0L); assertThat(allCues.get(0).durationUs).isEqualTo(2_000_000L); + assertThat(allCues.get(0).endTimeUs).isEqualTo(2_000_000L); Cue firstCue = Iterables.getOnlyElement(allCues.get(0).cues); assertThat(firstCue.text.toString()).isEqualTo("Sentence with font-size set to 4.4em."); assertThat((Spanned) firstCue.text) @@ -474,12 +511,14 @@ public class WebvttParserTest { assertThat(allCues.get(1).startTimeUs).isEqualTo(2_100_000L); assertThat(allCues.get(1).durationUs).isEqualTo(2_400_000L - 2_100_000L); + assertThat(allCues.get(1).endTimeUs).isEqualTo(2_400_000L); Cue secondCue = Iterables.getOnlyElement(allCues.get(1).cues); assertThat(secondCue.text.toString()).isEqualTo("Sentence with bad font-size unit."); assertThat((Spanned) secondCue.text).hasNoSpans(); assertThat(allCues.get(2).startTimeUs).isEqualTo(2_500_000L); assertThat(allCues.get(2).durationUs).isEqualTo(4_000_000L - 2_500_000L); + assertThat(allCues.get(2).endTimeUs).isEqualTo(4_000_000L); Cue thirdCue = Iterables.getOnlyElement(allCues.get(2).cues); assertThat(thirdCue.text.toString()).isEqualTo("Absolute font-size expressed in px unit!"); assertThat((Spanned) thirdCue.text) @@ -488,6 +527,7 @@ public class WebvttParserTest { assertThat(allCues.get(3).startTimeUs).isEqualTo(4_500_000L); assertThat(allCues.get(3).durationUs).isEqualTo(6_000_000L - 4_500_000L); + assertThat(allCues.get(3).endTimeUs).isEqualTo(6_000_000L); Cue fourthCue = Iterables.getOnlyElement(allCues.get(3).cues); assertThat(fourthCue.text.toString()).isEqualTo("Relative font-size expressed in % unit!"); assertThat((Spanned) fourthCue.text) @@ -496,12 +536,14 @@ public class WebvttParserTest { assertThat(allCues.get(4).startTimeUs).isEqualTo(6_100_000L); assertThat(allCues.get(4).durationUs).isEqualTo(6_400_000L - 6_100_000L); + assertThat(allCues.get(4).endTimeUs).isEqualTo(6_400_000L); Cue fifthCue = Iterables.getOnlyElement(allCues.get(4).cues); assertThat(fifthCue.text.toString()).isEqualTo("Sentence with bad font-size value."); assertThat((Spanned) secondCue.text).hasNoSpans(); assertThat(allCues.get(5).startTimeUs).isEqualTo(6_500_000L); assertThat(allCues.get(5).durationUs).isEqualTo(8_000_000L - 6_500_000L); + assertThat(allCues.get(5).endTimeUs).isEqualTo(8_000_000L); Cue sixthCue = Iterables.getOnlyElement(allCues.get(5).cues); assertThat(sixthCue.text.toString()) .isEqualTo("Upper and lower case letters in font-size unit.");