Changeset View
Changeset View
Standalone View
Standalone View
src/test/skiplist_tests.cpp
Show First 20 Lines • Show All 150 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(findearliestatleast_test) { | ||||
CChain chain; | CChain chain; | ||||
chain.SetTip(&vBlocksMain.back()); | chain.SetTip(&vBlocksMain.back()); | ||||
// Verify that FindEarliestAtLeast is correct. | // Verify that FindEarliestAtLeast is correct. | ||||
for (unsigned int i = 0; i < 10000; ++i) { | for (unsigned int i = 0; i < 10000; ++i) { | ||||
// Pick a random element in vBlocksMain. | // Pick a random element in vBlocksMain. | ||||
int r = InsecureRandRange(vBlocksMain.size()); | int r = InsecureRandRange(vBlocksMain.size()); | ||||
int64_t test_time = vBlocksMain[r].nTime; | int64_t test_time = vBlocksMain[r].nTime; | ||||
CBlockIndex *ret = chain.FindEarliestAtLeast(test_time); | CBlockIndex *ret = chain.FindEarliestAtLeast(test_time, 0); | ||||
BOOST_CHECK(ret->nTimeMax >= test_time); | BOOST_CHECK(ret->nTimeMax >= test_time); | ||||
BOOST_CHECK((ret->pprev == nullptr) || | BOOST_CHECK((ret->pprev == nullptr) || | ||||
ret->pprev->nTimeMax < test_time); | ret->pprev->nTimeMax < test_time); | ||||
BOOST_CHECK(vBlocksMain[r].GetAncestor(ret->nHeight) == ret); | BOOST_CHECK(vBlocksMain[r].GetAncestor(ret->nHeight) == ret); | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(findearliestatleast_edge_test) { | BOOST_AUTO_TEST_CASE(findearliestatleast_edge_test) { | ||||
std::list<CBlockIndex> blocks; | std::list<CBlockIndex> blocks; | ||||
for (const unsigned int timeMax : | for (const unsigned int timeMax : | ||||
{100, 100, 100, 200, 200, 200, 300, 300, 300}) { | {100, 100, 100, 200, 200, 200, 300, 300, 300}) { | ||||
CBlockIndex *prev = blocks.empty() ? nullptr : &blocks.back(); | CBlockIndex *prev = blocks.empty() ? nullptr : &blocks.back(); | ||||
blocks.emplace_back(); | blocks.emplace_back(); | ||||
blocks.back().nHeight = prev ? prev->nHeight + 1 : 0; | blocks.back().nHeight = prev ? prev->nHeight + 1 : 0; | ||||
blocks.back().pprev = prev; | blocks.back().pprev = prev; | ||||
blocks.back().BuildSkip(); | blocks.back().BuildSkip(); | ||||
blocks.back().nTimeMax = timeMax; | blocks.back().nTimeMax = timeMax; | ||||
} | } | ||||
CChain chain; | CChain chain; | ||||
chain.SetTip(&blocks.back()); | chain.SetTip(&blocks.back()); | ||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(50)->nHeight, 0); | BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(50, 0)->nHeight, 0); | ||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(100)->nHeight, 0); | BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(100, 0)->nHeight, 0); | ||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(150)->nHeight, 3); | BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(150, 0)->nHeight, 3); | ||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(200)->nHeight, 3); | BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(200, 0)->nHeight, 3); | ||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(250)->nHeight, 6); | BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(250, 0)->nHeight, 6); | ||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(300)->nHeight, 6); | BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(300, 0)->nHeight, 6); | ||||
BOOST_CHECK(!chain.FindEarliestAtLeast(350)); | BOOST_CHECK(!chain.FindEarliestAtLeast(350, 0)); | ||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(0)->nHeight, 0); | BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(0, 0)->nHeight, 0); | ||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(-1)->nHeight, 0); | BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(-1, 0)->nHeight, 0); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
chain.FindEarliestAtLeast(std::numeric_limits<int64_t>::min())->nHeight, | chain.FindEarliestAtLeast(std::numeric_limits<int64_t>::min(), 0) | ||||
0); | |||||
BOOST_CHECK_EQUAL( | |||||
chain.FindEarliestAtLeast(std::numeric_limits<unsigned int>::min()) | |||||
->nHeight, | ->nHeight, | ||||
0); | 0); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
chain | chain | ||||
.FindEarliestAtLeast( | .FindEarliestAtLeast( | ||||
-int64_t(std::numeric_limits<unsigned int>::max()) - 1) | -int64_t(std::numeric_limits<unsigned int>::max()) - 1, 0) | ||||
->nHeight, | ->nHeight, | ||||
0); | 0); | ||||
BOOST_CHECK( | BOOST_CHECK( | ||||
!chain.FindEarliestAtLeast(std::numeric_limits<int64_t>::max())); | !chain.FindEarliestAtLeast(std::numeric_limits<int64_t>::max(), 0)); | ||||
BOOST_CHECK( | |||||
!chain.FindEarliestAtLeast(std::numeric_limits<unsigned int>::max())); | |||||
BOOST_CHECK(!chain.FindEarliestAtLeast( | BOOST_CHECK(!chain.FindEarliestAtLeast( | ||||
int64_t(std::numeric_limits<unsigned int>::max()) + 1)); | std::numeric_limits<unsigned int>::max(), 0)); | ||||
BOOST_CHECK(!chain.FindEarliestAtLeast( | |||||
int64_t(std::numeric_limits<unsigned int>::max()) + 1, 0)); | |||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(0, -1)->nHeight, 0); | |||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(0, 0)->nHeight, 0); | |||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(0, 3)->nHeight, 3); | |||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(0, 8)->nHeight, 8); | |||||
BOOST_CHECK(!chain.FindEarliestAtLeast(0, 9)); | |||||
CBlockIndex *ret1 = chain.FindEarliestAtLeast(100, 2); | |||||
BOOST_CHECK(ret1->nTimeMax >= 100 && ret1->nHeight == 2); | |||||
BOOST_CHECK(!chain.FindEarliestAtLeast(300, 9)); | |||||
CBlockIndex *ret2 = chain.FindEarliestAtLeast(200, 4); | |||||
BOOST_CHECK(ret2->nTimeMax >= 200 && ret2->nHeight == 4); | |||||
} | } | ||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |