@@ -15,7 +15,28 @@ BOOST_AUTO_TEST_CASE(feefrac_operators)
1515 FeeFrac sum{1500 , 400 };
1616 FeeFrac diff{500 , -200 };
1717 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 );
1940
2041 BOOST_CHECK (empty == FeeFrac{}); // same as no-args
2142
@@ -67,6 +88,16 @@ BOOST_AUTO_TEST_CASE(feefrac_operators)
6788 BOOST_CHECK (oversized_1 << oversized_2);
6889 BOOST_CHECK (oversized_1 != oversized_2);
6990
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+
70101 // Tests paths that use double arithmetic
71102 FeeFrac busted{(static_cast <int64_t >(INT32_MAX)) + 1 , INT32_MAX};
72103 BOOST_CHECK (!(busted < busted));
@@ -77,6 +108,13 @@ BOOST_AUTO_TEST_CASE(feefrac_operators)
77108 BOOST_CHECK (max_fee <= max_fee);
78109 BOOST_CHECK (max_fee >= max_fee);
79110
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+
80118 FeeFrac max_fee2{1 , 1 };
81119 BOOST_CHECK (max_fee >= max_fee2);
82120
0 commit comments