/*
 Tests of string utilities

 Copyright (c) 2012 - 2016, Victor Zverovich
 All rights reserved.

 For the license information refer to format.h.
 */

#include "fmt/string.h"
#include "gtest/gtest.h"

using fmt::internal::StringBuffer;

TEST(StringBufferTest, Empty) {
  StringBuffer<char> buffer;
  EXPECT_EQ(0u, buffer.size());
  EXPECT_EQ(0u, buffer.capacity());
  std::string data;
  // std::string may have initial capacity.
  std::size_t capacity = data.capacity();
  buffer.move_to(data);
  EXPECT_EQ("", data);
  EXPECT_EQ(capacity, data.capacity());
}

TEST(StringBufferTest, Reserve) {
  StringBuffer<char> buffer;
  std::size_t capacity = std::string().capacity() + 10;
  buffer.reserve(capacity);
  EXPECT_EQ(0u, buffer.size());
  EXPECT_EQ(capacity, buffer.capacity());
  std::string data;
  buffer.move_to(data);
  EXPECT_EQ("", data);
}

TEST(StringBufferTest, Resize) {
  StringBuffer<char> buffer;
  std::size_t size = std::string().capacity() + 10;
  buffer.resize(size);
  EXPECT_EQ(size, buffer.size());
  EXPECT_EQ(size, buffer.capacity());
  std::string data;
  buffer.move_to(data);
  EXPECT_EQ(size, data.size());
}

TEST(StringBufferTest, MoveTo) {
  StringBuffer<char> buffer;
  std::size_t size = std::string().capacity() + 10;
  buffer.resize(size);
  const char *p = &buffer[0];
  std::string data;
  buffer.move_to(data);
  EXPECT_EQ(p, &data[0]);
  EXPECT_EQ(0u, buffer.size());
  EXPECT_EQ(0u, buffer.capacity());
}

TEST(StringWriterTest, MoveTo) {
  fmt::StringWriter out;
  out << "The answer is " << 42 << "\n";
  std::string s;
  out.move_to(s);
  EXPECT_EQ("The answer is 42\n", s);
  EXPECT_EQ(0u, out.size());
}

TEST(StringWriterTest, WString) {
  fmt::WStringWriter out;
  out << "The answer is " << 42 << "\n";
  std::wstring s;
  out.move_to(s);
  EXPECT_EQ(L"The answer is 42\n", s);
}

TEST(StringTest, ToString) {
  EXPECT_EQ("42", fmt::to_string(42));
}

TEST(StringTest, ToWString) {
  EXPECT_EQ(L"42", fmt::to_wstring(42));
}
