|
17 | 17 | #include <iostream> |
18 | 18 | #include <map> |
19 | 19 | #include <vector> |
| 20 | +#include <limits.h> |
20 | 21 |
|
21 | 22 | #include "parse-vectors.hpp" |
22 | 23 | #include "test.hpp" |
@@ -90,20 +91,56 @@ class serializer_test |
90 | 91 | } |
91 | 92 | } |
92 | 93 |
|
| 94 | + template<class T> |
| 95 | + void |
| 96 | + grind_one(string_view s, T const& t, string_view name = {}) |
| 97 | + { |
| 98 | + { |
| 99 | + auto const s1 = serialize(t); |
| 100 | + if( !BOOST_TEST(s == s1) ) |
| 101 | + { |
| 102 | + if(name.empty()) |
| 103 | + log << |
| 104 | + " " << s << "\n" |
| 105 | + " " << s1 << |
| 106 | + std::endl; |
| 107 | + else |
| 108 | + log << name << ":\n" |
| 109 | + " " << s << "\n" |
| 110 | + " " << s1 << |
| 111 | + std::endl; |
| 112 | + } |
| 113 | + } |
| 114 | + |
| 115 | + // large buffer |
| 116 | + { |
| 117 | + serializer sr; |
| 118 | + sr.reset(&t); |
| 119 | + string js; |
| 120 | + js.reserve(4096); |
| 121 | + js.grow(sr.read( |
| 122 | + js.data(), js.capacity()).size()); |
| 123 | + |
| 124 | + auto const s1 = serialize(t); |
| 125 | + BOOST_TEST( s == s1 ); |
| 126 | + } |
| 127 | + } |
| 128 | + |
| 129 | + template<class T> |
93 | 130 | void |
94 | 131 | grind( |
95 | 132 | string_view s0, |
96 | | - value const& jv, |
| 133 | + T const& t, |
97 | 134 | string_view name = {}) |
98 | 135 | { |
99 | | - grind_one(s0, jv, name); |
| 136 | + grind_one(s0, t, name); |
100 | 137 |
|
101 | | - auto const s1 = serialize(jv); |
| 138 | + auto const s1 = serialize(t); |
102 | 139 | for(std::size_t i = 1; |
103 | 140 | i < s1.size(); ++i) |
104 | 141 | { |
105 | 142 | serializer sr; |
106 | | - sr.reset(&jv); |
| 143 | + sr.reset(&t); |
107 | 144 | string s2; |
108 | 145 | s2.reserve(s1.size()); |
109 | 146 | s2.grow(sr.read( |
@@ -143,6 +180,18 @@ class serializer_test |
143 | 180 | break; |
144 | 181 | } |
145 | 182 | } |
| 183 | + { |
| 184 | + string s2; |
| 185 | + s2.reserve( s1.size() ); |
| 186 | + serializer sr; |
| 187 | + sr.reset(&t); |
| 188 | + for(std::size_t i = 0; i < s1.size(); ++i) |
| 189 | + { |
| 190 | + BOOST_TEST( sr.read(s2.data() + i, 1).size() == 1 ); |
| 191 | + s2.grow(1); |
| 192 | + } |
| 193 | + BOOST_TEST(s2 == s1); |
| 194 | + } |
146 | 195 | } |
147 | 196 |
|
148 | 197 | //------------------------------------------------------ |
@@ -500,6 +549,23 @@ class serializer_test |
500 | 549 | } |
501 | 550 | } |
502 | 551 |
|
| 552 | + template<class T> |
| 553 | + void |
| 554 | + check_udt( |
| 555 | + T const& t, |
| 556 | + string_view s, |
| 557 | + string_view name = {}) |
| 558 | + { |
| 559 | + try |
| 560 | + { |
| 561 | + grind(s, t, name); |
| 562 | + } |
| 563 | + catch(std::exception const&) |
| 564 | + { |
| 565 | + BOOST_TEST_FAIL(); |
| 566 | + } |
| 567 | + } |
| 568 | + |
503 | 569 | void |
504 | 570 | testVectors() |
505 | 571 | { |
@@ -681,36 +747,45 @@ class serializer_test |
681 | 747 | void |
682 | 748 | testUDT() |
683 | 749 | { |
| 750 | + { |
| 751 | + std::uint64_t u = 1; |
| 752 | + check_udt(u, "1"); |
| 753 | + |
| 754 | + u = (std::numeric_limits<std::int64_t>::max)(); |
| 755 | + u += 1; |
| 756 | + check_udt(u, "9223372036854775808"); |
| 757 | + |
| 758 | + std::int64_t i = -1; |
| 759 | + check_udt(i, "-1"); |
| 760 | + |
| 761 | + double d = 3.12; |
| 762 | + check_udt(d, "3.12E0"); |
| 763 | + |
| 764 | +#if defined(BOOST_HAS_INT128) && defined(__GLIBCXX_TYPE_INT_N_0) |
| 765 | + boost::int128_type ii = |
| 766 | + (std::numeric_limits<std::uint64_t>::max)(); |
| 767 | + ii += 1; |
| 768 | + d = ii; |
| 769 | + check_udt( ii, serialize(value(d)) ); |
| 770 | + |
| 771 | + ii = (std::numeric_limits<std::int64_t>::min)(); |
| 772 | + ii -= 1; |
| 773 | + d = ii; |
| 774 | + check_udt( ii, serialize(value(d)) ); |
| 775 | +#endif |
| 776 | + } |
684 | 777 | { |
685 | 778 | std::vector<int> v{1, 2, 3}; |
686 | | - |
687 | | - serializer sr; |
688 | | - sr.reset(&v); |
689 | | - |
690 | | - char buf[32]; |
691 | | - BOOST_TEST( sr.read(buf) == "[1,2,3]" ); |
| 779 | + check_udt(v, "[1,2,3]"); |
692 | 780 | } |
693 | 781 | { |
694 | 782 | std::vector<double> v{3.5, -14, 7711.1}; |
695 | | - |
696 | | - serializer sr; |
697 | | - sr.reset(&v); |
698 | | - |
699 | | - char buf[32]; |
700 | | - BOOST_TEST( sr.read(buf) == "[3.5E0,-1.4E1,7.7111E3]" ); |
| 783 | + check_udt(v, "[3.5E0,-1.4E1,7.7111E3]"); |
701 | 784 | } |
702 | 785 | { |
703 | 786 | std::map<std::string, int> m{ |
704 | 787 | {"one", 1}, {"two", 2}, {"three", 3} }; |
705 | | - |
706 | | - serializer sr; |
707 | | - sr.reset(&m); |
708 | | - |
709 | | - char buf[32]; |
710 | | - string_view output = sr.read(buf); |
711 | | - BOOST_TEST(( |
712 | | - parse(output) == |
713 | | - value{ {"one", 1}, {"two", 2}, {"three", 3} } )); |
| 788 | + check_udt( m, R"({"one":1,"three":3,"two":2})" ); |
714 | 789 | } |
715 | 790 | } |
716 | 791 |
|
|
0 commit comments