20 #include <ripple/basics/UnorderedContainers.h>
21 #include <ripple/beast/unit_test.h>
22 #include <ripple/protocol/Book.h>
23 #include <ripple/protocol/Issue.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>
57 BEAST_EXPECT(u1 != u2);
58 BEAST_EXPECT(u1 < u2);
59 BEAST_EXPECT(u1 <= u2);
60 BEAST_EXPECT(u2 <= u2);
61 BEAST_EXPECT(u2 == u2);
62 BEAST_EXPECT(u2 >= u2);
63 BEAST_EXPECT(u3 >= u2);
64 BEAST_EXPECT(u3 > u2);
68 BEAST_EXPECT(hash(u1) == hash(u1));
69 BEAST_EXPECT(hash(u2) == hash(u2));
70 BEAST_EXPECT(hash(u3) == hash(u3));
71 BEAST_EXPECT(hash(u1) != hash(u2));
72 BEAST_EXPECT(hash(u1) != hash(u3));
73 BEAST_EXPECT(hash(u2) != hash(u3));
79 template <
class Issue>
109 BEAST_EXPECT(hash(
Issue(c1, i1)) == hash(
Issue(c1, i1)));
110 BEAST_EXPECT(hash(
Issue(c1, i2)) == hash(
Issue(c1, i2)));
111 BEAST_EXPECT(hash(
Issue(c1, i3)) == hash(
Issue(c1, i3)));
112 BEAST_EXPECT(hash(
Issue(c2, i1)) == hash(
Issue(c2, i1)));
113 BEAST_EXPECT(hash(
Issue(c2, i2)) == hash(
Issue(c2, i2)));
114 BEAST_EXPECT(hash(
Issue(c2, i3)) == hash(
Issue(c2, i3)));
115 BEAST_EXPECT(hash(
Issue(c3, i1)) == hash(
Issue(c3, i1)));
116 BEAST_EXPECT(hash(
Issue(c3, i2)) == hash(
Issue(c3, i2)));
117 BEAST_EXPECT(hash(
Issue(c3, i3)) == hash(
Issue(c3, i3)));
118 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c1, i2)));
119 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c1, i3)));
120 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c2, i1)));
121 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c2, i2)));
122 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c2, i3)));
123 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c3, i1)));
124 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c3, i2)));
125 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c3, i3)));
136 Issue const a1(c1, i1);
137 Issue const a2(c2, i2);
143 if (!BEAST_EXPECT(c.size() == 1))
146 if (!BEAST_EXPECT(c.size() == 2))
149 if (!BEAST_EXPECT(c.erase(
Issue(c1, i2)) == 0))
151 if (!BEAST_EXPECT(c.erase(
Issue(c1, i1)) == 1))
153 if (!BEAST_EXPECT(c.erase(
Issue(c2, i2)) == 1))
155 if (!BEAST_EXPECT(c.empty()))
163 if (!BEAST_EXPECT(c.size() == 1))
166 if (!BEAST_EXPECT(c.size() == 2))
169 if (!BEAST_EXPECT(c.erase(
Issue(c1, i2)) == 0))
171 if (!BEAST_EXPECT(c.erase(
Issue(c1, i1)) == 1))
173 if (!BEAST_EXPECT(c.erase(
Issue(c2, i2)) == 1))
175 if (!BEAST_EXPECT(c.empty()))
178 #if STL_SET_HAS_EMPLACE
180 if (!BEAST_EXPECT(c.size() == 1))
183 if (!BEAST_EXPECT(c.size() == 2))
197 Issue const a1(c1, i1);
198 Issue const a2(c2, i2);
204 if (!BEAST_EXPECT(c.size() == 1))
207 if (!BEAST_EXPECT(c.size() == 2))
210 if (!BEAST_EXPECT(c.erase(
Issue(c1, i2)) == 0))
212 if (!BEAST_EXPECT(c.erase(
Issue(c1, i1)) == 1))
214 if (!BEAST_EXPECT(c.erase(
Issue(c2, i2)) == 1))
216 if (!BEAST_EXPECT(c.empty()))
224 if (!BEAST_EXPECT(c.size() == 1))
227 if (!BEAST_EXPECT(c.size() == 2))
230 if (!BEAST_EXPECT(c.erase(
Issue(c1, i2)) == 0))
232 if (!BEAST_EXPECT(c.erase(
Issue(c1, i1)) == 1))
234 if (!BEAST_EXPECT(c.erase(
Issue(c2, i2)) == 1))
236 if (!BEAST_EXPECT(c.empty()))
244 testcase(
"std::set <Issue>");
245 testIssueSet<std::set<Issue>>();
247 testcase(
"std::set <Issue>");
248 testIssueSet<std::set<Issue>>();
250 #if RIPPLE_ASSETS_ENABLE_STD_HASH
251 testcase(
"std::unordered_set <Issue>");
252 testIssueSet<std::unordered_set<Issue>>();
254 testcase(
"std::unordered_set <Issue>");
255 testIssueSet<std::unordered_set<Issue>>();
258 testcase(
"hash_set <Issue>");
259 testIssueSet<hash_set<Issue>>();
261 testcase(
"hash_set <Issue>");
262 testIssueSet<hash_set<Issue>>();
268 testcase(
"std::map <Issue, int>");
269 testIssueMap<std::map<Issue, int>>();
271 testcase(
"std::map <Issue, int>");
272 testIssueMap<std::map<Issue, int>>();
274 #if RIPPLE_ASSETS_ENABLE_STD_HASH
275 testcase(
"std::unordered_map <Issue, int>");
276 testIssueMap<std::unordered_map<Issue, int>>();
278 testcase(
"std::unordered_map <Issue, int>");
279 testIssueMap<std::unordered_map<Issue, int>>();
281 testcase(
"hash_map <Issue, int>");
282 testIssueMap<hash_map<Issue, int>>();
284 testcase(
"hash_map <Issue, int>");
285 testIssueMap<hash_map<Issue, int>>();
293 template <
class Book>
309 BEAST_EXPECT(
Book(a1, a2) !=
Book(a2, a3));
310 BEAST_EXPECT(
Book(a1, a2) <
Book(a2, a3));
311 BEAST_EXPECT(
Book(a1, a2) <=
Book(a2, a3));
312 BEAST_EXPECT(
Book(a2, a3) <=
Book(a2, a3));
313 BEAST_EXPECT(
Book(a2, a3) ==
Book(a2, a3));
314 BEAST_EXPECT(
Book(a2, a3) >=
Book(a2, a3));
315 BEAST_EXPECT(
Book(a3, a4) >=
Book(a2, a3));
316 BEAST_EXPECT(
Book(a3, a4) >
Book(a2, a3));
338 BEAST_EXPECT(hash(
Book(a1, a2)) == hash(
Book(a1, a2)));
339 BEAST_EXPECT(hash(
Book(a1, a3)) == hash(
Book(a1, a3)));
340 BEAST_EXPECT(hash(
Book(a1, a4)) == hash(
Book(a1, a4)));
341 BEAST_EXPECT(hash(
Book(a2, a3)) == hash(
Book(a2, a3)));
342 BEAST_EXPECT(hash(
Book(a2, a4)) == hash(
Book(a2, a4)));
343 BEAST_EXPECT(hash(
Book(a3, a4)) == hash(
Book(a3, a4)));
345 BEAST_EXPECT(hash(
Book(a1, a2)) != hash(
Book(a1, a3)));
346 BEAST_EXPECT(hash(
Book(a1, a2)) != hash(
Book(a1, a4)));
347 BEAST_EXPECT(hash(
Book(a1, a2)) != hash(
Book(a2, a3)));
348 BEAST_EXPECT(hash(
Book(a1, a2)) != hash(
Book(a2, a4)));
349 BEAST_EXPECT(hash(
Book(a1, a2)) != hash(
Book(a3, a4)));
362 Issue const a1(c1, i1);
363 Issue const a2(c2, i2);
364 Book const b1(a1, a2);
365 Book const b2(a2, a1);
371 if (!BEAST_EXPECT(c.size() == 1))
374 if (!BEAST_EXPECT(c.size() == 2))
377 if (!BEAST_EXPECT(c.erase(
Book(a1, a1)) == 0))
379 if (!BEAST_EXPECT(c.erase(
Book(a1, a2)) == 1))
381 if (!BEAST_EXPECT(c.erase(
Book(a2, a1)) == 1))
383 if (!BEAST_EXPECT(c.empty()))
391 if (!BEAST_EXPECT(c.size() == 1))
394 if (!BEAST_EXPECT(c.size() == 2))
397 if (!BEAST_EXPECT(c.erase(
Book(a1, a1)) == 0))
399 if (!BEAST_EXPECT(c.erase(
Book(a1, a2)) == 1))
401 if (!BEAST_EXPECT(c.erase(
Book(a2, a1)) == 1))
403 if (!BEAST_EXPECT(c.empty()))
406 #if STL_SET_HAS_EMPLACE
408 if (!BEAST_EXPECT(c.size() == 1))
411 if (!BEAST_EXPECT(c.size() == 2))
425 Issue const a1(c1, i1);
426 Issue const a2(c2, i2);
427 Book const b1(a1, a2);
428 Book const b2(a2, a1);
438 if (!BEAST_EXPECT(c.size() == 1))
442 if (!BEAST_EXPECT(c.size() == 2))
445 if (!BEAST_EXPECT(c.erase(
Book(a1, a1)) == 0))
447 if (!BEAST_EXPECT(c.erase(
Book(a1, a2)) == 1))
449 if (!BEAST_EXPECT(c.erase(
Book(a2, a1)) == 1))
451 if (!BEAST_EXPECT(c.empty()))
460 if (!BEAST_EXPECT(c.size() == 1))
464 if (!BEAST_EXPECT(c.size() == 2))
467 if (!BEAST_EXPECT(c.erase(
Book(a1, a1)) == 0))
469 if (!BEAST_EXPECT(c.erase(
Book(a1, a2)) == 1))
471 if (!BEAST_EXPECT(c.erase(
Book(a2, a1)) == 1))
473 if (!BEAST_EXPECT(c.empty()))
481 testcase(
"std::set <Book>");
482 testBookSet<std::set<Book>>();
484 testcase(
"std::set <Book>");
485 testBookSet<std::set<Book>>();
487 #if RIPPLE_ASSETS_ENABLE_STD_HASH
488 testcase(
"std::unordered_set <Book>");
489 testBookSet<std::unordered_set<Book>>();
491 testcase(
"std::unordered_set <Book>");
492 testBookSet<std::unordered_set<Book>>();
495 testcase(
"hash_set <Book>");
496 testBookSet<hash_set<Book>>();
498 testcase(
"hash_set <Book>");
499 testBookSet<hash_set<Book>>();
505 testcase(
"std::map <Book, int>");
506 testBookMap<std::map<Book, int>>();
508 testcase(
"std::map <Book, int>");
509 testBookMap<std::map<Book, int>>();
511 #if RIPPLE_ASSETS_ENABLE_STD_HASH
512 testcase(
"std::unordered_map <Book, int>");
513 testBookMap<std::unordered_map<Book, int>>();
515 testcase(
"std::unordered_map <Book, int>");
516 testBookMap<std::unordered_map<Book, int>>();
518 testcase(
"hash_map <Book, int>");
519 testBookMap<hash_map<Book, int>>();
521 testcase(
"hash_map <Book, int>");
522 testBookMap<hash_map<Book, int>>();
531 testcase(
"Currency");
532 testUnsigned<Currency>();
534 testcase(
"AccountID");
535 testUnsigned<AccountID>();