diff --git a/Source/FileManager/ReplacementCharacters.cs b/Source/FileManager/ReplacementCharacters.cs index 6c228411..85b65317 100644 --- a/Source/FileManager/ReplacementCharacters.cs +++ b/Source/FileManager/ReplacementCharacters.cs @@ -91,10 +91,10 @@ namespace FileManager { Replacement.OtherInvalid("_"), Replacement.FilenameForwardSlash("∕"), - Replacement.FilenameBackSlash(""), + Replacement.FilenameBackSlash("\\"), Replacement.OpenQuote("“"), Replacement.CloseQuote("”"), - Replacement.OtherQuote(""") + Replacement.OtherQuote("\"") } }; @@ -115,7 +115,18 @@ namespace FileManager Replacement.Colon("-"), } } - : Barebones; + : new () + { + Replacements = new Replacement[] + { + Replacement.OtherInvalid("_"), + Replacement.FilenameForwardSlash("_"), + Replacement.FilenameBackSlash("\\"), + Replacement.OpenQuote("\""), + Replacement.CloseQuote("\""), + Replacement.OtherQuote("\"") + } + }; public static readonly ReplacementCharacters Barebones = IsWindows @@ -164,13 +175,10 @@ namespace FileManager private string GetFilenameCharReplacement(char toReplace, char preceding, char succeding) { - if (invalidSlashes.Contains(toReplace)) - { - if (toReplace == ForwardSlash.CharacterToReplace) - return ForwardSlash.ReplacementString; - else - return BackSlash.ReplacementString; - } + if (toReplace == ForwardSlash.CharacterToReplace) + return ForwardSlash.ReplacementString; + else if (toReplace == BackSlash.CharacterToReplace) + return BackSlash.ReplacementString; else return GetPathCharReplacement(toReplace, preceding, succeding); } private string GetPathCharReplacement(char toReplace, char preceding, char succeding) @@ -199,6 +207,9 @@ namespace FileManager return OtherQuote; } + if (!IsWindows && toReplace == BackSlash.CharacterToReplace) + return BackSlash.ReplacementString; + //Replace any other non-mandatory characters for (int i = Replacement.FIXED_COUNT; i < Replacements.Count; i++) { diff --git a/Source/_Tests/FileManager.Tests/FileNamingTemplateTests.cs b/Source/_Tests/FileManager.Tests/FileNamingTemplateTests.cs index 9a2d8a30..f98868cf 100644 --- a/Source/_Tests/FileManager.Tests/FileNamingTemplateTests.cs +++ b/Source/_Tests/FileManager.Tests/FileNamingTemplateTests.cs @@ -15,16 +15,18 @@ namespace FileNamingTemplateTests static ReplacementCharacters Replacements = ReplacementCharacters.Default; [TestMethod] - public void equiv_GetValidFilename() + [DataRow(@"C:\foo\bar", @"C:\foo\bar\my꞉ book 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 [ID123456].txt", PlatformID.Win32NT)] + [DataRow(@"/foo/bar", @"/foo/bar/my: book 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 [ID123456].txt", PlatformID.Unix)] + public void equiv_GetValidFilename(string dirFullPath, string expected, PlatformID platformID) { + if (Environment.OSVersion.Platform != platformID) + return; + var sb = new System.Text.StringBuilder(); sb.Append('0', 300); var longText = sb.ToString(); - var expectedNew = @"C:\foo\bar\my꞉ book 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 [ID123456].txt"; - var f2 = NEW_GetValidFilename_FileNamingTemplate(@"C:\foo\bar", "my: book " + longText, "txt", "ID123456"); - - f2.Should().Be(expectedNew); + NEW_GetValidFilename_FileNamingTemplate(dirFullPath, "my: book " + longText, "txt", "ID123456").Should().Be(expected); } private static string NEW_GetValidFilename_FileNamingTemplate(string dirFullPath, string filename, string extension, string metadataSuffix) @@ -40,12 +42,12 @@ namespace FileNamingTemplateTests } [TestMethod] - public void equiv_GetMultipartFileName() + [DataRow(@"C:\foo\bar\my file.txt", @"C:\foo\bar\my file - 002 - title.txt", PlatformID.Win32NT)] + [DataRow(@"/foo/bar/my file.txt", @"/foo/bar/my file - 002 - title.txt", PlatformID.Unix)] + public void equiv_GetMultipartFileName(string inStr, string outStr, PlatformID platformID) { - var expected = @"C:\foo\bar\my file - 002 - title.txt"; - var f2 = NEW_GetMultipartFileName_FileNamingTemplate(@"C:\foo\bar\my file.txt", 2, 100, "title"); - - f2.Should().Be(expected); + if (Environment.OSVersion.Platform == platformID) + NEW_GetMultipartFileName_FileNamingTemplate(inStr, 2, 100, "title").Should().Be(outStr); } private static string NEW_GetMultipartFileName_FileNamingTemplate(string originalPath, int partsPosition, int partsTotal, string suffix) @@ -64,11 +66,16 @@ namespace FileNamingTemplateTests } [TestMethod] - public void remove_slashes() + [DataRow(@"\foo\.txt", @"\foo\sl∕as∕he∕s.txt", PlatformID.Win32NT)] + [DataRow(@"/foo/<title>.txt", @"/foo/s\l∕a\s∕h\e∕s.txt", PlatformID.Unix)] + public void remove_slashes(string inStr, string outStr, PlatformID platformID) { - var fileNamingTemplate = new FileNamingTemplate(@"\foo\<title>.txt"); - fileNamingTemplate.AddParameterReplacement("title", @"s\l/a\s/h\e/s"); - fileNamingTemplate.GetFilePath(Replacements).PathWithoutPrefix.Should().Be(@"\foo\sl∕as∕he∕s.txt"); + if (Environment.OSVersion.Platform == platformID) + { + var fileNamingTemplate = new FileNamingTemplate(inStr); + fileNamingTemplate.AddParameterReplacement("title", @"s\l/a\s/h\e/s"); + fileNamingTemplate.GetFilePath(Replacements).PathWithoutPrefix.Should().Be(outStr); + } } } } diff --git a/Source/_Tests/FileManager.Tests/FileUtilityTests.cs b/Source/_Tests/FileManager.Tests/FileUtilityTests.cs index b82c3d94..325113af 100644 --- a/Source/_Tests/FileManager.Tests/FileUtilityTests.cs +++ b/Source/_Tests/FileManager.Tests/FileUtilityTests.cs @@ -21,51 +21,78 @@ namespace FileUtilityTests [TestMethod] // non-empty replacement - [DataRow("abc*abc.txt", "abc✱abc.txt")] - // standardize slashes - [DataRow(@"a/b\c/d", @"a\b\c\d")] + [DataRow("abc*abc.txt", "abc✱abc.txt", PlatformID.Win32NT)] + [DataRow("abc*abc.txt", "abc*abc.txt", PlatformID.Unix)] + // standardize slashes. There is no unix equivalent because there is no alt directory separator + [DataRow(@"a/b\c/d", @"a\b\c\d", PlatformID.Win32NT)] // remove illegal chars - [DataRow("a*?:z.txt", "a✱?꞉z.txt")] + [DataRow("a*?:z.txt", "a✱?꞉z.txt", PlatformID.Win32NT)] + [DataRow("a*?:z.txt", "a*?:z.txt", PlatformID.Unix)] // retain drive letter path colon - [DataRow(@"C:\az.txt", @"C:\az.txt")] + [DataRow(@"C:\az.txt", @"C:\az.txt", PlatformID.Win32NT)] + [DataRow(@"/:/az.txt", @"/:/az.txt", PlatformID.Unix)] // replace all other colons - [DataRow(@"a\b:c\d.txt", @"a\b꞉c\d.txt")] + [DataRow(@"a\b:c\d.txt", @"a\b꞉c\d.txt", PlatformID.Win32NT)] + [DataRow(@"a/b:c/d.txt", @"a/b:c/d.txt", PlatformID.Unix)] // remove empty directories - [DataRow(@"C:\a\\\b\c\\\d.txt", @"C:\a\b\c\d.txt")] - [DataRow(@"C:\""foo\<id>", @"C:\“foo\<id>")] - public void DefaultTests(string inStr, string outStr) => Assert.AreEqual(outStr, FileUtility.GetSafePath(inStr, Default).PathWithoutPrefix); + [DataRow(@"C:\a\\\b\c\\\d.txt", @"C:\a\b\c\d.txt", PlatformID.Win32NT)] + [DataRow(@"/a///b/c///d.txt", @"/a/b/c/d.txt", PlatformID.Unix)] + [DataRow(@"C:\""foo\<id>", @"C:\“foo\<id>", PlatformID.Win32NT)] + [DataRow(@"/""foo/<id>", @"/“foo/<id>", PlatformID.Unix)] + public void DefaultTests(string inStr, string outStr, PlatformID platformID) + => Test(inStr, outStr, Default, platformID); [TestMethod] // non-empty replacement - [DataRow("abc*abc.txt", "abc_abc.txt")] - // standardize slashes - [DataRow(@"a/b\c/d", @"a\b\c\d")] + [DataRow("abc*abc.txt", "abc_abc.txt", PlatformID.Win32NT)] + [DataRow("abc*abc.txt", "abc*abc.txt", PlatformID.Unix)] + // standardize slashes. There is no unix equivalent because there is no alt directory separator + [DataRow(@"a/b\c/d", @"a\b\c\d", PlatformID.Win32NT)] // remove illegal chars - [DataRow("a*?:z.txt", "a__-z.txt")] + [DataRow("a*?:z.txt", "a__-z.txt", PlatformID.Win32NT)] + [DataRow("a*?:z.txt", "a*?:z.txt", PlatformID.Unix)] // retain drive letter path colon - [DataRow(@"C:\az.txt", @"C:\az.txt")] + [DataRow(@"C:\az.txt", @"C:\az.txt", PlatformID.Win32NT)] + [DataRow(@"/:az.txt", @"/:az.txt", PlatformID.Unix)] // replace all other colons - [DataRow(@"a\b:c\d.txt", @"a\b-c\d.txt")] + [DataRow(@"a\b:c\d.txt", @"a\b-c\d.txt", PlatformID.Win32NT)] + [DataRow(@"a/b:c/d.txt", @"a/b:c/d.txt", PlatformID.Unix)] // remove empty directories - [DataRow(@"C:\a\\\b\c\\\d.txt", @"C:\a\b\c\d.txt")] - [DataRow(@"C:\""foo\<id>", @"C:\'foo\{id}")] - public void LoFiDefaultTests(string inStr, string outStr) => Assert.AreEqual(outStr, FileUtility.GetSafePath(inStr, LoFiDefault).PathWithoutPrefix); + [DataRow(@"C:\a\\\b\c\\\d.txt", @"C:\a\b\c\d.txt", PlatformID.Win32NT)] + [DataRow(@"/a///b/c///d.txt", @"/a/b/c/d.txt", PlatformID.Unix)] + [DataRow(@"C:\""foo\<id>", @"C:\'foo\{id}", PlatformID.Win32NT)] + [DataRow(@"/""foo/<id>", @"/""foo/<id>", PlatformID.Unix)] + public void LoFiDefaultTests(string inStr, string outStr, PlatformID platformID) + => Test(inStr, outStr, LoFiDefault, platformID); [TestMethod] // empty replacement - [DataRow("abc*abc.txt", "abc_abc.txt")] - // standardize slashes - [DataRow(@"a/b\c/d", @"a\b\c\d")] + [DataRow("abc*abc.txt", "abc_abc.txt", PlatformID.Win32NT)] + [DataRow("abc*abc.txt", "abc*abc.txt", PlatformID.Unix)] + // standardize slashes. There is no unix equivalent because there is no alt directory separator + [DataRow(@"a/b\c/d", @"a\b\c\d", PlatformID.Win32NT)] // remove illegal chars - [DataRow("a*?:z.txt", "a___z.txt")] + [DataRow("a*?:z.txt", "a___z.txt", PlatformID.Win32NT)] + [DataRow("a*?:z.txt", "a*?:z.txt", PlatformID.Unix)] // retain drive letter path colon - [DataRow(@"C:\az.txt", @"C:\az.txt")] + [DataRow(@"C:\az.txt", @"C:\az.txt", PlatformID.Win32NT)] + [DataRow(@"/:az.txt", @"/:az.txt", PlatformID.Unix)] // replace all other colons - [DataRow(@"a\b:c\d.txt", @"a\b_c\d.txt")] + [DataRow(@"a\b:c\d.txt", @"a\b_c\d.txt", PlatformID.Win32NT)] + [DataRow(@"a/b:c/d.txt", @"a/b:c/d.txt", PlatformID.Unix)] // remove empty directories - [DataRow(@"C:\a\\\b\c\\\d.txt", @"C:\a\b\c\d.txt")] - [DataRow(@"C:\""foo\<id>", @"C:\_foo\_id_")] - public void BarebonesDefaultTests(string inStr, string outStr) => Assert.AreEqual(outStr, FileUtility.GetSafePath(inStr, Barebones).PathWithoutPrefix); + [DataRow(@"C:\a\\\b\c\\\d.txt", @"C:\a\b\c\d.txt", PlatformID.Win32NT)] + [DataRow(@"/a///b/c///d.txt", @"/a/b/c/d.txt", PlatformID.Unix)] + [DataRow(@"C:\""foo\<id>", @"C:\_foo\_id_", PlatformID.Win32NT)] + [DataRow(@"/""foo/<id>", @"/""foo/<id>", PlatformID.Unix)] + public void BarebonesDefaultTests(string inStr, string outStr, PlatformID platformID) + => Test(inStr, outStr, Barebones, platformID); + + private void Test(string inStr, string outStr, ReplacementCharacters replacements, PlatformID platformID) + { + if (Environment.OSVersion.Platform == platformID) + FileUtility.GetSafePath(inStr, replacements).PathWithoutPrefix.Should().Be(outStr); + } } [TestClass] @@ -77,23 +104,33 @@ namespace FileUtilityTests // needs separate method. middle null param not running correctly in TestExplorer when used in DataRow() [TestMethod] - [DataRow("http://test.com/a/b/c", "http꞉∕∕test.com∕a∕b∕c")] - public void url_null_replacement(string inStr, string outStr) => DefaultReplacementTest(inStr, outStr); + [DataRow("http://test.com/a/b/c", "http꞉∕∕test.com∕a∕b∕c", PlatformID.Win32NT)] + [DataRow("http://test.com/a/b/c", "http:∕∕test.com∕a∕b∕c", PlatformID.Unix)] + public void url_null_replacement(string inStr, string outStr, PlatformID platformID) => DefaultReplacementTest(inStr, outStr, platformID); [TestMethod] // empty replacement - [DataRow("http://test.com/a/b/c", "http꞉∕∕test.com∕a∕b∕c")] - public void DefaultReplacementTest(string inStr, string outStr) => Default.ReplaceFilenameChars(inStr).Should().Be(outStr); + [DataRow("http://test.com/a/b/c", "http꞉∕∕test.com∕a∕b∕c", PlatformID.Win32NT)] + [DataRow("http://test.com/a/b/c", "http:∕∕test.com∕a∕b∕c", PlatformID.Unix)] + public void DefaultReplacementTest(string inStr, string outStr, PlatformID platformID) => Test(inStr, outStr, Default, platformID); [TestMethod] // empty replacement - [DataRow("http://test.com/a/b/c", "http-__test.com_a_b_c")] - public void LoFiDefaultReplacementTest(string inStr, string outStr) => LoFiDefault.ReplaceFilenameChars(inStr).Should().Be(outStr); + [DataRow("http://test.com/a/b/c", "http-__test.com_a_b_c", PlatformID.Win32NT)] + [DataRow("http://test.com/a/b/c", "http:__test.com_a_b_c", PlatformID.Unix)] + public void LoFiDefaultReplacementTest(string inStr, string outStr, PlatformID platformID) => Test(inStr, outStr, LoFiDefault, platformID); [TestMethod] // empty replacement - [DataRow("http://test.com/a/b/c", "http___test.com_a_b_c")] - public void BarebonesDefaultReplacementTest(string inStr, string outStr) => Barebones.ReplaceFilenameChars(inStr).Should().Be(outStr); + [DataRow("http://test.com/a/b/c", "http___test.com_a_b_c", PlatformID.Win32NT)] + [DataRow("http://test.com/a/b/c", "http:__test.com_a_b_c", PlatformID.Unix)] + public void BarebonesDefaultReplacementTest(string inStr, string outStr, PlatformID platformID) => Test(inStr, outStr, Barebones, platformID); + + private void Test(string inStr, string outStr, ReplacementCharacters replacements, PlatformID platformID) + { + if (Environment.OSVersion.Platform == platformID) + replacements.ReplaceFilenameChars(inStr).Should().Be(outStr); + } } [TestClass] @@ -154,32 +191,41 @@ namespace FileUtilityTests } [TestClass] - public class GetValidFilename + public class GetValidFilename { static ReplacementCharacters Replacements = ReplacementCharacters.Default; [TestMethod] // dot-files - [DataRow(@"C:\a bc\x y z\.f i l e.txt")] + [DataRow(@"C:\a bc\x y z\.f i l e.txt", PlatformID.Win32NT)] + [DataRow(@"/a bc/x y z/.f i l e.txt", PlatformID.Unix)] // dot-folders - [DataRow(@"C:\a bc\.x y z\f i l e.txt")] - public void Valid(string input) => Tests(input, input); + [DataRow(@"C:\a bc\.x y z\f i l e.txt", PlatformID.Win32NT)] + [DataRow(@"/a bc/.x y z/f i l e.txt", PlatformID.Unix)] + public void Valid(string input, PlatformID platformID) => Tests(input, input, platformID); [TestMethod] // folder spaces - [DataRow(@"C:\ a bc \x y z ", @"C:\a bc\x y z")] + [DataRow(@"C:\ a bc \x y z ", @"C:\a bc\x y z", PlatformID.Win32NT)] + [DataRow(@"/ a bc /x y z ", @"/a bc/x y z", PlatformID.Unix)] // file spaces - [DataRow(@"C:\a bc\x y z\ f i l e.txt ", @"C:\a bc\x y z\f i l e.txt")] + [DataRow(@"C:\a bc\x y z\ f i l e.txt ", @"C:\a bc\x y z\f i l e.txt", PlatformID.Win32NT)] + [DataRow(@"/a bc/x y z/ f i l e.txt ", @"/a bc/x y z/f i l e.txt", PlatformID.Unix)] // eliminate beginning space and end dots and spaces - [DataRow(@"C:\a bc\ . . . x y z . . . \f i l e.txt", @"C:\a bc\. . . x y z\f i l e.txt")] + [DataRow(@"C:\a bc\ . . . x y z . . . \f i l e.txt", @"C:\a bc\. . . x y z\f i l e.txt", PlatformID.Win32NT)] + [DataRow(@"/a bc/ . . . x y z . . . /f i l e.txt", @"/a bc/. . . x y z/f i l e.txt", PlatformID.Unix)] // file end dots - [DataRow(@"C:\a bc\x y z\f i l e.txt . . .", @"C:\a bc\x y z\f i l e.txt")] - public void Tests(string input, string expected) - => FileUtility.GetValidFilename(input, Replacements).PathWithoutPrefix.Should().Be(expected); + [DataRow(@"C:\a bc\x y z\f i l e.txt . . .", @"C:\a bc\x y z\f i l e.txt", PlatformID.Win32NT)] + [DataRow(@"/a bc/x y z/f i l e.txt . . .", @"/a bc/x y z/f i l e.txt", PlatformID.Unix)] + public void Tests(string input, string expected, PlatformID platformID) + { + if (Environment.OSVersion.Platform == platformID) + FileUtility.GetValidFilename(input, Replacements).PathWithoutPrefix.Should().Be(expected); + } } [TestClass] - public class RemoveLastCharacter + public class RemoveLastCharacter { [TestMethod] public void is_null() => Tests(null, null); diff --git a/Source/_Tests/LibationFileManager.Tests/TemplatesTests.cs b/Source/_Tests/LibationFileManager.Tests/TemplatesTests.cs index 257995f2..33681b6b 100644 --- a/Source/_Tests/LibationFileManager.Tests/TemplatesTests.cs +++ b/Source/_Tests/LibationFileManager.Tests/TemplatesTests.cs @@ -81,40 +81,62 @@ namespace TemplatesTests => Templates.getFileNamingTemplate(GetLibraryBook(), template, dirFullPath, extension); [TestMethod] - public void null_extension() => Tests("f.txt", @"C:\foo\bar", null, @"C:\foo\bar\f.txt"); + [DataRow("f.txt", @"C:\foo\bar", null, @"C:\foo\bar\f.txt", PlatformID.Win32NT)] + [DataRow("f.txt", @"/foo/bar", null, @"/foo/bar/f.txt", PlatformID.Unix)] + [DataRow("f.txt", @"C:\foo\bar", "ext", @"C:\foo\bar\f.txt.ext", PlatformID.Win32NT)] + [DataRow("f.txt", @"/foo/bar", "ext", @"/foo/bar/f.txt.ext", PlatformID.Unix)] + [DataRow("f", @"C:\foo\bar", "ext", @"C:\foo\bar\f.ext", PlatformID.Win32NT)] + [DataRow("f", @"/foo/bar", "ext", @"/foo/bar/f.ext", PlatformID.Unix)] + [DataRow("<id>", @"C:\foo\bar", "ext", @"C:\foo\bar\asin.ext", PlatformID.Win32NT)] + [DataRow("<id>", @"/foo/bar", "ext", @"/foo/bar/asin.ext", PlatformID.Unix)] + [DataRow("<bitrate> - <samplerate> - <channels>", @"C:\foo\bar", "ext", @"C:\foo\bar\128 - 44100 - 2.ext", PlatformID.Win32NT)] + [DataRow("<bitrate> - <samplerate> - <channels>", @"/foo/bar", "ext", @"/foo/bar/128 - 44100 - 2.ext", PlatformID.Unix)] + [DataRow("<year> - <channels>", @"C:\foo\bar", "ext", @"C:\foo\bar\2017 - 2.ext", PlatformID.Win32NT)] + [DataRow("<year> - <channels>", @"/foo/bar", "ext", @"/foo/bar/2017 - 2.ext", PlatformID.Unix)] + public void Tests(string template, string dirFullPath, string extension, string expected, PlatformID platformID) + { + if (Environment.OSVersion.Platform == platformID) + Templates.getFileNamingTemplate(GetLibraryBook(), template, dirFullPath, extension) + .GetFilePath(Replacements) + .PathWithoutPrefix + .Should().Be(expected); + } [TestMethod] - [DataRow("f.txt", @"C:\foo\bar", "ext", @"C:\foo\bar\f.txt.ext")] - [DataRow("f", @"C:\foo\bar", "ext", @"C:\foo\bar\f.ext")] - [DataRow("<id>", @"C:\foo\bar", "ext", @"C:\foo\bar\asin.ext")] - [DataRow("<bitrate> - <samplerate> - <channels>", @"C:\foo\bar", "ext", @"C:\foo\bar\128 - 44100 - 2.ext")] - [DataRow("<year> - <channels>", @"C:\foo\bar", "ext", @"C:\foo\bar\2017 - 2.ext")] - public void Tests(string template, string dirFullPath, string extension, string expected) - => Templates.getFileNamingTemplate(GetLibraryBook(), template, dirFullPath, extension) - .GetFilePath(Replacements) - .PathWithoutPrefix - .Should().Be(expected); + [DataRow(@"C:\a\b", @"C:\a\b\foobar.ext", PlatformID.Win32NT)] + [DataRow(@"/a/b", @"/a/b/foobar.ext", PlatformID.Unix)] + public void IfSeries_empty(string directory, string expected, PlatformID platformID) + { + if (Environment.OSVersion.Platform == platformID) + Templates.getFileNamingTemplate(GetLibraryBook(), "foo<if series-><-if series>bar", directory, "ext") + .GetFilePath(Replacements) + .PathWithoutPrefix + .Should().Be(expected); + } [TestMethod] - public void IfSeries_empty() - => Templates.getFileNamingTemplate(GetLibraryBook(), "foo<if series-><-if series>bar", @"C:\a\b", "ext") - .GetFilePath(Replacements) - .PathWithoutPrefix - .Should().Be(@"C:\a\b\foobar.ext"); + [DataRow(@"C:\a\b", @"C:\a\b\foobar.ext", PlatformID.Win32NT)] + [DataRow(@"/a/b", @"/a/b/foobar.ext", PlatformID.Unix)] + public void IfSeries_no_series(string directory, string expected, PlatformID platformID) + { + if (Environment.OSVersion.Platform == platformID) + Templates.getFileNamingTemplate(GetLibraryBook(null), "foo<if series->-<series>-<id>-<-if series>bar", directory, "ext") + .GetFilePath(Replacements) + .PathWithoutPrefix + .Should().Be(expected); + } [TestMethod] - public void IfSeries_no_series() - => Templates.getFileNamingTemplate(GetLibraryBook(null), "foo<if series->-<series>-<id>-<-if series>bar", @"C:\a\b", "ext") - .GetFilePath(Replacements) - .PathWithoutPrefix - .Should().Be(@"C:\a\b\foobar.ext"); - - [TestMethod] - public void IfSeries_with_series() - => Templates.getFileNamingTemplate(GetLibraryBook(), "foo<if series->-<series>-<id>-<-if series>bar", @"C:\a\b", "ext") - .GetFilePath(Replacements) - .PathWithoutPrefix - .Should().Be(@"C:\a\b\foo-Sherlock Holmes-asin-bar.ext"); + [DataRow(@"C:\a\b", @"C:\a\b\foo-Sherlock Holmes-asin-bar.ext", PlatformID.Win32NT)] + [DataRow(@"/a/b", @"/a/b/foo-Sherlock Holmes-asin-bar.ext", PlatformID.Unix)] + public void IfSeries_with_series(string directory, string expected, PlatformID platformID) + { + if (Environment.OSVersion.Platform == platformID) + Templates.getFileNamingTemplate(GetLibraryBook(), "foo<if series->-<series>-<id>-<-if series>bar", directory, "ext") + .GetFilePath(Replacements) + .PathWithoutPrefix + .Should().Be(expected); + } } } @@ -256,7 +278,7 @@ namespace Templates_File_Tests public class GetErrors { [TestMethod] - public void null_is_invalid() => Tests(null, new[] { Templates.ERROR_NULL_IS_INVALID }); + public void null_is_invalid() => Tests(null, Environment.OSVersion.Platform, new[] { Templates.ERROR_NULL_IS_INVALID }); [TestMethod] public void empty_is_valid() => valid_tests(""); @@ -267,19 +289,23 @@ namespace Templates_File_Tests [TestMethod] [DataRow(@"foo")] [DataRow(@"<id>")] - public void valid_tests(string template) => Tests(template, Array.Empty<string>()); + public void valid_tests(string template) => Tests(template, Environment.OSVersion.Platform, Array.Empty<string>()); [TestMethod] - [DataRow(@"C:\", Templates.ERROR_INVALID_FILE_NAME_CHAR)] - [DataRow(@"\foo", Templates.ERROR_INVALID_FILE_NAME_CHAR)] - [DataRow(@"/foo", Templates.ERROR_INVALID_FILE_NAME_CHAR)] - [DataRow(@"C:\", Templates.ERROR_INVALID_FILE_NAME_CHAR)] - public void Tests(string template, params string[] expected) + [DataRow(@"C:\", PlatformID.Win32NT, Templates.ERROR_INVALID_FILE_NAME_CHAR)] + [DataRow(@"/", PlatformID.Unix, Templates.ERROR_INVALID_FILE_NAME_CHAR)] + [DataRow(@"\foo", PlatformID.Win32NT, Templates.ERROR_INVALID_FILE_NAME_CHAR)] + [DataRow(@"/foo", PlatformID.Win32NT, Templates.ERROR_INVALID_FILE_NAME_CHAR)] + [DataRow(@"/foo", PlatformID.Unix, Templates.ERROR_INVALID_FILE_NAME_CHAR)] + public void Tests(string template, PlatformID platformID, params string[] expected) { - var result = Templates.File.GetErrors(template); - result.Count().Should().Be(expected.Length); - result.Should().BeEquivalentTo(expected); + if (Environment.OSVersion.Platform == platformID) + { + var result = Templates.File.GetErrors(template); + result.Count().Should().Be(expected.Length); + result.Should().BeEquivalentTo(expected); + } } } @@ -287,21 +313,29 @@ namespace Templates_File_Tests public class IsValid { [TestMethod] - public void null_is_invalid() => Tests(null, false); + public void null_is_invalid() => Tests(null, false, Environment.OSVersion.Platform); [TestMethod] - public void empty_is_valid() => Tests("", true); + public void empty_is_valid() => Tests("", true, Environment.OSVersion.Platform); [TestMethod] - public void whitespace_is_valid() => Tests(" ", true); + public void whitespace_is_valid() => Tests(" ", true, Environment.OSVersion.Platform); [TestMethod] - [DataRow(@"C:\", false)] - [DataRow(@"foo", true)] - [DataRow(@"\foo", false)] - [DataRow(@"/foo", false)] - [DataRow(@"<id>", true)] - public void Tests(string template, bool expected) => Templates.File.IsValid(template).Should().Be(expected); + [DataRow(@"C:\", false, PlatformID.Win32NT)] + [DataRow(@"/", false, PlatformID.Unix)] + [DataRow(@"foo", true, PlatformID.Win32NT)] + [DataRow(@"foo", true, PlatformID.Unix)] + [DataRow(@"\foo", false, PlatformID.Win32NT)] + [DataRow(@"\foo", true, PlatformID.Unix)] + [DataRow(@"/foo", false, PlatformID.Win32NT)] + [DataRow(@"<id>", true, PlatformID.Win32NT)] + [DataRow(@"<id>", true, PlatformID.Unix)] + public void Tests(string template, bool expected, PlatformID platformID) + { + if (Environment.OSVersion.Platform == platformID) + Templates.File.IsValid(template).Should().Be(expected); + } } // same as Templates.Folder.GetWarnings @@ -331,28 +365,34 @@ namespace Templates_ChapterFile_Tests public class GetWarnings { [TestMethod] - public void null_is_invalid() => Tests(null, new[] { Templates.ERROR_NULL_IS_INVALID }); + public void null_is_invalid() => Tests(null, null, new[] { Templates.ERROR_NULL_IS_INVALID }); [TestMethod] - public void empty_has_warnings() => Tests("", Templates.WARNING_EMPTY, Templates.WARNING_NO_TAGS, Templates.WARNING_NO_CHAPTER_NUMBER_TAG); + public void empty_has_warnings() => Tests("", null, Templates.WARNING_EMPTY, Templates.WARNING_NO_TAGS, Templates.WARNING_NO_CHAPTER_NUMBER_TAG); [TestMethod] - public void whitespace_has_warnings() => Tests(" ", Templates.WARNING_WHITE_SPACE, Templates.WARNING_NO_TAGS, Templates.WARNING_NO_CHAPTER_NUMBER_TAG); + public void whitespace_has_warnings() => Tests(" ", null, Templates.WARNING_WHITE_SPACE, Templates.WARNING_NO_TAGS, Templates.WARNING_NO_CHAPTER_NUMBER_TAG); [TestMethod] [DataRow("<ch#>")] [DataRow("<ch#> <id>")] - public void valid_tests(string template) => Tests(template, Array.Empty<string>()); + public void valid_tests(string template) => Tests(template, null, Array.Empty<string>()); [TestMethod] - [DataRow(@"no tags", Templates.WARNING_NO_TAGS, Templates.WARNING_NO_CHAPTER_NUMBER_TAG)] - [DataRow(@"<id>\foo\bar", Templates.ERROR_INVALID_FILE_NAME_CHAR, Templates.WARNING_NO_CHAPTER_NUMBER_TAG)] - [DataRow("<chapter count> -- chapter tag but not ch# or ch_#", Templates.WARNING_NO_TAGS, Templates.WARNING_NO_CHAPTER_NUMBER_TAG)] - public void Tests(string template, params string[] expected) + [DataRow(@"no tags", null, Templates.WARNING_NO_TAGS, Templates.WARNING_NO_CHAPTER_NUMBER_TAG)] + [DataRow(@"<id>\foo\bar", true, Templates.ERROR_INVALID_FILE_NAME_CHAR, Templates.WARNING_NO_CHAPTER_NUMBER_TAG)] + [DataRow(@"<id>/foo/bar", false, Templates.ERROR_INVALID_FILE_NAME_CHAR, Templates.WARNING_NO_CHAPTER_NUMBER_TAG)] + [DataRow("<chapter count> -- chapter tag but not ch# or ch_#", null, Templates.WARNING_NO_TAGS, Templates.WARNING_NO_CHAPTER_NUMBER_TAG)] + public void Tests(string template, bool? windows, params string[] expected) { - var result = Templates.ChapterFile.GetWarnings(template); - result.Count().Should().Be(expected.Length); - result.Should().BeEquivalentTo(expected); + if(windows is null + || (windows is true && Environment.OSVersion.Platform is PlatformID.Win32NT) + || (windows is false && Environment.OSVersion.Platform is PlatformID.Unix)) + { + var result = Templates.ChapterFile.GetWarnings(template); + result.Count().Should().Be(expected.Length); + result.Should().BeEquivalentTo(expected); + } } } @@ -408,10 +448,15 @@ namespace Templates_ChapterFile_Tests static readonly ReplacementCharacters Default = ReplacementCharacters.Default; [TestMethod] - [DataRow("[<id>] <ch# 0> of <ch count> - <ch title>", @"C:\foo\", "txt", 6, 10, "chap", @"C:\foo\[asin] 06 of 10 - chap.txt")] - [DataRow("<ch#>", @"C:\foo\", "txt", 6, 10, "chap", @"C:\foo\6.txt")] - public void Tests(string template, string dir, string ext, int pos, int total, string chapter, string expected) - => Templates.ChapterFile.GetPortionFilename(GetLibraryBook(), template, new() { OutputFileName = $"xyz.{ext}", PartsPosition = pos, PartsTotal = total, Title = chapter }, dir, Default) - .Should().Be(expected); + [DataRow("[<id>] <ch# 0> of <ch count> - <ch title>", @"C:\foo\", "txt", 6, 10, "chap", @"C:\foo\[asin] 06 of 10 - chap.txt", PlatformID.Win32NT)] + [DataRow("[<id>] <ch# 0> of <ch count> - <ch title>", @"/foo/", "txt", 6, 10, "chap", @"/foo/[asin] 06 of 10 - chap.txt", PlatformID.Unix)] + [DataRow("<ch#>", @"C:\foo\", "txt", 6, 10, "chap", @"C:\foo\6.txt", PlatformID.Win32NT)] + [DataRow("<ch#>", @"/foo/", "txt", 6, 10, "chap", @"/foo/6.txt", PlatformID.Unix)] + public void Tests(string template, string dir, string ext, int pos, int total, string chapter, string expected, PlatformID platformID) + { + if (Environment.OSVersion.Platform == platformID) + Templates.ChapterFile.GetPortionFilename(GetLibraryBook(), template, new() { OutputFileName = $"xyz.{ext}", PartsPosition = pos, PartsTotal = total, Title = chapter }, dir, Default) + .Should().Be(expected); + } } }