#include "base/strings/to_string.h"
#include <ios>
#include <ostream>
#include <string>
#include "testing/gtest/include/gtest/gtest.h"
namespace base {
namespace {
TEST(ToStringTest, Streamable) {
EXPECT_EQ(ToString("foo"), "foo");
EXPECT_EQ(ToString(123), "123");
}
enum class StreamableTestEnum { kGreeting, kLocation };
std::ostream& operator<<(std::ostream& os, const StreamableTestEnum& value) {
switch (value) {
case StreamableTestEnum::kGreeting:
return os << "hello";
case StreamableTestEnum::kLocation:
return os << "world";
}
}
TEST(ToStringTest, UserDefinedStreamable) {
EXPECT_EQ(ToString(StreamableTestEnum::kGreeting), "hello");
EXPECT_EQ(ToString(StreamableTestEnum::kGreeting, " ",
StreamableTestEnum::kLocation),
"hello world");
}
class HasToString {
public:
std::string ToString() const { return "yay!"; }
};
TEST(ToStringTest, UserDefinedToString) {
EXPECT_EQ(ToString(HasToString()), "yay!");
}
class UnusualToString {
public:
HasToString ToString() const { return HasToString(); }
};
TEST(ToStringTest, ToStringReturnsNonStdString) {
EXPECT_EQ(ToString(UnusualToString()), "yay!");
}
enum class NonStreamableTestEnum { kGreeting = 0, kLocation };
TEST(ToStringTest, ScopedEnum) {
EXPECT_EQ(ToString(NonStreamableTestEnum::kLocation), "1");
}
TEST(ToStringTest, IoManip) {
EXPECT_EQ(ToString("42 in hex is ", std::hex, 42), "42 in hex is 2a");
}
void Func() {}
TEST(ToStringTest, FunctionPointer) {
EXPECT_NE(ToString(&Func), ToString(true));
EXPECT_EQ(ToString(Func), ToString(&Func));
}
class NotStringifiable {};
class OverloadsAddressOp {
public:
OverloadsAddressOp* operator&() { return nullptr; }
const OverloadsAddressOp* operator&() const { return nullptr; }
};
TEST(ToStringTest, NonStringifiable) {
EXPECT_NE(ToString(NotStringifiable()).find("-byte object at 0x"),
std::string::npos);
EXPECT_NE(ToString(OverloadsAddressOp()),
ToString(static_cast<OverloadsAddressOp*>(nullptr)));
}
}
}