Merge #7705: [amount] Add tests and make GetFee() monotonic
fad13b1 [amount] Preempt issues with negative fee rates (MarcoFalke) faf756a [amount] Make GetFee() monotonic (MarcoFalke) fab6880 [qa] Add amount tests (MarcoFalke)
This commit is contained in:
parent
721171ee39
commit
8fde2fd5fa
@ -38,6 +38,7 @@ BITCOIN_TESTS =\
|
|||||||
test/scriptnum10.h \
|
test/scriptnum10.h \
|
||||||
test/addrman_tests.cpp \
|
test/addrman_tests.cpp \
|
||||||
test/alert_tests.cpp \
|
test/alert_tests.cpp \
|
||||||
|
test/amount_tests.cpp \
|
||||||
test/allocator_tests.cpp \
|
test/allocator_tests.cpp \
|
||||||
test/base32_tests.cpp \
|
test/base32_tests.cpp \
|
||||||
test/base58_tests.cpp \
|
test/base58_tests.cpp \
|
||||||
|
@ -19,10 +19,10 @@ CFeeRate::CFeeRate(const CAmount& nFeePaid, size_t nSize)
|
|||||||
|
|
||||||
CAmount CFeeRate::GetFee(size_t nSize) const
|
CAmount CFeeRate::GetFee(size_t nSize) const
|
||||||
{
|
{
|
||||||
CAmount nFee = nSatoshisPerK*nSize / 1000;
|
CAmount nFee = nSatoshisPerK * nSize / 1000;
|
||||||
|
|
||||||
if (nFee == 0 && nSatoshisPerK > 0)
|
if (nFee == 0 && nSize != 0 && nSatoshisPerK > 0)
|
||||||
nFee = nSatoshisPerK;
|
nFee = CAmount(1);
|
||||||
|
|
||||||
return nFee;
|
return nFee;
|
||||||
}
|
}
|
||||||
|
12
src/amount.h
12
src/amount.h
@ -42,10 +42,14 @@ public:
|
|||||||
explicit CFeeRate(const CAmount& _nSatoshisPerK): nSatoshisPerK(_nSatoshisPerK) { }
|
explicit CFeeRate(const CAmount& _nSatoshisPerK): nSatoshisPerK(_nSatoshisPerK) { }
|
||||||
CFeeRate(const CAmount& nFeePaid, size_t nSize);
|
CFeeRate(const CAmount& nFeePaid, size_t nSize);
|
||||||
CFeeRate(const CFeeRate& other) { nSatoshisPerK = other.nSatoshisPerK; }
|
CFeeRate(const CFeeRate& other) { nSatoshisPerK = other.nSatoshisPerK; }
|
||||||
|
/**
|
||||||
CAmount GetFee(size_t size) const; // unit returned is satoshis
|
* Return the fee in satoshis for the given size in bytes.
|
||||||
CAmount GetFeePerK() const { return GetFee(1000); } // satoshis-per-1000-bytes
|
*/
|
||||||
|
CAmount GetFee(size_t size) const;
|
||||||
|
/**
|
||||||
|
* Return the fee in satoshis for a size of 1000 bytes
|
||||||
|
*/
|
||||||
|
CAmount GetFeePerK() const { return GetFee(1000); }
|
||||||
friend bool operator<(const CFeeRate& a, const CFeeRate& b) { return a.nSatoshisPerK < b.nSatoshisPerK; }
|
friend bool operator<(const CFeeRate& a, const CFeeRate& b) { return a.nSatoshisPerK < b.nSatoshisPerK; }
|
||||||
friend bool operator>(const CFeeRate& a, const CFeeRate& b) { return a.nSatoshisPerK > b.nSatoshisPerK; }
|
friend bool operator>(const CFeeRate& a, const CFeeRate& b) { return a.nSatoshisPerK > b.nSatoshisPerK; }
|
||||||
friend bool operator==(const CFeeRate& a, const CFeeRate& b) { return a.nSatoshisPerK == b.nSatoshisPerK; }
|
friend bool operator==(const CFeeRate& a, const CFeeRate& b) { return a.nSatoshisPerK == b.nSatoshisPerK; }
|
||||||
|
42
src/test/amount_tests.cpp
Normal file
42
src/test/amount_tests.cpp
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
// 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_dash.h"
|
||||||
|
|
||||||
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
|
BOOST_FIXTURE_TEST_SUITE(amount_tests, BasicTestingSetup)
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(GetFeeTest)
|
||||||
|
{
|
||||||
|
CFeeRate feeRate;
|
||||||
|
|
||||||
|
feeRate = CFeeRate(0);
|
||||||
|
// Must always return 0
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(0), 0);
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(1e5), 0);
|
||||||
|
|
||||||
|
feeRate = CFeeRate(1000);
|
||||||
|
// Must always just return the arg
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(0), 0);
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(1), 1);
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(121), 121);
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(999), 999);
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(1e3), 1e3);
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(9e3), 9e3);
|
||||||
|
|
||||||
|
feeRate = CFeeRate(123);
|
||||||
|
// Truncates the result, if not integer
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(0), 0);
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(8), 1); // Special case: returns 1 instead of 0
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(9), 1);
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(121), 14);
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(122), 15);
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(999), 122);
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(1e3), 123);
|
||||||
|
BOOST_CHECK_EQUAL(feeRate.GetFee(9e3), 1107);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_SUITE_END()
|
Loading…
Reference in New Issue
Block a user