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>
34#define STL_SET_HAS_EMPLACE 1
36#define STL_SET_HAS_EMPLACE 0
39#ifndef RIPPLE_ASSETS_ENABLE_STD_HASH
40#if BEAST_MAC || BEAST_IOS
41#define RIPPLE_ASSETS_ENABLE_STD_HASH 0
43#define RIPPLE_ASSETS_ENABLE_STD_HASH 1
55 template <
typename Un
signed>
63 BEAST_EXPECT(u1 != u2);
64 BEAST_EXPECT(u1 < u2);
65 BEAST_EXPECT(u1 <= u2);
66 BEAST_EXPECT(u2 <= u2);
67 BEAST_EXPECT(u2 == u2);
68 BEAST_EXPECT(u2 >= u2);
69 BEAST_EXPECT(u3 >= u2);
70 BEAST_EXPECT(u3 > u2);
74 BEAST_EXPECT(hash(u1) == hash(u1));
75 BEAST_EXPECT(hash(u2) == hash(u2));
76 BEAST_EXPECT(hash(u3) == hash(u3));
77 BEAST_EXPECT(hash(u1) != hash(u2));
78 BEAST_EXPECT(hash(u1) != hash(u3));
79 BEAST_EXPECT(hash(u2) != hash(u3));
85 template <
class Issue>
115 BEAST_EXPECT(hash(
Issue(c1, i1)) == hash(
Issue(c1, i1)));
116 BEAST_EXPECT(hash(
Issue(c1, i2)) == hash(
Issue(c1, i2)));
117 BEAST_EXPECT(hash(
Issue(c1, i3)) == hash(
Issue(c1, i3)));
118 BEAST_EXPECT(hash(
Issue(c2, i1)) == hash(
Issue(c2, i1)));
119 BEAST_EXPECT(hash(
Issue(c2, i2)) == hash(
Issue(c2, i2)));
120 BEAST_EXPECT(hash(
Issue(c2, i3)) == hash(
Issue(c2, i3)));
121 BEAST_EXPECT(hash(
Issue(c3, i1)) == hash(
Issue(c3, i1)));
122 BEAST_EXPECT(hash(
Issue(c3, i2)) == hash(
Issue(c3, i2)));
123 BEAST_EXPECT(hash(
Issue(c3, i3)) == hash(
Issue(c3, i3)));
124 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c1, i2)));
125 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c1, i3)));
126 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c2, i1)));
127 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c2, i2)));
128 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c2, i3)));
129 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c3, i1)));
130 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c3, i2)));
131 BEAST_EXPECT(hash(
Issue(c1, i1)) != hash(
Issue(c3, i3)));
142 Issue const a1(c1, i1);
143 Issue const a2(c2, i2);
149 if (!BEAST_EXPECT(c.size() == 1))
152 if (!BEAST_EXPECT(c.size() == 2))
155 if (!BEAST_EXPECT(c.erase(
Issue(c1, i2)) == 0))
157 if (!BEAST_EXPECT(c.erase(
Issue(c1, i1)) == 1))
159 if (!BEAST_EXPECT(c.erase(
Issue(c2, i2)) == 1))
161 if (!BEAST_EXPECT(c.empty()))
169 if (!BEAST_EXPECT(c.size() == 1))
172 if (!BEAST_EXPECT(c.size() == 2))
175 if (!BEAST_EXPECT(c.erase(
Issue(c1, i2)) == 0))
177 if (!BEAST_EXPECT(c.erase(
Issue(c1, i1)) == 1))
179 if (!BEAST_EXPECT(c.erase(
Issue(c2, i2)) == 1))
181 if (!BEAST_EXPECT(c.empty()))
184#if STL_SET_HAS_EMPLACE
186 if (!BEAST_EXPECT(c.size() == 1))
189 if (!BEAST_EXPECT(c.size() == 2))
203 Issue const a1(c1, i1);
204 Issue const a2(c2, i2);
210 if (!BEAST_EXPECT(c.size() == 1))
213 if (!BEAST_EXPECT(c.size() == 2))
216 if (!BEAST_EXPECT(c.erase(
Issue(c1, i2)) == 0))
218 if (!BEAST_EXPECT(c.erase(
Issue(c1, i1)) == 1))
220 if (!BEAST_EXPECT(c.erase(
Issue(c2, i2)) == 1))
222 if (!BEAST_EXPECT(c.empty()))
230 if (!BEAST_EXPECT(c.size() == 1))
233 if (!BEAST_EXPECT(c.size() == 2))
236 if (!BEAST_EXPECT(c.erase(
Issue(c1, i2)) == 0))
238 if (!BEAST_EXPECT(c.erase(
Issue(c1, i1)) == 1))
240 if (!BEAST_EXPECT(c.erase(
Issue(c2, i2)) == 1))
242 if (!BEAST_EXPECT(c.empty()))
255 Issue const a1(c1, i1);
256 Issue const a2(c2, i2);
263 if (!BEAST_EXPECT(c.size() == 1))
266 if (!BEAST_EXPECT(c.size() == 2))
269 if (!BEAST_EXPECT(c.size() == 3))
280 if (!BEAST_EXPECT(c.empty()))
292 Issue const a1(c1, i1);
293 Issue const a2(c2, i2);
300 if (!BEAST_EXPECT(c.size() == 1))
303 if (!BEAST_EXPECT(c.size() == 2))
306 if (!BEAST_EXPECT(c.size() == 3))
317 if (!BEAST_EXPECT(c.empty()))
324 testcase(
"std::set <std::pair<Issue, Domain>>");
325 testIssueDomainSet<std::set<std::pair<Issue, Domain>>>();
327 testcase(
"std::set <std::pair<Issue, Domain>>");
328 testIssueDomainSet<std::set<std::pair<Issue, Domain>>>();
330 testcase(
"hash_set <std::pair<Issue, Domain>>");
331 testIssueDomainSet<hash_set<std::pair<Issue, Domain>>>();
333 testcase(
"hash_set <std::pair<Issue, Domain>>");
334 testIssueDomainSet<hash_set<std::pair<Issue, Domain>>>();
340 testcase(
"std::map <std::pair<Issue, Domain>, int>");
341 testIssueDomainMap<std::map<std::pair<Issue, Domain>,
int>>();
343 testcase(
"std::map <std::pair<Issue, Domain>, int>");
344 testIssueDomainMap<std::map<std::pair<Issue, Domain>,
int>>();
346#if RIPPLE_ASSETS_ENABLE_STD_HASH
347 testcase(
"hash_map <std::pair<Issue, Domain>, int>");
348 testIssueDomainMap<hash_map<std::pair<Issue, Domain>,
int>>();
350 testcase(
"hash_map <std::pair<Issue, Domain>, int>");
351 testIssueDomainMap<hash_map<std::pair<Issue, Domain>,
int>>();
353 testcase(
"hardened_hash_map <std::pair<Issue, Domain>, int>");
354 testIssueDomainMap<hardened_hash_map<std::pair<Issue, Domain>,
int>>();
356 testcase(
"hardened_hash_map <std::pair<Issue, Domain>, int>");
357 testIssueDomainMap<hardened_hash_map<std::pair<Issue, Domain>,
int>>();
365 testIssueSet<std::set<Issue>>();
368 testIssueSet<std::set<Issue>>();
370#if RIPPLE_ASSETS_ENABLE_STD_HASH
371 testcase(
"std::unordered_set <Issue>");
372 testIssueSet<std::unordered_set<Issue>>();
374 testcase(
"std::unordered_set <Issue>");
375 testIssueSet<std::unordered_set<Issue>>();
379 testIssueSet<hash_set<Issue>>();
382 testIssueSet<hash_set<Issue>>();
389 testIssueMap<std::map<Issue, int>>();
392 testIssueMap<std::map<Issue, int>>();
394#if RIPPLE_ASSETS_ENABLE_STD_HASH
395 testcase(
"std::unordered_map <Issue, int>");
396 testIssueMap<std::unordered_map<Issue, int>>();
398 testcase(
"std::unordered_map <Issue, int>");
399 testIssueMap<std::unordered_map<Issue, int>>();
402 testIssueMap<hash_map<Issue, int>>();
405 testIssueMap<hash_map<Issue, int>>();
413 template <
class Book>
432 BEAST_EXPECT(
Book(a1, a2, std::nullopt) !=
Book(a2, a3, std::nullopt));
433 BEAST_EXPECT(
Book(a1, a2, std::nullopt) <
Book(a2, a3, std::nullopt));
434 BEAST_EXPECT(
Book(a1, a2, std::nullopt) <=
Book(a2, a3, std::nullopt));
435 BEAST_EXPECT(
Book(a2, a3, std::nullopt) <=
Book(a2, a3, std::nullopt));
436 BEAST_EXPECT(
Book(a2, a3, std::nullopt) ==
Book(a2, a3, std::nullopt));
437 BEAST_EXPECT(
Book(a2, a3, std::nullopt) >=
Book(a2, a3, std::nullopt));
438 BEAST_EXPECT(
Book(a3, a4, std::nullopt) >=
Book(a2, a3, std::nullopt));
439 BEAST_EXPECT(
Book(a3, a4, std::nullopt) >
Book(a2, a3, std::nullopt));
444 BEAST_EXPECT(
Book(a2, a3, domain1) !=
Book(a2, a3, domain2));
445 BEAST_EXPECT(
Book(a2, a3, domain1) <
Book(a2, a3, domain2));
446 BEAST_EXPECT(
Book(a2, a3, domain2) >
Book(a2, a3, domain1));
449 BEAST_EXPECT(
Book(a2, a3, domain1) !=
Book(a2, a3, std::nullopt));
450 BEAST_EXPECT(
Book(a2, a3, std::nullopt) <
Book(a2, a3, domain1));
451 BEAST_EXPECT(
Book(a2, a3, domain1) >
Book(a2, a3, std::nullopt));
454 BEAST_EXPECT(
Book(a2, a3, domain1) ==
Book(a2, a3, domain1));
455 BEAST_EXPECT(
Book(a2, a3, domain2) ==
Book(a2, a3, domain2));
457 Book(a2, a3, std::nullopt) ==
Book(a2, a3, std::nullopt));
461 Book(a2, a3, std::nullopt) ==
Book(a2, a3, std::nullopt));
466 BEAST_EXPECT(
Book(a2, a3, domain1) <=
Book(a2, a3, domain2));
467 BEAST_EXPECT(
Book(a2, a3, domain2) >=
Book(a2, a3, domain1));
468 BEAST_EXPECT(
Book(a2, a3, domain1) >=
Book(a2, a3, domain1));
469 BEAST_EXPECT(
Book(a2, a3, domain2) <=
Book(a2, a3, domain2));
472 BEAST_EXPECT(
Book(a2, a3, domain1) >
Book(a2, a3, std::nullopt));
473 BEAST_EXPECT(
Book(a2, a3, std::nullopt) <
Book(a2, a3, domain1));
476 BEAST_EXPECT(
Book(a2, a3, domain2) >
Book(a2, a3, std::nullopt));
477 BEAST_EXPECT(
Book(a2, a3, std::nullopt) <
Book(a2, a3, domain2));
481 Book(a2, a3, std::nullopt) <=
Book(a2, a3, std::nullopt));
483 Book(a2, a3, std::nullopt) >=
Book(a2, a3, std::nullopt));
486 BEAST_EXPECT(
Book(a2, a3, domain1) <=
Book(a2, a3, domain2));
487 BEAST_EXPECT(
Book(a2, a3, domain2) >=
Book(a2, a3, domain1));
490 BEAST_EXPECT(
Book(a2, a3, domain1) >=
Book(a2, a3, domain1));
491 BEAST_EXPECT(
Book(a2, a3, domain1) <=
Book(a2, a3, domain1));
496 BEAST_EXPECT(
Book(a2, a3, domain1) <
Book(a3, a4, domain2));
497 BEAST_EXPECT(
Book(a3, a4, domain2) >
Book(a2, a3, domain1));
500 BEAST_EXPECT(
Book(a3, a4, domain2) >
Book(a2, a3, std::nullopt));
501 BEAST_EXPECT(
Book(a2, a3, std::nullopt) <
Book(a3, a4, domain2));
504 BEAST_EXPECT(
Book(a3, a4, domain2) ==
Book(a3, a4, domain2));
507 BEAST_EXPECT(
Book(a2, a3, domain1) <
Book(a3, a4, domain2));
508 BEAST_EXPECT(
Book(a3, a4, domain2) >
Book(a2, a3, domain1));
532 hash(
Book(a1, a2, std::nullopt)) ==
533 hash(
Book(a1, a2, std::nullopt)));
535 hash(
Book(a1, a3, std::nullopt)) ==
536 hash(
Book(a1, a3, std::nullopt)));
538 hash(
Book(a1, a4, std::nullopt)) ==
539 hash(
Book(a1, a4, std::nullopt)));
541 hash(
Book(a2, a3, std::nullopt)) ==
542 hash(
Book(a2, a3, std::nullopt)));
544 hash(
Book(a2, a4, std::nullopt)) ==
545 hash(
Book(a2, a4, std::nullopt)));
547 hash(
Book(a3, a4, std::nullopt)) ==
548 hash(
Book(a3, a4, std::nullopt)));
551 hash(
Book(a1, a2, std::nullopt)) !=
552 hash(
Book(a1, a3, std::nullopt)));
554 hash(
Book(a1, a2, std::nullopt)) !=
555 hash(
Book(a1, a4, std::nullopt)));
557 hash(
Book(a1, a2, std::nullopt)) !=
558 hash(
Book(a2, a3, std::nullopt)));
560 hash(
Book(a1, a2, std::nullopt)) !=
561 hash(
Book(a2, a4, std::nullopt)));
563 hash(
Book(a1, a2, std::nullopt)) !=
564 hash(
Book(a3, a4, std::nullopt)));
568 hash(
Book(a1, a2, domain1)) == hash(
Book(a1, a2, domain1)));
570 hash(
Book(a1, a3, domain1)) == hash(
Book(a1, a3, domain1)));
572 hash(
Book(a1, a4, domain1)) == hash(
Book(a1, a4, domain1)));
574 hash(
Book(a2, a3, domain1)) == hash(
Book(a2, a3, domain1)));
576 hash(
Book(a2, a4, domain1)) == hash(
Book(a2, a4, domain1)));
578 hash(
Book(a3, a4, domain1)) == hash(
Book(a3, a4, domain1)));
580 hash(
Book(a1, a2, std::nullopt)) ==
581 hash(
Book(a1, a2, std::nullopt)));
585 hash(
Book(a1, a2, std::nullopt)) != hash(
Book(a1, a2, domain1)));
587 hash(
Book(a1, a3, std::nullopt)) != hash(
Book(a1, a3, domain1)));
589 hash(
Book(a1, a4, std::nullopt)) != hash(
Book(a1, a4, domain1)));
591 hash(
Book(a2, a3, std::nullopt)) != hash(
Book(a2, a3, domain1)));
593 hash(
Book(a2, a4, std::nullopt)) != hash(
Book(a2, a4, domain1)));
595 hash(
Book(a3, a4, std::nullopt)) != hash(
Book(a3, a4, domain1)));
599 hash(
Book(a1, a2, domain1)) != hash(
Book(a1, a3, domain1)));
601 hash(
Book(a1, a2, domain1)) != hash(
Book(a1, a4, domain1)));
603 hash(
Book(a2, a3, domain1)) != hash(
Book(a2, a4, domain1)));
605 hash(
Book(a1, a2, domain1)) != hash(
Book(a2, a3, domain1)));
607 hash(
Book(a2, a4, domain1)) != hash(
Book(a3, a4, domain1)));
609 hash(
Book(a3, a4, domain1)) != hash(
Book(a1, a4, domain1)));
613 hash(
Book(a1, a2, domain1)) != hash(
Book(a1, a2, domain2)));
615 hash(
Book(a1, a3, domain1)) != hash(
Book(a1, a3, domain2)));
617 hash(
Book(a1, a4, domain1)) != hash(
Book(a1, a4, domain2)));
619 hash(
Book(a2, a3, domain1)) != hash(
Book(a2, a3, domain2)));
621 hash(
Book(a2, a4, domain1)) != hash(
Book(a2, a4, domain2)));
623 hash(
Book(a3, a4, domain1)) != hash(
Book(a3, a4, domain2)));
636 Issue const a1(c1, i1);
637 Issue const a2(c2, i2);
638 Book const b1(a1, a2, std::nullopt);
639 Book const b2(a2, a1, std::nullopt);
644 Book const b1_d1(a1, a2, domain1);
645 Book const b2_d1(a2, a1, domain1);
646 Book const b1_d2(a1, a2, domain2);
647 Book const b2_d2(a2, a1, domain2);
653 if (!BEAST_EXPECT(c.size() == 1))
656 if (!BEAST_EXPECT(c.size() == 2))
659 if (!BEAST_EXPECT(c.erase(
Book(a1, a1, std::nullopt)) == 0))
661 if (!BEAST_EXPECT(c.erase(
Book(a1, a2, std::nullopt)) == 1))
663 if (!BEAST_EXPECT(c.erase(
Book(a2, a1, std::nullopt)) == 1))
665 if (!BEAST_EXPECT(c.empty()))
673 if (!BEAST_EXPECT(c.size() == 1))
676 if (!BEAST_EXPECT(c.size() == 2))
679 if (!BEAST_EXPECT(c.erase(
Book(a1, a1, std::nullopt)) == 0))
681 if (!BEAST_EXPECT(c.erase(
Book(a1, a2, std::nullopt)) == 1))
683 if (!BEAST_EXPECT(c.erase(
Book(a2, a1, std::nullopt)) == 1))
685 if (!BEAST_EXPECT(c.empty()))
688#if STL_SET_HAS_EMPLACE
690 if (!BEAST_EXPECT(c.size() == 1))
693 if (!BEAST_EXPECT(c.size() == 2))
702 if (!BEAST_EXPECT(c.size() == 1))
705 if (!BEAST_EXPECT(c.size() == 2))
708 if (!BEAST_EXPECT(c.size() == 3))
711 if (!BEAST_EXPECT(c.size() == 4))
715 if (!BEAST_EXPECT(c.erase(
Book(a2, a2, domain1)) == 0))
718 if (!BEAST_EXPECT(c.erase(
Book(a1, a2, domain1)) == 1))
720 if (!BEAST_EXPECT(c.erase(
Book(a2, a1, domain1)) == 1))
722 if (!BEAST_EXPECT(c.size() == 2))
725 if (!BEAST_EXPECT(c.erase(
Book(a1, a2, domain2)) == 1))
727 if (!BEAST_EXPECT(c.erase(
Book(a2, a1, domain2)) == 1))
729 if (!BEAST_EXPECT(c.empty()))
740 if (!BEAST_EXPECT(c.size() == 4))
743 if (!BEAST_EXPECT(c.erase(
Book(a1, a2, std::nullopt)) == 1))
745 if (!BEAST_EXPECT(c.erase(
Book(a2, a1, std::nullopt)) == 1))
747 if (!BEAST_EXPECT(c.size() == 2))
750 if (!BEAST_EXPECT(c.erase(
Book(a1, a2, domain1)) == 1))
752 if (!BEAST_EXPECT(c.erase(
Book(a2, a1, domain1)) == 1))
754 if (!BEAST_EXPECT(c.empty()))
767 Issue const a1(c1, i1);
768 Issue const a2(c2, i2);
769 Book const b1(a1, a2, std::nullopt);
770 Book const b2(a2, a1, std::nullopt);
775 Book const b1_d1(a1, a2, domain1);
776 Book const b2_d1(a2, a1, domain1);
777 Book const b1_d2(a1, a2, domain2);
778 Book const b2_d2(a2, a1, domain2);
788 if (!BEAST_EXPECT(c.size() == 1))
792 if (!BEAST_EXPECT(c.size() == 2))
795 if (!BEAST_EXPECT(c.erase(
Book(a1, a1, std::nullopt)) == 0))
797 if (!BEAST_EXPECT(c.erase(
Book(a1, a2, std::nullopt)) == 1))
799 if (!BEAST_EXPECT(c.erase(
Book(a2, a1, std::nullopt)) == 1))
801 if (!BEAST_EXPECT(c.empty()))
810 if (!BEAST_EXPECT(c.size() == 1))
814 if (!BEAST_EXPECT(c.size() == 2))
817 if (!BEAST_EXPECT(c.erase(
Book(a1, a1, std::nullopt)) == 0))
819 if (!BEAST_EXPECT(c.erase(
Book(a1, a2, std::nullopt)) == 1))
821 if (!BEAST_EXPECT(c.erase(
Book(a2, a1, std::nullopt)) == 1))
823 if (!BEAST_EXPECT(c.empty()))
831 if (!BEAST_EXPECT(c.size() == 1))
834 if (!BEAST_EXPECT(c.size() == 2))
837 if (!BEAST_EXPECT(c.size() == 3))
840 if (!BEAST_EXPECT(c.size() == 4))
844 if (!BEAST_EXPECT(c.erase(
Book(a2, a2, domain1)) == 0))
847 if (!BEAST_EXPECT(c.erase(
Book(a1, a2, domain1)) == 1))
849 if (!BEAST_EXPECT(c.erase(
Book(a2, a1, domain1)) == 1))
851 if (!BEAST_EXPECT(c.size() == 2))
854 if (!BEAST_EXPECT(c.erase(
Book(a1, a2, domain2)) == 1))
856 if (!BEAST_EXPECT(c.erase(
Book(a2, a1, domain2)) == 1))
858 if (!BEAST_EXPECT(c.empty()))
869 if (!BEAST_EXPECT(c.size() == 4))
873 if (!BEAST_EXPECT(c.erase(
Book(a1, a1, domain1)) == 0))
875 if (!BEAST_EXPECT(c.erase(
Book(a2, a2, domain2)) == 0))
878 if (!BEAST_EXPECT(c.erase(
Book(a1, a2, std::nullopt)) == 1))
880 if (!BEAST_EXPECT(c.erase(
Book(a2, a1, std::nullopt)) == 1))
882 if (!BEAST_EXPECT(c.size() == 2))
885 if (!BEAST_EXPECT(c.erase(
Book(a1, a2, domain1)) == 1))
887 if (!BEAST_EXPECT(c.erase(
Book(a2, a1, domain1)) == 1))
889 if (!BEAST_EXPECT(c.empty()))
898 testBookSet<std::set<Book>>();
901 testBookSet<std::set<Book>>();
903#if RIPPLE_ASSETS_ENABLE_STD_HASH
904 testcase(
"std::unordered_set <Book>");
905 testBookSet<std::unordered_set<Book>>();
907 testcase(
"std::unordered_set <Book>");
908 testBookSet<std::unordered_set<Book>>();
912 testBookSet<hash_set<Book>>();
915 testBookSet<hash_set<Book>>();
922 testBookMap<std::map<Book, int>>();
925 testBookMap<std::map<Book, int>>();
927#if RIPPLE_ASSETS_ENABLE_STD_HASH
928 testcase(
"std::unordered_map <Book, int>");
929 testBookMap<std::unordered_map<Book, int>>();
931 testcase(
"std::unordered_map <Book, int>");
932 testBookMap<std::unordered_map<Book, int>>();
935 testBookMap<hash_map<Book, int>>();
938 testBookMap<hash_map<Book, int>>();
948 testUnsigned<Currency>();
951 testUnsigned<AccountID>();
testcase_t testcase
Memberspace for declaring test cases.
void testIssueDomainSet()
void testIssueDomainSets()
void testIssueDomainMaps()
void run() override
Runs the suite.
void testIssueDomainMap()
A currency issued by an account.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.