#include <sstream>
#include <iomanip>
+using namespace boost::uuids;
+
+void uufail(const std::string& in)
+{
+ uuid out;
+ std::stringstream ss;
+ ss << in;
+ ss >> out;
+ BOOST_TEST_EQ(true, ss.fail());
+}
+
#ifndef BOOST_NO_STD_WSTRING
-namespace std {
-template <typename Elem, typename Traits>
-std::basic_ostream<Elem, Traits>& operator<<(std::basic_ostream<Elem, Traits>& os, std::wstring const& s) {
- // convert to string
- std::string temp(s.begin(), s.end());
- os << temp;
- return os;
+void uufail(const std::wstring& in)
+{
+ uuid out;
+ std::wstringstream ss;
+ ss << in;
+ ss >> out;
+ BOOST_TEST_EQ(true, ss.fail());
}
-} // namespace std
#endif
-int main(int, char*[])
+void uuroundtrip(const uuid& in, const std::string& expect)
{
- using namespace boost::uuids;
+ std::stringstream ss;
+ ss << in;
+ BOOST_TEST_EQ(false, ss.fail());
+ BOOST_TEST_EQ(expect, ss.str());
+
+ uuid out;
+ std::stringstream ss2;
+ ss2 << expect;
+ ss2 >> out;
+ BOOST_TEST_EQ(false, ss2.fail());
+ BOOST_TEST_EQ(in, out);
+}
+#ifndef BOOST_NO_STD_WSTRING
+void uuroundtrip(const uuid& in, const std::wstring& expect)
+{
+ std::wstringstream ss;
+ ss << in;
+ BOOST_TEST_EQ(false, ss.fail());
+ BOOST_TEST (expect == ss.str());
+
+ uuid out;
+ std::wstringstream ss2;
+ ss2 << expect;
+ ss2 >> out;
+ BOOST_TEST_EQ(false, ss2.fail());
+ BOOST_TEST (in == out);
+}
+#endif
+
+int main(int, char*[])
+{
const uuid u1 = {{0}};
const uuid u2 = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}};
const uuid u3 = {{0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef,0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef}};
- { // test insert/extract operators
- std::stringstream ss1;
- ss1 << u1;
- BOOST_TEST_EQ(ss1.str(), "00000000-0000-0000-0000-000000000000");
-
- std::stringstream ss2;
- ss2 << u2;
- BOOST_TEST_EQ(ss2.str(), "00010203-0405-0607-0809-0a0b0c0d0e0f");
-
- std::stringstream ss3;
- ss3 << u3;
- BOOST_TEST_EQ(ss3.str(), "12345678-90ab-cdef-1234-567890abcdef");
-
- std::stringstream ss4;
- ss4 << std::uppercase << u3;
- BOOST_TEST_EQ(ss4.str(), "12345678-90AB-CDEF-1234-567890ABCDEF");
-
- std::stringstream ss5;
- ss5 << 'a' << std::right << std::setfill('*') << std::setw(40) << u1 << 'a';
- BOOST_TEST_EQ(ss5.str(), "a****00000000-0000-0000-0000-000000000000a");
-
- std::stringstream ss6;
- ss6 << std::left << std::setfill('*') << std::setw(45) << u1;
- BOOST_TEST_EQ(ss6.str(), "00000000-0000-0000-0000-000000000000*********");
-
- std::stringstream ss7;
- ss7 << std::left << std::setfill('*') << std::setw(45) << u2;
- BOOST_TEST_EQ(ss7.str(), "00010203-0405-0607-0809-0a0b0c0d0e0f*********");
- }
-
- #ifndef BOOST_NO_STD_WSTRING
- { // test insert/extract operators
- std::wstringstream ss1;
- ss1 << u1;
- BOOST_TEST_EQ(ss1.str(), L"00000000-0000-0000-0000-000000000000");
-
- std::wstringstream ss2;
- ss2 << u2;
- BOOST_TEST_EQ(ss2.str(), L"00010203-0405-0607-0809-0a0b0c0d0e0f");
-
- std::wstringstream ss3;
- ss3 << u3;
- BOOST_TEST_EQ(ss3.str(), L"12345678-90ab-cdef-1234-567890abcdef");
-
- std::wstringstream ss4;
- ss4 << std::uppercase << u3;
- BOOST_TEST_EQ(ss4.str(), L"12345678-90AB-CDEF-1234-567890ABCDEF");
-
- std::wstringstream ss5;
- ss5 << L'a' << std::right << std::setfill(L'*') << std::setw(40) << u1 << L'a';
- BOOST_TEST_EQ(ss5.str(), L"a****00000000-0000-0000-0000-000000000000a");
-
- std::wstringstream ss6;
- ss6 << std::left << std::setfill(L'*') << std::setw(45) << u1;
- BOOST_TEST_EQ(ss6.str(), L"00000000-0000-0000-0000-000000000000*********");
-
- std::wstringstream ss7;
- ss7 << std::left << std::setfill(L'*') << std::setw(45) << u2;
- BOOST_TEST_EQ(ss7.str(), L"00010203-0405-0607-0809-0a0b0c0d0e0f*********");
- }
-#endif
+ uuroundtrip(u1, "00000000-0000-0000-0000-000000000000");
+ uuroundtrip(u2, "00010203-0405-0607-0809-0a0b0c0d0e0f");
+ uuroundtrip(u3, "12345678-90ab-cdef-1234-567890abcdef");
- {
- uuid u;
+ std::stringstream ss5;
+ ss5 << 'a' << std::right << std::setfill('*') << std::setw(40) << u1 << 'a';
+ BOOST_TEST_EQ(ss5.str(), "a****00000000-0000-0000-0000-000000000000a");
- std::stringstream ss;
- ss << "00000000-0000-0000-0000-000000000000";
- ss >> u;
- BOOST_TEST_EQ(u, u1);
+ std::stringstream ss6;
+ ss6 << std::left << std::setfill('*') << std::setw(45) << u1;
+ BOOST_TEST_EQ(ss6.str(), "00000000-0000-0000-0000-000000000000*********");
- ss << "12345678-90ab-cdef-1234-567890abcdef";
- ss >> u;
- BOOST_TEST_EQ(u, u3);
- }
+ std::stringstream ss7;
+ ss7 << std::left << std::setfill('*') << std::setw(45) << u2;
+ BOOST_TEST_EQ(ss7.str(), "00010203-0405-0607-0809-0a0b0c0d0e0f*********");
- #ifndef BOOST_NO_STD_WSTRING
- {
- uuid u;
+#ifndef BOOST_NO_STD_WSTRING
+ uuroundtrip(u1, L"00000000-0000-0000-0000-000000000000");
+ uuroundtrip(u2, L"00010203-0405-0607-0809-0a0b0c0d0e0f");
+ uuroundtrip(u3, L"12345678-90ab-cdef-1234-567890abcdef");
+#endif
- std::wstringstream ss;
- ss << L"00000000-0000-0000-0000-000000000000";
- ss >> u;
- BOOST_TEST_EQ(u, u1);
+ const char raw[36] = { '0', '1', '2', '3', '4', '5', '6', '7', '-',
+ '8', '9', 'a', 'b', '-',
+ 'c', 'd', 'e', 'f', '-',
+ 0 , '1', '2', '3', '-', // 0x00 character is intentional
+ '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+
+ uufail(std::string(raw, 36));
+ uufail("01234567-89ab-cdef-0123456789abcdef");
+ uufail("01234567-89ab-cdef0123-456789abcdef");
+ uufail("01234567-89abcdef-0123-456789abcdef");
+ uufail("0123456789ab-cdef-0123-456789abcdef");
+ uufail("{12345678-90ab-cdef-1234-567890abcdef}"); // stream is not as flexible as string
+ uufail("G1234567-89AB-CDEF-0123-456789abcdef");
+ uufail("01234567-89AB-CDEF-0123-456789abcdeg");
- ss << L"12345678-90ab-cdef-1234-567890abcdef";
- ss >> u;
- BOOST_TEST_EQ(u, u3);
- }
+#ifndef BOOST_NO_STD_WSTRING
+ uufail(L"01234567-89ab-cdef-");
+ uufail(L"01234567-89ab-cdef-0123456789abcdef");
+ uufail(L"01234567-89ab-cdef0123-456789abcdef");
+ uufail(L"01234567-89abcdef-0123-456789abcdef");
+ uufail(L"0123456789ab-cdef-0123-456789abcdef");
+ uufail(L"{12345678-90ab-cdef-1234-567890abcdef}"); // stream is not as flexible as string
+ uufail(L"G1234567-89AB-CDEF-0123-456789abcdef");
+ uufail(L"01234567-89AB-CDEF-0123-456789abcdeg");
#endif
- { // test with lexical_cast
- BOOST_TEST_EQ(boost::lexical_cast<std::string>(u1), std::string("00000000-0000-0000-0000-000000000000"));
- BOOST_TEST_EQ(boost::lexical_cast<uuid>("00000000-0000-0000-0000-000000000000"), u1);
+ BOOST_TEST(boost::lexical_cast<std::string>(u1) == std::string("00000000-0000-0000-0000-000000000000"));
+ BOOST_TEST(boost::lexical_cast<uuid>("00000000-0000-0000-0000-000000000000") == u1);
- BOOST_TEST_EQ(boost::lexical_cast<std::string>(u3), std::string("12345678-90ab-cdef-1234-567890abcdef"));
- BOOST_TEST_EQ(boost::lexical_cast<uuid>("12345678-90ab-cdef-1234-567890abcdef"), u3);
- }
+ BOOST_TEST(boost::lexical_cast<std::string>(u3) == std::string("12345678-90ab-cdef-1234-567890abcdef"));
+ BOOST_TEST(boost::lexical_cast<uuid>("12345678-90ab-cdef-1234-567890abcdef") == u3);
#ifndef BOOST_NO_STD_WSTRING
- { // test with lexical_cast
- BOOST_TEST_EQ(boost::lexical_cast<std::wstring>(u1), std::wstring(L"00000000-0000-0000-0000-000000000000"));
- BOOST_TEST_EQ(boost::lexical_cast<uuid>(L"00000000-0000-0000-0000-000000000000"), u1);
+ BOOST_TEST(boost::lexical_cast<std::wstring>(u1) == std::wstring(L"00000000-0000-0000-0000-000000000000"));
+ BOOST_TEST(boost::lexical_cast<uuid>(L"00000000-0000-0000-0000-000000000000") == u1);
- BOOST_TEST_EQ(boost::lexical_cast<std::wstring>(u3), std::wstring(L"12345678-90ab-cdef-1234-567890abcdef"));
- BOOST_TEST_EQ(boost::lexical_cast<uuid>(L"12345678-90ab-cdef-1234-567890abcdef"), u3);
- }
+ BOOST_TEST(boost::lexical_cast<std::wstring>(u3) == std::wstring(L"12345678-90ab-cdef-1234-567890abcdef"));
+ BOOST_TEST(boost::lexical_cast<uuid>(L"12345678-90ab-cdef-1234-567890abcdef") == u3);
#endif
- { // test to_string
- BOOST_TEST_EQ(to_string(u1), std::string("00000000-0000-0000-0000-000000000000"));
- BOOST_TEST_EQ(to_string(u3), std::string("12345678-90ab-cdef-1234-567890abcdef"));
- }
+ BOOST_TEST(to_string(u1) == std::string("00000000-0000-0000-0000-000000000000"));
+ BOOST_TEST(to_string(u3) == std::string("12345678-90ab-cdef-1234-567890abcdef"));
#ifndef BOOST_NO_STD_WSTRING
- { // test to_wstring
- BOOST_TEST_EQ(to_wstring(u1), std::wstring(L"00000000-0000-0000-0000-000000000000"));
- BOOST_TEST_EQ(to_wstring(u3), std::wstring(L"12345678-90ab-cdef-1234-567890abcdef"));
- }
+ BOOST_TEST(to_wstring(u1) == std::wstring(L"00000000-0000-0000-0000-000000000000"));
+ BOOST_TEST(to_wstring(u3) == std::wstring(L"12345678-90ab-cdef-1234-567890abcdef"));
#endif
return boost::report_errors();
}
+