20#include <xrpl/basics/UnorderedContainers.h>
21#include <xrpl/beast/unit_test.h>
22#include <xrpl/protocol/Book.h>
23#include <xrpl/protocol/Issue.h>
31#define STL_SET_HAS_EMPLACE 1
33#define STL_SET_HAS_EMPLACE 0
36#ifndef RIPPLE_ASSETS_ENABLE_STD_HASH
37#if BEAST_MAC || BEAST_IOS
38#define RIPPLE_ASSETS_ENABLE_STD_HASH 0
40#define RIPPLE_ASSETS_ENABLE_STD_HASH 1
50 template <
typename Un
signed>
58 BEAST_EXPECT(u1 != u2);
59 BEAST_EXPECT(u1 < u2);
60 BEAST_EXPECT(u1 <= u2);
61 BEAST_EXPECT(u2 <= u2);
62 BEAST_EXPECT(u2 == u2);
63 BEAST_EXPECT(u2 >= u2);
64 BEAST_EXPECT(u3 >= u2);
65 BEAST_EXPECT(u3 > u2);
69 BEAST_EXPECT(hash(u1) == hash(u1));
70 BEAST_EXPECT(hash(u2) == hash(u2));
71 BEAST_EXPECT(hash(u3) == hash(u3));
72 BEAST_EXPECT(hash(u1) != hash(u2));
73 BEAST_EXPECT(hash(u1) != hash(u3));
74 BEAST_EXPECT(hash(u2) != hash(u3));
80 template <
class Issue>
110 BEAST_EXPECT(hash(
Issue(c1, i1)) == hash(
Issue(c1, i1)));
111 BEAST_EXPECT(hash(
Issue(c1, i2)) == hash(
Issue(c1, i2)));
112 BEAST_EXPECT(hash(
Issue(c1, i3)) == hash(
Issue(c1, i3)));
113 BEAST_EXPECT(hash(
Issue(c2, i1)) == hash(
Issue(c2, i1)));
114 BEAST_EXPECT(hash(
Issue(c2, i2)) == hash(
Issue(c2, i2)));
115 BEAST_EXPECT(hash(
Issue(c2, i3)) == hash(
Issue(c2, i3)));
116 BEAST_EXPECT(hash(
Issue(c3, i1)) == hash(
Issue(c3, i1)));
117 BEAST_EXPECT(hash(
Issue(c3, i2)) == hash(
Issue(c3, i2)));
118 BEAST_EXPECT(hash(
Issue(c3, i3)) == hash(
Issue(c3, i3)));
119 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c1, i2)));
120 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c1, i3)));
121 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c2, i1)));
122 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c2, i2)));
123 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c2, i3)));
124 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c3, i1)));
125 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c3, i2)));
126 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c3, i3)));
137 Issue const a1(c1, i1);
138 Issue const a2(c2, i2);
144 if (!BEAST_EXPECT(c.size() == 1))
147 if (!BEAST_EXPECT(c.size() == 2))
150 if (!BEAST_EXPECT(c.erase(
Issue(c1, i2)) == 0))
152 if (!BEAST_EXPECT(c.erase(
Issue(c1, i1)) == 1))
154 if (!BEAST_EXPECT(c.erase(
Issue(c2, i2)) == 1))
156 if (!BEAST_EXPECT(c.empty()))
164 if (!BEAST_EXPECT(c.size() == 1))
167 if (!BEAST_EXPECT(c.size() == 2))
170 if (!BEAST_EXPECT(c.erase(
Issue(c1, i2)) == 0))
172 if (!BEAST_EXPECT(c.erase(
Issue(c1, i1)) == 1))
174 if (!BEAST_EXPECT(c.erase(
Issue(c2, i2)) == 1))
176 if (!BEAST_EXPECT(c.empty()))
179#if STL_SET_HAS_EMPLACE
181 if (!BEAST_EXPECT(c.size() == 1))
184 if (!BEAST_EXPECT(c.size() == 2))
198 Issue const a1(c1, i1);
199 Issue const a2(c2, i2);
205 if (!BEAST_EXPECT(c.size() == 1))
208 if (!BEAST_EXPECT(c.size() == 2))
211 if (!BEAST_EXPECT(c.erase(
Issue(c1, i2)) == 0))
213 if (!BEAST_EXPECT(c.erase(
Issue(c1, i1)) == 1))
215 if (!BEAST_EXPECT(c.erase(
Issue(c2, i2)) == 1))
217 if (!BEAST_EXPECT(c.empty()))
225 if (!BEAST_EXPECT(c.size() == 1))
228 if (!BEAST_EXPECT(c.size() == 2))
231 if (!BEAST_EXPECT(c.erase(
Issue(c1, i2)) == 0))
233 if (!BEAST_EXPECT(c.erase(
Issue(c1, i1)) == 1))
235 if (!BEAST_EXPECT(c.erase(
Issue(c2, i2)) == 1))
237 if (!BEAST_EXPECT(c.empty()))
246 testIssueSet<std::set<Issue>>();
249 testIssueSet<std::set<Issue>>();
251#if RIPPLE_ASSETS_ENABLE_STD_HASH
252 testcase(
"std::unordered_set <Issue>");
253 testIssueSet<std::unordered_set<Issue>>();
255 testcase(
"std::unordered_set <Issue>");
256 testIssueSet<std::unordered_set<Issue>>();
260 testIssueSet<hash_set<Issue>>();
263 testIssueSet<hash_set<Issue>>();
270 testIssueMap<std::map<Issue, int>>();
273 testIssueMap<std::map<Issue, int>>();
275#if RIPPLE_ASSETS_ENABLE_STD_HASH
276 testcase(
"std::unordered_map <Issue, int>");
277 testIssueMap<std::unordered_map<Issue, int>>();
279 testcase(
"std::unordered_map <Issue, int>");
280 testIssueMap<std::unordered_map<Issue, int>>();
283 testIssueMap<hash_map<Issue, int>>();
286 testIssueMap<hash_map<Issue, int>>();
294 template <
class Book>
310 BEAST_EXPECT(
Book(a1, a2) !=
Book(a2, a3));
311 BEAST_EXPECT(
Book(a1, a2) <
Book(a2, a3));
312 BEAST_EXPECT(
Book(a1, a2) <=
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(a2, a3) >=
Book(a2, a3));
316 BEAST_EXPECT(
Book(a3, a4) >=
Book(a2, a3));
317 BEAST_EXPECT(
Book(a3, a4) >
Book(a2, a3));
339 BEAST_EXPECT(hash(
Book(a1, a2)) == hash(
Book(a1, a2)));
340 BEAST_EXPECT(hash(
Book(a1, a3)) == hash(
Book(a1, a3)));
341 BEAST_EXPECT(hash(
Book(a1, a4)) == hash(
Book(a1, a4)));
342 BEAST_EXPECT(hash(
Book(a2, a3)) == hash(
Book(a2, a3)));
343 BEAST_EXPECT(hash(
Book(a2, a4)) == hash(
Book(a2, a4)));
344 BEAST_EXPECT(hash(
Book(a3, a4)) == hash(
Book(a3, a4)));
346 BEAST_EXPECT(hash(
Book(a1, a2)) != hash(
Book(a1, a3)));
347 BEAST_EXPECT(hash(
Book(a1, a2)) != hash(
Book(a1, a4)));
348 BEAST_EXPECT(hash(
Book(a1, a2)) != hash(
Book(a2, a3)));
349 BEAST_EXPECT(hash(
Book(a1, a2)) != hash(
Book(a2, a4)));
350 BEAST_EXPECT(hash(
Book(a1, a2)) != hash(
Book(a3, a4)));
363 Issue const a1(c1, i1);
364 Issue const a2(c2, i2);
365 Book const b1(a1, a2);
366 Book const b2(a2, a1);
372 if (!BEAST_EXPECT(c.size() == 1))
375 if (!BEAST_EXPECT(c.size() == 2))
378 if (!BEAST_EXPECT(c.erase(
Book(a1, a1)) == 0))
380 if (!BEAST_EXPECT(c.erase(
Book(a1, a2)) == 1))
382 if (!BEAST_EXPECT(c.erase(
Book(a2, a1)) == 1))
384 if (!BEAST_EXPECT(c.empty()))
392 if (!BEAST_EXPECT(c.size() == 1))
395 if (!BEAST_EXPECT(c.size() == 2))
398 if (!BEAST_EXPECT(c.erase(
Book(a1, a1)) == 0))
400 if (!BEAST_EXPECT(c.erase(
Book(a1, a2)) == 1))
402 if (!BEAST_EXPECT(c.erase(
Book(a2, a1)) == 1))
404 if (!BEAST_EXPECT(c.empty()))
407#if STL_SET_HAS_EMPLACE
409 if (!BEAST_EXPECT(c.size() == 1))
412 if (!BEAST_EXPECT(c.size() == 2))
426 Issue const a1(c1, i1);
427 Issue const a2(c2, i2);
428 Book const b1(a1, a2);
429 Book const b2(a2, a1);
439 if (!BEAST_EXPECT(c.size() == 1))
443 if (!BEAST_EXPECT(c.size() == 2))
446 if (!BEAST_EXPECT(c.erase(
Book(a1, a1)) == 0))
448 if (!BEAST_EXPECT(c.erase(
Book(a1, a2)) == 1))
450 if (!BEAST_EXPECT(c.erase(
Book(a2, a1)) == 1))
452 if (!BEAST_EXPECT(c.empty()))
461 if (!BEAST_EXPECT(c.size() == 1))
465 if (!BEAST_EXPECT(c.size() == 2))
468 if (!BEAST_EXPECT(c.erase(
Book(a1, a1)) == 0))
470 if (!BEAST_EXPECT(c.erase(
Book(a1, a2)) == 1))
472 if (!BEAST_EXPECT(c.erase(
Book(a2, a1)) == 1))
474 if (!BEAST_EXPECT(c.empty()))
483 testBookSet<std::set<Book>>();
486 testBookSet<std::set<Book>>();
488#if RIPPLE_ASSETS_ENABLE_STD_HASH
489 testcase(
"std::unordered_set <Book>");
490 testBookSet<std::unordered_set<Book>>();
492 testcase(
"std::unordered_set <Book>");
493 testBookSet<std::unordered_set<Book>>();
497 testBookSet<hash_set<Book>>();
500 testBookSet<hash_set<Book>>();
507 testBookMap<std::map<Book, int>>();
510 testBookMap<std::map<Book, int>>();
512#if RIPPLE_ASSETS_ENABLE_STD_HASH
513 testcase(
"std::unordered_map <Book, int>");
514 testBookMap<std::unordered_map<Book, int>>();
516 testcase(
"std::unordered_map <Book, int>");
517 testBookMap<std::unordered_map<Book, int>>();
520 testBookMap<hash_map<Book, int>>();
523 testBookMap<hash_map<Book, int>>();
533 testUnsigned<Currency>();
536 testUnsigned<AccountID>();
testcase_t testcase
Memberspace for declaring test cases.
void run() override
Runs the suite.
A currency issued by an account.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.