diff --git a/src/Makefile.test.include b/src/Makefile.test.include index 260977ace..2bab78142 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -1,191 +1,192 @@ # Copyright (c) 2013-2016 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. TESTS += test/test_bitcoin LOG_DRIVER = $(srcdir)/test/test-bitcoin-driver EXTRA_DIST += test/test-bitcoin-driver bin_PROGRAMS += test/test_bitcoin noinst_PROGRAMS += test/test_bitcoin_fuzzy TEST_SRCDIR = test TEST_BINARY=test/test_bitcoin$(EXEEXT) JSON_TEST_FILES = \ test/data/script_tests.json \ test/data/base58_keys_valid.json \ test/data/base58_encode_decode.json \ test/data/base58_keys_invalid.json \ test/data/tx_invalid.json \ test/data/tx_valid.json \ test/data/sighash.json RAW_TEST_FILES = GENERATED_TEST_FILES = $(JSON_TEST_FILES:.json=.json.h) $(RAW_TEST_FILES:.raw=.raw.h) # test_bitcoin binary # BITCOIN_TESTS =\ test/arith_uint256_tests.cpp \ test/scriptnum10.h \ test/addrman_tests.cpp \ test/amount_tests.cpp \ test/allocator_tests.cpp \ test/base32_tests.cpp \ test/base58_tests.cpp \ test/base64_tests.cpp \ test/bip32_tests.cpp \ test/blockcheck_tests.cpp \ test/blockencodings_tests.cpp \ test/blockindex_tests.cpp \ test/blockstatus_tests.cpp \ test/bloom_tests.cpp \ test/bswap_tests.cpp \ test/cashaddr_tests.cpp \ test/cashaddrenc_tests.cpp \ test/checkdatasig_tests.cpp \ test/checkpoints_tests.cpp \ test/coins_tests.cpp \ test/compress_tests.cpp \ test/config_tests.cpp \ test/core_io_tests.cpp \ test/crypto_tests.cpp \ test/cuckoocache_tests.cpp \ test/dbwrapper_tests.cpp \ test/DoS_tests.cpp \ test/dstencode_tests.cpp \ test/excessiveblock_tests.cpp \ + test/feerate_tests.cpp \ test/getarg_tests.cpp \ test/hash_tests.cpp \ test/inv_tests.cpp \ test/jsonutil.cpp \ test/jsonutil.h \ test/key_tests.cpp \ test/limitedmap_tests.cpp \ test/main_tests.cpp \ test/mempool_tests.cpp \ test/merkle_tests.cpp \ test/miner_tests.cpp \ test/monolith_opcodes.cpp \ test/multisig_tests.cpp \ test/net_tests.cpp \ test/netbase_tests.cpp \ test/pmt_tests.cpp \ test/policyestimator_tests.cpp \ test/pow_tests.cpp \ test/prevector_tests.cpp \ test/raii_event_tests.cpp \ test/random_tests.cpp \ test/reverselock_tests.cpp \ test/rpc_tests.cpp \ test/sanity_tests.cpp \ test/scheduler_tests.cpp \ test/script_commitment_tests.cpp \ test/script_P2SH_tests.cpp \ test/script_tests.cpp \ test/scriptflags.cpp \ test/scriptflags.h \ test/scriptnum_tests.cpp \ test/serialize_tests.cpp \ test/sigencoding_tests.cpp \ test/sighash_tests.cpp \ test/sighashtype_tests.cpp \ test/sigopcount_tests.cpp \ test/sigutil.cpp \ test/sigutil.h \ test/skiplist_tests.cpp \ test/streams_tests.cpp \ test/test_bitcoin.cpp \ test/test_bitcoin.h \ test/test_bitcoin_main.cpp \ test/testutil.cpp \ test/testutil.h \ test/timedata_tests.cpp \ test/transaction_tests.cpp \ test/txvalidationcache_tests.cpp \ test/versionbits_tests.cpp \ test/uint256_tests.cpp \ test/undo_tests.cpp \ test/univalue_tests.cpp \ test/util_tests.cpp \ test/validation_tests.cpp \ test/work_comparator_tests.cpp if ENABLE_WALLET BITCOIN_TESTS += \ wallet/test/wallet_test_fixture.cpp \ wallet/test/wallet_test_fixture.h \ wallet/test/accounting_tests.cpp \ wallet/test/wallet_tests.cpp \ wallet/test/walletdb_tests.cpp \ wallet/test/crypto_tests.cpp endif test_test_bitcoin_SOURCES = $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES) test_test_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) -I$(builddir)/test/ $(TESTDEFS) $(EVENT_CFLAGS) test_test_bitcoin_LDADD = if ENABLE_WALLET test_test_bitcoin_LDADD += $(LIBBITCOIN_WALLET) endif test_test_bitcoin_LDADD += $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) \ $(LIBLEVELDB) $(LIBLEVELDB_SSE42) $(LIBMEMENV) $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1) $(EVENT_LIBS) $(EVENT_PTHREADS_LIBS) test_test_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) test_test_bitcoin_LDADD += $(LIBBITCOIN_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) test_test_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) -static if ENABLE_ZMQ test_test_bitcoin_LDADD += $(ZMQ_LIBS) endif # # test_bitcoin_fuzzy binary # test_test_bitcoin_fuzzy_SOURCES = test/test_bitcoin_fuzzy.cpp test_test_bitcoin_fuzzy_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) test_test_bitcoin_fuzzy_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) test_test_bitcoin_fuzzy_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) test_test_bitcoin_fuzzy_LDADD = \ $(LIBUNIVALUE) \ $(LIBBITCOIN_SERVER) \ $(LIBBITCOIN_COMMON) \ $(LIBBITCOIN_UTIL) \ $(LIBBITCOIN_CONSENSUS) \ $(LIBBITCOIN_CRYPTO) \ $(LIBSECP256K1) test_test_bitcoin_fuzzy_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS) # nodist_test_test_bitcoin_SOURCES = $(GENERATED_TEST_FILES) $(BITCOIN_TESTS): $(GENERATED_TEST_FILES) CLEAN_BITCOIN_TEST = test/*.gcda test/*.gcno $(GENERATED_TEST_FILES) CLEANFILES += $(CLEAN_BITCOIN_TEST) bitcoin_test: $(TEST_BINARY) bitcoin_test_check: $(TEST_BINARY) FORCE $(MAKE) check-TESTS TESTS=$^ bitcoin_test_clean : FORCE rm -f $(CLEAN_BITCOIN_TEST) $(test_test_bitcoin_OBJECTS) $(TEST_BINARY) check-local: @echo "Running test/util/bitcoin-util-test.py..." $(top_builddir)/test/util/bitcoin-util-test.py $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C secp256k1 check if EMBEDDED_UNIVALUE $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C univalue check endif %.json.h: %.json @$(MKDIR_P) $(@D) @{ \ echo "namespace json_tests{" && \ echo "static unsigned const char $(*F)[] = {" && \ $(HEXDUMP) -v -e '8/1 "0x%02x, "' -e '"\n"' $< | $(SED) -e 's/0x ,//g' && \ echo "};};"; \ } > "$@.new" && mv -f "$@.new" "$@" @echo "Generated $@" diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index e10722188..5c6951d22 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -1,163 +1,164 @@ # Copyright (c) 2018 The Bitcoin developers project(bitcoin-test) # Process json files. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/data") find_program(PYTHON python) function(gen_json_header NAME) set(HEADERS "") foreach(f ${ARGN}) set(h "${CMAKE_CURRENT_BINARY_DIR}/${f}.h") # Get the proper name for the test variable. get_filename_component(TEST_NAME ${f} NAME_WE) add_custom_command(OUTPUT ${h} COMMAND ${PYTHON} ARGS "${CMAKE_CURRENT_SOURCE_DIR}/data/generate_header.py" "${TEST_NAME}" "${CMAKE_CURRENT_SOURCE_DIR}/${f}" > ${h} MAIN_DEPENDENCY ${f} DEPENDS "data/generate_header.py" VERBATIM ) list(APPEND HEADERS ${h}) endforeach(f) set(${NAME} "${HEADERS}" PARENT_SCOPE) endfunction() gen_json_header(JSON_HEADERS data/script_tests.json data/base58_keys_valid.json data/base58_encode_decode.json data/base58_keys_invalid.json data/tx_invalid.json data/tx_valid.json data/sighash.json ) include(TestSuite) create_test_suite(bitcoin) add_dependencies(check check-bitcoin) add_test_to_suite(bitcoin test_bitcoin arith_uint256_tests.cpp addrman_tests.cpp amount_tests.cpp allocator_tests.cpp base32_tests.cpp base58_tests.cpp base64_tests.cpp bip32_tests.cpp blockcheck_tests.cpp blockencodings_tests.cpp blockindex_tests.cpp blockstatus_tests.cpp bloom_tests.cpp bswap_tests.cpp cashaddr_tests.cpp cashaddrenc_tests.cpp checkdatasig_tests.cpp checkpoints_tests.cpp coins_tests.cpp compress_tests.cpp config_tests.cpp core_io_tests.cpp crypto_tests.cpp cuckoocache_tests.cpp dbwrapper_tests.cpp DoS_tests.cpp dstencode_tests.cpp excessiveblock_tests.cpp + feerate_tests.cpp getarg_tests.cpp hash_tests.cpp inv_tests.cpp jsonutil.cpp key_tests.cpp limitedmap_tests.cpp main_tests.cpp mempool_tests.cpp merkle_tests.cpp miner_tests.cpp monolith_opcodes.cpp multisig_tests.cpp net_tests.cpp netbase_tests.cpp pmt_tests.cpp policyestimator_tests.cpp pow_tests.cpp prevector_tests.cpp raii_event_tests.cpp random_tests.cpp reverselock_tests.cpp rpc_tests.cpp sanity_tests.cpp scheduler_tests.cpp script_commitment_tests.cpp script_P2SH_tests.cpp script_tests.cpp scriptflags.cpp scriptnum_tests.cpp serialize_tests.cpp sigencoding_tests.cpp sighash_tests.cpp sighashtype_tests.cpp sigopcount_tests.cpp sigutil.cpp skiplist_tests.cpp streams_tests.cpp test_bitcoin.cpp test_bitcoin_main.cpp testutil.cpp timedata_tests.cpp transaction_tests.cpp txvalidationcache_tests.cpp versionbits_tests.cpp uint256_tests.cpp undo_tests.cpp univalue_tests.cpp util_tests.cpp validation_tests.cpp work_comparator_tests.cpp # Tests generated from JSON ${JSON_HEADERS} ) target_include_directories(test_bitcoin PUBLIC # To access the generated json headers. ${CMAKE_CURRENT_BINARY_DIR} PRIVATE ${OPENSSL_INCLUDE_DIR} ) find_package(Boost 1.58 REQUIRED unit_test_framework) target_link_libraries(test_bitcoin Boost::unit_test_framework rpcclient server) # We need to detect if the BOOST_TEST_DYN_LINK flag is required. set(CMAKE_REQUIRED_LIBRARIES Boost::unit_test_framework) check_cxx_source_compiles(" #define BOOST_TEST_DYN_LINK #define BOOST_TEST_MAIN #include " BOOST_TEST_DYN_LINK) if(BOOST_TEST_DYN_LINK) target_compile_definitions(test_bitcoin PRIVATE BOOST_TEST_DYN_LINK) endif(BOOST_TEST_DYN_LINK) if(BUILD_BITCOIN_WALLET) target_sources(test_bitcoin PRIVATE ../wallet/test/wallet_test_fixture.cpp ../wallet/test/accounting_tests.cpp ../wallet/test/wallet_tests.cpp ../wallet/test/walletdb_tests.cpp ../wallet/test/crypto_tests.cpp ) endif() diff --git a/src/test/amount_tests.cpp b/src/test/amount_tests.cpp index d51c55677..39c3c56cb 100644 --- a/src/test/amount_tests.cpp +++ b/src/test/amount_tests.cpp @@ -1,163 +1,103 @@ // Copyright (c) 2016 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "amount.h" #include "test/test_bitcoin.h" #include #include BOOST_FIXTURE_TEST_SUITE(amount_tests, BasicTestingSetup) static void CheckAmounts(int64_t aval, int64_t bval) { Amount a(aval), b(bval); // Equality BOOST_CHECK_EQUAL(a == b, aval == bval); BOOST_CHECK_EQUAL(b == a, aval == bval); BOOST_CHECK_EQUAL(a != b, aval != bval); BOOST_CHECK_EQUAL(b != a, aval != bval); // Comparison BOOST_CHECK_EQUAL(a < b, aval < bval); BOOST_CHECK_EQUAL(b < a, bval < aval); BOOST_CHECK_EQUAL(a > b, aval > bval); BOOST_CHECK_EQUAL(b > a, bval > aval); BOOST_CHECK_EQUAL(a <= b, aval <= bval); BOOST_CHECK_EQUAL(b <= a, bval <= aval); BOOST_CHECK_EQUAL(a >= b, aval >= bval); BOOST_CHECK_EQUAL(b >= a, bval >= aval); // Unary minus BOOST_CHECK_EQUAL(-a, Amount(-aval)); BOOST_CHECK_EQUAL(-b, Amount(-bval)); // Addition and subtraction. BOOST_CHECK_EQUAL(a + b, b + a); BOOST_CHECK_EQUAL(a + b, Amount(aval + bval)); BOOST_CHECK_EQUAL(a - b, -(b - a)); BOOST_CHECK_EQUAL(a - b, Amount(aval - bval)); // Multiplication BOOST_CHECK_EQUAL(aval * b, bval * a); BOOST_CHECK_EQUAL(aval * b, Amount(aval * bval)); // Division if (b != Amount(0)) { BOOST_CHECK_EQUAL(a / b, aval / bval); BOOST_CHECK_EQUAL(a / bval, Amount(a / b)); } if (a != Amount(0)) { BOOST_CHECK_EQUAL(b / a, bval / aval); BOOST_CHECK_EQUAL(b / aval, Amount(b / a)); } // Modulus if (b != Amount(0)) { BOOST_CHECK_EQUAL(a % b, aval % bval); BOOST_CHECK_EQUAL(a % bval, Amount(a % b)); } if (a != Amount(0)) { BOOST_CHECK_EQUAL(b % a, bval % aval); BOOST_CHECK_EQUAL(b % aval, Amount(b % a)); } // OpAssign Amount v(0); v += a; BOOST_CHECK_EQUAL(v, a); v += b; BOOST_CHECK_EQUAL(v, a + b); v += b; BOOST_CHECK_EQUAL(v, a + 2 * b); v -= 2 * a; BOOST_CHECK_EQUAL(v, 2 * b - a); } BOOST_AUTO_TEST_CASE(AmountTests) { std::array values = {{-23, -1, 0, 1, 2, 3, 42, 99999999}}; for (int64_t i : values) { for (int64_t j : values) { CheckAmounts(i, j); } } BOOST_CHECK_EQUAL(COIN + COIN, 2 * COIN); BOOST_CHECK_EQUAL(2 * COIN + COIN, 3 * COIN); BOOST_CHECK_EQUAL(-1 * COIN + COIN, Amount(0)); BOOST_CHECK_EQUAL(COIN - COIN, Amount(0)); BOOST_CHECK_EQUAL(COIN - 2 * COIN, -1 * COIN); } -BOOST_AUTO_TEST_CASE(GetFeeTest) { - CFeeRate feeRate; - - feeRate = CFeeRate(Amount(0)); - // Must always return 0 - BOOST_CHECK_EQUAL(feeRate.GetFee(0), Amount(0)); - BOOST_CHECK_EQUAL(feeRate.GetFee(1e5), Amount(0)); - - feeRate = CFeeRate(Amount(1000)); - // Must always just return the arg - BOOST_CHECK_EQUAL(feeRate.GetFee(0), Amount(0)); - BOOST_CHECK_EQUAL(feeRate.GetFee(1), Amount(1)); - BOOST_CHECK_EQUAL(feeRate.GetFee(121), Amount(121)); - BOOST_CHECK_EQUAL(feeRate.GetFee(999), Amount(999)); - BOOST_CHECK_EQUAL(feeRate.GetFee(1000), Amount(1000)); - BOOST_CHECK_EQUAL(feeRate.GetFee(9000), Amount(9000)); - - feeRate = CFeeRate(Amount(-1000)); - // Must always just return -1 * arg - BOOST_CHECK_EQUAL(feeRate.GetFee(0), Amount(0)); - BOOST_CHECK_EQUAL(feeRate.GetFee(1), Amount(-1)); - BOOST_CHECK_EQUAL(feeRate.GetFee(121), Amount(-121)); - BOOST_CHECK_EQUAL(feeRate.GetFee(999), Amount(-999)); - BOOST_CHECK_EQUAL(feeRate.GetFee(1000), Amount(-1000)); - BOOST_CHECK_EQUAL(feeRate.GetFee(9000), Amount(-9000)); - - feeRate = CFeeRate(Amount(123)); - // Truncates the result, if not integer - BOOST_CHECK_EQUAL(feeRate.GetFee(0), Amount(0)); - // Special case: returns 1 instead of 0 - BOOST_CHECK_EQUAL(feeRate.GetFee(8), Amount(1)); - BOOST_CHECK_EQUAL(feeRate.GetFee(9), Amount(1)); - BOOST_CHECK_EQUAL(feeRate.GetFee(121), Amount(14)); - BOOST_CHECK_EQUAL(feeRate.GetFee(122), Amount(15)); - BOOST_CHECK_EQUAL(feeRate.GetFee(999), Amount(122)); - BOOST_CHECK_EQUAL(feeRate.GetFee(1000), Amount(123)); - BOOST_CHECK_EQUAL(feeRate.GetFee(9000), Amount(1107)); - - feeRate = CFeeRate(Amount(-123)); - // Truncates the result, if not integer - BOOST_CHECK_EQUAL(feeRate.GetFee(0), Amount(0)); - // Special case: returns -1 instead of 0 - BOOST_CHECK_EQUAL(feeRate.GetFee(8), Amount(-1)); - BOOST_CHECK_EQUAL(feeRate.GetFee(9), Amount(-1)); - - // Check full constructor - // default value - BOOST_CHECK(CFeeRate(Amount(-1), 1000) == CFeeRate(Amount(-1))); - BOOST_CHECK(CFeeRate(Amount(0), 1000) == CFeeRate(Amount(0))); - BOOST_CHECK(CFeeRate(Amount(1), 1000) == CFeeRate(Amount(1))); - // lost precision (can only resolve satoshis per kB) - BOOST_CHECK(CFeeRate(Amount(1), 1001) == CFeeRate(Amount(0))); - BOOST_CHECK(CFeeRate(Amount(2), 1001) == CFeeRate(Amount(1))); - // some more integer checks - BOOST_CHECK(CFeeRate(Amount(26), 789) == CFeeRate(Amount(32))); - BOOST_CHECK(CFeeRate(Amount(27), 789) == CFeeRate(Amount(34))); - // Maximum size in bytes, should not crash - CFeeRate(MAX_MONEY, std::numeric_limits::max() >> 1).GetFeePerK(); -} - BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/amount_tests.cpp b/src/test/feerate_tests.cpp similarity index 55% copy from src/test/amount_tests.cpp copy to src/test/feerate_tests.cpp index d51c55677..63e04c40c 100644 --- a/src/test/amount_tests.cpp +++ b/src/test/feerate_tests.cpp @@ -1,163 +1,74 @@ // Copyright (c) 2016 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "amount.h" #include "test/test_bitcoin.h" #include #include -BOOST_FIXTURE_TEST_SUITE(amount_tests, BasicTestingSetup) - -static void CheckAmounts(int64_t aval, int64_t bval) { - Amount a(aval), b(bval); - - // Equality - BOOST_CHECK_EQUAL(a == b, aval == bval); - BOOST_CHECK_EQUAL(b == a, aval == bval); - - BOOST_CHECK_EQUAL(a != b, aval != bval); - BOOST_CHECK_EQUAL(b != a, aval != bval); - - // Comparison - BOOST_CHECK_EQUAL(a < b, aval < bval); - BOOST_CHECK_EQUAL(b < a, bval < aval); - - BOOST_CHECK_EQUAL(a > b, aval > bval); - BOOST_CHECK_EQUAL(b > a, bval > aval); - - BOOST_CHECK_EQUAL(a <= b, aval <= bval); - BOOST_CHECK_EQUAL(b <= a, bval <= aval); - - BOOST_CHECK_EQUAL(a >= b, aval >= bval); - BOOST_CHECK_EQUAL(b >= a, bval >= aval); - - // Unary minus - BOOST_CHECK_EQUAL(-a, Amount(-aval)); - BOOST_CHECK_EQUAL(-b, Amount(-bval)); - - // Addition and subtraction. - BOOST_CHECK_EQUAL(a + b, b + a); - BOOST_CHECK_EQUAL(a + b, Amount(aval + bval)); - - BOOST_CHECK_EQUAL(a - b, -(b - a)); - BOOST_CHECK_EQUAL(a - b, Amount(aval - bval)); - - // Multiplication - BOOST_CHECK_EQUAL(aval * b, bval * a); - BOOST_CHECK_EQUAL(aval * b, Amount(aval * bval)); - - // Division - if (b != Amount(0)) { - BOOST_CHECK_EQUAL(a / b, aval / bval); - BOOST_CHECK_EQUAL(a / bval, Amount(a / b)); - } - - if (a != Amount(0)) { - BOOST_CHECK_EQUAL(b / a, bval / aval); - BOOST_CHECK_EQUAL(b / aval, Amount(b / a)); - } - - // Modulus - if (b != Amount(0)) { - BOOST_CHECK_EQUAL(a % b, aval % bval); - BOOST_CHECK_EQUAL(a % bval, Amount(a % b)); - } - - if (a != Amount(0)) { - BOOST_CHECK_EQUAL(b % a, bval % aval); - BOOST_CHECK_EQUAL(b % aval, Amount(b % a)); - } - - // OpAssign - Amount v(0); - v += a; - BOOST_CHECK_EQUAL(v, a); - v += b; - BOOST_CHECK_EQUAL(v, a + b); - v += b; - BOOST_CHECK_EQUAL(v, a + 2 * b); - v -= 2 * a; - BOOST_CHECK_EQUAL(v, 2 * b - a); -} - -BOOST_AUTO_TEST_CASE(AmountTests) { - std::array values = {{-23, -1, 0, 1, 2, 3, 42, 99999999}}; - - for (int64_t i : values) { - for (int64_t j : values) { - CheckAmounts(i, j); - } - } - - BOOST_CHECK_EQUAL(COIN + COIN, 2 * COIN); - BOOST_CHECK_EQUAL(2 * COIN + COIN, 3 * COIN); - BOOST_CHECK_EQUAL(-1 * COIN + COIN, Amount(0)); - - BOOST_CHECK_EQUAL(COIN - COIN, Amount(0)); - BOOST_CHECK_EQUAL(COIN - 2 * COIN, -1 * COIN); -} +BOOST_FIXTURE_TEST_SUITE(feerate_tests, BasicTestingSetup) BOOST_AUTO_TEST_CASE(GetFeeTest) { CFeeRate feeRate; feeRate = CFeeRate(Amount(0)); // Must always return 0 BOOST_CHECK_EQUAL(feeRate.GetFee(0), Amount(0)); BOOST_CHECK_EQUAL(feeRate.GetFee(1e5), Amount(0)); feeRate = CFeeRate(Amount(1000)); // Must always just return the arg BOOST_CHECK_EQUAL(feeRate.GetFee(0), Amount(0)); BOOST_CHECK_EQUAL(feeRate.GetFee(1), Amount(1)); BOOST_CHECK_EQUAL(feeRate.GetFee(121), Amount(121)); BOOST_CHECK_EQUAL(feeRate.GetFee(999), Amount(999)); BOOST_CHECK_EQUAL(feeRate.GetFee(1000), Amount(1000)); BOOST_CHECK_EQUAL(feeRate.GetFee(9000), Amount(9000)); feeRate = CFeeRate(Amount(-1000)); // Must always just return -1 * arg BOOST_CHECK_EQUAL(feeRate.GetFee(0), Amount(0)); BOOST_CHECK_EQUAL(feeRate.GetFee(1), Amount(-1)); BOOST_CHECK_EQUAL(feeRate.GetFee(121), Amount(-121)); BOOST_CHECK_EQUAL(feeRate.GetFee(999), Amount(-999)); BOOST_CHECK_EQUAL(feeRate.GetFee(1000), Amount(-1000)); BOOST_CHECK_EQUAL(feeRate.GetFee(9000), Amount(-9000)); feeRate = CFeeRate(Amount(123)); // Truncates the result, if not integer BOOST_CHECK_EQUAL(feeRate.GetFee(0), Amount(0)); // Special case: returns 1 instead of 0 BOOST_CHECK_EQUAL(feeRate.GetFee(8), Amount(1)); BOOST_CHECK_EQUAL(feeRate.GetFee(9), Amount(1)); BOOST_CHECK_EQUAL(feeRate.GetFee(121), Amount(14)); BOOST_CHECK_EQUAL(feeRate.GetFee(122), Amount(15)); BOOST_CHECK_EQUAL(feeRate.GetFee(999), Amount(122)); BOOST_CHECK_EQUAL(feeRate.GetFee(1000), Amount(123)); BOOST_CHECK_EQUAL(feeRate.GetFee(9000), Amount(1107)); feeRate = CFeeRate(Amount(-123)); // Truncates the result, if not integer BOOST_CHECK_EQUAL(feeRate.GetFee(0), Amount(0)); // Special case: returns -1 instead of 0 BOOST_CHECK_EQUAL(feeRate.GetFee(8), Amount(-1)); BOOST_CHECK_EQUAL(feeRate.GetFee(9), Amount(-1)); // Check full constructor // default value BOOST_CHECK(CFeeRate(Amount(-1), 1000) == CFeeRate(Amount(-1))); BOOST_CHECK(CFeeRate(Amount(0), 1000) == CFeeRate(Amount(0))); BOOST_CHECK(CFeeRate(Amount(1), 1000) == CFeeRate(Amount(1))); // lost precision (can only resolve satoshis per kB) BOOST_CHECK(CFeeRate(Amount(1), 1001) == CFeeRate(Amount(0))); BOOST_CHECK(CFeeRate(Amount(2), 1001) == CFeeRate(Amount(1))); // some more integer checks BOOST_CHECK(CFeeRate(Amount(26), 789) == CFeeRate(Amount(32))); BOOST_CHECK(CFeeRate(Amount(27), 789) == CFeeRate(Amount(34))); // Maximum size in bytes, should not crash CFeeRate(MAX_MONEY, std::numeric_limits::max() >> 1).GetFeePerK(); } BOOST_AUTO_TEST_SUITE_END()