Skip to content

Commit c9ad49f

Browse files
committed
Step 2.5: Run the STNumber tests using both mantissa sizes
- Nothing really needed to be changed in the tests, but I added a couple of test cases for the min and max int64.
1 parent 857eaff commit c9ad49f

File tree

3 files changed

+60
-24
lines changed

3 files changed

+60
-24
lines changed

include/xrpl/basics/Number.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,20 @@ squelch(Number const& x, Number const& limit) noexcept
509509
return x;
510510
}
511511

512+
inline std::string
513+
to_string(MantissaRange::mantissa_scale const& scale)
514+
{
515+
switch (scale)
516+
{
517+
case MantissaRange::small:
518+
return "small";
519+
case MantissaRange::large:
520+
return "large";
521+
default:
522+
throw std::runtime_error("Bad scale");
523+
}
524+
}
525+
512526
class saveNumberRoundMode
513527
{
514528
Number::rounding_mode mode_;

src/test/basics/Number_test.cpp

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,6 @@
99

1010
namespace ripple {
1111

12-
std::string
13-
to_string(MantissaRange::mantissa_scale const& scale)
14-
{
15-
switch (scale)
16-
{
17-
case MantissaRange::small:
18-
return "small";
19-
case MantissaRange::large:
20-
return "large";
21-
default:
22-
throw std::runtime_error("Bad scale");
23-
}
24-
}
25-
2612
class Number_test : public beast::unit_test::suite
2713
{
2814
public:

src/test/protocol/STNumber_test.cpp

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,8 @@ struct STNumber_test : public beast::unit_test::suite
2929
}
3030

3131
void
32-
run() override
32+
doRun()
3333
{
34-
static_assert(!std::is_convertible_v<STNumber*, Number*>);
35-
3634
{
3735
STNumber const stnum{sfNumber};
3836
BEAST_EXPECT(stnum.getSType() == STI_NUMBER);
@@ -127,6 +125,38 @@ struct STNumber_test : public beast::unit_test::suite
127125
BEAST_EXPECT(
128126
numberFromJson(sfNumber, "-0.000e6") == STNumber(sfNumber, 0));
129127

128+
{
129+
NumberRoundModeGuard mg(Number::towards_zero);
130+
// maxint64 9,223,372,036,854,775,807
131+
auto const maxInt =
132+
std::to_string(std::numeric_limits<std::int64_t>::max());
133+
// minint64 -9,223,372,036,854,775,808
134+
auto const minInt =
135+
std::to_string(std::numeric_limits<std::int64_t>::min());
136+
if (Number::getMantissaScale() == MantissaRange::small)
137+
{
138+
BEAST_EXPECT(
139+
numberFromJson(sfNumber, maxInt) ==
140+
STNumber(sfNumber, Number{9'223'372'036'854'775, 3}));
141+
BEAST_EXPECT(
142+
numberFromJson(sfNumber, minInt) ==
143+
STNumber(sfNumber, Number{-9'223'372'036'854'775, 3}));
144+
}
145+
else
146+
{
147+
BEAST_EXPECT(
148+
numberFromJson(sfNumber, maxInt) ==
149+
STNumber(
150+
sfNumber, Number{9'223'372'036'854'775'807, 0}));
151+
/*
152+
BEAST_EXPECT(
153+
numberFromJson(sfNumber, minInt) ==
154+
STNumber(
155+
sfNumber, Number{-9'223'372'036'854'775'807, 0}));
156+
*/
157+
}
158+
}
159+
130160
constexpr auto imin = std::numeric_limits<int>::min();
131161
BEAST_EXPECT(
132162
numberFromJson(sfNumber, imin) ==
@@ -279,15 +309,21 @@ struct STNumber_test : public beast::unit_test::suite
279309
}
280310
}
281311
}
312+
313+
void
314+
run() override
315+
{
316+
static_assert(!std::is_convertible_v<STNumber*, Number*>);
317+
318+
for (auto const scale : {MantissaRange::small, MantissaRange::large})
319+
{
320+
NumberMantissaScaleGuard sg(scale);
321+
testcase << to_string(Number::getMantissaScale());
322+
doRun();
323+
}
324+
}
282325
};
283326

284327
BEAST_DEFINE_TESTSUITE(STNumber, protocol, ripple);
285328

286-
void
287-
testCompile(std::ostream& out)
288-
{
289-
STNumber number{sfNumber, 42};
290-
out << number;
291-
}
292-
293329
} // namespace ripple

0 commit comments

Comments
 (0)