1 #include <boost/test/unit_test.hpp>
11 #define RANDOM_REPEATS 5
15 typedef set<pair<const CWalletTx*,unsigned int> >
CoinSet;
17 BOOST_AUTO_TEST_SUITE(wallet_tests)
22 static
void add_coin(
int64 nValue,
int nAge = 6*24,
bool fIsFromMe = false,
int nInput=0)
24 static int nextLockTime = 0;
27 tx.
vout.resize(nInput+1);
28 tx.
vout[nInput].nValue = nValue;
38 COutput output(wtx, nInput, nAge);
39 vCoins.push_back(output);
42 static void empty_wallet(
void)
44 BOOST_FOREACH(
COutput output, vCoins)
51 pair<CoinSet::iterator, CoinSet::iterator> ret = mismatch(a.begin(), a.end(), b.begin());
52 return ret.first == a.end() && ret.second == b.end();
57 CoinSet setCoinsRet, setCoinsRet2;
66 BOOST_CHECK(!wallet.
SelectCoinsMinConf( 1 * CENT, 1, 6, vCoins, setCoinsRet, nValueRet));
71 BOOST_CHECK(!wallet.
SelectCoinsMinConf( 1 * CENT, 1, 6, vCoins, setCoinsRet, nValueRet));
74 BOOST_CHECK( wallet.
SelectCoinsMinConf( 1 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
75 BOOST_CHECK_EQUAL(nValueRet, 1 * CENT);
80 BOOST_CHECK(!wallet.
SelectCoinsMinConf( 3 * CENT, 1, 6, vCoins, setCoinsRet, nValueRet));
83 BOOST_CHECK( wallet.
SelectCoinsMinConf( 3 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
84 BOOST_CHECK_EQUAL(nValueRet, 3 * CENT);
87 add_coin(10*CENT, 3,
true);
93 BOOST_CHECK(!wallet.
SelectCoinsMinConf(38 * CENT, 1, 6, vCoins, setCoinsRet, nValueRet));
95 BOOST_CHECK(!wallet.
SelectCoinsMinConf(38 * CENT, 6, 6, vCoins, setCoinsRet, nValueRet));
97 BOOST_CHECK( wallet.
SelectCoinsMinConf(37 * CENT, 1, 6, vCoins, setCoinsRet, nValueRet));
98 BOOST_CHECK_EQUAL(nValueRet, 37 * CENT);
100 BOOST_CHECK( wallet.
SelectCoinsMinConf(38 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
101 BOOST_CHECK_EQUAL(nValueRet, 38 * CENT);
104 BOOST_CHECK( wallet.
SelectCoinsMinConf(34 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
105 BOOST_CHECK_GT(nValueRet, 34 * CENT);
106 BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U);
109 BOOST_CHECK( wallet.
SelectCoinsMinConf( 7 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
110 BOOST_CHECK_EQUAL(nValueRet, 7 * CENT);
111 BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U);
114 BOOST_CHECK( wallet.
SelectCoinsMinConf( 8 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
115 BOOST_CHECK(nValueRet == 8 * CENT);
116 BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U);
119 BOOST_CHECK( wallet.
SelectCoinsMinConf( 9 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
120 BOOST_CHECK_EQUAL(nValueRet, 10 * CENT);
121 BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U);
133 BOOST_CHECK( wallet.
SelectCoinsMinConf(71 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
134 BOOST_CHECK(!wallet.
SelectCoinsMinConf(72 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
137 BOOST_CHECK( wallet.
SelectCoinsMinConf(16 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
138 BOOST_CHECK_EQUAL(nValueRet, 20 * CENT);
139 BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U);
144 BOOST_CHECK( wallet.
SelectCoinsMinConf(16 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
145 BOOST_CHECK_EQUAL(nValueRet, 18 * CENT);
146 BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U);
151 BOOST_CHECK( wallet.
SelectCoinsMinConf(16 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
152 BOOST_CHECK_EQUAL(nValueRet, 18 * CENT);
153 BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U);
156 BOOST_CHECK( wallet.
SelectCoinsMinConf(11 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
157 BOOST_CHECK_EQUAL(nValueRet, 11 * CENT);
158 BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U);
165 BOOST_CHECK( wallet.
SelectCoinsMinConf(95 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
166 BOOST_CHECK_EQUAL(nValueRet, 1 * COIN);
167 BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U);
169 BOOST_CHECK( wallet.
SelectCoinsMinConf(195 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
170 BOOST_CHECK_EQUAL(nValueRet, 2 * COIN);
171 BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U);
183 BOOST_CHECK( wallet.
SelectCoinsMinConf(1 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
184 BOOST_CHECK_EQUAL(nValueRet, 1 * CENT);
190 BOOST_CHECK( wallet.
SelectCoinsMinConf(1 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
191 BOOST_CHECK_EQUAL(nValueRet, 1 * CENT);
198 BOOST_CHECK( wallet.
SelectCoinsMinConf(1 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
199 BOOST_CHECK_EQUAL(nValueRet, 1 * CENT);
204 for (
int i = 0; i < 20; i++)
205 add_coin(50000 * COIN);
207 BOOST_CHECK( wallet.
SelectCoinsMinConf(500000 * COIN, 1, 1, vCoins, setCoinsRet, nValueRet));
208 BOOST_CHECK_EQUAL(nValueRet, 500000 * COIN);
209 BOOST_CHECK_EQUAL(setCoinsRet.size(), 10U);
216 add_coin(0.5 * CENT);
217 add_coin(0.6 * CENT);
218 add_coin(0.7 * CENT);
219 add_coin(1111 * CENT);
220 BOOST_CHECK( wallet.
SelectCoinsMinConf(1 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
221 BOOST_CHECK_EQUAL(nValueRet, 1111 * CENT);
222 BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U);
226 add_coin(0.4 * CENT);
227 add_coin(0.6 * CENT);
228 add_coin(0.8 * CENT);
229 add_coin(1111 * CENT);
230 BOOST_CHECK( wallet.
SelectCoinsMinConf(1 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet));
231 BOOST_CHECK_EQUAL(nValueRet, 1 * CENT);
232 BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U);
236 add_coin(0.0005 * COIN);
237 add_coin(0.01 * COIN);
241 BOOST_CHECK( wallet.
SelectCoinsMinConf(1.0001 * COIN, 1, 1, vCoins, setCoinsRet, nValueRet));
242 BOOST_CHECK_EQUAL(nValueRet, 1.0105 * COIN);
243 BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U);
246 BOOST_CHECK( wallet.
SelectCoinsMinConf(0.999 * COIN, 1, 1, vCoins, setCoinsRet, nValueRet));
247 BOOST_CHECK_EQUAL(nValueRet, 1.01 * COIN);
248 BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U);
253 for (
int i2 = 0; i2 < 100; i2++)
258 BOOST_CHECK(wallet.
SelectCoinsMinConf(50 * COIN, 1, 6, vCoins, setCoinsRet , nValueRet));
259 BOOST_CHECK(wallet.
SelectCoinsMinConf(50 * COIN, 1, 6, vCoins, setCoinsRet2, nValueRet));
260 BOOST_CHECK(!equal_sets(setCoinsRet, setCoinsRet2));
269 if (equal_sets(setCoinsRet, setCoinsRet2))
272 BOOST_CHECK_NE(fails, RANDOM_REPEATS);
277 add_coin( 5*CENT); add_coin(10*CENT); add_coin(15*CENT); add_coin(20*CENT); add_coin(25*CENT);
284 BOOST_CHECK(wallet.
SelectCoinsMinConf(90*CENT, 1, 6, vCoins, setCoinsRet , nValueRet));
285 BOOST_CHECK(wallet.
SelectCoinsMinConf(90*CENT, 1, 6, vCoins, setCoinsRet2, nValueRet));
286 if (equal_sets(setCoinsRet, setCoinsRet2))
289 BOOST_CHECK_NE(fails, RANDOM_REPEATS);
294 BOOST_AUTO_TEST_SUITE_END()
set< pair< const CWalletTx *, unsigned int > > CoinSet
bool SelectCoinsMinConf(int64 nTargetValue, int nConfMine, int nConfTheirs, std::vector< COutput > vCoins, std::set< std::pair< const CWalletTx *, unsigned int > > &setCoinsRet, int64 &nValueRet) const
BOOST_AUTO_TEST_CASE(coin_selection_tests)
std::vector< CTxOut > vout
A transaction with a bunch of additional info that only the owner cares about.
A CWallet is an extension of a keystore, which also maintains a set of transactions and balances...
The basic transaction that is broadcasted on the network and contained in blocks. ...