@@ -78,24 +78,24 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
78
78
empty_wallet ();
79
79
80
80
// with an empty wallet we can't even pay one cent
81
- BOOST_CHECK (!wallet.SelectCoinsMinConf ( 1 * CENT, 1 , 6 , vCoins, setCoinsRet, nValueRet));
81
+ BOOST_CHECK (!wallet.SelectCoinsMinConf ( 1 * CENT, 1 , 6 , 0 , vCoins, setCoinsRet, nValueRet));
82
82
83
83
add_coin (1 *CENT, 4 ); // add a new 1 cent coin
84
84
85
85
// with a new 1 cent coin, we still can't find a mature 1 cent
86
- BOOST_CHECK (!wallet.SelectCoinsMinConf ( 1 * CENT, 1 , 6 , vCoins, setCoinsRet, nValueRet));
86
+ BOOST_CHECK (!wallet.SelectCoinsMinConf ( 1 * CENT, 1 , 6 , 0 , vCoins, setCoinsRet, nValueRet));
87
87
88
88
// but we can find a new 1 cent
89
- BOOST_CHECK ( wallet.SelectCoinsMinConf ( 1 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
89
+ BOOST_CHECK ( wallet.SelectCoinsMinConf ( 1 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
90
90
BOOST_CHECK_EQUAL (nValueRet, 1 * CENT);
91
91
92
92
add_coin (2 *CENT); // add a mature 2 cent coin
93
93
94
94
// we can't make 3 cents of mature coins
95
- BOOST_CHECK (!wallet.SelectCoinsMinConf ( 3 * CENT, 1 , 6 , vCoins, setCoinsRet, nValueRet));
95
+ BOOST_CHECK (!wallet.SelectCoinsMinConf ( 3 * CENT, 1 , 6 , 0 , vCoins, setCoinsRet, nValueRet));
96
96
97
97
// we can make 3 cents of new coins
98
- BOOST_CHECK ( wallet.SelectCoinsMinConf ( 3 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
98
+ BOOST_CHECK ( wallet.SelectCoinsMinConf ( 3 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
99
99
BOOST_CHECK_EQUAL (nValueRet, 3 * CENT);
100
100
101
101
add_coin (5 *CENT); // add a mature 5 cent coin,
@@ -105,33 +105,33 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
105
105
// now we have new: 1+10=11 (of which 10 was self-sent), and mature: 2+5+20=27. total = 38
106
106
107
107
// we can't make 38 cents only if we disallow new coins:
108
- BOOST_CHECK (!wallet.SelectCoinsMinConf (38 * CENT, 1 , 6 , vCoins, setCoinsRet, nValueRet));
108
+ BOOST_CHECK (!wallet.SelectCoinsMinConf (38 * CENT, 1 , 6 , 0 , vCoins, setCoinsRet, nValueRet));
109
109
// we can't even make 37 cents if we don't allow new coins even if they're from us
110
- BOOST_CHECK (!wallet.SelectCoinsMinConf (38 * CENT, 6 , 6 , vCoins, setCoinsRet, nValueRet));
110
+ BOOST_CHECK (!wallet.SelectCoinsMinConf (38 * CENT, 6 , 6 , 0 , vCoins, setCoinsRet, nValueRet));
111
111
// but we can make 37 cents if we accept new coins from ourself
112
- BOOST_CHECK ( wallet.SelectCoinsMinConf (37 * CENT, 1 , 6 , vCoins, setCoinsRet, nValueRet));
112
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (37 * CENT, 1 , 6 , 0 , vCoins, setCoinsRet, nValueRet));
113
113
BOOST_CHECK_EQUAL (nValueRet, 37 * CENT);
114
114
// and we can make 38 cents if we accept all new coins
115
- BOOST_CHECK ( wallet.SelectCoinsMinConf (38 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
115
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (38 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
116
116
BOOST_CHECK_EQUAL (nValueRet, 38 * CENT);
117
117
118
118
// try making 34 cents from 1,2,5,10,20 - we can't do it exactly
119
- BOOST_CHECK ( wallet.SelectCoinsMinConf (34 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
119
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (34 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
120
120
BOOST_CHECK_EQUAL (nValueRet, 35 * CENT); // but 35 cents is closest
121
121
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)
122
122
123
123
// when we try making 7 cents, the smaller coins (1,2,5) are enough. We should see just 2+5
124
- BOOST_CHECK ( wallet.SelectCoinsMinConf ( 7 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
124
+ BOOST_CHECK ( wallet.SelectCoinsMinConf ( 7 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
125
125
BOOST_CHECK_EQUAL (nValueRet, 7 * CENT);
126
126
BOOST_CHECK_EQUAL (setCoinsRet.size (), 2U );
127
127
128
128
// when we try making 8 cents, the smaller coins (1,2,5) are exactly enough.
129
- BOOST_CHECK ( wallet.SelectCoinsMinConf ( 8 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
129
+ BOOST_CHECK ( wallet.SelectCoinsMinConf ( 8 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
130
130
BOOST_CHECK (nValueRet == 8 * CENT);
131
131
BOOST_CHECK_EQUAL (setCoinsRet.size (), 3U );
132
132
133
133
// when we try making 9 cents, no subset of smaller coins is enough, and we get the next bigger coin (10)
134
- BOOST_CHECK ( wallet.SelectCoinsMinConf ( 9 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
134
+ BOOST_CHECK ( wallet.SelectCoinsMinConf ( 9 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
135
135
BOOST_CHECK_EQUAL (nValueRet, 10 * CENT);
136
136
BOOST_CHECK_EQUAL (setCoinsRet.size (), 1U );
137
137
@@ -145,30 +145,30 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
145
145
add_coin (30 *CENT); // now we have 6+7+8+20+30 = 71 cents total
146
146
147
147
// check that we have 71 and not 72
148
- BOOST_CHECK ( wallet.SelectCoinsMinConf (71 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
149
- BOOST_CHECK (!wallet.SelectCoinsMinConf (72 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
148
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (71 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
149
+ BOOST_CHECK (!wallet.SelectCoinsMinConf (72 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
150
150
151
151
// 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
152
- BOOST_CHECK ( wallet.SelectCoinsMinConf (16 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
152
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (16 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
153
153
BOOST_CHECK_EQUAL (nValueRet, 20 * CENT); // we should get 20 in one coin
154
154
BOOST_CHECK_EQUAL (setCoinsRet.size (), 1U );
155
155
156
156
add_coin ( 5 *CENT); // now we have 5+6+7+8+20+30 = 75 cents total
157
157
158
158
// 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
159
- BOOST_CHECK ( wallet.SelectCoinsMinConf (16 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
159
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (16 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
160
160
BOOST_CHECK_EQUAL (nValueRet, 18 * CENT); // we should get 18 in 3 coins
161
161
BOOST_CHECK_EQUAL (setCoinsRet.size (), 3U );
162
162
163
163
add_coin ( 18 *CENT); // now we have 5+6+7+8+18+20+30
164
164
165
165
// 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
166
- BOOST_CHECK ( wallet.SelectCoinsMinConf (16 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
166
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (16 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
167
167
BOOST_CHECK_EQUAL (nValueRet, 18 * CENT); // we should get 18 in 1 coin
168
168
BOOST_CHECK_EQUAL (setCoinsRet.size (), 1U ); // because in the event of a tie, the biggest coin wins
169
169
170
170
// now try making 11 cents. we should get 5+6
171
- BOOST_CHECK ( wallet.SelectCoinsMinConf (11 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
171
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (11 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
172
172
BOOST_CHECK_EQUAL (nValueRet, 11 * CENT);
173
173
BOOST_CHECK_EQUAL (setCoinsRet.size (), 2U );
174
174
@@ -177,11 +177,11 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
177
177
add_coin ( 2 *COIN);
178
178
add_coin ( 3 *COIN);
179
179
add_coin ( 4 *COIN); // now we have 5+6+7+8+18+20+30+100+200+300+400 = 1094 cents
180
- BOOST_CHECK ( wallet.SelectCoinsMinConf (95 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
180
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (95 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
181
181
BOOST_CHECK_EQUAL (nValueRet, 1 * COIN); // we should get 1 BTC in 1 coin
182
182
BOOST_CHECK_EQUAL (setCoinsRet.size (), 1U );
183
183
184
- BOOST_CHECK ( wallet.SelectCoinsMinConf (195 * CENT, 1 , 1 , vCoins, setCoinsRet, nValueRet));
184
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (195 * CENT, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
185
185
BOOST_CHECK_EQUAL (nValueRet, 2 * COIN); // we should get 2 BTC in 1 coin
186
186
BOOST_CHECK_EQUAL (setCoinsRet.size (), 1U );
187
187
@@ -196,22 +196,22 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
196
196
197
197
// try making 1 * MIN_CHANGE from the 1.5 * MIN_CHANGE
198
198
// we'll get change smaller than MIN_CHANGE whatever happens, so can expect MIN_CHANGE exactly
199
- BOOST_CHECK ( wallet.SelectCoinsMinConf (MIN_CHANGE, 1 , 1 , vCoins, setCoinsRet, nValueRet));
199
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (MIN_CHANGE, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
200
200
BOOST_CHECK_EQUAL (nValueRet, MIN_CHANGE);
201
201
202
202
// but if we add a bigger coin, small change is avoided
203
203
add_coin (1111 *MIN_CHANGE);
204
204
205
205
// try making 1 from 0.1 + 0.2 + 0.3 + 0.4 + 0.5 + 1111 = 1112.5
206
- BOOST_CHECK ( wallet.SelectCoinsMinConf (1 * MIN_CHANGE, 1 , 1 , vCoins, setCoinsRet, nValueRet));
206
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (1 * MIN_CHANGE, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
207
207
BOOST_CHECK_EQUAL (nValueRet, 1 * MIN_CHANGE); // we should get the exact amount
208
208
209
209
// if we add more small coins:
210
210
add_coin (MIN_CHANGE * 6 / 10 );
211
211
add_coin (MIN_CHANGE * 7 / 10 );
212
212
213
213
// and try again to make 1.0 * MIN_CHANGE
214
- BOOST_CHECK ( wallet.SelectCoinsMinConf (1 * MIN_CHANGE, 1 , 1 , vCoins, setCoinsRet, nValueRet));
214
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (1 * MIN_CHANGE, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
215
215
BOOST_CHECK_EQUAL (nValueRet, 1 * MIN_CHANGE); // we should get the exact amount
216
216
217
217
// run the 'mtgox' test (see http://blockexplorer.com/tx/29a3efd3ef04f9153d47a990bd7b048a4b2d213daaa5fb8ed670fb85f13bdbcf)
@@ -220,7 +220,7 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
220
220
for (int j = 0 ; j < 20 ; j++)
221
221
add_coin (50000 * COIN);
222
222
223
- BOOST_CHECK ( wallet.SelectCoinsMinConf (500000 * COIN, 1 , 1 , vCoins, setCoinsRet, nValueRet));
223
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (500000 * COIN, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
224
224
BOOST_CHECK_EQUAL (nValueRet, 500000 * COIN); // we should get the exact amount
225
225
BOOST_CHECK_EQUAL (setCoinsRet.size (), 10U ); // in ten coins
226
226
@@ -233,7 +233,7 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
233
233
add_coin (MIN_CHANGE * 6 / 10 );
234
234
add_coin (MIN_CHANGE * 7 / 10 );
235
235
add_coin (1111 * MIN_CHANGE);
236
- BOOST_CHECK ( wallet.SelectCoinsMinConf (1 * MIN_CHANGE, 1 , 1 , vCoins, setCoinsRet, nValueRet));
236
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (1 * MIN_CHANGE, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
237
237
BOOST_CHECK_EQUAL (nValueRet, 1111 * MIN_CHANGE); // we get the bigger coin
238
238
BOOST_CHECK_EQUAL (setCoinsRet.size (), 1U );
239
239
@@ -243,7 +243,7 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
243
243
add_coin (MIN_CHANGE * 6 / 10 );
244
244
add_coin (MIN_CHANGE * 8 / 10 );
245
245
add_coin (1111 * MIN_CHANGE);
246
- BOOST_CHECK ( wallet.SelectCoinsMinConf (MIN_CHANGE, 1 , 1 , vCoins, setCoinsRet, nValueRet));
246
+ BOOST_CHECK ( wallet.SelectCoinsMinConf (MIN_CHANGE, 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
247
247
BOOST_CHECK_EQUAL (nValueRet, MIN_CHANGE); // we should get the exact amount
248
248
BOOST_CHECK_EQUAL (setCoinsRet.size (), 2U ); // in two coins 0.4+0.6
249
249
@@ -254,12 +254,12 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
254
254
add_coin (MIN_CHANGE * 100 );
255
255
256
256
// trying to make 100.01 from these three coins
257
- BOOST_CHECK (wallet.SelectCoinsMinConf (MIN_CHANGE * 10001 / 100 , 1 , 1 , vCoins, setCoinsRet, nValueRet));
257
+ BOOST_CHECK (wallet.SelectCoinsMinConf (MIN_CHANGE * 10001 / 100 , 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
258
258
BOOST_CHECK_EQUAL (nValueRet, MIN_CHANGE * 10105 / 100 ); // we should get all coins
259
259
BOOST_CHECK_EQUAL (setCoinsRet.size (), 3U );
260
260
261
261
// but if we try to make 99.9, we should take the bigger of the two small coins to avoid small change
262
- BOOST_CHECK (wallet.SelectCoinsMinConf (MIN_CHANGE * 9990 / 100 , 1 , 1 , vCoins, setCoinsRet, nValueRet));
262
+ BOOST_CHECK (wallet.SelectCoinsMinConf (MIN_CHANGE * 9990 / 100 , 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
263
263
BOOST_CHECK_EQUAL (nValueRet, 101 * MIN_CHANGE);
264
264
BOOST_CHECK_EQUAL (setCoinsRet.size (), 2U );
265
265
@@ -269,7 +269,7 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
269
269
// Create 676 inputs (= (old MAX_STANDARD_TX_SIZE == 100000) / 148 bytes per input)
270
270
for (uint16_t j = 0 ; j < 676 ; j++)
271
271
add_coin (amt);
272
- BOOST_CHECK (wallet.SelectCoinsMinConf (2000 , 1 , 1 , vCoins, setCoinsRet, nValueRet));
272
+ BOOST_CHECK (wallet.SelectCoinsMinConf (2000 , 1 , 1 , 0 , vCoins, setCoinsRet, nValueRet));
273
273
if (amt - 2000 < MIN_CHANGE) {
274
274
// needs more than one input:
275
275
uint16_t returnSize = std::ceil ((2000.0 + MIN_CHANGE)/amt);
@@ -291,17 +291,17 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
291
291
292
292
// picking 50 from 100 coins doesn't depend on the shuffle,
293
293
// but does depend on randomness in the stochastic approximation code
294
- BOOST_CHECK (wallet.SelectCoinsMinConf (50 * COIN, 1 , 6 , vCoins, setCoinsRet , nValueRet));
295
- BOOST_CHECK (wallet.SelectCoinsMinConf (50 * COIN, 1 , 6 , vCoins, setCoinsRet2, nValueRet));
294
+ BOOST_CHECK (wallet.SelectCoinsMinConf (50 * COIN, 1 , 6 , 0 , vCoins, setCoinsRet , nValueRet));
295
+ BOOST_CHECK (wallet.SelectCoinsMinConf (50 * COIN, 1 , 6 , 0 , vCoins, setCoinsRet2, nValueRet));
296
296
BOOST_CHECK (!equal_sets (setCoinsRet, setCoinsRet2));
297
297
298
298
int fails = 0 ;
299
299
for (int j = 0 ; j < RANDOM_REPEATS; j++)
300
300
{
301
301
// selecting 1 from 100 identical coins depends on the shuffle; this test will fail 1% of the time
302
302
// run the test RANDOM_REPEATS times and only complain if all of them fail
303
- BOOST_CHECK (wallet.SelectCoinsMinConf (COIN, 1 , 6 , vCoins, setCoinsRet , nValueRet));
304
- BOOST_CHECK (wallet.SelectCoinsMinConf (COIN, 1 , 6 , vCoins, setCoinsRet2, nValueRet));
303
+ BOOST_CHECK (wallet.SelectCoinsMinConf (COIN, 1 , 6 , 0 , vCoins, setCoinsRet , nValueRet));
304
+ BOOST_CHECK (wallet.SelectCoinsMinConf (COIN, 1 , 6 , 0 , vCoins, setCoinsRet2, nValueRet));
305
305
if (equal_sets (setCoinsRet, setCoinsRet2))
306
306
fails++;
307
307
}
@@ -321,8 +321,8 @@ BOOST_AUTO_TEST_CASE(coin_selection_tests)
321
321
{
322
322
// selecting 1 from 100 identical coins depends on the shuffle; this test will fail 1% of the time
323
323
// run the test RANDOM_REPEATS times and only complain if all of them fail
324
- BOOST_CHECK (wallet.SelectCoinsMinConf (90 *CENT, 1 , 6 , vCoins, setCoinsRet , nValueRet));
325
- BOOST_CHECK (wallet.SelectCoinsMinConf (90 *CENT, 1 , 6 , vCoins, setCoinsRet2, nValueRet));
324
+ BOOST_CHECK (wallet.SelectCoinsMinConf (90 *CENT, 1 , 6 , 0 , vCoins, setCoinsRet , nValueRet));
325
+ BOOST_CHECK (wallet.SelectCoinsMinConf (90 *CENT, 1 , 6 , 0 , vCoins, setCoinsRet2, nValueRet));
326
326
if (equal_sets (setCoinsRet, setCoinsRet2))
327
327
fails++;
328
328
}
@@ -346,7 +346,7 @@ BOOST_AUTO_TEST_CASE(ApproximateBestSubset)
346
346
add_coin (1000 * COIN);
347
347
add_coin (3 * COIN);
348
348
349
- BOOST_CHECK (wallet.SelectCoinsMinConf (1003 * COIN, 1 , 6 , vCoins, setCoinsRet, nValueRet));
349
+ BOOST_CHECK (wallet.SelectCoinsMinConf (1003 * COIN, 1 , 6 , 0 , vCoins, setCoinsRet, nValueRet));
350
350
BOOST_CHECK_EQUAL (nValueRet, 1003 * COIN);
351
351
BOOST_CHECK_EQUAL (setCoinsRet.size (), 2U );
352
352
}
0 commit comments