From f5042df72bd267512a8e0a2a32724ef58a8493a3 Mon Sep 17 00:00:00 2001 From: Bronek Kozicki Date: Wed, 26 Mar 2025 16:16:31 +0000 Subject: [PATCH] Expand tests for numberFromJson --- src/test/protocol/STNumber_test.cpp | 185 ++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) diff --git a/src/test/protocol/STNumber_test.cpp b/src/test/protocol/STNumber_test.cpp index 6a3afc5e0a..6f2c57ecb0 100644 --- a/src/test/protocol/STNumber_test.cpp +++ b/src/test/protocol/STNumber_test.cpp @@ -18,12 +18,15 @@ //============================================================================== #include +#include +#include #include #include #include #include #include +#include namespace ripple { @@ -80,12 +83,194 @@ struct STNumber_test : public beast::unit_test::suite } { + BEAST_EXPECT( + numberFromJson(sfNumber, Json::Value(42)) == + STNumber(sfNumber, 42)); + BEAST_EXPECT( + numberFromJson(sfNumber, Json::Value(-42)) == + STNumber(sfNumber, -42)); + + BEAST_EXPECT( + numberFromJson(sfNumber, Json::UInt(42)) == + STNumber(sfNumber, 42)); + + BEAST_EXPECT( + numberFromJson(sfNumber, "-123") == STNumber(sfNumber, -123)); + BEAST_EXPECT( numberFromJson(sfNumber, "123") == STNumber(sfNumber, 123)); + BEAST_EXPECT( + numberFromJson(sfNumber, "-123") == STNumber(sfNumber, -123)); + + BEAST_EXPECT( + numberFromJson(sfNumber, "3.14") == + STNumber(sfNumber, Number(314, -2))); + BEAST_EXPECT( + numberFromJson(sfNumber, "-3.14") == + STNumber(sfNumber, -Number(314, -2))); BEAST_EXPECT( numberFromJson(sfNumber, "3.14e2") == STNumber(sfNumber, 314)); + BEAST_EXPECT( + numberFromJson(sfNumber, "-3.14e2") == + STNumber(sfNumber, -314)); + BEAST_EXPECT( numberFromJson(sfNumber, "1000e-2") == STNumber(sfNumber, 10)); + BEAST_EXPECT( + numberFromJson(sfNumber, "-1000e-2") == + STNumber(sfNumber, -10)); + + BEAST_EXPECT( + numberFromJson(sfNumber, "0") == STNumber(sfNumber, 0)); + BEAST_EXPECT( + numberFromJson(sfNumber, "0.0") == STNumber(sfNumber, 0)); + BEAST_EXPECT( + numberFromJson(sfNumber, "0.000") == STNumber(sfNumber, 0)); + BEAST_EXPECT( + numberFromJson(sfNumber, "-0") == STNumber(sfNumber, 0)); + BEAST_EXPECT( + numberFromJson(sfNumber, "-0.0") == STNumber(sfNumber, 0)); + BEAST_EXPECT( + numberFromJson(sfNumber, "-0.000") == STNumber(sfNumber, 0)); + BEAST_EXPECT( + numberFromJson(sfNumber, "0e6") == STNumber(sfNumber, 0)); + BEAST_EXPECT( + numberFromJson(sfNumber, "0.0e6") == STNumber(sfNumber, 0)); + BEAST_EXPECT( + numberFromJson(sfNumber, "0.000e6") == STNumber(sfNumber, 0)); + BEAST_EXPECT( + numberFromJson(sfNumber, "-0e6") == STNumber(sfNumber, 0)); + BEAST_EXPECT( + numberFromJson(sfNumber, "-0.0e6") == STNumber(sfNumber, 0)); + BEAST_EXPECT( + numberFromJson(sfNumber, "-0.000e6") == STNumber(sfNumber, 0)); + + // Obvious non-numbers tested here + try + { + auto _ = numberFromJson(sfNumber, ""); + BEAST_EXPECT(false); + } + catch (std::runtime_error const& e) + { + std::string const expected = "'' is not a number"; + BEAST_EXPECT(e.what() == expected); + } + + try + { + auto _ = numberFromJson(sfNumber, "e"); + BEAST_EXPECT(false); + } + catch (std::runtime_error const& e) + { + std::string const expected = "'e' is not a number"; + BEAST_EXPECT(e.what() == expected); + } + + try + { + auto _ = numberFromJson(sfNumber, "1e"); + BEAST_EXPECT(false); + } + catch (std::runtime_error const& e) + { + std::string const expected = "'1e' is not a number"; + BEAST_EXPECT(e.what() == expected); + } + + try + { + auto _ = numberFromJson(sfNumber, "e2"); + BEAST_EXPECT(false); + } + catch (std::runtime_error const& e) + { + std::string const expected = "'e2' is not a number"; + BEAST_EXPECT(e.what() == expected); + } + + try + { + auto _ = numberFromJson(sfNumber, Json::Value()); + BEAST_EXPECT(false); + } + catch (std::runtime_error const& e) + { + std::string const expected = "not a number"; + BEAST_EXPECT(e.what() == expected); + } + + try + { + auto _ = numberFromJson( + sfNumber, + "1234567890123456789012345678901234567890123456789012345678" + "9012345678901234567890123456789012345678901234567890123456" + "78901234567890123456789012345678901234567890"); + BEAST_EXPECT(false); + } + catch (std::bad_cast const& e) + { + BEAST_EXPECT(true); + } + + // We do not handle leading zeros + try + { + auto _ = numberFromJson(sfNumber, "001"); + BEAST_EXPECT(false); + } + catch (std::runtime_error const& e) + { + std::string const expected = "'001' is not a number"; + BEAST_EXPECT(e.what() == expected); + } + + try + { + auto _ = numberFromJson(sfNumber, "000.0"); + BEAST_EXPECT(false); + } + catch (std::runtime_error const& e) + { + std::string const expected = "'000.0' is not a number"; + BEAST_EXPECT(e.what() == expected); + } + + // We do not handle dangling dot + try + { + auto _ = numberFromJson(sfNumber, ".1"); + BEAST_EXPECT(false); + } + catch (std::runtime_error const& e) + { + std::string const expected = "'.1' is not a number"; + BEAST_EXPECT(e.what() == expected); + } + + try + { + auto _ = numberFromJson(sfNumber, "1."); + BEAST_EXPECT(false); + } + catch (std::runtime_error const& e) + { + std::string const expected = "'1.' is not a number"; + BEAST_EXPECT(e.what() == expected); + } + + try + { + auto _ = numberFromJson(sfNumber, "1.e3"); + BEAST_EXPECT(false); + } + catch (std::runtime_error const& e) + { + std::string const expected = "'1.e3' is not a number"; + BEAST_EXPECT(e.what() == expected); + } } } };