Skip to content

Commit 3f8def5

Browse files
add 3 new test cases for SelectCoins()
1. More coins should be selected when effective fee < long term fee. 2. Less coin should be selected when effective fee > long term fee. 3. If a coin is preselected, it should be selected even if disadvantageous.
1 parent 747cdf1 commit 3f8def5

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

src/wallet/test/coinselector_tests.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,48 @@ BOOST_AUTO_TEST_CASE(bnb_search_test)
344344
const auto result10 = SelectCoins(*wallet, coins, 10 * CENT, coin_control, coin_selection_params_bnb);
345345
BOOST_CHECK(result10);
346346
}
347+
{
348+
std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain.get(), "", m_args, CreateMockWalletDatabase());
349+
wallet->LoadWallet();
350+
LOCK(wallet->cs_wallet);
351+
wallet->SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
352+
wallet->SetupDescriptorScriptPubKeyMans();
353+
354+
std::vector<COutput> coins;
355+
356+
add_coin(coins, *wallet, 10 * CENT, 6 * 24, false, 0, true);
357+
add_coin(coins, *wallet, 9 * CENT, 6 * 24, false, 0, true);
358+
add_coin(coins, *wallet, 1 * CENT, 6 * 24, false, 0, true);
359+
360+
// single coin should be selected when effective fee > long term fee
361+
expected_result.Clear();
362+
add_coin(10 * CENT, 2, expected_result);
363+
CCoinControl coin_control;
364+
coin_selection_params_bnb.m_effective_feerate = CFeeRate(5000);
365+
coin_selection_params_bnb.m_long_term_feerate = CFeeRate(3000);
366+
const auto result11 = SelectCoins(*wallet, coins, 10 * CENT, coin_control, coin_selection_params_bnb);
367+
BOOST_CHECK(EquivalentResult(expected_result, *result11));
368+
369+
// more coins should be selected when effective fee < long term fee
370+
expected_result.Clear();
371+
add_coin(9 * CENT, 2, expected_result);
372+
add_coin(1 * CENT, 2, expected_result);
373+
coin_selection_params_bnb.m_effective_feerate = CFeeRate(3000);
374+
coin_selection_params_bnb.m_long_term_feerate = CFeeRate(5000);
375+
const auto result12 = SelectCoins(*wallet, coins, 10 * CENT, coin_control, coin_selection_params_bnb);
376+
BOOST_CHECK(EquivalentResult(expected_result, *result12));
377+
378+
// pre selected coin should be selected even if disadvantageous
379+
expected_result.Clear();
380+
add_coin(9 * CENT, 2, expected_result);
381+
add_coin(1 * CENT, 2, expected_result);
382+
coin_control.fAllowOtherInputs = true;
383+
coin_control.Select(coins.at(1).outpoint); // pre select 9 coin
384+
coin_selection_params_bnb.m_effective_feerate = CFeeRate(5000);
385+
coin_selection_params_bnb.m_long_term_feerate = CFeeRate(3000);
386+
const auto result13 = SelectCoins(*wallet, coins, 10 * CENT, coin_control, coin_selection_params_bnb);
387+
BOOST_CHECK(EquivalentResult(expected_result, *result13));
388+
}
347389
}
348390

349391
BOOST_AUTO_TEST_CASE(knapsack_solver_test)

0 commit comments

Comments
 (0)