test_io.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. // (C) Copyright Andy Tompkins 2009. Permission to copy, use, modify, sell and
  2. // distribute this software is granted provided this copyright notice appears
  3. // in all copies. This software is provided "as is" without express or implied
  4. // warranty, and with no claim as to its suitability for any purpose.
  5. // Distributed under the Boost Software License, Version 1.0. (See
  6. // accompanying file LICENSE_1_0.txt or copy at
  7. // https://www.boost.org/LICENSE_1_0.txt)
  8. // libs/uuid/test/test_io.cpp -------------------------------//
  9. #include <boost/uuid/uuid.hpp>
  10. #include <boost/uuid/uuid_io.hpp>
  11. #include <boost/detail/lightweight_test.hpp>
  12. #include <boost/predef/library/c/cloudabi.h>
  13. #include <string>
  14. #include <sstream>
  15. #include <iomanip>
  16. #if !BOOST_LIB_C_CLOUDABI
  17. #include <boost/lexical_cast.hpp>
  18. #endif
  19. using namespace boost::uuids;
  20. void uufail(const std::string& in)
  21. {
  22. uuid out;
  23. std::stringstream ss;
  24. ss << in;
  25. ss >> out;
  26. BOOST_TEST_EQ(true, ss.fail());
  27. }
  28. #ifndef BOOST_NO_STD_WSTRING
  29. void uufail(const std::wstring& in)
  30. {
  31. uuid out;
  32. std::wstringstream ss;
  33. ss << in;
  34. ss >> out;
  35. BOOST_TEST_EQ(true, ss.fail());
  36. }
  37. #endif
  38. void uuroundtrip(const uuid& in, const std::string& expect)
  39. {
  40. std::stringstream ss;
  41. ss << in;
  42. BOOST_TEST_EQ(false, ss.fail());
  43. BOOST_TEST_EQ(expect, ss.str());
  44. uuid out;
  45. std::stringstream ss2;
  46. ss2 << expect;
  47. ss2 >> out;
  48. BOOST_TEST_EQ(false, ss2.fail());
  49. BOOST_TEST_EQ(in, out);
  50. }
  51. #ifndef BOOST_NO_STD_WSTRING
  52. void uuroundtrip(const uuid& in, const std::wstring& expect)
  53. {
  54. std::wstringstream ss;
  55. ss << in;
  56. BOOST_TEST_EQ(false, ss.fail());
  57. BOOST_TEST (expect == ss.str());
  58. uuid out;
  59. std::wstringstream ss2;
  60. ss2 << expect;
  61. ss2 >> out;
  62. BOOST_TEST_EQ(false, ss2.fail());
  63. BOOST_TEST (in == out);
  64. }
  65. #endif
  66. int main(int, char*[])
  67. {
  68. const uuid u1 = {{0}};
  69. const uuid u2 = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}};
  70. const uuid u3 = {{0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef,0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef}};
  71. uuroundtrip(u1, "00000000-0000-0000-0000-000000000000");
  72. uuroundtrip(u2, "00010203-0405-0607-0809-0a0b0c0d0e0f");
  73. uuroundtrip(u3, "12345678-90ab-cdef-1234-567890abcdef");
  74. std::stringstream ss5;
  75. ss5 << 'a' << std::right << std::setfill('*') << std::setw(40) << u1 << 'a';
  76. BOOST_TEST_EQ(ss5.str(), "a****00000000-0000-0000-0000-000000000000a");
  77. std::stringstream ss6;
  78. ss6 << std::left << std::setfill('*') << std::setw(45) << u1;
  79. BOOST_TEST_EQ(ss6.str(), "00000000-0000-0000-0000-000000000000*********");
  80. std::stringstream ss7;
  81. ss7 << std::left << std::setfill('*') << std::setw(45) << u2;
  82. BOOST_TEST_EQ(ss7.str(), "00010203-0405-0607-0809-0a0b0c0d0e0f*********");
  83. #ifndef BOOST_NO_STD_WSTRING
  84. uuroundtrip(u1, L"00000000-0000-0000-0000-000000000000");
  85. uuroundtrip(u2, L"00010203-0405-0607-0809-0a0b0c0d0e0f");
  86. uuroundtrip(u3, L"12345678-90ab-cdef-1234-567890abcdef");
  87. #endif
  88. const char raw[36] = { '0', '1', '2', '3', '4', '5', '6', '7', '-',
  89. '8', '9', 'a', 'b', '-',
  90. 'c', 'd', 'e', 'f', '-',
  91. 0 , '1', '2', '3', '-', // 0x00 character is intentional
  92. '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
  93. uufail(std::string(raw, 36));
  94. uufail("01234567-89ab-cdef-0123456789abcdef");
  95. uufail("01234567-89ab-cdef0123-456789abcdef");
  96. uufail("01234567-89abcdef-0123-456789abcdef");
  97. uufail("0123456789ab-cdef-0123-456789abcdef");
  98. uufail("{12345678-90ab-cdef-1234-567890abcdef}"); // stream is not as flexible as string
  99. uufail("G1234567-89AB-CDEF-0123-456789abcdef");
  100. uufail("01234567-89AB-CDEF-0123-456789abcdeg");
  101. #ifndef BOOST_NO_STD_WSTRING
  102. uufail(L"01234567-89ab-cdef-");
  103. uufail(L"01234567-89ab-cdef-0123456789abcdef");
  104. uufail(L"01234567-89ab-cdef0123-456789abcdef");
  105. uufail(L"01234567-89abcdef-0123-456789abcdef");
  106. uufail(L"0123456789ab-cdef-0123-456789abcdef");
  107. uufail(L"{12345678-90ab-cdef-1234-567890abcdef}"); // stream is not as flexible as string
  108. uufail(L"G1234567-89AB-CDEF-0123-456789abcdef");
  109. uufail(L"01234567-89AB-CDEF-0123-456789abcdeg");
  110. #endif
  111. #if !BOOST_LIB_C_CLOUDABI
  112. // lexical_cast depends on sprintf which is not available in cloudlibc
  113. BOOST_TEST(boost::lexical_cast<std::string>(u1) == std::string("00000000-0000-0000-0000-000000000000"));
  114. BOOST_TEST(boost::lexical_cast<uuid>("00000000-0000-0000-0000-000000000000") == u1);
  115. BOOST_TEST(boost::lexical_cast<std::string>(u3) == std::string("12345678-90ab-cdef-1234-567890abcdef"));
  116. BOOST_TEST(boost::lexical_cast<uuid>("12345678-90ab-cdef-1234-567890abcdef") == u3);
  117. #ifndef BOOST_NO_STD_WSTRING
  118. BOOST_TEST(boost::lexical_cast<std::wstring>(u1) == std::wstring(L"00000000-0000-0000-0000-000000000000"));
  119. BOOST_TEST(boost::lexical_cast<uuid>(L"00000000-0000-0000-0000-000000000000") == u1);
  120. BOOST_TEST(boost::lexical_cast<std::wstring>(u3) == std::wstring(L"12345678-90ab-cdef-1234-567890abcdef"));
  121. BOOST_TEST(boost::lexical_cast<uuid>(L"12345678-90ab-cdef-1234-567890abcdef") == u3);
  122. #endif
  123. #endif
  124. BOOST_TEST(to_string(u1) == std::string("00000000-0000-0000-0000-000000000000"));
  125. BOOST_TEST(to_string(u3) == std::string("12345678-90ab-cdef-1234-567890abcdef"));
  126. #ifndef BOOST_NO_STD_WSTRING
  127. BOOST_TEST(to_wstring(u1) == std::wstring(L"00000000-0000-0000-0000-000000000000"));
  128. BOOST_TEST(to_wstring(u3) == std::wstring(L"12345678-90ab-cdef-1234-567890abcdef"));
  129. #endif
  130. return boost::report_errors();
  131. }