1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 12:17:44 +00:00

AK: Make LexicalPath immutable

This replaces the current LexicalPath::append() API with a new method
that returns a new LexicalPath object and doesn't touch the this-object.
With this, LexicalPath is now immutable. It also adds a
LexicalPath::parent() method and the relevant test cases.
This commit is contained in:
Max Wipfli 2021-06-29 17:55:12 +02:00 committed by Andreas Kling
parent 1e80022282
commit 4c018909f7
3 changed files with 38 additions and 11 deletions

View file

@ -137,15 +137,14 @@ String LexicalPath::relative_path(String absolute_path, String const& prefix)
return absolute_path.substring(prefix_length); return absolute_path.substring(prefix_length);
} }
void LexicalPath::append(String const& component) LexicalPath LexicalPath::append(StringView const& value) const
{ {
StringBuilder builder; return LexicalPath::join(m_string, value);
builder.append(m_string); }
builder.append('/');
builder.append(component);
m_string = builder.to_string(); LexicalPath LexicalPath::parent() const
canonicalize(); {
return append("..");
} }
} }

View file

@ -30,7 +30,8 @@ public:
bool has_extension(StringView const&) const; bool has_extension(StringView const&) const;
void append(String const& component); [[nodiscard]] LexicalPath append(StringView const&) const;
[[nodiscard]] LexicalPath parent() const;
static String canonicalized_path(String); static String canonicalized_path(String);
static String relative_path(String absolute_path, String const& prefix); static String relative_path(String absolute_path, String const& prefix);

View file

@ -165,11 +165,38 @@ TEST_CASE(join)
EXPECT_EQ(LexicalPath::join("anon", "foo.txt").string(), "anon/foo.txt"); EXPECT_EQ(LexicalPath::join("anon", "foo.txt").string(), "anon/foo.txt");
EXPECT_EQ(LexicalPath::join("/home", "anon/foo.txt").string(), "/home/anon/foo.txt"); EXPECT_EQ(LexicalPath::join("/home", "anon/foo.txt").string(), "/home/anon/foo.txt");
EXPECT_EQ(LexicalPath::join("/", "foo.txt").string(), "/foo.txt"); EXPECT_EQ(LexicalPath::join("/", "foo.txt").string(), "/foo.txt");
EXPECT_EQ(LexicalPath::join("/home", "anon", "foo.txt").string(), "/home/anon/foo.txt");
} }
TEST_CASE(append) TEST_CASE(append)
{ {
LexicalPath path("/home/anon"); LexicalPath path("/home/anon/");
path.append("foo.txt"); auto new_path = path.append("foo.txt");
EXPECT_EQ(path.string(), "/home/anon/foo.txt"); 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(), "/");
}
} }