@ -78,24 +78,24 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
empty_wallet ( ) ;
empty_wallet ( ) ;
// with an empty wallet we can't even pay one cent
// with an empty wallet we can't even pay one cent
BOOST_CHECK ( ! wallet . SelectCoinsMinConf ( 1 * CENT , 1 , 6 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( ! wallet . SelectCoinsMinConf ( 1 * CENT , 1 , 6 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
add_coin ( 1 * CENT , 4 ) ; // add a new 1 cent coin
add_coin ( 1 * CENT , 4 ) ; // add a new 1 cent coin
// with a new 1 cent coin, we still can't find a mature 1 cent
// with a new 1 cent coin, we still can't find a mature 1 cent
BOOST_CHECK ( ! wallet . SelectCoinsMinConf ( 1 * CENT , 1 , 6 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( ! wallet . SelectCoinsMinConf ( 1 * CENT , 1 , 6 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
// but we can find a new 1 cent
// but we can find a new 1 cent
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 1 * CENT , 1 , 1 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 1 * CENT , 1 , 1 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , 1 * CENT ) ;
BOOST_CHECK_EQUAL ( nValueRet , 1 * CENT ) ;
add_coin ( 2 * CENT ) ; // add a mature 2 cent coin
add_coin ( 2 * CENT ) ; // add a mature 2 cent coin
// we can't make 3 cents of mature coins
// we can't make 3 cents of mature coins
BOOST_CHECK ( ! wallet . SelectCoinsMinConf ( 3 * CENT , 1 , 6 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( ! wallet . SelectCoinsMinConf ( 3 * CENT , 1 , 6 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
// we can make 3 cents of new coins
// we can make 3 cents of new coins
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 3 * CENT , 1 , 1 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 3 * CENT , 1 , 1 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , 3 * CENT ) ;
BOOST_CHECK_EQUAL ( nValueRet , 3 * CENT ) ;
add_coin ( 5 * CENT ) ; // add a mature 5 cent coin,
add_coin ( 5 * CENT ) ; // add a mature 5 cent coin,
@ -105,33 +105,33 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
// now we have new: 1+10=11 (of which 10 was self-sent), and mature: 2+5+20=27. total = 38
// now we have new: 1+10=11 (of which 10 was self-sent), and mature: 2+5+20=27. total = 38
// we can't make 38 cents only if we disallow new coins:
// we can't make 38 cents only if we disallow new coins:
BOOST_CHECK ( ! wallet . SelectCoinsMinConf ( 38 * CENT , 1 , 6 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( ! wallet . SelectCoinsMinConf ( 38 * CENT , 1 , 6 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
// we can't even make 37 cents if we don't allow new coins even if they're from us
// we can't even make 37 cents if we don't allow new coins even if they're from us
BOOST_CHECK ( ! wallet . SelectCoinsMinConf ( 38 * CENT , 6 , 6 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( ! wallet . SelectCoinsMinConf ( 38 * CENT , 6 , 6 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
// but we can make 37 cents if we accept new coins from ourself
// but we can make 37 cents if we accept new coins from ourself
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 37 * CENT , 1 , 6 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 37 * CENT , 1 , 6 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , 37 * CENT ) ;
BOOST_CHECK_EQUAL ( nValueRet , 37 * CENT ) ;
// and we can make 38 cents if we accept all new coins
// and we can make 38 cents if we accept all new coins
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 38 * CENT , 1 , 1 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 38 * CENT , 1 , 1 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , 38 * CENT ) ;
BOOST_CHECK_EQUAL ( nValueRet , 38 * CENT ) ;
// 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 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , 35 * CENT ) ; // but 35 cents is closest
BOOST_CHECK_EQUAL ( nValueRet , 35 * CENT ) ; // but 35 cents is closest
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)
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 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , 7 * CENT ) ;
BOOST_CHECK_EQUAL ( nValueRet , 7 * CENT ) ;
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 2U ) ;
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 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( nValueRet = = 8 * CENT ) ;
BOOST_CHECK ( nValueRet = = 8 * CENT ) ;
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 3U ) ;
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 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , 10 * CENT ) ;
BOOST_CHECK_EQUAL ( nValueRet , 10 * CENT ) ;
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 1U ) ;
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 1U ) ;
@ -145,30 +145,30 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
add_coin ( 30 * CENT ) ; // now we have 6+7+8+20+30 = 71 cents total
add_coin ( 30 * CENT ) ; // now we have 6+7+8+20+30 = 71 cents total
// check that we have 71 and not 72
// check that we have 71 and not 72
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 71 * CENT , 1 , 1 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 71 * CENT , 1 , 1 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( ! wallet . SelectCoinsMinConf ( 72 * CENT , 1 , 1 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( ! wallet . SelectCoinsMinConf ( 72 * CENT , 1 , 1 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
// 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 , 0 , 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 ( ) , 1U ) ;
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 , 0 , 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 ( ) , 3U ) ;
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 , 0 , 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 ( ) , 1U ) ; // 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 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , 11 * CENT ) ;
BOOST_CHECK_EQUAL ( nValueRet , 11 * CENT ) ;
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 2U ) ;
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 2U ) ;
@ -177,11 +177,11 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
add_coin ( 2 * COIN ) ;
add_coin ( 2 * COIN ) ;
add_coin ( 3 * COIN ) ;
add_coin ( 3 * COIN ) ;
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 , 0 , 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 ( ) , 1U ) ;
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 , 0 , 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 ( ) , 1U ) ;
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 1U ) ;
@ -196,14 +196,14 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
// try making 1 * MIN_CHANGE from the 1.5 * MIN_CHANGE
// try making 1 * MIN_CHANGE from the 1.5 * MIN_CHANGE
// we'll get change smaller than MIN_CHANGE whatever happens, so can expect MIN_CHANGE exactly
// we'll get change smaller than MIN_CHANGE whatever happens, so can expect MIN_CHANGE exactly
BOOST_CHECK ( wallet . SelectCoinsMinConf ( MIN_CHANGE , 1 , 1 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( MIN_CHANGE , 1 , 1 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , MIN_CHANGE ) ;
BOOST_CHECK_EQUAL ( nValueRet , MIN_CHANGE ) ;
// but if we add a bigger coin, small change is avoided
// but if we add a bigger coin, small change is avoided
add_coin ( 1111 * MIN_CHANGE ) ;
add_coin ( 1111 * MIN_CHANGE ) ;
// try making 1 from 0.1 + 0.2 + 0.3 + 0.4 + 0.5 + 1111 = 1112.5
// try making 1 from 0.1 + 0.2 + 0.3 + 0.4 + 0.5 + 1111 = 1112.5
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 1 * MIN_CHANGE , 1 , 1 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 1 * MIN_CHANGE , 1 , 1 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , 1 * MIN_CHANGE ) ; // we should get the exact amount
BOOST_CHECK_EQUAL ( nValueRet , 1 * MIN_CHANGE ) ; // we should get the exact amount
// if we add more small coins:
// if we add more small coins:
@ -211,7 +211,7 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
add_coin ( MIN_CHANGE * 7 / 10 ) ;
add_coin ( MIN_CHANGE * 7 / 10 ) ;
// and try again to make 1.0 * MIN_CHANGE
// and try again to make 1.0 * MIN_CHANGE
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 1 * MIN_CHANGE , 1 , 1 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 1 * MIN_CHANGE , 1 , 1 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , 1 * MIN_CHANGE ) ; // we should get the exact amount
BOOST_CHECK_EQUAL ( nValueRet , 1 * MIN_CHANGE ) ; // we should get the exact amount
// run the 'mtgox' test (see http://blockexplorer.com/tx/29a3efd3ef04f9153d47a990bd7b048a4b2d213daaa5fb8ed670fb85f13bdbcf)
// run the 'mtgox' test (see http://blockexplorer.com/tx/29a3efd3ef04f9153d47a990bd7b048a4b2d213daaa5fb8ed670fb85f13bdbcf)
@ -220,7 +220,7 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
for ( int j = 0 ; j < 20 ; j + + )
for ( int j = 0 ; j < 20 ; j + + )
add_coin ( 50000 * COIN ) ;
add_coin ( 50000 * COIN ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 500000 * COIN , 1 , 1 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 500000 * COIN , 1 , 1 , 0 , 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 ( ) , 10U ) ; // in ten coins
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 10U ) ; // in ten coins
@ -233,7 +233,7 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
add_coin ( MIN_CHANGE * 6 / 10 ) ;
add_coin ( MIN_CHANGE * 6 / 10 ) ;
add_coin ( MIN_CHANGE * 7 / 10 ) ;
add_coin ( MIN_CHANGE * 7 / 10 ) ;
add_coin ( 1111 * MIN_CHANGE ) ;
add_coin ( 1111 * MIN_CHANGE ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 1 * MIN_CHANGE , 1 , 1 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 1 * MIN_CHANGE , 1 , 1 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , 1111 * MIN_CHANGE ) ; // we get the bigger coin
BOOST_CHECK_EQUAL ( nValueRet , 1111 * MIN_CHANGE ) ; // we get the bigger coin
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 1U ) ;
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 1U ) ;
@ -243,7 +243,7 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
add_coin ( MIN_CHANGE * 6 / 10 ) ;
add_coin ( MIN_CHANGE * 6 / 10 ) ;
add_coin ( MIN_CHANGE * 8 / 10 ) ;
add_coin ( MIN_CHANGE * 8 / 10 ) ;
add_coin ( 1111 * MIN_CHANGE ) ;
add_coin ( 1111 * MIN_CHANGE ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( MIN_CHANGE , 1 , 1 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( MIN_CHANGE , 1 , 1 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , MIN_CHANGE ) ; // we should get the exact amount
BOOST_CHECK_EQUAL ( nValueRet , MIN_CHANGE ) ; // we should get the exact amount
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 2U ) ; // in two coins 0.4+0.6
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 2U ) ; // in two coins 0.4+0.6
@ -254,12 +254,12 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
add_coin ( MIN_CHANGE * 100 ) ;
add_coin ( MIN_CHANGE * 100 ) ;
// trying to make 100.01 from these three coins
// trying to make 100.01 from these three coins
BOOST_CHECK ( wallet . SelectCoinsMinConf ( MIN_CHANGE * 10001 / 100 , 1 , 1 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( MIN_CHANGE * 10001 / 100 , 1 , 1 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , MIN_CHANGE * 10105 / 100 ) ; // we should get all coins
BOOST_CHECK_EQUAL ( nValueRet , MIN_CHANGE * 10105 / 100 ) ; // we should get all coins
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 3U ) ;
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 3U ) ;
// but if we try to make 99.9, we should take the bigger of the two small coins to avoid small change
// but if we try to make 99.9, we should take the bigger of the two small coins to avoid small change
BOOST_CHECK ( wallet . SelectCoinsMinConf ( MIN_CHANGE * 9990 / 100 , 1 , 1 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( MIN_CHANGE * 9990 / 100 , 1 , 1 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , 101 * MIN_CHANGE ) ;
BOOST_CHECK_EQUAL ( nValueRet , 101 * MIN_CHANGE ) ;
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 2U ) ;
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 2U ) ;
@ -269,7 +269,7 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
// Create 676 inputs (= (old MAX_STANDARD_TX_SIZE == 100000) / 148 bytes per input)
// Create 676 inputs (= (old MAX_STANDARD_TX_SIZE == 100000) / 148 bytes per input)
for ( uint16_t j = 0 ; j < 676 ; j + + )
for ( uint16_t j = 0 ; j < 676 ; j + + )
add_coin ( amt ) ;
add_coin ( amt ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 2000 , 1 , 1 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 2000 , 1 , 1 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
if ( amt - 2000 < MIN_CHANGE ) {
if ( amt - 2000 < MIN_CHANGE ) {
// needs more than one input:
// needs more than one input:
uint16_t returnSize = std : : ceil ( ( 2000.0 + MIN_CHANGE ) / amt ) ;
uint16_t returnSize = std : : ceil ( ( 2000.0 + MIN_CHANGE ) / amt ) ;
@ -291,8 +291,8 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
// picking 50 from 100 coins doesn't depend on the shuffle,
// picking 50 from 100 coins doesn't depend on the shuffle,
// but does depend on randomness in the stochastic approximation code
// but does depend on randomness in the stochastic approximation code
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 50 * COIN , 1 , 6 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 50 * COIN , 1 , 6 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 50 * COIN , 1 , 6 , vCoins , setCoinsRet2 , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 50 * COIN , 1 , 6 , 0 , vCoins , setCoinsRet2 , nValueRet ) ) ;
BOOST_CHECK ( ! equal_sets ( setCoinsRet , setCoinsRet2 ) ) ;
BOOST_CHECK ( ! equal_sets ( setCoinsRet , setCoinsRet2 ) ) ;
int fails = 0 ;
int fails = 0 ;
@ -300,8 +300,8 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
{
{
// selecting 1 from 100 identical coins depends on the shuffle; this test will fail 1% of the time
// selecting 1 from 100 identical coins depends on the shuffle; this test will fail 1% of the time
// run the test RANDOM_REPEATS times and only complain if all of them fail
// run the test RANDOM_REPEATS times and only complain if all of them fail
BOOST_CHECK ( wallet . SelectCoinsMinConf ( COIN , 1 , 6 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( COIN , 1 , 6 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( COIN , 1 , 6 , vCoins , setCoinsRet2 , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( COIN , 1 , 6 , 0 , vCoins , setCoinsRet2 , nValueRet ) ) ;
if ( equal_sets ( setCoinsRet , setCoinsRet2 ) )
if ( equal_sets ( setCoinsRet , setCoinsRet2 ) )
fails + + ;
fails + + ;
}
}
@ -321,8 +321,8 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
{
{
// selecting 1 from 100 identical coins depends on the shuffle; this test will fail 1% of the time
// selecting 1 from 100 identical coins depends on the shuffle; this test will fail 1% of the time
// run the test RANDOM_REPEATS times and only complain if all of them fail
// run the test RANDOM_REPEATS times and only complain if all of them fail
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 90 * CENT , 1 , 6 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 90 * CENT , 1 , 6 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 90 * CENT , 1 , 6 , vCoins , setCoinsRet2 , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 90 * CENT , 1 , 6 , 0 , vCoins , setCoinsRet2 , nValueRet ) ) ;
if ( equal_sets ( setCoinsRet , setCoinsRet2 ) )
if ( equal_sets ( setCoinsRet , setCoinsRet2 ) )
fails + + ;
fails + + ;
}
}
@ -346,7 +346,7 @@ BOOST_AUTO_TEST_CASE(ApproximateBestSubset)
add_coin ( 1000 * COIN ) ;
add_coin ( 1000 * COIN ) ;
add_coin ( 3 * COIN ) ;
add_coin ( 3 * COIN ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 1003 * COIN , 1 , 6 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK ( wallet . SelectCoinsMinConf ( 1003 * COIN , 1 , 6 , 0 , vCoins , setCoinsRet , nValueRet ) ) ;
BOOST_CHECK_EQUAL ( nValueRet , 1003 * COIN ) ;
BOOST_CHECK_EQUAL ( nValueRet , 1003 * COIN ) ;
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 2U ) ;
BOOST_CHECK_EQUAL ( setCoinsRet . size ( ) , 2U ) ;
}
}