TestLexicalPath.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2021, Max Wipfli <max.wipfli@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <LibTest/TestCase.h>
  8. #include <AK/DeprecatedString.h>
  9. #include <AK/LexicalPath.h>
  10. TEST_CASE(relative_path)
  11. {
  12. EXPECT_EQ(LexicalPath::relative_path("/tmp/abc.txt"sv, "/tmp"sv), "abc.txt"sv);
  13. EXPECT_EQ(LexicalPath::relative_path("/tmp/abc.txt"sv, "/tmp/"sv), "abc.txt"sv);
  14. EXPECT_EQ(LexicalPath::relative_path("/tmp/abc.txt"sv, "/"sv), "tmp/abc.txt"sv);
  15. EXPECT_EQ(LexicalPath::relative_path("/tmp/abc.txt"sv, "/usr"sv), "/tmp/abc.txt"sv);
  16. EXPECT_EQ(LexicalPath::relative_path("/tmp/foo.txt"sv, "tmp"sv), ""sv);
  17. EXPECT_EQ(LexicalPath::relative_path("tmp/foo.txt"sv, "/tmp"sv), ""sv);
  18. }
  19. TEST_CASE(regular_absolute_path)
  20. {
  21. LexicalPath path("/home/anon/foo.txt");
  22. EXPECT_EQ(path.string(), "/home/anon/foo.txt");
  23. EXPECT_EQ(path.dirname(), "/home/anon");
  24. EXPECT_EQ(path.basename(), "foo.txt");
  25. EXPECT_EQ(path.title(), "foo");
  26. EXPECT_EQ(path.extension(), "txt");
  27. EXPECT(path.has_extension(".txt"sv));
  28. EXPECT(path.has_extension("txt"sv));
  29. EXPECT(!path.has_extension("txxt"sv));
  30. EXPECT_EQ(path.parts_view().size(), 3u);
  31. EXPECT_EQ(path.parts_view()[0], "home");
  32. EXPECT_EQ(path.parts_view()[1], "anon");
  33. EXPECT_EQ(path.parts_view()[2], "foo.txt");
  34. }
  35. TEST_CASE(regular_relative_path)
  36. {
  37. LexicalPath path("anon/foo.txt");
  38. EXPECT_EQ(path.dirname(), "anon");
  39. EXPECT_EQ(path.basename(), "foo.txt");
  40. EXPECT_EQ(path.parts_view().size(), 2u);
  41. EXPECT_EQ(path.parts_view()[0], "anon");
  42. EXPECT_EQ(path.parts_view()[1], "foo.txt");
  43. }
  44. TEST_CASE(single_dot)
  45. {
  46. {
  47. LexicalPath path("/home/./anon/foo.txt");
  48. EXPECT_EQ(path.string(), "/home/anon/foo.txt");
  49. }
  50. {
  51. LexicalPath path("./test.txt");
  52. EXPECT_EQ(path.string(), "test.txt");
  53. }
  54. {
  55. LexicalPath path("./../test.txt");
  56. EXPECT_EQ(path.string(), "../test.txt");
  57. }
  58. }
  59. TEST_CASE(relative_path_with_dotdot)
  60. {
  61. LexicalPath path("anon/../../foo.txt");
  62. EXPECT_EQ(path.string(), "../foo.txt");
  63. EXPECT_EQ(path.dirname(), "..");
  64. EXPECT_EQ(path.basename(), "foo.txt");
  65. EXPECT_EQ(path.parts_view().size(), 2u);
  66. EXPECT_EQ(path.parts_view()[0], "..");
  67. EXPECT_EQ(path.parts_view()[1], "foo.txt");
  68. }
  69. TEST_CASE(absolute_path_with_dotdot)
  70. {
  71. {
  72. LexicalPath path("/test/../foo.txt");
  73. EXPECT_EQ(path.string(), "/foo.txt");
  74. }
  75. {
  76. LexicalPath path("/../../foo.txt");
  77. EXPECT_EQ(path.string(), "/foo.txt");
  78. }
  79. }
  80. TEST_CASE(more_dotdot_paths)
  81. {
  82. EXPECT_EQ(LexicalPath::canonicalized_path("/home/user/../../not/home"), "/not/home");
  83. EXPECT_EQ(LexicalPath::canonicalized_path("/../../../../"), "/");
  84. EXPECT_EQ(LexicalPath::canonicalized_path("./../../../../"), "../../../..");
  85. EXPECT_EQ(LexicalPath::canonicalized_path("../../../../../"), "../../../../..");
  86. }
  87. TEST_CASE(the_root_path)
  88. {
  89. LexicalPath path("/");
  90. EXPECT_EQ(path.dirname(), "/");
  91. EXPECT_EQ(path.basename(), "/");
  92. EXPECT_EQ(path.title(), "/");
  93. EXPECT_EQ(path.parts_view().size(), 0u);
  94. }
  95. TEST_CASE(the_dot_path)
  96. {
  97. LexicalPath path(".");
  98. EXPECT_EQ(path.string(), ".");
  99. EXPECT_EQ(path.dirname(), ".");
  100. EXPECT_EQ(path.basename(), ".");
  101. EXPECT_EQ(path.title(), ".");
  102. }
  103. TEST_CASE(double_slash)
  104. {
  105. LexicalPath path("//home/anon/foo.txt");
  106. EXPECT_EQ(path.string(), "/home/anon/foo.txt");
  107. }
  108. TEST_CASE(trailing_slash)
  109. {
  110. LexicalPath path("/home/anon/");
  111. EXPECT_EQ(path.string(), "/home/anon");
  112. EXPECT_EQ(path.dirname(), "/home");
  113. EXPECT_EQ(path.basename(), "anon");
  114. EXPECT_EQ(path.parts_view().size(), 2u);
  115. }
  116. TEST_CASE(resolve_absolute_path)
  117. {
  118. EXPECT_EQ(LexicalPath::absolute_path("/home/anon", "foo.txt"), "/home/anon/foo.txt");
  119. EXPECT_EQ(LexicalPath::absolute_path("/home/anon/", "foo.txt"), "/home/anon/foo.txt");
  120. EXPECT_EQ(LexicalPath::absolute_path("/home/anon", "././foo.txt"), "/home/anon/foo.txt");
  121. EXPECT_EQ(LexicalPath::absolute_path("/home/anon/quux", "../foo.txt"), "/home/anon/foo.txt");
  122. EXPECT_EQ(LexicalPath::absolute_path("/home/anon/quux", "../test/foo.txt"), "/home/anon/test/foo.txt");
  123. EXPECT_EQ(LexicalPath::absolute_path("quux", "../test/foo.txt"), "test/foo.txt");
  124. EXPECT_EQ(LexicalPath::absolute_path("quux", "../../test/foo.txt"), "../test/foo.txt");
  125. EXPECT_EQ(LexicalPath::absolute_path("quux/bar", "../../test/foo.txt"), "test/foo.txt");
  126. EXPECT_EQ(LexicalPath::absolute_path("quux/bar/", "../../test/foo.txt"), "test/foo.txt");
  127. }
  128. TEST_CASE(has_extension)
  129. {
  130. {
  131. LexicalPath path("/tmp/simple.png");
  132. EXPECT(path.has_extension(".png"sv));
  133. EXPECT(path.has_extension(".pnG"sv));
  134. EXPECT(path.has_extension(".PNG"sv));
  135. }
  136. {
  137. LexicalPath path("/TMP/SIMPLE.PNG");
  138. EXPECT(path.has_extension(".png"sv));
  139. EXPECT(path.has_extension(".pnG"sv));
  140. EXPECT(path.has_extension(".PNG"sv));
  141. }
  142. {
  143. LexicalPath path(".png");
  144. EXPECT(path.has_extension(".png"sv));
  145. }
  146. {
  147. LexicalPath path("png");
  148. EXPECT_EQ(path.has_extension(".png"sv), false);
  149. }
  150. }
  151. TEST_CASE(join)
  152. {
  153. EXPECT_EQ(LexicalPath::join("anon"sv, "foo.txt"sv).string(), "anon/foo.txt"sv);
  154. EXPECT_EQ(LexicalPath::join("/home"sv, "anon/foo.txt"sv).string(), "/home/anon/foo.txt"sv);
  155. EXPECT_EQ(LexicalPath::join("/"sv, "foo.txt"sv).string(), "/foo.txt"sv);
  156. EXPECT_EQ(LexicalPath::join("/home"sv, "anon"sv, "foo.txt"sv).string(), "/home/anon/foo.txt"sv);
  157. }
  158. TEST_CASE(append)
  159. {
  160. LexicalPath path("/home/anon/");
  161. auto new_path = path.append("foo.txt"sv);
  162. EXPECT_EQ(new_path.string(), "/home/anon/foo.txt");
  163. }
  164. TEST_CASE(parent)
  165. {
  166. {
  167. LexicalPath path("/home/anon/foo.txt");
  168. auto parent = path.parent();
  169. EXPECT_EQ(parent.string(), "/home/anon");
  170. }
  171. {
  172. LexicalPath path("anon/foo.txt");
  173. auto parent = path.parent();
  174. EXPECT_EQ(parent.string(), "anon");
  175. }
  176. {
  177. LexicalPath path("foo.txt");
  178. auto parent = path.parent();
  179. EXPECT_EQ(parent.string(), ".");
  180. auto parent_of_parent = parent.parent();
  181. EXPECT_EQ(parent_of_parent.string(), "..");
  182. }
  183. {
  184. LexicalPath path("/");
  185. auto parent = path.parent();
  186. EXPECT_EQ(parent.string(), "/");
  187. }
  188. }
  189. TEST_CASE(is_child_of)
  190. {
  191. {
  192. LexicalPath parent("/a/parent/directory");
  193. LexicalPath child("/a/parent/directory/a/child");
  194. LexicalPath mismatching("/not/a/child/directory");
  195. EXPECT(child.is_child_of(parent));
  196. EXPECT(child.is_child_of(child));
  197. EXPECT(parent.is_child_of(parent));
  198. EXPECT(!parent.is_child_of(child));
  199. EXPECT(!mismatching.is_child_of(parent));
  200. EXPECT(parent.is_child_of(parent.parent()));
  201. EXPECT(child.parent().parent().is_child_of(parent));
  202. EXPECT(!child.parent().parent().parent().is_child_of(parent));
  203. }
  204. {
  205. LexicalPath root("/");
  206. EXPECT(LexicalPath("/").is_child_of(root));
  207. EXPECT(LexicalPath("/any").is_child_of(root));
  208. EXPECT(LexicalPath("/child/directory").is_child_of(root));
  209. }
  210. {
  211. LexicalPath relative("folder");
  212. LexicalPath relative_child("folder/sub");
  213. LexicalPath absolute("/folder");
  214. LexicalPath absolute_child("/folder/sub");
  215. EXPECT(relative_child.is_child_of(relative));
  216. EXPECT(absolute_child.is_child_of(absolute));
  217. EXPECT(relative.is_child_of(absolute));
  218. EXPECT(relative.is_child_of(absolute_child));
  219. EXPECT(relative_child.is_child_of(absolute));
  220. EXPECT(relative_child.is_child_of(absolute_child));
  221. EXPECT(!absolute.is_child_of(relative));
  222. EXPECT(!absolute_child.is_child_of(relative));
  223. EXPECT(!absolute_child.is_child_of(relative_child));
  224. }
  225. }