123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- /*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
- * Copyright (c) 2021, Max Wipfli <max.wipfli@serenityos.org>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
- #include <LibTest/TestCase.h>
- #include <AK/DeprecatedString.h>
- #include <AK/LexicalPath.h>
- TEST_CASE(relative_path)
- {
- EXPECT_EQ(LexicalPath::relative_path("/tmp/abc.txt"sv, "/tmp"sv), "abc.txt"sv);
- EXPECT_EQ(LexicalPath::relative_path("/tmp/abc.txt"sv, "/tmp/"sv), "abc.txt"sv);
- EXPECT_EQ(LexicalPath::relative_path("/tmp/abc.txt"sv, "/"sv), "tmp/abc.txt"sv);
- EXPECT_EQ(LexicalPath::relative_path("/tmp/abc.txt"sv, "/usr"sv), "/tmp/abc.txt"sv);
- EXPECT_EQ(LexicalPath::relative_path("/tmp/foo.txt"sv, "tmp"sv), ""sv);
- EXPECT_EQ(LexicalPath::relative_path("tmp/foo.txt"sv, "/tmp"sv), ""sv);
- }
- TEST_CASE(regular_absolute_path)
- {
- LexicalPath path("/home/anon/foo.txt");
- EXPECT_EQ(path.string(), "/home/anon/foo.txt");
- EXPECT_EQ(path.dirname(), "/home/anon");
- EXPECT_EQ(path.basename(), "foo.txt");
- EXPECT_EQ(path.title(), "foo");
- EXPECT_EQ(path.extension(), "txt");
- EXPECT(path.has_extension(".txt"sv));
- EXPECT(path.has_extension("txt"sv));
- EXPECT(!path.has_extension("txxt"sv));
- EXPECT_EQ(path.parts_view().size(), 3u);
- EXPECT_EQ(path.parts_view()[0], "home");
- EXPECT_EQ(path.parts_view()[1], "anon");
- EXPECT_EQ(path.parts_view()[2], "foo.txt");
- }
- TEST_CASE(regular_relative_path)
- {
- LexicalPath path("anon/foo.txt");
- EXPECT_EQ(path.dirname(), "anon");
- EXPECT_EQ(path.basename(), "foo.txt");
- EXPECT_EQ(path.parts_view().size(), 2u);
- EXPECT_EQ(path.parts_view()[0], "anon");
- EXPECT_EQ(path.parts_view()[1], "foo.txt");
- }
- TEST_CASE(single_dot)
- {
- {
- LexicalPath path("/home/./anon/foo.txt");
- EXPECT_EQ(path.string(), "/home/anon/foo.txt");
- }
- {
- LexicalPath path("./test.txt");
- EXPECT_EQ(path.string(), "test.txt");
- }
- {
- LexicalPath path("./../test.txt");
- EXPECT_EQ(path.string(), "../test.txt");
- }
- }
- TEST_CASE(relative_path_with_dotdot)
- {
- LexicalPath path("anon/../../foo.txt");
- EXPECT_EQ(path.string(), "../foo.txt");
- EXPECT_EQ(path.dirname(), "..");
- EXPECT_EQ(path.basename(), "foo.txt");
- EXPECT_EQ(path.parts_view().size(), 2u);
- EXPECT_EQ(path.parts_view()[0], "..");
- EXPECT_EQ(path.parts_view()[1], "foo.txt");
- }
- TEST_CASE(absolute_path_with_dotdot)
- {
- {
- LexicalPath path("/test/../foo.txt");
- EXPECT_EQ(path.string(), "/foo.txt");
- }
- {
- LexicalPath path("/../../foo.txt");
- EXPECT_EQ(path.string(), "/foo.txt");
- }
- }
- TEST_CASE(more_dotdot_paths)
- {
- EXPECT_EQ(LexicalPath::canonicalized_path("/home/user/../../not/home"), "/not/home");
- EXPECT_EQ(LexicalPath::canonicalized_path("/../../../../"), "/");
- EXPECT_EQ(LexicalPath::canonicalized_path("./../../../../"), "../../../..");
- EXPECT_EQ(LexicalPath::canonicalized_path("../../../../../"), "../../../../..");
- }
- TEST_CASE(the_root_path)
- {
- LexicalPath path("/");
- EXPECT_EQ(path.dirname(), "/");
- EXPECT_EQ(path.basename(), "/");
- EXPECT_EQ(path.title(), "/");
- EXPECT_EQ(path.parts_view().size(), 0u);
- }
- TEST_CASE(the_dot_path)
- {
- LexicalPath path(".");
- EXPECT_EQ(path.string(), ".");
- EXPECT_EQ(path.dirname(), ".");
- EXPECT_EQ(path.basename(), ".");
- EXPECT_EQ(path.title(), ".");
- }
- TEST_CASE(double_slash)
- {
- LexicalPath path("//home/anon/foo.txt");
- EXPECT_EQ(path.string(), "/home/anon/foo.txt");
- }
- TEST_CASE(trailing_slash)
- {
- LexicalPath path("/home/anon/");
- EXPECT_EQ(path.string(), "/home/anon");
- EXPECT_EQ(path.dirname(), "/home");
- EXPECT_EQ(path.basename(), "anon");
- EXPECT_EQ(path.parts_view().size(), 2u);
- }
- TEST_CASE(resolve_absolute_path)
- {
- EXPECT_EQ(LexicalPath::absolute_path("/home/anon", "foo.txt"), "/home/anon/foo.txt");
- EXPECT_EQ(LexicalPath::absolute_path("/home/anon/", "foo.txt"), "/home/anon/foo.txt");
- EXPECT_EQ(LexicalPath::absolute_path("/home/anon", "././foo.txt"), "/home/anon/foo.txt");
- EXPECT_EQ(LexicalPath::absolute_path("/home/anon/quux", "../foo.txt"), "/home/anon/foo.txt");
- EXPECT_EQ(LexicalPath::absolute_path("/home/anon/quux", "../test/foo.txt"), "/home/anon/test/foo.txt");
- EXPECT_EQ(LexicalPath::absolute_path("quux", "../test/foo.txt"), "test/foo.txt");
- EXPECT_EQ(LexicalPath::absolute_path("quux", "../../test/foo.txt"), "../test/foo.txt");
- EXPECT_EQ(LexicalPath::absolute_path("quux/bar", "../../test/foo.txt"), "test/foo.txt");
- EXPECT_EQ(LexicalPath::absolute_path("quux/bar/", "../../test/foo.txt"), "test/foo.txt");
- }
- TEST_CASE(has_extension)
- {
- {
- LexicalPath path("/tmp/simple.png");
- EXPECT(path.has_extension(".png"sv));
- EXPECT(path.has_extension(".pnG"sv));
- EXPECT(path.has_extension(".PNG"sv));
- }
- {
- LexicalPath path("/TMP/SIMPLE.PNG");
- EXPECT(path.has_extension(".png"sv));
- EXPECT(path.has_extension(".pnG"sv));
- EXPECT(path.has_extension(".PNG"sv));
- }
- {
- LexicalPath path(".png");
- EXPECT(path.has_extension(".png"sv));
- }
- {
- LexicalPath path("png");
- EXPECT_EQ(path.has_extension(".png"sv), false);
- }
- }
- TEST_CASE(join)
- {
- EXPECT_EQ(LexicalPath::join("anon"sv, "foo.txt"sv).string(), "anon/foo.txt"sv);
- EXPECT_EQ(LexicalPath::join("/home"sv, "anon/foo.txt"sv).string(), "/home/anon/foo.txt"sv);
- EXPECT_EQ(LexicalPath::join("/"sv, "foo.txt"sv).string(), "/foo.txt"sv);
- EXPECT_EQ(LexicalPath::join("/home"sv, "anon"sv, "foo.txt"sv).string(), "/home/anon/foo.txt"sv);
- }
- TEST_CASE(append)
- {
- LexicalPath path("/home/anon/");
- auto new_path = path.append("foo.txt"sv);
- EXPECT_EQ(new_path.string(), "/home/anon/foo.txt");
- }
- TEST_CASE(parent)
- {
- {
- LexicalPath path("/home/anon/foo.txt");
- auto parent = path.parent();
- EXPECT_EQ(parent.string(), "/home/anon");
- }
- {
- LexicalPath path("anon/foo.txt");
- auto parent = path.parent();
- EXPECT_EQ(parent.string(), "anon");
- }
- {
- LexicalPath path("foo.txt");
- auto parent = path.parent();
- EXPECT_EQ(parent.string(), ".");
- auto parent_of_parent = parent.parent();
- EXPECT_EQ(parent_of_parent.string(), "..");
- }
- {
- LexicalPath path("/");
- auto parent = path.parent();
- EXPECT_EQ(parent.string(), "/");
- }
- }
- TEST_CASE(is_child_of)
- {
- {
- LexicalPath parent("/a/parent/directory");
- LexicalPath child("/a/parent/directory/a/child");
- LexicalPath mismatching("/not/a/child/directory");
- EXPECT(child.is_child_of(parent));
- EXPECT(child.is_child_of(child));
- EXPECT(parent.is_child_of(parent));
- EXPECT(!parent.is_child_of(child));
- EXPECT(!mismatching.is_child_of(parent));
- EXPECT(parent.is_child_of(parent.parent()));
- EXPECT(child.parent().parent().is_child_of(parent));
- EXPECT(!child.parent().parent().parent().is_child_of(parent));
- }
- {
- LexicalPath root("/");
- EXPECT(LexicalPath("/").is_child_of(root));
- EXPECT(LexicalPath("/any").is_child_of(root));
- EXPECT(LexicalPath("/child/directory").is_child_of(root));
- }
- {
- LexicalPath relative("folder");
- LexicalPath relative_child("folder/sub");
- LexicalPath absolute("/folder");
- LexicalPath absolute_child("/folder/sub");
- EXPECT(relative_child.is_child_of(relative));
- EXPECT(absolute_child.is_child_of(absolute));
- EXPECT(relative.is_child_of(absolute));
- EXPECT(relative.is_child_of(absolute_child));
- EXPECT(relative_child.is_child_of(absolute));
- EXPECT(relative_child.is_child_of(absolute_child));
- EXPECT(!absolute.is_child_of(relative));
- EXPECT(!absolute_child.is_child_of(relative));
- EXPECT(!absolute_child.is_child_of(relative_child));
- }
- }
|