Bitcoin Core 32.99.0
P2P Digital Currency
Loading...
Searching...
No Matches
amount_tests.cpp
Go to the documentation of this file.
1// Copyright (c) 2016-present The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#include <consensus/amount.h>
6#include <policy/feerate.h>
7
8#include <limits>
9
10#include <boost/test/unit_test.hpp>
11
13
22
24{
26
27 feeRate = CFeeRate(0);
28 // Must always return 0
29 BOOST_CHECK_EQUAL(feeRate.GetFee(0), CAmount(0));
30 BOOST_CHECK_EQUAL(feeRate.GetFee(1e5), CAmount(0));
31 BOOST_CHECK_EQUAL(CFeeRate(0, 0).GetFeePerK(), CAmount{0});
32 BOOST_CHECK_EQUAL(CFeeRate(CAmount{5}, 0).GetFeePerK(), CAmount{0});
33
34 feeRate = CFeeRate(1000);
35 // Must always just return the arg
36 BOOST_CHECK_EQUAL(feeRate.GetFee(0), CAmount(0));
37 BOOST_CHECK_EQUAL(feeRate.GetFee(1), CAmount(1));
38 BOOST_CHECK_EQUAL(feeRate.GetFee(121), CAmount(121));
39 BOOST_CHECK_EQUAL(feeRate.GetFee(999), CAmount(999));
42
43 feeRate = CFeeRate(-1000);
44 // Must always just return -1 * arg
45 BOOST_CHECK_EQUAL(feeRate.GetFee(0), CAmount(0));
46 BOOST_CHECK_EQUAL(feeRate.GetFee(1), CAmount(-1));
47 BOOST_CHECK_EQUAL(feeRate.GetFee(121), CAmount(-121));
48 BOOST_CHECK_EQUAL(feeRate.GetFee(999), CAmount(-999));
51
52 feeRate = CFeeRate(123);
53 // Rounds up the result, if not integer
54 BOOST_CHECK_EQUAL(feeRate.GetFee(0), CAmount(0));
55 BOOST_CHECK_EQUAL(feeRate.GetFee(8), CAmount(1)); // Special case: returns 1 instead of 0
56 BOOST_CHECK_EQUAL(feeRate.GetFee(9), CAmount(2));
57 BOOST_CHECK_EQUAL(feeRate.GetFee(121), CAmount(15));
58 BOOST_CHECK_EQUAL(feeRate.GetFee(122), CAmount(16));
59 BOOST_CHECK_EQUAL(feeRate.GetFee(999), CAmount(123));
60 BOOST_CHECK_EQUAL(feeRate.GetFee(1e3), CAmount(123));
61 BOOST_CHECK_EQUAL(feeRate.GetFee(9e3), CAmount(1107));
62
63 feeRate = CFeeRate(-123);
64 // Truncates the result, if not integer
65 BOOST_CHECK_EQUAL(feeRate.GetFee(0), CAmount(0));
66 BOOST_CHECK_EQUAL(feeRate.GetFee(8), CAmount(-1)); // Special case: returns -1 instead of 0
67 BOOST_CHECK_EQUAL(feeRate.GetFee(9), CAmount(-1));
68
69 // check alternate constructor
70 feeRate = CFeeRate(1000);
72 BOOST_CHECK_EQUAL(feeRate.GetFee(100), altFeeRate.GetFee(100));
73
74 // Check full constructor
75 BOOST_CHECK(CFeeRate(CAmount(-1), 0) == CFeeRate(0));
78 BOOST_CHECK(CFeeRate(CAmount(1), -1000) == CFeeRate(0));
79 // default value
80 BOOST_CHECK(CFeeRate(CAmount(-1), 1000) == CFeeRate(-1));
81 BOOST_CHECK(CFeeRate(CAmount(0), 1000) == CFeeRate(0));
82 BOOST_CHECK(CFeeRate(CAmount(1), 1000) == CFeeRate(1));
83 // Previously, precision was limited to three decimal digits
84 // due to only supporting satoshis per kB, so CFeeRate(CAmount(1), 1001) was equal to CFeeRate(0)
85 // Since #32750, higher precision is maintained.
86 BOOST_CHECK(CFeeRate(CAmount(1), 1001) > CFeeRate(0));
87 BOOST_CHECK(CFeeRate(CAmount(1), 1001) < CFeeRate(1));
88 BOOST_CHECK(CFeeRate(CAmount(2), 1001) > CFeeRate(1));
89 BOOST_CHECK(CFeeRate(CAmount(2), 1001) < CFeeRate(2));
90 // some more integer checks
91 BOOST_CHECK(CFeeRate(CAmount(26), 789) > CFeeRate(32));
92 BOOST_CHECK(CFeeRate(CAmount(26), 789) < CFeeRate(33));
93 BOOST_CHECK(CFeeRate(CAmount(27), 789) > CFeeRate(34));
94 BOOST_CHECK(CFeeRate(CAmount(27), 789) < CFeeRate(35));
95 // Maximum size in bytes, should not crash
96 CFeeRate(MAX_MONEY, std::numeric_limits<int32_t>::max()).GetFeePerK();
97
98 // Adding to a zero size fee rate should not crash
99 CFeeRate empty_rate(0, 0);
100 empty_rate += CFeeRate(1, 1);
102
103 // check multiplication operator
104 // check multiplying by zero
105 feeRate = CFeeRate(1000);
106 BOOST_CHECK(0 * feeRate == CFeeRate(0));
107 BOOST_CHECK(feeRate * 0 == CFeeRate(0));
108 // check multiplying by a positive integer
109 BOOST_CHECK(3 * feeRate == CFeeRate(3000));
110 BOOST_CHECK(feeRate * 3 == CFeeRate(3000));
111 // check multiplying by a negative integer
112 BOOST_CHECK(-3 * feeRate == CFeeRate(-3000));
113 BOOST_CHECK(feeRate * -3 == CFeeRate(-3000));
114 // check commutativity
115 BOOST_CHECK(2 * feeRate == feeRate * 2);
116 // check with large numbers
117 int largeNumber = 1000000;
119 // check boundary values
120 int maxInt = std::numeric_limits<int>::max();
122 BOOST_CHECK(feeRate * 2 == CFeeRate(static_cast<int64_t>(maxInt) * 2));
123 BOOST_CHECK(2 * feeRate == CFeeRate(static_cast<int64_t>(maxInt) * 2));
124 // check with zero fee rate
125 feeRate = CFeeRate(0);
126 BOOST_CHECK(feeRate * 5 == CFeeRate(0));
127 BOOST_CHECK(5 * feeRate == CFeeRate(0));
128}
129
131{
132 CFeeRate a, b;
133 a = CFeeRate(1);
134 b = CFeeRate(2);
135 BOOST_CHECK(a < b);
136 BOOST_CHECK(b > a);
137 BOOST_CHECK(a == a);
138 BOOST_CHECK(a <= b);
139 BOOST_CHECK(a <= a);
140 BOOST_CHECK(b >= a);
141 BOOST_CHECK(b >= b);
142 // a should be 0.00000002 BTC/kvB now
143 a += a;
144 BOOST_CHECK(a == b);
145}
146
148{
150 feeRate = CFeeRate(1);
151 BOOST_CHECK_EQUAL(feeRate.ToString(), "0.00000001 BTC/kvB");
152 BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::BTC_KVB), "0.00000001 BTC/kvB");
153 BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::SAT_VB), "0.001 sat/vB");
154
155 feeRate = CFeeRate(0);
156 BOOST_CHECK_EQUAL(feeRate.ToString(), "0.00000000 BTC/kvB");
157 BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::BTC_KVB), "0.00000000 BTC/kvB");
158 BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::SAT_VB), "0.000 sat/vB");
159
160 feeRate = CFeeRate(-1);
161 BOOST_CHECK_EQUAL(feeRate.ToString(), "-0.00000001 BTC/kvB");
162 BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::BTC_KVB), "-0.00000001 BTC/kvB");
163 BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::SAT_VB), "-0.001 sat/vB");
164
165 feeRate = CFeeRate(-1000);
166 BOOST_CHECK_EQUAL(feeRate.ToString(), "-0.00001000 BTC/kvB");
167 BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::SAT_VB), "-1.000 sat/vB");
168
169 feeRate = CFeeRate(-COIN - 1);
170 BOOST_CHECK_EQUAL(feeRate.ToString(), "-1.00000001 BTC/kvB");
171 BOOST_CHECK_EQUAL(feeRate.ToString(FeeRateFormat::SAT_VB), "-100000.001 sat/vB");
172}
173
constexpr CAmount MAX_MONEY
No amount larger than this (in satoshi) is valid.
Definition amount.h:26
bool MoneyRange(const CAmount &nValue)
Definition amount.h:27
int64_t CAmount
Amount in satoshis (Can be negative)
Definition amount.h:12
constexpr CAmount COIN
The amount of satoshis in one BTC.
Definition amount.h:15
BOOST_AUTO_TEST_CASE(MoneyRangeTest)
Fee rate in satoshis per virtualbyte: CAmount / vB the feerate is represented internally as FeeFrac.
Definition feerate.h:32
CAmount GetFeePerK() const
Return the fee in satoshis for a vsize of 1000 vbytes.
Definition feerate.cpp:21
BOOST_AUTO_TEST_SUITE_END()
@ BTC_KVB
Use BTC/kvB fee rate unit.
@ SAT_VB
Use sat/vB fee rate unit.
#define BOOST_CHECK_EQUAL(v1, v2)
Definition object.cpp:17
#define BOOST_CHECK(expr)
Definition object.cpp:16
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.
Definition time.h:82