910e62b5创建于 1月15日历史提交
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/strings/lazy_string_builder.h"

#include <string>

#include "base/strings/string_number_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace base {

TEST(LazyStringBuilderTest, Empty) {
  auto builder = LazyStringBuilder::CreateForTesting();
  EXPECT_EQ("", builder.Build());
}

TEST(LazyStringBuilderTest, AppendStringView) {
  auto builder = LazyStringBuilder::CreateForTesting();
  std::string_view sv = "hello";
  builder.AppendByReference(sv);
  EXPECT_EQ("hello", builder.Build());
}

TEST(LazyStringBuilderTest, AppendCString) {
  auto builder = LazyStringBuilder::CreateForTesting();
  builder.AppendByReference("hello");
  EXPECT_EQ("hello", builder.Build());
}

TEST(LazyStringBuilderTest, AppendLValueString) {
  // The string must outlive the builder, and so be allocated first.
  std::string lvalue_string = "lvalue";
  auto builder = LazyStringBuilder::CreateForTesting();
  builder.AppendByReference(lvalue_string);
  EXPECT_EQ("lvalue", builder.Build());
}

TEST(LazyStringBuilderTest, AppendMultiple) {
  auto builder = LazyStringBuilder::CreateForTesting();
  builder.AppendByReference("hello", " ", "world");
  EXPECT_EQ("hello world", builder.Build());
}

TEST(LazyStringBuilderTest, AppendMultipleStringViews) {
  auto builder = LazyStringBuilder::CreateForTesting();
  std::string_view hello = "hello";
  std::string_view space = " ";
  std::string_view world = "world";
  builder.AppendByReference(hello, space, world);
  EXPECT_EQ("hello world", builder.Build());
}

TEST(LazyStringBuilderTest, AppendMultipleLValueStrings) {
  std::string s1 = "hello";
  const std::string s2 = " ";
  std::string s3 = "world";
  auto builder = LazyStringBuilder::CreateForTesting();
  builder.AppendByReference(s1, s2, s3);
  EXPECT_EQ("hello world", builder.Build());
}
TEST(LazyStringBuilderTest, CopyAndAppend) {
  auto builder = LazyStringBuilder::CreateForTesting();
  std::string s = "world";
  builder.AppendByReference("hello ");
  builder.AppendByValue(s);
  EXPECT_EQ("hello world", builder.Build());
}

TEST(LazyStringBuilderTest, CopyAndAppendRvalue) {
  auto builder = LazyStringBuilder::CreateForTesting();
  builder.AppendByReference("hello ");
  builder.AppendByValue(std::string("world"));
  EXPECT_EQ("hello world", builder.Build());
}

TEST(LazyStringBuilderTest, MixedAppend) {
  auto builder = LazyStringBuilder::CreateForTesting();
  std::string_view part1 = "The quick brown fox";
  std::string part2 = "jumps over";
  const char* part3 = "the lazy dog.";

  builder.AppendByReference(part1);
  builder.AppendByReference(" ");
  builder.AppendByValue(std::move(part2));
  builder.AppendByReference(" ", part3);

  EXPECT_EQ("The quick brown fox jumps over the lazy dog.", builder.Build());
}

TEST(LazyStringBuilderTest, ManyAppends) {
  auto builder = LazyStringBuilder::CreateForTesting();
  std::string expected;
  for (int i = 0; i < 40; ++i) {
    std::string s = base::NumberToString(i);
    builder.AppendByValue(s);

    expected += s;
  }
  EXPECT_EQ(expected, builder.Build());
}

TEST(LazyStringBuilderTest, ManyAppendsVariadic) {
  auto builder = LazyStringBuilder::CreateForTesting();
  builder.AppendByReference("0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
                            "10", "11", "12", "13", "14", "15", "16", "17",
                            "18", "19", "20", "21", "22", "23", "24", "25",
                            "26", "27", "28", "29", "30", "31", "32", "33");
  EXPECT_EQ("0123456789101112131415161718192021222324252627282930313233",
            builder.Build());
}

// Build() is a const method, so it can be called multiple times, and more
// things can be appended after calling it.
TEST(LazyStringBuilderTest, Reuse) {
  auto builder = LazyStringBuilder::CreateForTesting();
  builder.AppendByReference("hello");
  EXPECT_EQ("hello", builder.Build());

  builder.AppendByReference(" world");
  EXPECT_EQ("hello world", builder.Build());
}

}  // namespace base