@@ -17,26 +17,43 @@ BOOST_AUTO_TEST_CASE(feefrac_operators)
1717 FeeFrac empty{0 , 0 };
1818 FeeFrac zero_fee{0 , 1 }; // zero-fee allowed
1919
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 );
20+ BOOST_CHECK_EQUAL (zero_fee.EvaluateFeeDown (0 ), 0 );
21+ BOOST_CHECK_EQUAL (zero_fee.EvaluateFeeDown (1 ), 0 );
22+ BOOST_CHECK_EQUAL (zero_fee.EvaluateFeeDown (1000000 ), 0 );
23+ BOOST_CHECK_EQUAL (zero_fee.EvaluateFeeDown (0x7fffffff ), 0 );
24+ BOOST_CHECK_EQUAL (zero_fee.EvaluateFeeUp (0 ), 0 );
25+ BOOST_CHECK_EQUAL (zero_fee.EvaluateFeeUp (1 ), 0 );
26+ BOOST_CHECK_EQUAL (zero_fee.EvaluateFeeUp (1000000 ), 0 );
27+ BOOST_CHECK_EQUAL (zero_fee.EvaluateFeeUp (0x7fffffff ), 0 );
28+
29+ BOOST_CHECK_EQUAL (p1.EvaluateFeeDown (0 ), 0 );
30+ BOOST_CHECK_EQUAL (p1.EvaluateFeeDown (1 ), 10 );
31+ BOOST_CHECK_EQUAL (p1.EvaluateFeeDown (100000000 ), 1000000000 );
32+ BOOST_CHECK_EQUAL (p1.EvaluateFeeDown (0x7fffffff ), int64_t (0x7fffffff ) * 10 );
33+ BOOST_CHECK_EQUAL (p1.EvaluateFeeUp (0 ), 0 );
34+ BOOST_CHECK_EQUAL (p1.EvaluateFeeUp (1 ), 10 );
35+ BOOST_CHECK_EQUAL (p1.EvaluateFeeUp (100000000 ), 1000000000 );
36+ BOOST_CHECK_EQUAL (p1.EvaluateFeeUp (0x7fffffff ), int64_t (0x7fffffff ) * 10 );
2937
3038 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 );
39+ BOOST_CHECK_EQUAL (neg.EvaluateFeeDown (0 ), 0 );
40+ BOOST_CHECK_EQUAL (neg.EvaluateFeeDown (1 ), -11 );
41+ BOOST_CHECK_EQUAL (neg.EvaluateFeeDown (2 ), -21 );
42+ BOOST_CHECK_EQUAL (neg.EvaluateFeeDown (3 ), -31 );
43+ BOOST_CHECK_EQUAL (neg.EvaluateFeeDown (100 ), -1001 );
44+ BOOST_CHECK_EQUAL (neg.EvaluateFeeDown (101 ), -1012 );
45+ BOOST_CHECK_EQUAL (neg.EvaluateFeeDown (100000000 ), -1001000000 );
46+ BOOST_CHECK_EQUAL (neg.EvaluateFeeDown (100000001 ), -1001000011 );
47+ BOOST_CHECK_EQUAL (neg.EvaluateFeeDown (0x7fffffff ), -21496311307 );
48+ BOOST_CHECK_EQUAL (neg.EvaluateFeeUp (0 ), 0 );
49+ BOOST_CHECK_EQUAL (neg.EvaluateFeeUp (1 ), -10 );
50+ BOOST_CHECK_EQUAL (neg.EvaluateFeeUp (2 ), -20 );
51+ BOOST_CHECK_EQUAL (neg.EvaluateFeeUp (3 ), -30 );
52+ BOOST_CHECK_EQUAL (neg.EvaluateFeeUp (100 ), -1001 );
53+ BOOST_CHECK_EQUAL (neg.EvaluateFeeUp (101 ), -1011 );
54+ BOOST_CHECK_EQUAL (neg.EvaluateFeeUp (100000000 ), -1001000000 );
55+ BOOST_CHECK_EQUAL (neg.EvaluateFeeUp (100000001 ), -1001000010 );
56+ BOOST_CHECK_EQUAL (neg.EvaluateFeeUp (0x7fffffff ), -21496311306 );
4057
4158 BOOST_CHECK (empty == FeeFrac{}); // same as no-args
4259
@@ -88,15 +105,22 @@ BOOST_AUTO_TEST_CASE(feefrac_operators)
88105 BOOST_CHECK (oversized_1 << oversized_2);
89106 BOOST_CHECK (oversized_1 != oversized_2);
90107
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 );
108+ BOOST_CHECK_EQUAL (oversized_1.EvaluateFeeDown (0 ), 0 );
109+ BOOST_CHECK_EQUAL (oversized_1.EvaluateFeeDown (1 ), 1152921 );
110+ BOOST_CHECK_EQUAL (oversized_1.EvaluateFeeDown (2 ), 2305843 );
111+ BOOST_CHECK_EQUAL (oversized_1.EvaluateFeeDown (1548031267 ), 1784758530396540 );
112+ BOOST_CHECK_EQUAL (oversized_1.EvaluateFeeUp (0 ), 0 );
113+ BOOST_CHECK_EQUAL (oversized_1.EvaluateFeeUp (1 ), 1152922 );
114+ BOOST_CHECK_EQUAL (oversized_1.EvaluateFeeUp (2 ), 2305843 );
115+ BOOST_CHECK_EQUAL (oversized_1.EvaluateFeeUp (1548031267 ), 1784758530396541 );
116+
117+ // Test cases on the threshold where FeeFrac::Evaluate start using Mul/Div.
118+ BOOST_CHECK_EQUAL (FeeFrac (0x1ffffffff , 123456789 ).EvaluateFeeDown (98765432 ), 6871947728 );
119+ BOOST_CHECK_EQUAL (FeeFrac (0x200000000 , 123456789 ).EvaluateFeeDown (98765432 ), 6871947729 );
120+ BOOST_CHECK_EQUAL (FeeFrac (0x200000001 , 123456789 ).EvaluateFeeDown (98765432 ), 6871947730 );
121+ BOOST_CHECK_EQUAL (FeeFrac (0x1ffffffff , 123456789 ).EvaluateFeeUp (98765432 ), 6871947729 );
122+ BOOST_CHECK_EQUAL (FeeFrac (0x200000000 , 123456789 ).EvaluateFeeUp (98765432 ), 6871947730 );
123+ BOOST_CHECK_EQUAL (FeeFrac (0x200000001 , 123456789 ).EvaluateFeeUp (98765432 ), 6871947731 );
100124
101125 // Tests paths that use double arithmetic
102126 FeeFrac busted{(static_cast <int64_t >(INT32_MAX)) + 1 , INT32_MAX};
@@ -108,12 +132,18 @@ BOOST_AUTO_TEST_CASE(feefrac_operators)
108132 BOOST_CHECK (max_fee <= max_fee);
109133 BOOST_CHECK (max_fee >= max_fee);
110134
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 );
135+ BOOST_CHECK_EQUAL (max_fee.EvaluateFeeDown (0 ), 0 );
136+ BOOST_CHECK_EQUAL (max_fee.EvaluateFeeDown (1 ), 977888 );
137+ BOOST_CHECK_EQUAL (max_fee.EvaluateFeeDown (2 ), 1955777 );
138+ BOOST_CHECK_EQUAL (max_fee.EvaluateFeeDown (3 ), 2933666 );
139+ BOOST_CHECK_EQUAL (max_fee.EvaluateFeeDown (1256796054 ), 1229006664189047 );
140+ BOOST_CHECK_EQUAL (max_fee.EvaluateFeeDown (INT32_MAX), 2100000000000000 );
141+ BOOST_CHECK_EQUAL (max_fee.EvaluateFeeUp (0 ), 0 );
142+ BOOST_CHECK_EQUAL (max_fee.EvaluateFeeUp (1 ), 977889 );
143+ BOOST_CHECK_EQUAL (max_fee.EvaluateFeeUp (2 ), 1955778 );
144+ BOOST_CHECK_EQUAL (max_fee.EvaluateFeeUp (3 ), 2933667 );
145+ BOOST_CHECK_EQUAL (max_fee.EvaluateFeeUp (1256796054 ), 1229006664189048 );
146+ BOOST_CHECK_EQUAL (max_fee.EvaluateFeeUp (INT32_MAX), 2100000000000000 );
117147
118148 FeeFrac max_fee2{1 , 1 };
119149 BOOST_CHECK (max_fee >= max_fee2);
0 commit comments