diff options
author | Gav Wood <i@gavwood.com> | 2014-01-19 22:42:02 +0800 |
---|---|---|
committer | Gav Wood <i@gavwood.com> | 2014-01-19 22:42:02 +0800 |
commit | 9033480699fb59a307680c39ddb698608a493648 (patch) | |
tree | 4aad7677f7d2b557468ff57aff9321d5bccad095 /trie.cpp | |
parent | d0381ed9f1716a305da08bf6be70df6652b9c3c3 (diff) | |
download | dexon-solidity-9033480699fb59a307680c39ddb698608a493648.tar dexon-solidity-9033480699fb59a307680c39ddb698608a493648.tar.gz dexon-solidity-9033480699fb59a307680c39ddb698608a493648.tar.bz2 dexon-solidity-9033480699fb59a307680c39ddb698608a493648.tar.lz dexon-solidity-9033480699fb59a307680c39ddb698608a493648.tar.xz dexon-solidity-9033480699fb59a307680c39ddb698608a493648.tar.zst dexon-solidity-9033480699fb59a307680c39ddb698608a493648.zip |
Repotted tests.
Diffstat (limited to 'trie.cpp')
-rw-r--r-- | trie.cpp | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/trie.cpp b/trie.cpp new file mode 100644 index 00000000..bb41c12c --- /dev/null +++ b/trie.cpp @@ -0,0 +1,189 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Foobar is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Foobar. If not, see <http://www.gnu.org/licenses/>. +*/ +/** @file trie.cpp + * @author Gav Wood <i@gavwood.com> + * @date 2014 + * Trie test functions. + */ + +#include <random> +#include <TrieHash.h> +#include <TrieDB.h> +#include <MemTrie.h> +using namespace std; +using namespace eth; + +int trieTest() +{ + { + BasicMap m; + GenericTrieDB<BasicMap> t(&m); + t.init(); // initialise as empty tree. + cout << t; + cout << m; + cout << t.root() << endl; + cout << hash256(StringMap()) << endl; + + t.insert(string("tesz"), string("test")); + cout << t; + cout << m; + cout << t.root() << endl; + cout << hash256({{"test", "test"}}) << endl; + + t.insert(string("tesa"), string("testy")); + cout << t; + cout << m; + cout << t.root() << endl; + cout << hash256({{"test", "test"}, {"te", "testy"}}) << endl; + cout << t.at(string("test")) << endl; + cout << t.at(string("te")) << endl; + cout << t.at(string("t")) << endl; + + t.remove(string("te")); + cout << m; + cout << t.root() << endl; + cout << hash256({{"test", "test"}}) << endl; + + t.remove(string("test")); + cout << m; + cout << t.root() << endl; + cout << hash256(StringMap()) << endl; + } + { + BasicMap m; + GenericTrieDB<BasicMap> t(&m); + t.init(); // initialise as empty tree. + t.insert(string("a"), string("A")); + t.insert(string("b"), string("B")); + cout << t; + cout << m; + cout << t.root() << endl; + cout << hash256({{"b", "B"}, {"a", "A"}}) << endl; + cout << RLP(rlp256({{"b", "B"}, {"a", "A"}})) << endl; + } + { + MemTrie t; + t.insert("dog", "puppy"); + cout << hex << t.hash256() << endl; + cout << RLP(t.rlp()) << endl; + } + { + MemTrie t; + t.insert("bed", "d"); + t.insert("be", "e"); + cout << hex << t.hash256() << endl; + cout << RLP(t.rlp()) << endl; + } + { + cout << hex << hash256({{"dog", "puppy"}, {"doe", "reindeer"}}) << endl; + MemTrie t; + t.insert("dog", "puppy"); + t.insert("doe", "reindeer"); + cout << hex << t.hash256() << endl; + cout << RLP(t.rlp()) << endl; + cout << asHex(t.rlp()) << endl; + } + { + BasicMap m; + GenericTrieDB<BasicMap> d(&m); + d.init(); // initialise as empty tree. + MemTrie t; + StringMap s; + + auto add = [&](char const* a, char const* b) + { + d.insert(string(a), string(b)); + t.insert(a, b); + s[a] = b; + + cout << endl << "-------------------------------" << endl; + cout << a << " -> " << b << endl; + cout << d; + cout << m; + cout << d.root() << endl; + cout << hash256(s) << endl; + + assert(t.hash256() == hash256(s)); + assert(d.root() == hash256(s)); + for (auto const& i: s) + { + assert(t.at(i.first) == i.second); + assert(d.at(i.first) == i.second); + } + }; + + auto remove = [&](char const* a) + { + s.erase(a); + t.remove(a); + d.remove(string(a)); + + cout << endl << "-------------------------------" << endl; + cout << "X " << a << endl; + cout << d; + cout << m; + cout << d.root() << endl; + cout << hash256(s) << endl; + + assert(t.at(a).empty()); + assert(d.at(string(a)).empty()); + assert(t.hash256() == hash256(s)); + assert(d.root() == hash256(s)); + for (auto const& i: s) + { + assert(t.at(i.first) == i.second); + assert(d.at(i.first) == i.second); + } + }; + + add("dogglesworth", "cat"); + add("doe", "reindeer"); + remove("dogglesworth"); + add("horse", "stallion"); + add("do", "verb"); + add("doge", "coin"); + remove("horse"); + remove("do"); + remove("doge"); + remove("doe"); + for (int a = 0; a < 20; ++a) + { + StringMap m; + for (int i = 0; i < 20; ++i) + { + auto k = randomWord(); + auto v = toString(i); + m.insert(make_pair(k, v)); + t.insert(k, v); + d.insert(k, v); + assert(hash256(m) == t.hash256()); + assert(hash256(m) == d.root()); + } + while (!m.empty()) + { + auto k = m.begin()->first; + d.remove(k); + t.remove(k); + m.erase(k); + assert(hash256(m) == t.hash256()); + assert(hash256(m) == d.root()); + } + } + } + return 0; +} + |