@@ -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+
5872BOOST_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
10698BOOST_AUTO_TEST_SUITE_END ()
0 commit comments