Skip to content

Commit f69347d

Browse files
committed
test: extend and simplify availablecoins_tests
Clean redundant code and add coverage for 'AvailableCoins' incremental result.
1 parent 212ccdf commit f69347d

File tree

1 file changed

+25
-33
lines changed

1 file changed

+25
-33
lines changed

src/wallet/test/availablecoins_tests.cpp

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,31 @@ class AvailableCoinsTestingSetup : public TestChain100Setup
5555
std::unique_ptr<CWallet> wallet;
5656
};
5757

58+
void TestCoinsResult(AvailableCoinsTestingSetup& context, OutputType out_type, CAmount amount,
59+
std::map<OutputType, size_t>& expected_coins_sizes)
60+
{
61+
LOCK(context.wallet->cs_wallet);
62+
util::Result<CTxDestination> dest = Assert(context.wallet->GetNewDestination(out_type, ""));
63+
CWalletTx& wtx = context.AddTx(CRecipient{{GetScriptForDestination(*dest)}, amount, /*fSubtractFeeFromAmount=*/true});
64+
CoinFilterParams filter;
65+
filter.skip_locked = false;
66+
CoinsResult available_coins = AvailableCoins(*context.wallet, nullptr, std::nullopt, filter);
67+
// Lock outputs so they are not spent in follow-up transactions
68+
for (uint32_t i = 0; i < wtx.tx->vout.size(); i++) context.wallet->LockCoin({wtx.GetHash(), i});
69+
for (const auto& [type, size] : expected_coins_sizes) BOOST_CHECK_EQUAL(size, available_coins.coins[type].size());
70+
}
71+
5872
BOOST_FIXTURE_TEST_CASE(BasicOutputTypesTest, AvailableCoinsTestingSetup)
5973
{
60-
CoinsResult available_coins;
61-
util::Result<CTxDestination> dest{util::Error{}};
62-
LOCK(wallet->cs_wallet);
74+
std::map<OutputType, size_t> expected_coins_sizes;
75+
for (const auto& out_type : OUTPUT_TYPES) { expected_coins_sizes[out_type] = 0U; }
6376

6477
// Verify our wallet has one usable coinbase UTXO before starting
6578
// This UTXO is a P2PK, so it should show up in the Other bucket
66-
available_coins = AvailableCoins(*wallet);
67-
BOOST_CHECK_EQUAL(available_coins.Size(), 1U);
68-
BOOST_CHECK_EQUAL(available_coins.coins[OutputType::UNKNOWN].size(), 1U);
79+
expected_coins_sizes[OutputType::UNKNOWN] = 1U;
80+
CoinsResult available_coins = WITH_LOCK(wallet->cs_wallet, return AvailableCoins(*wallet));
81+
BOOST_CHECK_EQUAL(available_coins.Size(), expected_coins_sizes[OutputType::UNKNOWN]);
82+
BOOST_CHECK_EQUAL(available_coins.coins[OutputType::UNKNOWN].size(), expected_coins_sizes[OutputType::UNKNOWN]);
6983

7084
// We will create a self transfer for each of the OutputTypes and
7185
// verify it is put in the correct bucket after running GetAvailablecoins
@@ -74,33 +88,11 @@ BOOST_FIXTURE_TEST_CASE(BasicOutputTypesTest, AvailableCoinsTestingSetup)
7488
// 1. One UTXO as the recipient
7589
// 2. One UTXO from the change, due to payment address matching logic
7690

77-
// Bech32m
78-
dest = wallet->GetNewDestination(OutputType::BECH32M, "");
79-
BOOST_ASSERT(dest);
80-
AddTx(CRecipient{{GetScriptForDestination(*dest)}, 1 * COIN, /*fSubtractFeeFromAmount=*/true});
81-
available_coins = AvailableCoins(*wallet);
82-
BOOST_CHECK_EQUAL(available_coins.coins[OutputType::BECH32M].size(), 2U);
83-
84-
// Bech32
85-
dest = wallet->GetNewDestination(OutputType::BECH32, "");
86-
BOOST_ASSERT(dest);
87-
AddTx(CRecipient{{GetScriptForDestination(*dest)}, 2 * COIN, /*fSubtractFeeFromAmount=*/true});
88-
available_coins = AvailableCoins(*wallet);
89-
BOOST_CHECK_EQUAL(available_coins.coins[OutputType::BECH32].size(), 2U);
90-
91-
// P2SH-SEGWIT
92-
dest = wallet->GetNewDestination(OutputType::P2SH_SEGWIT, "");
93-
BOOST_ASSERT(dest);
94-
AddTx(CRecipient{{GetScriptForDestination(*dest)}, 3 * COIN, /*fSubtractFeeFromAmount=*/true});
95-
available_coins = AvailableCoins(*wallet);
96-
BOOST_CHECK_EQUAL(available_coins.coins[OutputType::P2SH_SEGWIT].size(), 2U);
97-
98-
// Legacy (P2PKH)
99-
dest = wallet->GetNewDestination(OutputType::LEGACY, "");
100-
BOOST_ASSERT(dest);
101-
AddTx(CRecipient{{GetScriptForDestination(*dest)}, 4 * COIN, /*fSubtractFeeFromAmount=*/true});
102-
available_coins = AvailableCoins(*wallet);
103-
BOOST_CHECK_EQUAL(available_coins.coins[OutputType::LEGACY].size(), 2U);
91+
for (const auto& out_type : OUTPUT_TYPES) {
92+
if (out_type == OutputType::UNKNOWN) continue;
93+
expected_coins_sizes[out_type] = 2U;
94+
TestCoinsResult(*this, out_type, 1 * COIN, expected_coins_sizes);
95+
}
10496
}
10597

10698
BOOST_AUTO_TEST_SUITE_END()

0 commit comments

Comments
 (0)