Changeset View
Changeset View
Standalone View
Standalone View
src/test/blockstatus_tests.cpp
Show All 16 Lines | static void CheckBlockStatus(const BlockStatus s, BlockValidity validity, | ||||
BOOST_CHECK(s.getValidity() == validity); | BOOST_CHECK(s.getValidity() == validity); | ||||
BOOST_CHECK_EQUAL(s.hasData(), hasData); | BOOST_CHECK_EQUAL(s.hasData(), hasData); | ||||
BOOST_CHECK_EQUAL(s.hasUndo(), hasUndo); | BOOST_CHECK_EQUAL(s.hasUndo(), hasUndo); | ||||
BOOST_CHECK_EQUAL(s.hasFailed(), hasFailed); | BOOST_CHECK_EQUAL(s.hasFailed(), hasFailed); | ||||
BOOST_CHECK_EQUAL(s.hasFailedParent(), hasFailedParent); | BOOST_CHECK_EQUAL(s.hasFailedParent(), hasFailedParent); | ||||
BOOST_CHECK_EQUAL(s.isInvalid(), hasFailed || hasFailedParent); | BOOST_CHECK_EQUAL(s.isInvalid(), hasFailed || hasFailedParent); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(sighash_construction_test) { | static void CheckAllPermutations(const BlockStatus base, bool hasData, | ||||
// Check default values. | bool hasUndo, bool hasFailed, | ||||
CheckBlockStatus(BlockStatus(), BlockValidity::UNKNOWN, false, false, false, | bool hasFailedParent) { | ||||
false); | |||||
// Check all possible permutations. | // Check all possible permutations. | ||||
std::set<BlockValidity> baseValidities{ | std::set<BlockValidity> baseValidities{ | ||||
BlockValidity::UNKNOWN, BlockValidity::HEADER, | BlockValidity::UNKNOWN, BlockValidity::HEADER, | ||||
BlockValidity::TREE, BlockValidity::TRANSACTIONS, | BlockValidity::TREE, BlockValidity::TRANSACTIONS, | ||||
BlockValidity::CHAIN, BlockValidity::SCRIPTS}; | BlockValidity::CHAIN, BlockValidity::SCRIPTS}; | ||||
std::set<bool> hasDataValues{false, true}; | |||||
std::set<bool> hasUndoValues{false, true}; | |||||
std::set<bool> hasFailedValues{false, true}; | |||||
std::set<bool> hasFailedParentValues{false, true}; | |||||
for (BlockValidity validity : baseValidities) { | for (BlockValidity validity : baseValidities) { | ||||
for (bool hasData : hasDataValues) { | const BlockStatus s = base.withValidity(validity); | ||||
for (bool hasUndo : hasUndoValues) { | CheckBlockStatus(s, validity, hasData, hasUndo, hasFailed, | ||||
for (bool hasFailed : hasFailedValues) { | hasFailedParent); | ||||
for (bool hasFailedParent : hasFailedParentValues) { | |||||
const BlockStatus s = | |||||
BlockStatus() | |||||
.withValidity(validity) | |||||
.withData(hasData) | |||||
.withUndo(hasUndo) | |||||
.withFailed(hasFailed) | |||||
.withFailedParent(hasFailedParent); | |||||
CheckBlockStatus(s, validity, hasData, hasUndo, | |||||
hasFailed, hasFailedParent); | |||||
// Clears failure flags. | // Clears failure flags. | ||||
CheckBlockStatus(s.withClearedFailureFlags(), validity, | CheckBlockStatus(s.withClearedFailureFlags(), validity, hasData, | ||||
hasData, hasUndo, false, false); | hasUndo, false, false); | ||||
// Also check all possible alterations. | // Also check all possible alterations. | ||||
CheckBlockStatus(s.withData(hasData), validity, hasData, | CheckBlockStatus(s.withData(true), validity, true, hasUndo, hasFailed, | ||||
hasUndo, hasFailed, hasFailedParent); | |||||
CheckBlockStatus(s.withData(!hasData), validity, | |||||
!hasData, hasUndo, hasFailed, | |||||
hasFailedParent); | hasFailedParent); | ||||
CheckBlockStatus(s.withUndo(hasUndo), validity, hasData, | CheckBlockStatus(s.withData(false), validity, false, hasUndo, hasFailed, | ||||
hasUndo, hasFailed, hasFailedParent); | hasFailedParent); | ||||
CheckBlockStatus(s.withUndo(!hasUndo), validity, | CheckBlockStatus(s.withUndo(true), validity, hasData, true, hasFailed, | ||||
hasData, !hasUndo, hasFailed, | |||||
hasFailedParent); | hasFailedParent); | ||||
CheckBlockStatus(s.withFailed(hasFailed), validity, | CheckBlockStatus(s.withUndo(false), validity, hasData, false, hasFailed, | ||||
hasData, hasUndo, hasFailed, | |||||
hasFailedParent); | hasFailedParent); | ||||
CheckBlockStatus(s.withFailed(!hasFailed), validity, | CheckBlockStatus(s.withFailed(true), validity, hasData, hasUndo, true, | ||||
hasData, hasUndo, !hasFailed, | |||||
hasFailedParent); | hasFailedParent); | ||||
CheckBlockStatus(s.withFailedParent(hasFailedParent), | CheckBlockStatus(s.withFailed(false), validity, hasData, hasUndo, false, | ||||
validity, hasData, hasUndo, hasFailed, | |||||
hasFailedParent); | hasFailedParent); | ||||
CheckBlockStatus(s.withFailedParent(!hasFailedParent), | CheckBlockStatus(s.withFailedParent(true), validity, hasData, hasUndo, | ||||
validity, hasData, hasUndo, hasFailed, | hasFailed, true); | ||||
!hasFailedParent); | CheckBlockStatus(s.withFailedParent(false), validity, hasData, hasUndo, | ||||
hasFailed, false); | |||||
for (BlockValidity newValidity : baseValidities) { | for (BlockValidity newValidity : baseValidities) { | ||||
CheckBlockStatus(s.withValidity(newValidity), | CheckBlockStatus(s.withValidity(newValidity), newValidity, hasData, | ||||
newValidity, hasData, hasUndo, | hasUndo, hasFailed, hasFailedParent); | ||||
hasFailed, hasFailedParent); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
static void CheckFailures(const BlockStatus s, bool hasData, bool hasUndo) { | |||||
std::set<bool> hasFailedValues{false, true}; | |||||
std::set<bool> hasFailedParentValues{false, true}; | |||||
for (bool hasFailed : hasFailedValues) { | |||||
for (bool hasFailedParent : hasFailedParentValues) { | |||||
CheckAllPermutations( | |||||
s.withFailed(hasFailed).withFailedParent(hasFailedParent), | |||||
hasData, hasUndo, hasFailed, hasFailedParent); | |||||
} | |||||
} | |||||
} | |||||
static void CheckHaveDataAndUndo(const BlockStatus s) { | |||||
std::set<bool> hasDataValues{false, true}; | |||||
std::set<bool> hasUndoValues{false, true}; | |||||
for (bool hasData : hasDataValues) { | |||||
for (bool hasUndo : hasUndoValues) { | |||||
CheckFailures(s.withData(hasData).withUndo(hasUndo), hasData, | |||||
hasUndo); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(sighash_construction_test) { | |||||
// Check default values. | |||||
CheckBlockStatus(BlockStatus(), BlockValidity::UNKNOWN, false, false, false, | |||||
false); | |||||
CheckHaveDataAndUndo(BlockStatus()); | |||||
} | } | ||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |