2
0

PathUtilsTest.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. namespace MeloongCore.Tests;
  2. public class PathUtilsTests : TestBase {
  3. #region 长路径
  4. [Test]
  5. public async Task 长路径_ToShortPath_输出超过260字符() {
  6. string root = Path.Combine(Path.GetTempPath(), $"{nameof(PathUtilsTests)}-{Guid.NewGuid():N}");
  7. string path = root;
  8. for (int i = 0; i < 40; i++) path = Path.Combine(path, $"D{i:000000}");
  9. try {
  10. DirectoryUtils.Create(path);
  11. string result = PathUtils.ToShortPath(path);
  12. await Assert.That(result.Length > 260).IsTrue();
  13. await Assert.That(DirectoryUtils.Exists(result)).IsTrue();
  14. } finally {
  15. DirectoryUtils.Delete(root);
  16. }
  17. }
  18. [Test]
  19. public async Task 长路径_ToShortPath_创建短文件名() {
  20. string root = Path.Combine(Path.GetTempPath(), $"{nameof(PathUtilsTests)}-{Guid.NewGuid():N}");
  21. string path = Path.Combine(root, new string('A', 220), "versions", "test");
  22. try {
  23. DirectoryUtils.Create(path);
  24. string result = PathUtils.ToShortPath(path);
  25. await Assert.That(result.Length <= 200).IsTrue();
  26. await Assert.That(result.Length < path.Length).IsTrue();
  27. await Assert.That(DirectoryUtils.Exists(result)).IsTrue();
  28. } finally {
  29. DirectoryUtils.Delete(root);
  30. }
  31. }
  32. #endregion
  33. #region 路径处理
  34. [Test]
  35. [Arguments("en-US")]
  36. [Arguments("zh-CN")]
  37. [Arguments("tr-TR")]
  38. public async Task 路径比较_不受当前语言影响(string cultureName) {
  39. var originalCulture = System.Globalization.CultureInfo.CurrentCulture;
  40. try {
  41. System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo(cultureName);
  42. await Assert.That(PathUtils.Compare(@"C:\FILES\FILE.jar", @"C:\files\file.jar")).IsEqualTo(0);
  43. await Assert.That(PathUtils.IsSame(@"C:\FILES\FILE.jar", @"C:\files\file.jar")).IsTrue();
  44. await Assert.That(PathUtils.IsSame(@"C:\files\I.jar", @"C:\files\ı.jar")).IsFalse();
  45. await Assert.That(PathUtils.IsSame(@"C:\files\ab.jar", "C:\\files\\a\u00adb.jar")).IsFalse();
  46. await Assert.That(PathUtils.Compare(@"C:\files\I.jar", @"C:\files\J.jar") < 0).IsTrue();
  47. await Assert.That(PathUtils.IsParentOf(@"C:\FILES", @"C:\files\child")).IsTrue();
  48. await Assert.That(PathUtils.IsParentOf(@"C:\FILES", @"C:\files")).IsTrue();
  49. await Assert.That(PathUtils.IsParentOf(@"C:\FILES", @"C:\files-other\child")).IsFalse();
  50. await Assert.That(PathUtils.IsParentOf(@"C:\I", @"C:\ı\child")).IsFalse();
  51. await Assert.That(PathUtils.IsSame(null, "")).IsTrue();
  52. await Assert.That(PathUtils.Compare("", @"C:\files") < 0).IsTrue();
  53. await Assert.That(PathUtils.Compare(@"C:\files", null) > 0).IsTrue();
  54. } finally {
  55. System.Globalization.CultureInfo.CurrentCulture = originalCulture;
  56. }
  57. }
  58. [Test]
  59. [Arguments(@"\\?\C:\foo\bar.txt", @"\\?\C:\foo")]
  60. [Arguments(@"C:\foo\extra/bar.txt", @"C:\foo\extra")]
  61. [Arguments(@"C:\foo/extra/bar.txt", @"C:\foo/extra")]
  62. [Arguments(@"C:\foo/extra\bar.txt", @"C:\foo/extra")]
  63. [Arguments(@"C:\foo\bar.txt", @"C:\foo")]
  64. [Arguments(@"\\?\C:\foo\Bar", @"\\?\C:\foo")]
  65. [Arguments(@"C:\foo\bar", @"C:\foo")]
  66. [Arguments(@"C:\Foo\bar\", @"C:\Foo")]
  67. [Arguments(@"\\?\C:\foo\", @"\\?\C:")]
  68. [Arguments(@"C:\foo", @"C:")]
  69. [Arguments(@"C:\foo\", @"C:")]
  70. [Arguments(@"https://foo.bar/file\long/pack.zip?arg=1", @"https://foo.bar/file\long")]
  71. [Arguments(@"https://foo.bar/file\long\pack.zip?arg=1", @"https://foo.bar/file\long")]
  72. [Arguments(@"https://foo.bar/file/long\pack.zip?arg=1", @"https://foo.bar/file/long")]
  73. [Arguments(@"https://foo.bar/file/long/pack.zip?arg=1", @"https://foo.bar/file/long")]
  74. [Arguments(@"https://foo.bar/file/", "https://foo.bar")]
  75. [Arguments(@"https://foo.bar/file/?arg=1", "https://foo.bar")]
  76. [Arguments(@"https://foo.bar/file?arg=1", "https://foo.bar")]
  77. public async Task 路径处理_RemoveLastPart(string input, string expected)
  78. => await Assert.That(PathUtils.RemoveLastPart(input)).IsEqualTo(expected);
  79. [Test]
  80. [Arguments(@"\\?\C:\foo\bar.txt", "bar.txt")]
  81. [Arguments(@"C:\foo\extra/bar.txt", "bar.txt")]
  82. [Arguments(@"C:\foo/extra/bar.txt", "bar.txt")]
  83. [Arguments(@"C:\foo/extra\bar.txt", "bar.txt")]
  84. [Arguments(@"C:\foo\bar.txt", "bar.txt")]
  85. [Arguments(@"C:\foo\bar.txt", "bar.txt")]
  86. [Arguments(@"\\?\C:\foo/bar", "bar")]
  87. [Arguments(@"C:\foo\bar", "bar")]
  88. [Arguments(@"C:\foo\bar\", "bar")]
  89. [Arguments(@"\\?\C:\foo\", "foo")]
  90. [Arguments(@"C:\foo", "foo")]
  91. [Arguments(@"C:\foo\", "foo")]
  92. [Arguments(@"https://foo.bar/file\long/pack.zip?arg=1", "pack.zip")]
  93. [Arguments(@"https://foo.bar/file\long\pack.zip?arg=1", "pack.zip")]
  94. [Arguments(@"https://foo.bar/file/long\pack.zip?arg=1", "pack.zip")]
  95. [Arguments(@"https://foo.bar/file/long/pack.zip?arg=1", "pack.zip")]
  96. [Arguments(@"https://foo.bar/file/", "file")]
  97. [Arguments(@"https://foo.bar/file/?arg=1", "file")]
  98. [Arguments(@"https://foo.bar/File?arg=1", "File")]
  99. [Arguments(@"https://cdn.modrinth.com/data/RvfAlf4Z/versions/XauQUBeR\Redstone Tweaks 2.5.3.zip?mr_download_reason=modpack", "Redstone Tweaks 2.5.3.zip")]
  100. public async Task 路径处理_GetLastPart(string input, string expected)
  101. => await Assert.That(PathUtils.GetLastPart(input)).IsEqualTo(expected);
  102. [Test]
  103. [Arguments(@"\\?\C:\foo\bar.txt", "bar")]
  104. [Arguments(@"C:\foo\bar.2.txt", "bar.2")]
  105. [Arguments(@"\\?\C:\foo\bar", "bar")]
  106. [Arguments(@"C:\foo\bar", "bar")]
  107. [Arguments(@"C:\foo.bar\how/long\path.txt", "path")]
  108. [Arguments(@"C:\foo.bar\how/long/path.txt", "path")]
  109. [Arguments(@"C:\foo.bar\how\long/path.txt", "path")]
  110. [Arguments(@"C:\foo.bar\how\", "how")]
  111. [Arguments(@"\\?\C:\foo\", "foo")]
  112. [Arguments(@"C:\foo", "foo")]
  113. [Arguments(@"C:\foo\", "foo")]
  114. [Arguments(@"cREate.jar.disabled", "cREate.jar")]
  115. [Arguments(@"create.jar", "create")]
  116. [Arguments(@"create", "create")]
  117. [Arguments(@"https://foo.bar/file\long/pack.zip?arg=1", "pack")]
  118. [Arguments(@"https://foo.bar/file\long\pack.zip?arg=1", "pack")]
  119. [Arguments(@"https://foo.bar/file/long\pack.zip?arg=1", "pack")]
  120. [Arguments(@"https://foo.bar/file/long/pack.zip?arg=1", "pack")]
  121. [Arguments(@"https://foo.bar/file/page.xaml.vb?arg=1", "page.xaml")]
  122. [Arguments(@"https://foo.bar/some.how/file/", "file")]
  123. [Arguments(@"https://foo.bar/file/?arg=1", "file")]
  124. [Arguments(@"https://foo.bar/file?arg=1", "file")]
  125. public async Task 路径处理_GetFileNameWithoutExtension(string input, string expected)
  126. => await Assert.That(PathUtils.GetFileNameWithoutExtension(input)).IsEqualTo(expected);
  127. [Test]
  128. [Arguments(@"\\?\C:\FOO\BAR.TXT", "txt")]
  129. [Arguments(@"C:\foo\bar.txt", "txt")]
  130. [Arguments(@"C:\foo.bar\how/long\path.txt", "txt")]
  131. [Arguments(@"C:\foo.bar\how/long/path.txt", "txt")]
  132. [Arguments(@"C:\foo.bar\how\long/path.txt", "txt")]
  133. [Arguments(@"\\?\C:\foo\bar", "")]
  134. [Arguments(@"C:\foo\bar", "")]
  135. [Arguments(@"C:\foo\bar\", "")]
  136. [Arguments(@"\\?\C:\foo\", "")]
  137. [Arguments(@"C:\foo", "")]
  138. [Arguments(@"C:\foo\", "")]
  139. [Arguments("create.jar.diSAbled", "disabled")]
  140. [Arguments(@"https://foo.bar/file\long/pack.zip?arg=1", "zip")]
  141. [Arguments(@"https://foo.bar/file\long\pack.zip?arg=1", "zip")]
  142. [Arguments(@"https://foo.bar/file/long\pack.zip?arg=1", "zip")]
  143. [Arguments("https://foo.bar/file/page.xaml.vb?arg=1", "vb")]
  144. [Arguments("https://foo.bar/file/long/pack.ZIP?arg=1", "zip")]
  145. [Arguments("https://foo.bar/file/", "")]
  146. [Arguments("https://foo.bar/file/?arg=1", "")]
  147. [Arguments("https://foo.bar/file?arg=1", "")]
  148. public async Task 路径处理_GetExtension(string input, string expected)
  149. => await Assert.That(PathUtils.GetExtension(input)).IsEqualTo(expected);
  150. #endregion
  151. }