TEST_F(TransfersContainer_addTransaction, addingConfirmedOutputMultisignatureTwiceFails) { { TestTransactionBuilder tx; auto out = tx.addTestMultisignatureOutput(TEST_OUTPUT_AMOUNT, TEST_TRANSACTION_OUTPUT_GLOBAL_INDEX); ASSERT_TRUE(container.addTransaction(blockInfo(TEST_BLOCK_HEIGHT), *tx.build(), { out })); } { TestTransactionBuilder tx; auto out = tx.addTestMultisignatureOutput(TEST_OUTPUT_AMOUNT, TEST_TRANSACTION_OUTPUT_GLOBAL_INDEX); ASSERT_ANY_THROW(container.addTransaction(blockInfo(TEST_BLOCK_HEIGHT + 1), *tx.build(), { out })); } }
TEST_F(TransfersContainer_getOutputs, filtersByStateAndKeySimultaneously) { TestTransactionBuilder tx; tx.addTestInput(AMOUNT_1 + AMOUNT_2 + 1); auto outInfo1 = tx.addTestKeyOutput(AMOUNT_1, UNCONFIRMED_TRANSACTION_GLOBAL_OUTPUT_INDEX, account); auto outInfo2 = tx.addTestMultisignatureOutput(AMOUNT_2, UNCONFIRMED_TRANSACTION_GLOBAL_OUTPUT_INDEX); ASSERT_TRUE(container.addTransaction(blockInfo(WALLET_LEGACY_UNCONFIRMED_TRANSACTION_HEIGHT), *tx.build(), { outInfo1, outInfo2 })); auto tx2 = addTransaction(TEST_BLOCK_HEIGHT, AMOUNT_1 + AMOUNT_2); container.advanceHeight(TEST_CONTAINER_CURRENT_HEIGHT); std::vector<TransactionOutputInformation> transfers; container.getOutputs(transfers, ITransfersContainer::IncludeStateLocked | ITransfersContainer::IncludeTypeKey); ASSERT_EQ(1, transfers.size()); ASSERT_EQ(AMOUNT_1, transfers.front().amount); transfers.clear(); container.getOutputs(transfers, ITransfersContainer::IncludeStateLocked | ITransfersContainer::IncludeTypeMultisignature); ASSERT_EQ(1, transfers.size()); ASSERT_EQ(AMOUNT_2, transfers.front().amount); transfers.clear(); container.getOutputs(transfers, ITransfersContainer::IncludeStateUnlocked | ITransfersContainer::IncludeTypeKey); ASSERT_EQ(1, transfers.size()); ASSERT_EQ(AMOUNT_1 + AMOUNT_2, transfers.front().amount); }
TEST_F(TransfersContainer_balance, handlesTransferTypeKey) { TestTransactionBuilder tx; tx.addTestInput(AMOUNT_1 + AMOUNT_2 + 1); auto outInfo1 = tx.addTestKeyOutput(AMOUNT_1, TEST_TRANSACTION_OUTPUT_GLOBAL_INDEX, account); auto outInfo2 = tx.addTestMultisignatureOutput(AMOUNT_2, TEST_TRANSACTION_OUTPUT_GLOBAL_INDEX); ASSERT_TRUE(container.addTransaction(blockInfo(TEST_BLOCK_HEIGHT), *tx.build(), { outInfo1, outInfo2 })); ASSERT_EQ(AMOUNT_1, container.balance(ITransfersContainer::IncludeStateAll | ITransfersContainer::IncludeTypeKey)); }
TEST_F(TransfersContainer_getOutputs, handlesTransferTypeMultisignature) { TestTransactionBuilder tx; tx.addTestInput(AMOUNT_1 + AMOUNT_2 + 1); auto outInfo1 = tx.addTestKeyOutput(AMOUNT_1, TEST_TRANSACTION_OUTPUT_GLOBAL_INDEX, account); auto outInfo2 = tx.addTestMultisignatureOutput(AMOUNT_2, TEST_TRANSACTION_OUTPUT_GLOBAL_INDEX); ASSERT_TRUE(container.addTransaction(blockInfo(TEST_BLOCK_HEIGHT), *tx.build(), { outInfo1, outInfo2 })); std::vector<TransactionOutputInformation> transfers; container.getOutputs(transfers, ITransfersContainer::IncludeStateAll | ITransfersContainer::IncludeTypeMultisignature); ASSERT_EQ(1, transfers.size()); ASSERT_EQ(AMOUNT_2, transfers.front().amount); }
TEST_F(TransfersContainer_addTransaction, handlesAddingUnconfirmedOutputMultisignature) { TestTransactionBuilder tx; auto out = tx.addTestMultisignatureOutput(TEST_OUTPUT_AMOUNT, UNCONFIRMED_TRANSACTION_GLOBAL_OUTPUT_INDEX); ASSERT_TRUE(container.addTransaction(blockInfo(WALLET_LEGACY_UNCONFIRMED_TRANSACTION_HEIGHT), *tx.build(), { out })); ASSERT_EQ(1, container.transactionsCount()); ASSERT_EQ(1, container.transfersCount()); ASSERT_EQ(TEST_OUTPUT_AMOUNT, container.balance(ITransfersContainer::IncludeAll)); ASSERT_EQ(TEST_OUTPUT_AMOUNT, container.balance(ITransfersContainer::IncludeTypeMultisignature | ITransfersContainer::IncludeStateLocked)); ASSERT_EQ(0, container.balance(ITransfersContainer::IncludeTypeMultisignature | ITransfersContainer::IncludeStateUnlocked)); }
TEST_F(TransfersContainer_balance, filtersByStateAndKeySimultaneously) { TestTransactionBuilder tx; tx.addTestInput(AMOUNT_1 + AMOUNT_2 + 1); auto outInfo1 = tx.addTestKeyOutput(AMOUNT_1, UNCONFIRMED_TRANSACTION_GLOBAL_OUTPUT_INDEX, account); auto outInfo2 = tx.addTestMultisignatureOutput(AMOUNT_2, UNCONFIRMED_TRANSACTION_GLOBAL_OUTPUT_INDEX); ASSERT_TRUE(container.addTransaction(blockInfo(WALLET_LEGACY_UNCONFIRMED_TRANSACTION_HEIGHT), *tx.build(), { outInfo1, outInfo2 })); auto tx2 = addTransaction(TEST_BLOCK_HEIGHT, AMOUNT_1 + AMOUNT_2); container.advanceHeight(TEST_CONTAINER_CURRENT_HEIGHT); ASSERT_EQ(AMOUNT_1, container.balance(ITransfersContainer::IncludeStateLocked | ITransfersContainer::IncludeTypeKey)); ASSERT_EQ(AMOUNT_2, container.balance(ITransfersContainer::IncludeStateLocked | ITransfersContainer::IncludeTypeMultisignature)); ASSERT_EQ(AMOUNT_1 + AMOUNT_2, container.balance(ITransfersContainer::IncludeStateUnlocked | ITransfersContainer::IncludeTypeKey)); }
TEST_F(TransfersContainer_addTransaction, spendingConfirmedMultisignatureOutputWithUnconfirmedTxSucceed) { TestTransactionBuilder tx; tx.addTestInput(TEST_OUTPUT_AMOUNT + 1, account); auto out = tx.addTestMultisignatureOutput(TEST_OUTPUT_AMOUNT, TEST_TRANSACTION_OUTPUT_GLOBAL_INDEX); ASSERT_TRUE(container.addTransaction(blockInfo(TEST_BLOCK_HEIGHT), *tx.build(), { out })); container.advanceHeight(1000); ASSERT_EQ(TEST_OUTPUT_AMOUNT, container.balance(ITransfersContainer::IncludeAllUnlocked)); TestTransactionBuilder spendingTx; spendingTx.addTestMultisignatureInput(TEST_OUTPUT_AMOUNT, out); ASSERT_TRUE(container.addTransaction(blockInfo(WALLET_LEGACY_UNCONFIRMED_TRANSACTION_HEIGHT), *spendingTx.build(), {})); ASSERT_EQ(0, container.balance(ITransfersContainer::IncludeAllUnlocked)); }
TEST_F(TransfersContainer_addTransaction, handlesAddingConfirmedOutputMultisignature) { TestTransactionBuilder tx; auto out = tx.addTestMultisignatureOutput(TEST_OUTPUT_AMOUNT, TEST_TRANSACTION_OUTPUT_GLOBAL_INDEX); ASSERT_TRUE(container.addTransaction(blockInfo(TEST_BLOCK_HEIGHT), *tx.build(), { out })); container.advanceHeight(1000); ASSERT_EQ(1, container.transactionsCount()); ASSERT_EQ(1, container.transfersCount()); ASSERT_EQ(TEST_OUTPUT_AMOUNT, container.balance(ITransfersContainer::IncludeAll)); ASSERT_EQ(TEST_OUTPUT_AMOUNT, container.balance(ITransfersContainer::IncludeTypeMultisignature | ITransfersContainer::IncludeStateUnlocked)); ASSERT_EQ(0, container.balance(ITransfersContainer::IncludeTypeMultisignature | ITransfersContainer::IncludeStateLocked)); }