diff --git a/AK/String.cpp b/AK/String.cpp index 4fcdd2e979..e165bf697a 100644 --- a/AK/String.cpp +++ b/AK/String.cpp @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include diff --git a/AK/String.h b/AK/String.h index c59242a409..46821e3426 100644 --- a/AK/String.h +++ b/AK/String.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -185,6 +186,14 @@ public: return vformatted(fmtstr.view(), variadic_format_parameters); } + template + static ErrorOr join(SeparatorType const& separator, CollectionType const& collection, StringView fmtstr = "{}"sv) + { + StringBuilder builder; + TRY(builder.try_join(separator, collection, fmtstr)); + return builder.to_string(); + } + // NOTE: This is primarily interesting to unit tests. [[nodiscard]] bool is_short_string() const; diff --git a/Tests/AK/TestString.cpp b/Tests/AK/TestString.cpp index 5c1572eebc..4f5d87dee0 100644 --- a/Tests/AK/TestString.cpp +++ b/Tests/AK/TestString.cpp @@ -471,3 +471,27 @@ TEST_CASE(repeated) return Test::Crash::Failure::DidNotCrash; }); } + +TEST_CASE(join) +{ + auto string1 = MUST(String::join(',', Vector {})); + EXPECT(string1.is_empty()); + + auto string2 = MUST(String::join(',', Array { 1 })); + EXPECT_EQ(string2, "1"sv); + + auto string3 = MUST(String::join(':', Array { 1 }, "[{}]"sv)); + EXPECT_EQ(string3, "[1]"sv); + + auto string4 = MUST(String::join(',', Array { 1, 2, 3 })); + EXPECT_EQ(string4, "1,2,3"sv); + + auto string5 = MUST(String::join(',', Array { 1, 2, 3 }, "[{}]"sv)); + EXPECT_EQ(string5, "[1],[2],[3]"sv); + + auto string6 = MUST(String::join(String::from_utf8_short_string("!!!"sv), Array { "foo"sv, "bar"sv, "baz"sv })); + EXPECT_EQ(string6, "foo!!!bar!!!baz"sv); + + auto string7 = MUST(String::join(" - "sv, Array { 1, 16, 256, 4096 }, "[{:#04x}]"sv)); + EXPECT_EQ(string7, "[0x0001] - [0x0010] - [0x0100] - [0x1000]"sv); +}