From 64aac345d38f98520c367c080829f06fd47472b6 Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Sat, 17 Jul 2021 16:27:12 -0600 Subject: [PATCH] AK: Use new Formatter for each element in Formatter> The state of the formatter for the previous element should be thrown away for each iteration. This showed up when trying to format a Vector, since Formatter was unhappy about some state that gets set when it's called. Add a test for Formatter. --- AK/Format.h | 4 +++- Tests/AK/TestFormat.cpp | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/AK/Format.h b/AK/Format.h index 199cab97b4..8c9f3184d1 100644 --- a/AK/Format.h +++ b/AK/Format.h @@ -354,8 +354,10 @@ requires(HasFormatter) struct Formatter> : StandardFormatter { builder.put_literal("[ "sv); bool first = true; for (auto& content : value) { - if (!first) + if (!first) { builder.put_literal(", "sv); + content_fmt = Formatter {}; + } first = false; content_fmt.format(builder, content); } diff --git a/Tests/AK/TestFormat.cpp b/Tests/AK/TestFormat.cpp index 3c61179879..28696cce28 100644 --- a/Tests/AK/TestFormat.cpp +++ b/Tests/AK/TestFormat.cpp @@ -8,6 +8,7 @@ #include #include +#include TEST_CASE(is_integral_works_properly) { @@ -306,3 +307,19 @@ TEST_CASE(hex_dump) EXPECT_EQ(String::formatted("{:>2hex-dump}", "0000"), "3030 00\n3030 00"); EXPECT_EQ(String::formatted("{:*>4hex-dump}", "0000"), "30303030****0000"); } + +TEST_CASE(vector_format) +{ + { + Vector v { 1, 2, 3, 4 }; + EXPECT_EQ(String::formatted("{}", v), "[ 1, 2, 3, 4 ]"); + } + { + Vector v { "1"sv, "2"sv, "3"sv, "4"sv }; + EXPECT_EQ(String::formatted("{}", v), "[ 1, 2, 3, 4 ]"); + } + { + Vector> v { { "1"sv, "2"sv }, { "3"sv, "4"sv } }; + EXPECT_EQ(String::formatted("{}", v), "[ [ 1, 2 ], [ 3, 4 ] ]"); + } +}