rippled
Loading...
Searching...
No Matches
tests/libxrpl/basics/mulDiv.cpp
1#include <xrpl/basics/mulDiv.h>
2
3#include <doctest/doctest.h>
4
5#include <cstdint>
6#include <limits>
7
8using namespace ripple;
9
10TEST_CASE("mulDiv")
11{
14
15 auto result = mulDiv(85, 20, 5);
16 REQUIRE(result);
17 CHECK(*result == 340);
18 result = mulDiv(20, 85, 5);
19 REQUIRE(result);
20 CHECK(*result == 340);
21
22 result = mulDiv(0, max - 1, max - 3);
23 REQUIRE(result);
24 CHECK(*result == 0);
25 result = mulDiv(max - 1, 0, max - 3);
26 REQUIRE(result);
27 CHECK(*result == 0);
28
29 result = mulDiv(max, 2, max / 2);
30 REQUIRE(result);
31 CHECK(*result == 4);
32 result = mulDiv(max, 1000, max / 1000);
33 REQUIRE(result);
34 CHECK(*result == 1000000);
35 result = mulDiv(max, 1000, max / 1001);
36 REQUIRE(result);
37 CHECK(*result == 1001000);
38 result = mulDiv(max32 + 1, max32 + 1, 5);
39 REQUIRE(result);
40 CHECK(*result == 3689348814741910323);
41
42 // Overflow
43 result = mulDiv(max - 1, max - 2, 5);
44 CHECK(!result);
45}
T max(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
std::optional< std::uint64_t > mulDiv(std::uint64_t value, std::uint64_t mul, std::uint64_t div)
Return value*mul/div accurately.