#define _CRT_SECURE_NO_WARNINGS #include #include "gtest/gtest.h" #include "libimp/fmt.h" TEST(fmt, spec) { EXPECT_STREQ(imp::spec("hello")(123).fstr.data(), "hello"); EXPECT_EQ(imp::spec("hello")(123).param , 123); EXPECT_STREQ(imp::spec("hello")("world").fstr.data(), "hello"); EXPECT_STREQ(imp::spec("hello")("world").param , "world"); } TEST(fmt, to_string) { /// @brief string EXPECT_STREQ(imp::to_string(""), ""); EXPECT_STREQ(imp::to_string("%what%"), "%what%"); EXPECT_EQ(imp::to_string("%what%", "10") , " %what%"); EXPECT_EQ(imp::to_string("%what%", "-10"), "%what% "); /// @brief character EXPECT_EQ(imp::to_string('A'), "A"); EXPECT_EQ(imp::to_string(L'A'), "A"); EXPECT_EQ(imp::to_string(u'A'), "A"); EXPECT_EQ(imp::to_string(U'A'), "A"); /// @brief numeric EXPECT_EQ(imp::to_string((signed char)123), "123"); EXPECT_EQ(imp::to_string((signed char)-321), "-65"); EXPECT_EQ(imp::to_string((unsigned char)123), "123"); EXPECT_EQ(imp::to_string((unsigned char)321), "65"); EXPECT_EQ(imp::to_string((short)123), "123"); EXPECT_EQ(imp::to_string((short)-321), "-321"); EXPECT_EQ(imp::to_string((unsigned short)123), "123"); EXPECT_EQ(imp::to_string((unsigned short)321), "321"); EXPECT_EQ(imp::to_string((short)123123), "-7949"); EXPECT_EQ(imp::to_string((short)-321321), "6359"); EXPECT_EQ(imp::to_string((unsigned short)123123), "57587"); EXPECT_EQ(imp::to_string((unsigned short)321321), "59177"); EXPECT_EQ(imp::to_string(123123), "123123"); EXPECT_EQ(imp::to_string(-321321), "-321321"); EXPECT_EQ(imp::to_string(123123u), "123123"); EXPECT_EQ(imp::to_string(321321u), "321321"); EXPECT_EQ(imp::to_string(123123ll), "123123"); EXPECT_EQ(imp::to_string(-321321ll), "-321321"); EXPECT_EQ(imp::to_string(123123ull), "123123"); EXPECT_EQ(imp::to_string(321321ull), "321321"); EXPECT_EQ(imp::to_string(123123, "x"), "1e0f3"); EXPECT_EQ(imp::to_string(123123u, "x"), "1e0f3"); EXPECT_EQ(imp::to_string(123123123123ll, "X"), "1CAAB5C3B3"); EXPECT_EQ(imp::to_string(123123123123ull, "X"), "1CAAB5C3B3"); /// @brief floating point EXPECT_EQ(imp::to_string(123.123f, ".3"), "123.123"); EXPECT_EQ(imp::to_string(123.123, "010.5"), "0123.12300"); EXPECT_EQ(imp::to_string(123.123l, "010.6"), "123.123000"); EXPECT_EQ(imp::to_string(1.5, "e"), "1.500000e+00"); EXPECT_EQ(imp::to_string(1.5, "E"), "1.500000E+00"); double r = 0.0; std::cout << imp::to_string(0.0/r) << "\n"; std::cout << imp::to_string(1.0/r) << "\n"; SUCCEED(); /// @brief pointer EXPECT_EQ(imp::to_string(nullptr), "null"); int *p = (int *)0x0f013a04; std::cout << imp::to_string((void *)p) << "\n"; SUCCEED(); /// @brief date and time auto tp = std::chrono::system_clock::now(); auto tt = std::chrono::system_clock::to_time_t(tp); auto tm = *std::localtime(&tt); std::cout << imp::to_string(tm) << "\n"; EXPECT_EQ(imp::to_string(tm), imp::to_string(tp)); SUCCEED(); } TEST(fmt, fmt) { auto s = imp::fmt("hello", " ", "world", "."); EXPECT_EQ(s, "hello world."); std::cout << imp::fmt('[', std::chrono::system_clock::now(), "] ", s) << "\n"; } namespace { class foo {}; std::string tag_invoke(decltype(imp::fmt_to_string), foo arg) noexcept(false) { throw arg; return {}; } } // namespace TEST(fmt, throw) { EXPECT_THROW(imp::fmt(foo{}), foo); }