2
0

SsaParserTests.cs 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.IO;
  5. using System.Text;
  6. using System.Threading;
  7. using MediaBrowser.MediaEncoding.Subtitles;
  8. using MediaBrowser.Model.MediaInfo;
  9. using Microsoft.Extensions.Logging.Abstractions;
  10. using Xunit;
  11. namespace Jellyfin.MediaEncoding.Subtitles.Tests
  12. {
  13. public class SsaParserTests
  14. {
  15. private readonly SsaParser _parser = new SsaParser(new NullLogger<AssParser>());
  16. [Theory]
  17. [MemberData(nameof(Parse_MultipleDialogues_TestData))]
  18. public void Parse_MultipleDialogues_Success(string ssa, IReadOnlyList<SubtitleTrackEvent> expectedSubtitleTrackEvents)
  19. {
  20. using (Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(ssa)))
  21. {
  22. SubtitleTrackInfo subtitleTrackInfo = _parser.Parse(stream, CancellationToken.None);
  23. Assert.Equal(expectedSubtitleTrackEvents.Count, subtitleTrackInfo.TrackEvents.Count);
  24. for (int i = 0; i < expectedSubtitleTrackEvents.Count; ++i)
  25. {
  26. SubtitleTrackEvent expected = expectedSubtitleTrackEvents[i];
  27. SubtitleTrackEvent actual = subtitleTrackInfo.TrackEvents[i];
  28. Assert.Equal(expected.Id, actual.Id);
  29. Assert.Equal(expected.Text, actual.Text);
  30. Assert.Equal(expected.StartPositionTicks, actual.StartPositionTicks);
  31. Assert.Equal(expected.EndPositionTicks, actual.EndPositionTicks);
  32. }
  33. }
  34. }
  35. public static IEnumerable<object[]> Parse_MultipleDialogues_TestData()
  36. {
  37. yield return new object[]
  38. {
  39. @"[Events]
  40. Format: Layer, Start, End, Text
  41. Dialogue: ,0:00:01.18,0:00:01.85,dialogue1
  42. Dialogue: ,0:00:02.18,0:00:02.85,dialogue2
  43. Dialogue: ,0:00:03.18,0:00:03.85,dialogue3
  44. ",
  45. new List<SubtitleTrackEvent>
  46. {
  47. new SubtitleTrackEvent("1", "dialogue1")
  48. {
  49. StartPositionTicks = 11800000,
  50. EndPositionTicks = 18500000
  51. },
  52. new SubtitleTrackEvent("2", "dialogue2")
  53. {
  54. StartPositionTicks = 21800000,
  55. EndPositionTicks = 28500000
  56. },
  57. new SubtitleTrackEvent("3", "dialogue3")
  58. {
  59. StartPositionTicks = 31800000,
  60. EndPositionTicks = 38500000
  61. }
  62. }
  63. };
  64. }
  65. [Fact]
  66. public void Parse_Valid_Success()
  67. {
  68. using (var stream = File.OpenRead("Test Data/example.ssa"))
  69. {
  70. var parsed = _parser.Parse(stream, CancellationToken.None);
  71. Assert.Single(parsed.TrackEvents);
  72. var trackEvent = parsed.TrackEvents[0];
  73. Assert.Equal("1", trackEvent.Id);
  74. Assert.Equal(TimeSpan.Parse("00:00:01.18", CultureInfo.InvariantCulture).Ticks, trackEvent.StartPositionTicks);
  75. Assert.Equal(TimeSpan.Parse("00:00:06.85", CultureInfo.InvariantCulture).Ticks, trackEvent.EndPositionTicks);
  76. Assert.Equal("{\\pos(400,570)}Like an angel with pity on nobody", trackEvent.Text);
  77. }
  78. }
  79. }
  80. }