20 #include <ripple/basics/UnorderedContainers.h>
21 #include <ripple/protocol/Book.h>
22 #include <ripple/protocol/Issue.h>
23 #include <ripple/beast/unit_test.h>
30 # define STL_SET_HAS_EMPLACE 1
32 # define STL_SET_HAS_EMPLACE 0
35 #ifndef RIPPLE_ASSETS_ENABLE_STD_HASH
36 # if BEAST_MAC || BEAST_IOS
37 # define RIPPLE_ASSETS_ENABLE_STD_HASH 0
39 # define RIPPLE_ASSETS_ENABLE_STD_HASH 1
49 template <
typename Un
signed>
52 Unsigned
const u1 (1);
53 Unsigned
const u2 (2);
54 Unsigned
const u3 (3);
56 BEAST_EXPECT(u1 != u2);
57 BEAST_EXPECT(u1 < u2);
58 BEAST_EXPECT(u1 <= u2);
59 BEAST_EXPECT(u2 <= u2);
60 BEAST_EXPECT(u2 == u2);
61 BEAST_EXPECT(u2 >= u2);
62 BEAST_EXPECT(u3 >= u2);
63 BEAST_EXPECT(u3 > u2);
67 BEAST_EXPECT(hash (u1) == hash (u1));
68 BEAST_EXPECT(hash (u2) == hash (u2));
69 BEAST_EXPECT(hash (u3) == hash (u3));
70 BEAST_EXPECT(hash (u1) != hash (u2));
71 BEAST_EXPECT(hash (u1) != hash (u3));
72 BEAST_EXPECT(hash (u2) != hash (u3));
78 template <
class Issue>
85 BEAST_EXPECT(
Issue (c1, i1) !=
Issue (c2, i1));
87 BEAST_EXPECT(
Issue (c1, i1) <=
Issue (c2, i1));
88 BEAST_EXPECT(
Issue (c2, i1) <=
Issue (c2, i1));
89 BEAST_EXPECT(
Issue (c2, i1) ==
Issue (c2, i1));
90 BEAST_EXPECT(
Issue (c2, i1) >=
Issue (c2, i1));
91 BEAST_EXPECT(
Issue (c3, i1) >=
Issue (c2, i1));
93 BEAST_EXPECT(
Issue (c1, i1) !=
Issue (c1, i2));
95 BEAST_EXPECT(
Issue (c1, i1) <=
Issue (c1, i2));
96 BEAST_EXPECT(
Issue (c1, i2) <=
Issue (c1, i2));
97 BEAST_EXPECT(
Issue (c1, i2) ==
Issue (c1, i2));
98 BEAST_EXPECT(
Issue (c1, i2) >=
Issue (c1, i2));
99 BEAST_EXPECT(
Issue (c1, i3) >=
Issue (c1, i2));
100 BEAST_EXPECT(
Issue (c1, i3) >
Issue (c1, i2));
104 BEAST_EXPECT(hash (
Issue (c1, i1)) == hash (
Issue (c1, i1)));
105 BEAST_EXPECT(hash (
Issue (c1, i2)) == hash (
Issue (c1, i2)));
106 BEAST_EXPECT(hash (
Issue (c1, i3)) == hash (
Issue (c1, i3)));
107 BEAST_EXPECT(hash (
Issue (c2, i1)) == hash (
Issue (c2, i1)));
108 BEAST_EXPECT(hash (
Issue (c2, i2)) == hash (
Issue (c2, i2)));
109 BEAST_EXPECT(hash (
Issue (c2, i3)) == hash (
Issue (c2, i3)));
110 BEAST_EXPECT(hash (
Issue (c3, i1)) == hash (
Issue (c3, i1)));
111 BEAST_EXPECT(hash (
Issue (c3, i2)) == hash (
Issue (c3, i2)));
112 BEAST_EXPECT(hash (
Issue (c3, i3)) == hash (
Issue (c3, i3)));
113 BEAST_EXPECT(hash (
Issue (c1, i1)) != hash (
Issue (c1, i2)));
114 BEAST_EXPECT(hash (
Issue (c1, i1)) != hash (
Issue (c1, i3)));
115 BEAST_EXPECT(hash (
Issue (c1, i1)) != hash (
Issue (c2, i1)));
116 BEAST_EXPECT(hash (
Issue (c1, i1)) != hash (
Issue (c2, i2)));
117 BEAST_EXPECT(hash (
Issue (c1, i1)) != hash (
Issue (c2, i3)));
118 BEAST_EXPECT(hash (
Issue (c1, i1)) != hash (
Issue (c3, i1)));
119 BEAST_EXPECT(hash (
Issue (c1, i1)) != hash (
Issue (c3, i2)));
120 BEAST_EXPECT(hash (
Issue (c1, i1)) != hash (
Issue (c3, i3)));
130 Issue const a1 (c1, i1);
131 Issue const a2 (c2, i2);
137 if (! BEAST_EXPECT(c.size () == 1))
return;
139 if (! BEAST_EXPECT(c.size () == 2))
return;
141 if (! BEAST_EXPECT(c.erase (
Issue (c1, i2)) == 0))
return;
142 if (! BEAST_EXPECT(c.erase (
Issue (c1, i1)) == 1))
return;
143 if (! BEAST_EXPECT(c.erase (
Issue (c2, i2)) == 1))
return;
144 if (! BEAST_EXPECT(c.empty ()))
return;
151 if (! BEAST_EXPECT(c.size () == 1))
return;
153 if (! BEAST_EXPECT(c.size () == 2))
return;
155 if (! BEAST_EXPECT(c.erase (
Issue (c1, i2)) == 0))
return;
156 if (! BEAST_EXPECT(c.erase (
Issue (c1, i1)) == 1))
return;
157 if (! BEAST_EXPECT(c.erase (
Issue (c2, i2)) == 1))
return;
158 if (! BEAST_EXPECT(c.empty ()))
return;
160 #if STL_SET_HAS_EMPLACE
162 if (! BEAST_EXPECT(c.size() == 1))
return;
164 if (! BEAST_EXPECT(c.size() == 2))
return;
176 Issue const a1 (c1, i1);
177 Issue const a2 (c2, i2);
183 if (! BEAST_EXPECT(c.size () == 1))
return;
185 if (! BEAST_EXPECT(c.size () == 2))
return;
187 if (! BEAST_EXPECT(c.erase (
Issue (c1, i2)) == 0))
return;
188 if (! BEAST_EXPECT(c.erase (
Issue (c1, i1)) == 1))
return;
189 if (! BEAST_EXPECT(c.erase (
Issue (c2, i2)) == 1))
return;
190 if (! BEAST_EXPECT(c.empty ()))
return;
197 if (! BEAST_EXPECT(c.size () == 1))
return;
199 if (! BEAST_EXPECT(c.size () == 2))
return;
201 if (! BEAST_EXPECT(c.erase (
Issue (c1, i2)) == 0))
return;
202 if (! BEAST_EXPECT(c.erase (
Issue (c1, i1)) == 1))
return;
203 if (! BEAST_EXPECT(c.erase (
Issue (c2, i2)) == 1))
return;
204 if (! BEAST_EXPECT(c.empty ()))
return;
210 testcase (
"std::set <Issue>");
211 testIssueSet <std::set <Issue>> ();
213 testcase (
"std::set <Issue>");
214 testIssueSet <std::set <Issue>> ();
216 #if RIPPLE_ASSETS_ENABLE_STD_HASH
217 testcase (
"std::unordered_set <Issue>");
218 testIssueSet <std::unordered_set <Issue>> ();
220 testcase (
"std::unordered_set <Issue>");
221 testIssueSet <std::unordered_set <Issue>> ();
224 testcase (
"hash_set <Issue>");
225 testIssueSet <hash_set <Issue>> ();
227 testcase (
"hash_set <Issue>");
228 testIssueSet <hash_set <Issue>> ();
233 testcase (
"std::map <Issue, int>");
234 testIssueMap <std::map <Issue, int>> ();
236 testcase (
"std::map <Issue, int>");
237 testIssueMap <std::map <Issue, int>> ();
239 #if RIPPLE_ASSETS_ENABLE_STD_HASH
240 testcase (
"std::unordered_map <Issue, int>");
241 testIssueMap <std::unordered_map <Issue, int>> ();
243 testcase (
"std::unordered_map <Issue, int>");
244 testIssueMap <std::unordered_map <Issue, int>> ();
246 testcase (
"hash_map <Issue, int>");
247 testIssueMap <hash_map <Issue, int>> ();
249 testcase (
"hash_map <Issue, int>");
250 testIssueMap <hash_map <Issue, int>> ();
258 template <
class Book>
270 BEAST_EXPECT(
Book (a1, a2) !=
Book (a2, a3));
271 BEAST_EXPECT(
Book (a1, a2) <
Book (a2, a3));
272 BEAST_EXPECT(
Book (a1, a2) <=
Book (a2, a3));
273 BEAST_EXPECT(
Book (a2, a3) <=
Book (a2, a3));
274 BEAST_EXPECT(
Book (a2, a3) ==
Book (a2, a3));
275 BEAST_EXPECT(
Book (a2, a3) >=
Book (a2, a3));
276 BEAST_EXPECT(
Book (a3, a4) >=
Book (a2, a3));
277 BEAST_EXPECT(
Book (a3, a4) >
Book (a2, a3));
299 BEAST_EXPECT(hash (
Book (a1, a2)) == hash (
Book (a1, a2)));
300 BEAST_EXPECT(hash (
Book (a1, a3)) == hash (
Book (a1, a3)));
301 BEAST_EXPECT(hash (
Book (a1, a4)) == hash (
Book (a1, a4)));
302 BEAST_EXPECT(hash (
Book (a2, a3)) == hash (
Book (a2, a3)));
303 BEAST_EXPECT(hash (
Book (a2, a4)) == hash (
Book (a2, a4)));
304 BEAST_EXPECT(hash (
Book (a3, a4)) == hash (
Book (a3, a4)));
306 BEAST_EXPECT(hash (
Book (a1, a2)) != hash (
Book (a1, a3)));
307 BEAST_EXPECT(hash (
Book (a1, a2)) != hash (
Book (a1, a4)));
308 BEAST_EXPECT(hash (
Book (a1, a2)) != hash (
Book (a2, a3)));
309 BEAST_EXPECT(hash (
Book (a1, a2)) != hash (
Book (a2, a4)));
310 BEAST_EXPECT(hash (
Book (a1, a2)) != hash (
Book (a3, a4)));
322 Issue const a1 (c1, i1);
323 Issue const a2 (c2, i2);
324 Book const b1 (a1, a2);
325 Book const b2 (a2, a1);
331 if (! BEAST_EXPECT(c.size () == 1))
return;
333 if (! BEAST_EXPECT(c.size () == 2))
return;
335 if (! BEAST_EXPECT(c.erase (
Book (a1, a1)) == 0))
return;
336 if (! BEAST_EXPECT(c.erase (
Book (a1, a2)) == 1))
return;
337 if (! BEAST_EXPECT(c.erase (
Book (a2, a1)) == 1))
return;
338 if (! BEAST_EXPECT(c.empty ()))
return;
345 if (! BEAST_EXPECT(c.size () == 1))
return;
347 if (! BEAST_EXPECT(c.size () == 2))
return;
349 if (! BEAST_EXPECT(c.erase (
Book (a1, a1)) == 0))
return;
350 if (! BEAST_EXPECT(c.erase (
Book (a1, a2)) == 1))
return;
351 if (! BEAST_EXPECT(c.erase (
Book (a2, a1)) == 1))
return;
352 if (! BEAST_EXPECT(c.empty ()))
return;
354 #if STL_SET_HAS_EMPLACE
356 if (! BEAST_EXPECT(c.size() == 1))
return;
358 if (! BEAST_EXPECT(c.size() == 2))
return;
370 Issue const a1 (c1, i1);
371 Issue const a2 (c2, i2);
372 Book const b1 (a1, a2);
373 Book const b2 (a2, a1);
383 if (! BEAST_EXPECT(c.size () == 1))
return;
386 if (! BEAST_EXPECT(c.size () == 2))
return;
388 if (! BEAST_EXPECT(c.erase (
Book (a1, a1)) == 0))
return;
389 if (! BEAST_EXPECT(c.erase (
Book (a1, a2)) == 1))
return;
390 if (! BEAST_EXPECT(c.erase (
Book (a2, a1)) == 1))
return;
391 if (! BEAST_EXPECT(c.empty ()))
return;
399 if (! BEAST_EXPECT(c.size () == 1))
return;
402 if (! BEAST_EXPECT(c.size () == 2))
return;
404 if (! BEAST_EXPECT(c.erase (
Book (a1, a1)) == 0))
return;
405 if (! BEAST_EXPECT(c.erase (
Book (a1, a2)) == 1))
return;
406 if (! BEAST_EXPECT(c.erase (
Book (a2, a1)) == 1))
return;
407 if (! BEAST_EXPECT(c.empty ()))
return;
413 testcase (
"std::set <Book>");
414 testBookSet <std::set <Book>> ();
416 testcase (
"std::set <Book>");
417 testBookSet <std::set <Book>> ();
419 #if RIPPLE_ASSETS_ENABLE_STD_HASH
420 testcase (
"std::unordered_set <Book>");
421 testBookSet <std::unordered_set <Book>> ();
423 testcase (
"std::unordered_set <Book>");
424 testBookSet <std::unordered_set <Book>> ();
427 testcase (
"hash_set <Book>");
428 testBookSet <hash_set <Book>> ();
430 testcase (
"hash_set <Book>");
431 testBookSet <hash_set <Book>> ();
436 testcase (
"std::map <Book, int>");
437 testBookMap <std::map <Book, int>> ();
439 testcase (
"std::map <Book, int>");
440 testBookMap <std::map <Book, int>> ();
442 #if RIPPLE_ASSETS_ENABLE_STD_HASH
443 testcase (
"std::unordered_map <Book, int>");
444 testBookMap <std::unordered_map <Book, int>> ();
446 testcase (
"std::unordered_map <Book, int>");
447 testBookMap <std::unordered_map <Book, int>> ();
449 testcase (
"hash_map <Book, int>");
450 testBookMap <hash_map <Book, int>> ();
452 testcase (
"hash_map <Book, int>");
453 testBookMap <hash_map <Book, int>> ();
461 testcase (
"Currency");
462 testUnsigned <Currency> ();
464 testcase (
"AccountID");
465 testUnsigned <AccountID> ();
470 testIssue <Issue> ();
473 testIssue <Issue> ();