@@ -15,7 +15,28 @@ BOOST_AUTO_TEST_CASE(feefrac_operators)
15
15
FeeFrac sum{1500 , 400 };
16
16
FeeFrac diff{500 , -200 };
17
17
FeeFrac empty{0 , 0 };
18
- [[maybe_unused]] FeeFrac zero_fee{0 , 1 }; // zero-fee allowed
18
+ FeeFrac zero_fee{0 , 1 }; // zero-fee allowed
19
+
20
+ BOOST_CHECK_EQUAL (zero_fee.EvaluateFee (0 ), 0 );
21
+ BOOST_CHECK_EQUAL (zero_fee.EvaluateFee (1 ), 0 );
22
+ BOOST_CHECK_EQUAL (zero_fee.EvaluateFee (1000000 ), 0 );
23
+ BOOST_CHECK_EQUAL (zero_fee.EvaluateFee (0x7fffffff ), 0 );
24
+
25
+ BOOST_CHECK_EQUAL (p1.EvaluateFee (0 ), 0 );
26
+ BOOST_CHECK_EQUAL (p1.EvaluateFee (1 ), 10 );
27
+ BOOST_CHECK_EQUAL (p1.EvaluateFee (100000000 ), 1000000000 );
28
+ BOOST_CHECK_EQUAL (p1.EvaluateFee (0x7fffffff ), int64_t (0x7fffffff ) * 10 );
29
+
30
+ FeeFrac neg{-1001 , 100 };
31
+ BOOST_CHECK_EQUAL (neg.EvaluateFee (0 ), 0 );
32
+ BOOST_CHECK_EQUAL (neg.EvaluateFee (1 ), -11 );
33
+ BOOST_CHECK_EQUAL (neg.EvaluateFee (2 ), -21 );
34
+ BOOST_CHECK_EQUAL (neg.EvaluateFee (3 ), -31 );
35
+ BOOST_CHECK_EQUAL (neg.EvaluateFee (100 ), -1001 );
36
+ BOOST_CHECK_EQUAL (neg.EvaluateFee (101 ), -1012 );
37
+ BOOST_CHECK_EQUAL (neg.EvaluateFee (100000000 ), -1001000000 );
38
+ BOOST_CHECK_EQUAL (neg.EvaluateFee (100000001 ), -1001000011 );
39
+ BOOST_CHECK_EQUAL (neg.EvaluateFee (0x7fffffff ), -21496311307 );
19
40
20
41
BOOST_CHECK (empty == FeeFrac{}); // same as no-args
21
42
@@ -67,6 +88,16 @@ BOOST_AUTO_TEST_CASE(feefrac_operators)
67
88
BOOST_CHECK (oversized_1 << oversized_2);
68
89
BOOST_CHECK (oversized_1 != oversized_2);
69
90
91
+ BOOST_CHECK_EQUAL (oversized_1.EvaluateFee (0 ), 0 );
92
+ BOOST_CHECK_EQUAL (oversized_1.EvaluateFee (1 ), 1152921 );
93
+ BOOST_CHECK_EQUAL (oversized_1.EvaluateFee (2 ), 2305843 );
94
+ BOOST_CHECK_EQUAL (oversized_1.EvaluateFee (1548031267 ), 1784758530396540 );
95
+
96
+ // Test cases on the threshold where FeeFrac::EvaluateFee start using Mul/Div.
97
+ BOOST_CHECK_EQUAL (FeeFrac (0x1ffffffff , 123456789 ).EvaluateFee (98765432 ), 6871947728 );
98
+ BOOST_CHECK_EQUAL (FeeFrac (0x200000000 , 123456789 ).EvaluateFee (98765432 ), 6871947729 );
99
+ BOOST_CHECK_EQUAL (FeeFrac (0x200000001 , 123456789 ).EvaluateFee (98765432 ), 6871947730 );
100
+
70
101
// Tests paths that use double arithmetic
71
102
FeeFrac busted{(static_cast <int64_t >(INT32_MAX)) + 1 , INT32_MAX};
72
103
BOOST_CHECK (!(busted < busted));
@@ -77,6 +108,13 @@ BOOST_AUTO_TEST_CASE(feefrac_operators)
77
108
BOOST_CHECK (max_fee <= max_fee);
78
109
BOOST_CHECK (max_fee >= max_fee);
79
110
111
+ BOOST_CHECK_EQUAL (max_fee.EvaluateFee (0 ), 0 );
112
+ BOOST_CHECK_EQUAL (max_fee.EvaluateFee (1 ), 977888 );
113
+ BOOST_CHECK_EQUAL (max_fee.EvaluateFee (2 ), 1955777 );
114
+ BOOST_CHECK_EQUAL (max_fee.EvaluateFee (3 ), 2933666 );
115
+ BOOST_CHECK_EQUAL (max_fee.EvaluateFee (1256796054 ), 1229006664189047 );
116
+ BOOST_CHECK_EQUAL (max_fee.EvaluateFee (INT32_MAX), 2100000000000000 );
117
+
80
118
FeeFrac max_fee2{1 , 1 };
81
119
BOOST_CHECK (max_fee >= max_fee2);
82
120
0 commit comments