diff --git a/src/ripple/types/api/RippleAssets.h b/src/ripple/types/api/RippleAssets.h index ee1051158..82799675e 100644 --- a/src/ripple/types/api/RippleAssets.h +++ b/src/ripple/types/api/RippleAssets.h @@ -180,8 +180,8 @@ bool operator<= (RippleAssetType const& lhs, //------------------------------------------------------------------------------ -typedef RippleAssetType RippleAssetRef; typedef RippleAssetType RippleAsset; +typedef RippleAssetType RippleAssetRef; /** Create an asset specifier by parsing the given JSON. Errors, if any, will be returned or injected into the specified result @@ -285,7 +285,7 @@ bool operator< (RippleBookType const& lhs, RippleBookType const& rhs) { int const diff (compare (lhs.in, rhs.in)); - if (diff != 0 || lhs.in.is_xrp ()) + if (diff != 0) return diff < 0; return lhs.out < rhs.out; } @@ -314,8 +314,8 @@ bool operator<= (RippleBookType const& lhs, //------------------------------------------------------------------------------ -typedef RippleBookType RippleBook; -typedef RippleBookType RippleBookRef; +typedef RippleBookType RippleBook; +typedef RippleBookType RippleBookRef; } diff --git a/src/ripple/types/impl/RippleAssets.cpp b/src/ripple/types/impl/RippleAssets.cpp index dc8507ad5..1f048df65 100644 --- a/src/ripple/types/impl/RippleAssets.cpp +++ b/src/ripple/types/impl/RippleAssets.cpp @@ -18,6 +18,7 @@ //============================================================================== #include +#include #include #include @@ -32,6 +33,81 @@ namespace ripple { class RippleAssetTests : public UnitTest { public: + // Comparison, hash tests for uint60 (via base_uint) + template + void testUnsigned () + { + Unsigned const u1 (1); + Unsigned const u2 (2); + Unsigned const u3 (3); + + expect (u1 != u2); + expect (u1 < u2); + expect (u1 <= u2); + expect (u2 <= u2); + expect (u2 == u2); + expect (u2 >= u2); + expect (u3 >= u2); + expect (u3 > u2); + + std::hash const hash; + + expect (hash (u1) == hash (u1)); + expect (hash (u2) == hash (u2)); + expect (hash (u3) == hash (u3)); + expect (hash (u1) != hash (u2)); + expect (hash (u1) != hash (u3)); + expect (hash (u2) != hash (u3)); + } + + //-------------------------------------------------------------------------- + + // Comparison, hash tests for RippleAssetType + template + void testAssetType () + { + RippleCurrency const c1 (1); RippleIssuer const i1 (1); + RippleCurrency const c2 (2); RippleIssuer const i2 (2); + RippleCurrency const c3 (3); RippleIssuer const i3 (3); + + expect (Asset (c1, i1) != Asset (c2, i1)); + expect (Asset (c1, i1) < Asset (c2, i1)); + expect (Asset (c1, i1) <= Asset (c2, i1)); + expect (Asset (c2, i1) <= Asset (c2, i1)); + expect (Asset (c2, i1) == Asset (c2, i1)); + expect (Asset (c2, i1) >= Asset (c2, i1)); + expect (Asset (c3, i1) >= Asset (c2, i1)); + expect (Asset (c3, i1) > Asset (c2, i1)); + expect (Asset (c1, i1) != Asset (c1, i2)); + expect (Asset (c1, i1) < Asset (c1, i2)); + expect (Asset (c1, i1) <= Asset (c1, i2)); + expect (Asset (c1, i2) <= Asset (c1, i2)); + expect (Asset (c1, i2) == Asset (c1, i2)); + expect (Asset (c1, i2) >= Asset (c1, i2)); + expect (Asset (c1, i3) >= Asset (c1, i2)); + expect (Asset (c1, i3) > Asset (c1, i2)); + + std::hash const hash; + + expect (hash (Asset (c1, i1)) == hash (Asset (c1, i1))); + expect (hash (Asset (c1, i2)) == hash (Asset (c1, i2))); + expect (hash (Asset (c1, i3)) == hash (Asset (c1, i3))); + expect (hash (Asset (c2, i1)) == hash (Asset (c2, i1))); + expect (hash (Asset (c2, i2)) == hash (Asset (c2, i2))); + expect (hash (Asset (c2, i3)) == hash (Asset (c2, i3))); + expect (hash (Asset (c3, i1)) == hash (Asset (c3, i1))); + expect (hash (Asset (c3, i2)) == hash (Asset (c3, i2))); + expect (hash (Asset (c3, i3)) == hash (Asset (c3, i3))); + expect (hash (Asset (c1, i1)) != hash (Asset (c1, i2))); + expect (hash (Asset (c1, i1)) != hash (Asset (c1, i3))); + expect (hash (Asset (c1, i1)) != hash (Asset (c2, i1))); + expect (hash (Asset (c1, i1)) != hash (Asset (c2, i2))); + expect (hash (Asset (c1, i1)) != hash (Asset (c2, i3))); + expect (hash (Asset (c1, i1)) != hash (Asset (c3, i1))); + expect (hash (Asset (c1, i1)) != hash (Asset (c3, i2))); + expect (hash (Asset (c1, i1)) != hash (Asset (c3, i3))); + } + template void testAssetSet () { @@ -42,27 +118,40 @@ public: RippleAssetRef const a1 (c1, i1); RippleAssetRef const a2 (c2, i2); - Set c; + { + Set c; - c.insert (a1); - c.insert (a2); - expect (c.erase (RippleAsset (c1, i2)) == 0); - expect (c.erase (RippleAsset (c1, i1)) == 1); - expect (c.erase (RippleAsset (c2, i2)) == 1); - expect (c.empty ()); + c.insert (a1); + if (! expect (c.size () == 1)) return; + c.insert (a2); + if (! expect (c.size () == 2)) return; - c.insert (a1); - c.insert (a2); - expect (c.erase (RippleAssetRef (c1, i2)) == 0); - expect (c.erase (RippleAssetRef (c1, i1)) == 1); - expect (c.erase (RippleAssetRef (c2, i2)) == 1); - expect (c.empty ()); + if (! expect (c.erase (RippleAsset (c1, i2)) == 0)) return; + if (! expect (c.erase (RippleAsset (c1, i1)) == 1)) return; + if (! expect (c.erase (RippleAsset (c2, i2)) == 1)) return; + if (! expect (c.empty ())) return; + } -#if STL_SET_HAS_EMPLACE - c.emplace (c1, i1); - c.emplace (c2, i2); - expect (c.size() == 2); -#endif + { + Set c; + + c.insert (a1); + if (! expect (c.size () == 1)) return; + c.insert (a2); + if (! expect (c.size () == 2)) return; + + if (! expect (c.erase (RippleAssetRef (c1, i2)) == 0)) return; + if (! expect (c.erase (RippleAssetRef (c1, i1)) == 1)) return; + if (! expect (c.erase (RippleAssetRef (c2, i2)) == 1)) return; + if (! expect (c.empty ())) return; + + #if STL_SET_HAS_EMPLACE + c.emplace (c1, i1); + if (! expect (c.size() == 1)) return; + c.emplace (c2, i2); + if (! expect (c.size() == 2)) return; + #endif + } } template @@ -75,74 +164,119 @@ public: RippleAssetRef const a1 (c1, i1); RippleAssetRef const a2 (c2, i2); - Map c; + { + Map c; - c.insert (std::make_pair (a1, 1)); - c.insert (std::make_pair (a2, 2)); - expect (c.erase (RippleAsset (c1, i2)) == 0); - expect (c.erase (RippleAsset (c1, i1)) == 1); - expect (c.erase (RippleAsset (c2, i2)) == 1); - expect (c.empty ()); + c.insert (std::make_pair (a1, 1)); + if (! expect (c.size () == 1)) return; + c.insert (std::make_pair (a2, 2)); + if (! expect (c.size () == 2)) return; - c.insert (std::make_pair (a1, 1)); - c.insert (std::make_pair (a2, 2)); - expect (c.erase (RippleAssetRef (c1, i2)) == 0); - expect (c.erase (RippleAssetRef (c1, i1)) == 1); - expect (c.erase (RippleAssetRef (c2, i2)) == 1); - expect (c.empty ()); + if (! expect (c.erase (RippleAsset (c1, i2)) == 0)) return; + if (! expect (c.erase (RippleAsset (c1, i1)) == 1)) return; + if (! expect (c.erase (RippleAsset (c2, i2)) == 1)) return; + if (! expect (c.empty ())) return; + } + + { + Map c; + + c.insert (std::make_pair (a1, 1)); + if (! expect (c.size () == 1)) return; + c.insert (std::make_pair (a2, 2)); + if (! expect (c.size () == 2)) return; + + if (! expect (c.erase (RippleAssetRef (c1, i2)) == 0)) return; + if (! expect (c.erase (RippleAssetRef (c1, i1)) == 1)) return; + if (! expect (c.erase (RippleAssetRef (c2, i2)) == 1)) return; + if (! expect (c.empty ())) return; + } } - void testAssets () + void testAssetSets () { - beginTestCase ("assets"); - - RippleCurrency const c1 (1); - RippleIssuer const i1 (1); - RippleCurrency const c2 (2); - RippleIssuer const i2 (2); - - { - RippleAssetRef a0 (xrp_asset ()); - expect (a0 == xrp_asset()); - - RippleAssetRef a1 (c1, i1); - RippleAssetRef a2 (a1); - - expect (a1 == a2); - } - - { - // VFALCO NOTE this should be uninitialized - RippleAsset uninitialized_asset; - } - - { - RippleAsset a1 (c1, i1); - RippleAsset a2 (a1); - - expect (a1 == a2); - expect (a1 != xrp_asset()); - - a2 = RippleAsset (c2, i2); - - expect (a1 < a2); - } - + beginTestCase ("std::set "); testAssetSet > (); - testAssetSet > (); - testAssetSet > (); - testAssetSet > (); - testAssetSet > (); - testAssetSet > (); + beginTestCase ("std::set "); + testAssetSet > (); + + beginTestCase ("std::unordered_set "); + testAssetSet > (); + + beginTestCase ("std::unordered_set "); + testAssetSet > (); + + beginTestCase ("boost::unordered_set "); + testAssetSet > (); + + beginTestCase ("boost::unordered_set "); + testAssetSet > (); + } + + void testAssetMaps () + { + beginTestCase ("std::map "); testAssetMap > (); + + beginTestCase ("std::map "); testAssetMap > (); + + beginTestCase ("std::unordered_map "); testAssetMap > (); + + beginTestCase ("std::unordered_map "); testAssetMap > (); + + beginTestCase ("boost::unordered_map "); testAssetMap > (); + + beginTestCase ("boost::unordered_map "); testAssetMap > (); } + //-------------------------------------------------------------------------- + + // Comparison, hash tests for RippleBookType + template + void testBook () + { + RippleCurrency const c1 (1); RippleIssuer const i1 (1); + RippleCurrency const c2 (2); RippleIssuer const i2 (2); + RippleCurrency const c3 (3); RippleIssuer const i3 (3); + + RippleAsset a1 (c1, i1); + RippleAsset a2 (c1, i2); + RippleAsset a3 (c2, i2); + RippleAsset a4 (c3, i2); + + expect (Book (a1, a2) != Book (a2, a3)); + expect (Book (a1, a2) < Book (a2, a3)); + expect (Book (a1, a2) <= Book (a2, a3)); + expect (Book (a2, a3) <= Book (a2, a3)); + expect (Book (a2, a3) == Book (a2, a3)); + expect (Book (a2, a3) >= Book (a2, a3)); + expect (Book (a3, a4) >= Book (a2, a3)); + expect (Book (a3, a4) > Book (a2, a3)); + + std::hash const hash; + + expect (hash (Book (a1, a2)) == hash (Book (a1, a2))); + expect (hash (Book (a1, a3)) == hash (Book (a1, a3))); + expect (hash (Book (a1, a4)) == hash (Book (a1, a4))); + expect (hash (Book (a2, a3)) == hash (Book (a2, a3))); + expect (hash (Book (a2, a4)) == hash (Book (a2, a4))); + expect (hash (Book (a3, a4)) == hash (Book (a3, a4))); + + expect (hash (Book (a1, a2)) != hash (Book (a1, a3))); + expect (hash (Book (a1, a2)) != hash (Book (a1, a4))); + expect (hash (Book (a1, a2)) != hash (Book (a2, a3))); + expect (hash (Book (a1, a2)) != hash (Book (a2, a4))); + expect (hash (Book (a1, a2)) != hash (Book (a3, a4))); + } + + //-------------------------------------------------------------------------- + template void testBookSet () { @@ -155,27 +289,40 @@ public: RippleBookRef const b1 (a1, a2); RippleBookRef const b2 (a2, a1); - Set c; + { + Set c; - c.insert (b1); - c.insert (b2); - expect (c.erase (RippleBook (a1, a1)) == 0); - expect (c.erase (RippleBook (a1, a2)) == 1); - expect (c.erase (RippleBook (a2, a1)) == 1); - expect (c.empty ()); + c.insert (b1); + if (! expect (c.size () == 1)) return; + c.insert (b2); + if (! expect (c.size () == 2)) return; - c.insert (b1); - c.insert (b2); - expect (c.erase (RippleBookRef (a1, a1)) == 0); - expect (c.erase (RippleBookRef (a1, a2)) == 1); - expect (c.erase (RippleBookRef (a2, a1)) == 1); - expect (c.empty ()); + if (! expect (c.erase (RippleBook (a1, a1)) == 0)) return; + if (! expect (c.erase (RippleBook (a1, a2)) == 1)) return; + if (! expect (c.erase (RippleBook (a2, a1)) == 1)) return; + if (! expect (c.empty ())) return; + } -#if STL_SET_HAS_EMPLACE - c.emplace (a1, a2); - c.emplace (a2, a1); - expect (c.size() == 2); -#endif + { + Set c; + + c.insert (b1); + if (! expect (c.size () == 1)) return; + c.insert (b2); + if (! expect (c.size () == 2)) return; + + if (! expect (c.erase (RippleBookRef (a1, a1)) == 0)) return; + if (! expect (c.erase (RippleBookRef (a1, a2)) == 1)) return; + if (! expect (c.erase (RippleBookRef (a2, a1)) == 1)) return; + if (! expect (c.empty ())) return; + + #if STL_SET_HAS_EMPLACE + c.emplace (a1, a2); + if (! expect (c.size() == 1)) return; + c.emplace (a2, a1); + if (! expect (c.size() == 2)) return; + #endif + } } template @@ -190,55 +337,115 @@ public: RippleBookRef const b1 (a1, a2); RippleBookRef const b2 (a2, a1); - Map c; + //typename Map::value_type value_type; + //std::pair value_type; - c.insert (std::make_pair (b1, 1)); - c.insert (std::make_pair (b2, 2)); - expect (c.erase (RippleBook (a1, a1)) == 0); - expect (c.erase (RippleBook (a1, a2)) == 1); - expect (c.erase (RippleBook (a2, a1)) == 1); - expect (c.empty ()); + { + Map c; - c.insert (std::make_pair (b1, 1)); - c.insert (std::make_pair (b2, 2)); - expect (c.erase (RippleBookRef (a1, a1)) == 0); - expect (c.erase (RippleBookRef (a1, a2)) == 1); - expect (c.erase (RippleBookRef (a2, a1)) == 1); - expect (c.empty ()); + //c.insert (value_type (b1, 1)); + c.insert (std::make_pair (b1, 1)); + if (! expect (c.size () == 1)) return; + //c.insert (value_type (b2, 2)); + c.insert (std::make_pair (b2, 1)); + if (! expect (c.size () == 2)) return; + + if (! expect (c.erase (RippleBook (a1, a1)) == 0)) return; + if (! expect (c.erase (RippleBook (a1, a2)) == 1)) return; + if (! expect (c.erase (RippleBook (a2, a1)) == 1)) return; + if (! expect (c.empty ())) return; + } + + { + Map c; + + //c.insert (value_type (b1, 1)); + c.insert (std::make_pair (b1, 1)); + if (! expect (c.size () == 1)) return; + //c.insert (value_type (b2, 2)); + c.insert (std::make_pair (b2, 1)); + if (! expect (c.size () == 2)) return; + + if (! expect (c.erase (RippleBookRef (a1, a1)) == 0)) return; + if (! expect (c.erase (RippleBookRef (a1, a2)) == 1)) return; + if (! expect (c.erase (RippleBookRef (a2, a1)) == 1)) return; + if (! expect (c.empty ())) return; + } } - void testBooks () + void testBookSets () { - beginTestCase ("books"); - - RippleAsset a1 (RippleCurrency (1), RippleIssuer (1)); - RippleAsset a2 (RippleCurrency (2), RippleIssuer (2)); - - RippleBook b1 (a1, a2); - RippleBook b2 (a2, a1); - - expect (b1 != b2); - expect (b1 < b2); - + beginTestCase ("std::set "); testBookSet > (); - testBookSet > (); - testBookSet > (); - testBookSet > (); - testBookSet > (); - testBookSet > (); + beginTestCase ("std::set "); + testBookSet > (); + + beginTestCase ("std::unordered_set "); + testBookSet > (); + + beginTestCase ("std::unordered_set "); + testBookSet > (); + + beginTestCase ("boost::unordered_set "); + testBookSet > (); + + beginTestCase ("boost::unordered_set "); + testBookSet > (); + } + + void testBookMaps () + { + beginTestCase ("std::map "); testBookMap > (); + + beginTestCase ("std::map "); testBookMap > (); + + beginTestCase ("std::unordered_map "); testBookMap > (); + + beginTestCase ("std::unordered_map "); testBookMap > (); + + beginTestCase ("boost::unordered_map "); testBookMap > (); + + beginTestCase ("boost::unordered_map "); testBookMap > (); } + //-------------------------------------------------------------------------- + void runTest () { - testAssets (); - testBooks (); + beginTestCase ("RippleCurrency"); + testUnsigned (); + + beginTestCase ("RippleIssuer"); + testUnsigned (); + + // --- + + beginTestCase ("RippleAsset"); + testAssetType (); + + beginTestCase ("RippleAssetRef"); + testAssetType (); + + testAssetSets (); + testAssetMaps (); + + // --- + + beginTestCase ("RippleBook"); + testBook (); + + beginTestCase ("RippleBookRef"); + testBook (); + + testBookSets (); + testBookMaps (); } RippleAssetTests () : UnitTest ("RippleAsset", "ripple")