|
|
@ -104,22 +104,22 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests) |
|
|
|
// try making 34 cents from 1,2,5,10,20 - we can't do it exactly
|
|
|
|
// try making 34 cents from 1,2,5,10,20 - we can't do it exactly
|
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(34 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(34 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK_GT(nValueRet, 34 * CENT); // but should get more than 34 cents
|
|
|
|
BOOST_CHECK_GT(nValueRet, 34 * CENT); // but should get more than 34 cents
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 3); // the best should be 20+10+5. it's incredibly unlikely the 1 or 2 got included (but possible)
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U); // the best should be 20+10+5. it's incredibly unlikely the 1 or 2 got included (but possible)
|
|
|
|
|
|
|
|
|
|
|
|
// when we try making 7 cents, the smaller coins (1,2,5) are enough. We should see just 2+5
|
|
|
|
// when we try making 7 cents, the smaller coins (1,2,5) are enough. We should see just 2+5
|
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf( 7 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf( 7 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 7 * CENT); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 7 * CENT); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 2); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U); |
|
|
|
|
|
|
|
|
|
|
|
// when we try making 8 cents, the smaller coins (1,2,5) are exactly enough.
|
|
|
|
// when we try making 8 cents, the smaller coins (1,2,5) are exactly enough.
|
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf( 8 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf( 8 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK(nValueRet == 8 * CENT); |
|
|
|
BOOST_CHECK(nValueRet == 8 * CENT); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 3); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U); |
|
|
|
|
|
|
|
|
|
|
|
// when we try making 9 cents, no subset of smaller coins is enough, and we get the next bigger coin (10)
|
|
|
|
// when we try making 9 cents, no subset of smaller coins is enough, and we get the next bigger coin (10)
|
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf( 9 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf( 9 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 10 * CENT); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 10 * CENT); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 1); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U); |
|
|
|
|
|
|
|
|
|
|
|
// now clear out the wallet and start again to test choosing between subsets of smaller coins and the next biggest coin
|
|
|
|
// now clear out the wallet and start again to test choosing between subsets of smaller coins and the next biggest coin
|
|
|
|
empty_wallet(); |
|
|
|
empty_wallet(); |
|
|
@ -137,26 +137,26 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests) |
|
|
|
// now try making 16 cents. the best smaller coins can do is 6+7+8 = 21; not as good at the next biggest coin, 20
|
|
|
|
// now try making 16 cents. the best smaller coins can do is 6+7+8 = 21; not as good at the next biggest coin, 20
|
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(16 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(16 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 20 * CENT); // we should get 20 in one coin
|
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 20 * CENT); // we should get 20 in one coin
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 1); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U); |
|
|
|
|
|
|
|
|
|
|
|
add_coin( 5*CENT); // now we have 5+6+7+8+20+30 = 75 cents total
|
|
|
|
add_coin( 5*CENT); // now we have 5+6+7+8+20+30 = 75 cents total
|
|
|
|
|
|
|
|
|
|
|
|
// now if we try making 16 cents again, the smaller coins can make 5+6+7 = 18 cents, better than the next biggest coin, 20
|
|
|
|
// now if we try making 16 cents again, the smaller coins can make 5+6+7 = 18 cents, better than the next biggest coin, 20
|
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(16 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(16 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 18 * CENT); // we should get 18 in 3 coins
|
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 18 * CENT); // we should get 18 in 3 coins
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 3); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U); |
|
|
|
|
|
|
|
|
|
|
|
add_coin( 18*CENT); // now we have 5+6+7+8+18+20+30
|
|
|
|
add_coin( 18*CENT); // now we have 5+6+7+8+18+20+30
|
|
|
|
|
|
|
|
|
|
|
|
// and now if we try making 16 cents again, the smaller coins can make 5+6+7 = 18 cents, the same as the next biggest coin, 18
|
|
|
|
// and now if we try making 16 cents again, the smaller coins can make 5+6+7 = 18 cents, the same as the next biggest coin, 18
|
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(16 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(16 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 18 * CENT); // we should get 18 in 1 coin
|
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 18 * CENT); // we should get 18 in 1 coin
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 1); // because in the event of a tie, the biggest coin wins
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U); // because in the event of a tie, the biggest coin wins
|
|
|
|
|
|
|
|
|
|
|
|
// now try making 11 cents. we should get 5+6
|
|
|
|
// now try making 11 cents. we should get 5+6
|
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(11 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(11 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 11 * CENT); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 11 * CENT); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 2); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U); |
|
|
|
|
|
|
|
|
|
|
|
// check that the smallest bigger coin is used
|
|
|
|
// check that the smallest bigger coin is used
|
|
|
|
add_coin( 1*COIN); |
|
|
|
add_coin( 1*COIN); |
|
|
@ -165,11 +165,11 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests) |
|
|
|
add_coin( 4*COIN); // now we have 5+6+7+8+18+20+30+100+200+300+400 = 1094 cents
|
|
|
|
add_coin( 4*COIN); // now we have 5+6+7+8+18+20+30+100+200+300+400 = 1094 cents
|
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(95 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(95 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 1 * COIN); // we should get 1 BTC in 1 coin
|
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 1 * COIN); // we should get 1 BTC in 1 coin
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 1); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U); |
|
|
|
|
|
|
|
|
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(195 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(195 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 2 * COIN); // we should get 2 BTC in 1 coin
|
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 2 * COIN); // we should get 2 BTC in 1 coin
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 1); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U); |
|
|
|
|
|
|
|
|
|
|
|
// empty the wallet and start again, now with fractions of a cent, to test sub-cent change avoidance
|
|
|
|
// empty the wallet and start again, now with fractions of a cent, to test sub-cent change avoidance
|
|
|
|
empty_wallet(); |
|
|
|
empty_wallet(); |
|
|
@ -207,7 +207,7 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests) |
|
|
|
|
|
|
|
|
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(500000 * COIN, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(500000 * COIN, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 500000 * COIN); // we should get the exact amount
|
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 500000 * COIN); // we should get the exact amount
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 10); // in ten coins
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 10U); // in ten coins
|
|
|
|
|
|
|
|
|
|
|
|
// if there's not enough in the smaller coins to make at least 1 cent change (0.5+0.6+0.7 < 1.0+1.0),
|
|
|
|
// if there's not enough in the smaller coins to make at least 1 cent change (0.5+0.6+0.7 < 1.0+1.0),
|
|
|
|
// we need to try finding an exact subset anyway
|
|
|
|
// we need to try finding an exact subset anyway
|
|
|
@ -220,7 +220,7 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests) |
|
|
|
add_coin(1111 * CENT); |
|
|
|
add_coin(1111 * CENT); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(1 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(1 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 1111 * CENT); // we get the bigger coin
|
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 1111 * CENT); // we get the bigger coin
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 1); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U); |
|
|
|
|
|
|
|
|
|
|
|
// but sometimes it's possible, and we use an exact subset (0.4 + 0.6 = 1.0)
|
|
|
|
// but sometimes it's possible, and we use an exact subset (0.4 + 0.6 = 1.0)
|
|
|
|
empty_wallet(); |
|
|
|
empty_wallet(); |
|
|
@ -230,7 +230,7 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests) |
|
|
|
add_coin(1111 * CENT); |
|
|
|
add_coin(1111 * CENT); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(1 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(1 * CENT, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 1 * CENT); // we should get the exact amount
|
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 1 * CENT); // we should get the exact amount
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 2); // in two coins 0.4+0.6
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U); // in two coins 0.4+0.6
|
|
|
|
|
|
|
|
|
|
|
|
// test avoiding sub-cent change
|
|
|
|
// test avoiding sub-cent change
|
|
|
|
empty_wallet(); |
|
|
|
empty_wallet(); |
|
|
@ -241,12 +241,12 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests) |
|
|
|
// trying to make 1.0001 from these three coins
|
|
|
|
// trying to make 1.0001 from these three coins
|
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(1.0001 * COIN, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(1.0001 * COIN, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 1.0105 * COIN); // we should get all coins
|
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 1.0105 * COIN); // we should get all coins
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 3); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U); |
|
|
|
|
|
|
|
|
|
|
|
// but if we try to make 0.999, we should take the bigger of the two small coins to avoid sub-cent change
|
|
|
|
// but if we try to make 0.999, we should take the bigger of the two small coins to avoid sub-cent change
|
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(0.999 * COIN, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK( wallet.SelectCoinsMinConf(0.999 * COIN, 1, 1, vCoins, setCoinsRet, nValueRet)); |
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 1.01 * COIN); // we should get 1 + 0.01
|
|
|
|
BOOST_CHECK_EQUAL(nValueRet, 1.01 * COIN); // we should get 1 + 0.01
|
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 2); |
|
|
|
BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U); |
|
|
|
|
|
|
|
|
|
|
|
// test randomness
|
|
|
|
// test randomness
|
|
|
|
{ |
|
|
|
{ |
|
|
|