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