ExternalPathParserTests.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System.Text.RegularExpressions;
  2. using Emby.Naming.Common;
  3. using Emby.Naming.ExternalFiles;
  4. using MediaBrowser.Model.Dlna;
  5. using MediaBrowser.Model.Globalization;
  6. using Moq;
  7. using Xunit;
  8. namespace Jellyfin.Naming.Tests.ExternalFiles;
  9. public class ExternalPathParserTests
  10. {
  11. private readonly ExternalPathParser _audioPathParser;
  12. private readonly ExternalPathParser _subtitlePathParser;
  13. public ExternalPathParserTests()
  14. {
  15. var englishCultureDto = new CultureDto("English", "English", "en", new[] { "eng" });
  16. var frenchCultureDto = new CultureDto("French", "French", "fr", new[] { "fre", "fra" });
  17. var hindiCultureDto = new CultureDto("Hindi", "Hindi", "hi", new[] { "hin" });
  18. var localizationManager = new Mock<ILocalizationManager>(MockBehavior.Loose);
  19. localizationManager.Setup(lm => lm.FindLanguageInfo(It.IsRegex("en.*", RegexOptions.IgnoreCase)))
  20. .Returns(englishCultureDto);
  21. localizationManager.Setup(lm => lm.FindLanguageInfo(It.IsRegex("fr.*", RegexOptions.IgnoreCase)))
  22. .Returns(frenchCultureDto);
  23. localizationManager.Setup(lm => lm.FindLanguageInfo(It.IsRegex("hi.*", RegexOptions.IgnoreCase)))
  24. .Returns(hindiCultureDto);
  25. _audioPathParser = new ExternalPathParser(new NamingOptions(), localizationManager.Object, DlnaProfileType.Audio);
  26. _subtitlePathParser = new ExternalPathParser(new NamingOptions(), localizationManager.Object, DlnaProfileType.Subtitle);
  27. }
  28. [Theory]
  29. [InlineData("")]
  30. [InlineData("MyVideo.ass")]
  31. [InlineData("MyVideo.mks")]
  32. [InlineData("MyVideo.sami")]
  33. [InlineData("MyVideo.srt")]
  34. [InlineData("MyVideo.m4v")]
  35. public void ParseFile_AudioExtensionsNotMatched_ReturnsNull(string path)
  36. {
  37. Assert.Null(_audioPathParser.ParseFile(path, string.Empty));
  38. }
  39. [Theory]
  40. [InlineData("MyVideo.aa")]
  41. [InlineData("MyVideo.aac")]
  42. [InlineData("MyVideo.flac")]
  43. [InlineData("MyVideo.m4a")]
  44. [InlineData("MyVideo.mka")]
  45. [InlineData("MyVideo.mp3")]
  46. public void ParseFile_AudioExtensionsMatched_ReturnsPath(string path)
  47. {
  48. var actual = _audioPathParser.ParseFile(path, string.Empty);
  49. Assert.NotNull(actual);
  50. Assert.Equal(path, actual!.Path);
  51. }
  52. [Theory]
  53. [InlineData("")]
  54. [InlineData("MyVideo.aa")]
  55. [InlineData("MyVideo.aac")]
  56. [InlineData("MyVideo.flac")]
  57. [InlineData("MyVideo.mka")]
  58. [InlineData("MyVideo.m4v")]
  59. public void ParseFile_SubtitleExtensionsNotMatched_ReturnsNull(string path)
  60. {
  61. Assert.Null(_subtitlePathParser.ParseFile(path, string.Empty));
  62. }
  63. [Theory]
  64. [InlineData("MyVideo.ass")]
  65. [InlineData("MyVideo.mks")]
  66. [InlineData("MyVideo.sami")]
  67. [InlineData("MyVideo.srt")]
  68. [InlineData("MyVideo.vtt")]
  69. public void ParseFile_SubtitleExtensionsMatched_ReturnsPath(string path)
  70. {
  71. var actual = _subtitlePathParser.ParseFile(path, string.Empty);
  72. Assert.NotNull(actual);
  73. Assert.Equal(path, actual!.Path);
  74. }
  75. [Theory]
  76. [InlineData("", null, null)]
  77. [InlineData(".default", null, null, true, false)]
  78. [InlineData(".forced", null, null, false, true)]
  79. [InlineData(".foreign", null, null, false, true)]
  80. [InlineData(".default.forced", null, null, true, true)]
  81. [InlineData(".forced.default", null, null, true, true)]
  82. [InlineData(".DEFAULT.FORCED", null, null, true, true)]
  83. [InlineData(".en", null, "eng")]
  84. [InlineData(".EN", null, "eng")]
  85. [InlineData(".hi", null, "hin")]
  86. [InlineData(".fr.en", "fr", "eng")]
  87. [InlineData(".en.fr", "en", "fre")]
  88. [InlineData(".title.en.fr", "title.en", "fre")]
  89. [InlineData(".Title Goes Here", "Title Goes Here", null)]
  90. [InlineData(".Title.with.Separator", "Title.with.Separator", null)]
  91. [InlineData(".title.en.default.forced", "title", "eng", true, true)]
  92. [InlineData(".forced.default.en.title", "title", "eng", true, true)]
  93. [InlineData(".sdh.en.title", "title", "eng", false, false, true)]
  94. [InlineData(".en.cc.title", "title", "eng", false, false, true)]
  95. [InlineData(".hi.en.title", "title", "eng", false, false, true)]
  96. [InlineData(".en.hi.title", "title", "eng", false, false, true)]
  97. [InlineData(".Subs for Chinese Audio.eng", "Subs for Chinese Audio", "eng", false, false, false)]
  98. public void ParseFile_ExtraTokens_ParseToValues(string tokens, string? title, string? language, bool isDefault = false, bool isForced = false, bool isHearingImpaired = false)
  99. {
  100. var path = "My.Video" + tokens + ".srt";
  101. var actual = _subtitlePathParser.ParseFile(path, tokens);
  102. Assert.NotNull(actual);
  103. Assert.Equal(title, actual!.Title);
  104. Assert.Equal(language, actual.Language);
  105. Assert.Equal(isDefault, actual.IsDefault);
  106. Assert.Equal(isForced, actual.IsForced);
  107. Assert.Equal(isHearingImpaired, actual.IsHearingImpaired);
  108. }
  109. }