Changeset View
Changeset View
Standalone View
Standalone View
src/test/blockchain_tests.cpp
- This file was added.
#include <rpc/blockchain.h> | |||||
#include <chain.h> | |||||
#include <test/test_bitcoin.h> | |||||
#include <boost/test/unit_test.hpp> | |||||
#include <cstdlib> | |||||
/** | |||||
* Equality between doubles is imprecise. Comparison should be done | |||||
* with a small threshold of tolerance, rather than exact equality. | |||||
*/ | |||||
static bool DoubleEquals(double a, double b, double epsilon) { | |||||
return std::abs(a - b) < epsilon; | |||||
} | |||||
static CBlockIndex *CreateBlockIndexWithNbits(uint32_t nbits) { | |||||
CBlockIndex *block_index = new CBlockIndex(); | |||||
block_index->nHeight = 46367; | |||||
block_index->nTime = 1269211443; | |||||
block_index->nBits = nbits; | |||||
return block_index; | |||||
} | |||||
static void RejectDifficultyMismatch(double difficulty, | |||||
double expected_difficulty) { | |||||
BOOST_CHECK_MESSAGE(DoubleEquals(difficulty, expected_difficulty, 0.00001), | |||||
"Difficulty was " + std::to_string(difficulty) + | |||||
" but was expected to be " + | |||||
std::to_string(expected_difficulty)); | |||||
} | |||||
/** | |||||
* Given a BlockIndex with the provided nbits, | |||||
* verify that the expected difficulty results. | |||||
*/ | |||||
static void TestDifficulty(uint32_t nbits, double expected_difficulty) { | |||||
CBlockIndex *block_index = CreateBlockIndexWithNbits(nbits); | |||||
double difficulty = GetDifficulty(block_index); | |||||
delete block_index; | |||||
RejectDifficultyMismatch(difficulty, expected_difficulty); | |||||
} | |||||
BOOST_FIXTURE_TEST_SUITE(blockchain_tests, BasicTestingSetup) | |||||
BOOST_AUTO_TEST_CASE(get_difficulty_for_very_low_target) { | |||||
TestDifficulty(0x1f111111, 0.000001); | |||||
} | |||||
BOOST_AUTO_TEST_CASE(get_difficulty_for_low_target) { | |||||
TestDifficulty(0x1ef88f6f, 0.000016); | |||||
} | |||||
BOOST_AUTO_TEST_CASE(get_difficulty_for_mid_target) { | |||||
TestDifficulty(0x1df88f6f, 0.004023); | |||||
} | |||||
BOOST_AUTO_TEST_CASE(get_difficulty_for_high_target) { | |||||
TestDifficulty(0x1cf88f6f, 1.029916); | |||||
} | |||||
BOOST_AUTO_TEST_CASE(get_difficulty_for_very_high_target) { | |||||
TestDifficulty(0x12345678, 5913134931067755359633408.0); | |||||
} | |||||
BOOST_AUTO_TEST_SUITE_END() |