9 #include <test/util/setup_common.h>
15 #include <boost/test/unit_test.hpp>
25 #define RANDOM_REPEATS 5
43 static void add_coin(
const CAmount& nValue,
int nInput, std::vector<CInputCoin>& set)
46 tx.
vout.resize(nInput + 1);
47 tx.
vout[nInput].nValue = nValue;
54 tx.
vout.resize(nInput + 1);
55 tx.
vout[nInput].nValue = nValue;
62 static int nextLockTime = 0;
65 tx.
vout.resize(nInput + 1);
66 tx.
vout[nInput].nValue = nValue;
85 COutput output(wtx, nInput, nAge,
true ,
true ,
true );
88 static void add_coin(
const CAmount& nValue,
int nAge = 6*24,
bool fIsFromMe =
false,
int nInput=0,
bool spendable =
false)
101 std::pair<CoinSet::iterator, CoinSet::iterator> ret = mismatch(a.begin(), a.end(), b.begin());
102 return ret.first == a.end() && ret.second == b.end();
109 for (
int i = 0; i < utxos; ++i) {
110 target += (
CAmount)1 << (utxos+i);
117 inline std::vector<OutputGroup>&
GroupCoins(
const std::vector<CInputCoin>& coins)
119 static std::vector<OutputGroup> static_groups;
120 static_groups.clear();
121 for (
auto& coin : coins) {
122 static_groups.emplace_back();
123 static_groups.back().Insert(coin, 0,
true, 0, 0,
false);
125 return static_groups;
128 inline std::vector<OutputGroup>&
GroupCoins(
const std::vector<COutput>& coins)
130 static std::vector<OutputGroup> static_groups;
131 static_groups.clear();
132 for (
auto& coin : coins) {
133 static_groups.emplace_back();
136 return static_groups;
147 std::vector<CInputCoin> utxo_pool;
168 add_coin(1 * CENT, 1, actual_selection);
172 actual_selection.clear();
176 add_coin(2 * CENT, 2, actual_selection);
180 actual_selection.clear();
184 add_coin(4 * CENT, 4, actual_selection);
185 add_coin(1 * CENT, 1, actual_selection);
189 actual_selection.clear();
194 actual_selection.clear();
198 add_coin(1 * CENT, 1, actual_selection);
202 actual_selection.clear();
207 actual_selection.clear();
212 add_coin(5 * CENT, 5, actual_selection);
213 add_coin(4 * CENT, 4, actual_selection);
214 add_coin(1 * CENT, 1, actual_selection);
218 actual_selection.clear();
223 add_coin(5 * CENT, 5, actual_selection);
224 add_coin(3 * CENT, 3, actual_selection);
225 add_coin(2 * CENT, 2, actual_selection);
233 actual_selection.clear();
244 add_coin(7 * CENT, 7, actual_selection);
245 add_coin(7 * CENT, 7, actual_selection);
246 add_coin(7 * CENT, 7, actual_selection);
247 add_coin(7 * CENT, 7, actual_selection);
248 add_coin(2 * CENT, 7, actual_selection);
254 for (
int i = 0; i < 50000; ++i) {
266 for (
int i = 5; i <= 20; ++i) {
270 for (
int i = 0; i < 100; ++i) {
284 vCoins.at(0).nInputBytes = 40;
290 vCoins.at(0).nInputBytes = 40;
301 wallet->LoadWallet(firstRun);
302 wallet->SetupLegacyScriptPubKeyMan();
311 BOOST_CHECK(
wallet->SelectCoins(
vCoins, 10 * CENT, setCoinsRet, nValueRet, coin_control, coin_selection_params_bnb, bnb_used));
319 CoinSet setCoinsRet, setCoinsRet2;
471 for (
int j = 0; j < 20; j++)
522 for (uint16_t j = 0; j < 676; j++)
531 uint16_t returnSize = std::ceil((2000.0 +
MIN_CHANGE)/amt);
532 CAmount returnValue = amt * returnSize;
546 for (
int i2 = 0; i2 < 100; i2++)
609 for (
int i = 0; i < 1000; i++)
626 std::default_random_engine generator;
627 std::exponential_distribution<double> distribution (100);
631 for (
int i = 0; i < 100; ++i)
636 for (
int j = 0; j < 1000; ++j)
658 bool bnb_used =
false;
661 BOOST_CHECK_GE(out_value, target);