#include "absl/strings/internal/stringify_stream.h"
#include <cstddef>
#include <iomanip>
#include <ostream>
#include <sstream>
#include "gtest/gtest.h"
#include "absl/base/config.h"
#include "absl/strings/str_format.h"
#include "absl/strings/string_view.h"
namespace absl {
ABSL_NAMESPACE_BEGIN
namespace strings_internal {
namespace {
struct AppendNCharsTest {
size_t count;
char ch;
template <typename Sink>
friend void AbslStringify(Sink& sink, const AppendNCharsTest& t) {
sink.Append(t.count, t.ch);
}
};
TEST(StringifyStreamTest, AppendNChars) {
std::ostringstream os;
StringifyStream(os) << AppendNCharsTest{5, 'a'};
EXPECT_EQ(os.str(), "aaaaa");
}
struct AppendStringViewTest {
absl::string_view v;
template <typename Sink>
friend void AbslStringify(Sink& sink, const AppendStringViewTest& t) {
sink.Append(t.v);
}
};
TEST(StringifyStreamTest, AppendStringView) {
std::ostringstream os;
StringifyStream(os) << AppendStringViewTest{"abc"};
EXPECT_EQ(os.str(), "abc");
}
struct AbslFormatFlushTest {
absl::string_view a, b, c;
template <typename Sink>
friend void AbslStringify(Sink& sink, const AbslFormatFlushTest& t) {
absl::Format(&sink, "%s, %s, %s", t.a, t.b, t.c);
}
};
TEST(StringifyStreamTest, AbslFormatFlush) {
std::ostringstream os;
StringifyStream(os) << AbslFormatFlushTest{"a", "b", "c"};
EXPECT_EQ(os.str(), "a, b, c");
}
struct PreferStreamInsertionOverAbslStringifyTest {
friend std::ostream& operator<<( std::ostream& os, const PreferStreamInsertionOverAbslStringifyTest&) {
return os << "good";
}
template <typename Sink>
friend void AbslStringify (Sink& sink, const PreferStreamInsertionOverAbslStringifyTest&) {
sink.Append("bad");
}
};
TEST(StringifyStreamTest, PreferStreamInsertionOverAbslStringify) {
std::ostringstream os;
StringifyStream(os) << PreferStreamInsertionOverAbslStringifyTest{};
EXPECT_EQ(os.str(), "good");
}
TEST(StringifyStreamTest, SupportEndl) {
std::ostringstream os;
StringifyStream(os) << std::endl;
EXPECT_EQ(os.str(), "\n");
}
TEST(StringifyStreamTest, SupportSetbase) {
std::ostringstream os;
StringifyStream(os) << std::setbase(16) << 255;
EXPECT_EQ(os.str(), "ff");
}
} } ABSL_NAMESPACE_END
}