From 3f8def51d53a078a5ee71ec675b5e06b784147de Mon Sep 17 00:00:00 2001 From: akankshakashyap Date: Sun, 10 Apr 2022 22:08:54 +0530 Subject: [PATCH] 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. --- src/wallet/test/coinselector_tests.cpp | 42 ++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/wallet/test/coinselector_tests.cpp b/src/wallet/test/coinselector_tests.cpp index 2a08c8ab572..a9cedd93ad3 100644 --- a/src/wallet/test/coinselector_tests.cpp +++ b/src/wallet/test/coinselector_tests.cpp @@ -344,6 +344,48 @@ BOOST_AUTO_TEST_CASE(bnb_search_test) const auto result10 = SelectCoins(*wallet, coins, 10 * CENT, coin_control, coin_selection_params_bnb); BOOST_CHECK(result10); } + { + std::unique_ptr wallet = std::make_unique(m_node.chain.get(), "", m_args, CreateMockWalletDatabase()); + wallet->LoadWallet(); + LOCK(wallet->cs_wallet); + wallet->SetWalletFlag(WALLET_FLAG_DESCRIPTORS); + wallet->SetupDescriptorScriptPubKeyMans(); + + std::vector coins; + + add_coin(coins, *wallet, 10 * CENT, 6 * 24, false, 0, true); + add_coin(coins, *wallet, 9 * CENT, 6 * 24, false, 0, true); + add_coin(coins, *wallet, 1 * CENT, 6 * 24, false, 0, true); + + // single coin should be selected when effective fee > long term fee + expected_result.Clear(); + add_coin(10 * CENT, 2, expected_result); + CCoinControl coin_control; + coin_selection_params_bnb.m_effective_feerate = CFeeRate(5000); + coin_selection_params_bnb.m_long_term_feerate = CFeeRate(3000); + const auto result11 = SelectCoins(*wallet, coins, 10 * CENT, coin_control, coin_selection_params_bnb); + BOOST_CHECK(EquivalentResult(expected_result, *result11)); + + // more coins should be selected when effective fee < long term fee + expected_result.Clear(); + add_coin(9 * CENT, 2, expected_result); + add_coin(1 * CENT, 2, expected_result); + coin_selection_params_bnb.m_effective_feerate = CFeeRate(3000); + coin_selection_params_bnb.m_long_term_feerate = CFeeRate(5000); + const auto result12 = SelectCoins(*wallet, coins, 10 * CENT, coin_control, coin_selection_params_bnb); + BOOST_CHECK(EquivalentResult(expected_result, *result12)); + + // pre selected coin should be selected even if disadvantageous + expected_result.Clear(); + add_coin(9 * CENT, 2, expected_result); + add_coin(1 * CENT, 2, expected_result); + coin_control.fAllowOtherInputs = true; + coin_control.Select(coins.at(1).outpoint); // pre select 9 coin + coin_selection_params_bnb.m_effective_feerate = CFeeRate(5000); + coin_selection_params_bnb.m_long_term_feerate = CFeeRate(3000); + const auto result13 = SelectCoins(*wallet, coins, 10 * CENT, coin_control, coin_selection_params_bnb); + BOOST_CHECK(EquivalentResult(expected_result, *result13)); + } } BOOST_AUTO_TEST_CASE(knapsack_solver_test)