12 #include "test/test_dash.h" 14 #include <boost/foreach.hpp> 15 #include <boost/test/unit_test.hpp> 22 #define RANDOM_REPEATS 5 26 typedef set<pair<const CWalletTx*,unsigned int> >
CoinSet;
28 BOOST_FIXTURE_TEST_SUITE(wallet_tests, TestingSetup)
33 static
void add_coin(const
CAmount& nValue,
int nAge = 6*24,
bool fIsFromMe = false,
int nInput=0)
35 static int nextLockTime = 0;
38 tx.
vout.resize(nInput+1);
39 tx.
vout[nInput].nValue = nValue;
51 COutput output(wtx, nInput, nAge,
true,
true);
64 pair<CoinSet::iterator, CoinSet::iterator> ret = mismatch(a.begin(), a.end(), b.begin());
65 return ret.first == a.end() && ret.second == b.end();
70 CoinSet setCoinsRet, setCoinsRet2;
81 BOOST_CHECK(!
wallet.SelectCoinsMinConf( 1 *
CENT, 1, 6,
vCoins, setCoinsRet, nValueRet));
86 BOOST_CHECK(!
wallet.SelectCoinsMinConf( 1 *
CENT, 1, 6,
vCoins, setCoinsRet, nValueRet));
89 BOOST_CHECK(
wallet.SelectCoinsMinConf( 1 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
90 BOOST_CHECK_EQUAL(nValueRet, 1 *
CENT);
95 BOOST_CHECK(!
wallet.SelectCoinsMinConf( 3 *
CENT, 1, 6,
vCoins, setCoinsRet, nValueRet));
98 BOOST_CHECK(
wallet.SelectCoinsMinConf( 3 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
99 BOOST_CHECK_EQUAL(nValueRet, 3 *
CENT);
108 BOOST_CHECK(!
wallet.SelectCoinsMinConf(38 *
CENT, 1, 6,
vCoins, setCoinsRet, nValueRet));
110 BOOST_CHECK(!
wallet.SelectCoinsMinConf(38 *
CENT, 6, 6,
vCoins, setCoinsRet, nValueRet));
112 BOOST_CHECK(
wallet.SelectCoinsMinConf(37 *
CENT, 1, 6,
vCoins, setCoinsRet, nValueRet));
113 BOOST_CHECK_EQUAL(nValueRet, 37 *
CENT);
115 BOOST_CHECK(
wallet.SelectCoinsMinConf(38 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
116 BOOST_CHECK_EQUAL(nValueRet, 38 *
CENT);
119 BOOST_CHECK(
wallet.SelectCoinsMinConf(34 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
120 BOOST_CHECK_EQUAL(nValueRet, 35 *
CENT);
121 BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U);
124 BOOST_CHECK(
wallet.SelectCoinsMinConf( 7 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
125 BOOST_CHECK_EQUAL(nValueRet, 7 *
CENT);
126 BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U);
129 BOOST_CHECK(
wallet.SelectCoinsMinConf( 8 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
130 BOOST_CHECK(nValueRet == 8 *
CENT);
131 BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U);
134 BOOST_CHECK(
wallet.SelectCoinsMinConf( 9 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
135 BOOST_CHECK_EQUAL(nValueRet, 10 *
CENT);
136 BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U);
148 BOOST_CHECK(
wallet.SelectCoinsMinConf(71 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
149 BOOST_CHECK(!
wallet.SelectCoinsMinConf(72 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
152 BOOST_CHECK(
wallet.SelectCoinsMinConf(16 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
153 BOOST_CHECK_EQUAL(nValueRet, 20 *
CENT);
154 BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U);
159 BOOST_CHECK(
wallet.SelectCoinsMinConf(16 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
160 BOOST_CHECK_EQUAL(nValueRet, 18 *
CENT);
161 BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U);
166 BOOST_CHECK(
wallet.SelectCoinsMinConf(16 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
167 BOOST_CHECK_EQUAL(nValueRet, 18 *
CENT);
168 BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U);
171 BOOST_CHECK(
wallet.SelectCoinsMinConf(11 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
172 BOOST_CHECK_EQUAL(nValueRet, 11 *
CENT);
173 BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U);
180 BOOST_CHECK(
wallet.SelectCoinsMinConf(95 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
181 BOOST_CHECK_EQUAL(nValueRet, 1 *
COIN);
182 BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U);
184 BOOST_CHECK(
wallet.SelectCoinsMinConf(195 *
CENT, 1, 1,
vCoins, setCoinsRet, nValueRet));
185 BOOST_CHECK_EQUAL(nValueRet, 2 *
COIN);
186 BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U);
220 for (
int i = 0; i < 20; i++)
223 BOOST_CHECK(
wallet.SelectCoinsMinConf(500000 *
COIN, 1, 1,
vCoins, setCoinsRet, nValueRet));
224 BOOST_CHECK_EQUAL(nValueRet, 500000 *
COIN);
225 BOOST_CHECK_EQUAL(setCoinsRet.size(), 10U);
237 BOOST_CHECK_EQUAL(nValueRet, 1111 *
MIN_CHANGE);
238 BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U);
248 BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U);
258 BOOST_CHECK_EQUAL(nValueRet, 101.05 *
MIN_CHANGE);
259 BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U);
263 BOOST_CHECK_EQUAL(nValueRet, 101 *
MIN_CHANGE);
264 BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U);
270 for (uint16_t j = 0; j < 676; j++)
272 BOOST_CHECK(
wallet.SelectCoinsMinConf(2000, 1, 1,
vCoins, setCoinsRet, nValueRet));
275 uint16_t returnSize = std::ceil((2000.0 +
MIN_CHANGE)/amt);
276 CAmount returnValue = amt * returnSize;
277 BOOST_CHECK_EQUAL(nValueRet, returnValue);
278 BOOST_CHECK_EQUAL(setCoinsRet.size(), returnSize);
281 BOOST_CHECK_EQUAL(nValueRet, amt);
282 BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U);
289 for (
int i2 = 0; i2 < 100; i2++)
294 BOOST_CHECK(
wallet.SelectCoinsMinConf(50 *
COIN, 1, 6,
vCoins, setCoinsRet , nValueRet));
295 BOOST_CHECK(
wallet.SelectCoinsMinConf(50 *
COIN, 1, 6,
vCoins, setCoinsRet2, nValueRet));
296 BOOST_CHECK(!
equal_sets(setCoinsRet, setCoinsRet2));
303 BOOST_CHECK(
wallet.SelectCoinsMinConf(
COIN, 1, 6,
vCoins, setCoinsRet , nValueRet));
304 BOOST_CHECK(
wallet.SelectCoinsMinConf(
COIN, 1, 6,
vCoins, setCoinsRet2, nValueRet));
320 BOOST_CHECK(
wallet.SelectCoinsMinConf(90*
CENT, 1, 6,
vCoins, setCoinsRet , nValueRet));
321 BOOST_CHECK(
wallet.SelectCoinsMinConf(90*
CENT, 1, 6,
vCoins, setCoinsRet2, nValueRet));
341 for (
int i = 0; i < 1000; i++)
345 BOOST_CHECK(
wallet.SelectCoinsMinConf(1003 *
COIN, 1, 6,
vCoins, setCoinsRet, nValueRet));
346 BOOST_CHECK_EQUAL(nValueRet, 1003 *
COIN);
347 BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U);
352 for (
int i = 0; i < 100; i++)
354 for (
int i = 0; i < 100; i++)
357 BOOST_CHECK(
wallet.SelectCoinsMinConf(100001 *
COIN, 1, 6,
vCoins, setCoinsRet, nValueRet));
360 BOOST_CHECK_EQUAL(nValueRet, 100010 *
COIN);
361 BOOST_CHECK_EQUAL(setCoinsRet.size(), 101);
364 BOOST_AUTO_TEST_SUITE_END()
static const CAmount COIN
set< pair< const CWalletTx *, unsigned int > > CoinSet
bool fDebitCached
position in ordered transaction list
static void add_coin(const CAmount &nValue, int nAge=6 *24, bool fIsFromMe=false, int nInput=0)
static void ApproximateBestSubset(vector< pair< CAmount, pair< const CWalletTx *, unsigned int > > >vValue, const CAmount &nTotalLower, const CAmount &nTargetValue, vector< char > &vfBest, CAmount &nBest, int iterations=1000, bool fUseInstantSend=false)
static const CAmount MIN_CHANGE
minimum change amount
BOOST_AUTO_TEST_CASE(coin_selection_tests)
static const CAmount CENT
std::vector< CTxOut > vout
static vector< COutput > vCoins
static bool equal_sets(CoinSet a, CoinSet b)
static void empty_wallet(void)