// Copyright 2017 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/strcat.h"
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace gurl_base {

TEST(StrCat, 8Bit) {
  EXPECT_EQ("", StrCat({""}));
  EXPECT_EQ("1", StrCat({"1"}));
  EXPECT_EQ("122", StrCat({"1", "22"}));
  EXPECT_EQ("122333", StrCat({"1", "22", "333"}));
  EXPECT_EQ("1223334444", StrCat({"1", "22", "333", "4444"}));
  EXPECT_EQ("122333444455555", StrCat({"1", "22", "333", "4444", "55555"}));
}

TEST(StrCat, 16Bit) {
  std::u16string arg1 = u"1";
  std::u16string arg2 = u"22";
  std::u16string arg3 = u"333";

  EXPECT_EQ(u"", StrCat({std::u16string()}));
  EXPECT_EQ(u"1", StrCat({arg1}));
  EXPECT_EQ(u"122", StrCat({arg1, arg2}));
  EXPECT_EQ(u"122333", StrCat({arg1, arg2, arg3}));
}

TEST(StrAppend, 8Bit) {
  std::string result;

  result = "foo";
  StrAppend(&result, {std::string()});
  EXPECT_EQ("foo", result);

  result = "foo";
  StrAppend(&result, {"1"});
  EXPECT_EQ("foo1", result);

  result = "foo";
  StrAppend(&result, {"1", "22", "333"});
  EXPECT_EQ("foo122333", result);
}

TEST(StrAppend, 16Bit) {
  std::u16string arg1 = u"1";
  std::u16string arg2 = u"22";
  std::u16string arg3 = u"333";

  std::u16string result;

  result = u"foo";
  StrAppend(&result, {std::u16string()});
  EXPECT_EQ(u"foo", result);

  result = u"foo";
  StrAppend(&result, {arg1});
  EXPECT_EQ(u"foo1", result);

  result = u"foo";
  StrAppend(&result, {arg1, arg2, arg3});
  EXPECT_EQ(u"foo122333", result);
}

TEST(StrAppendT, ReserveAdditionalIfNeeded) {
  std::string str = "foo";
  const char* prev_data = str.data();
  size_t prev_capacity = str.capacity();
  // Fully exhaust current capacity.
  StrAppend(&str, {std::string(str.capacity() - str.size(), 'o')});
  // Expect that we hit capacity, but didn't require a re-alloc.
  EXPECT_EQ(str.capacity(), str.size());
  EXPECT_EQ(prev_data, str.data());
  EXPECT_EQ(prev_capacity, str.capacity());

  // Force a re-alloc by appending another character.
  StrAppend(&str, {"o"});

  // Expect at least 2x growth in capacity.
  EXPECT_LE(2 * prev_capacity, str.capacity());
}

}  // namespace base
