summaryrefslogtreecommitdiff
path: root/asl/strings/parse_number_tests.cpp
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2025-07-03 18:37:18 +0200
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2025-07-04 20:44:04 +0200
commitbcdad5b8762060c82a0b7840cb905e69ddb9a65e (patch)
tree468694d1662c61c12f813689520f43c8e1767538 /asl/strings/parse_number_tests.cpp
parentcca2e267241a90f238e424e47501b1e8613a5955 (diff)
Add numbers parsingHEADmain
Diffstat (limited to 'asl/strings/parse_number_tests.cpp')
-rw-r--r--asl/strings/parse_number_tests.cpp203
1 files changed, 203 insertions, 0 deletions
diff --git a/asl/strings/parse_number_tests.cpp b/asl/strings/parse_number_tests.cpp
new file mode 100644
index 0000000..df759e9
--- /dev/null
+++ b/asl/strings/parse_number_tests.cpp
@@ -0,0 +1,203 @@
+// Copyright 2025 Steven Le Rouzic
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+#include "asl/strings/parse_number.hpp"
+#include "asl/testing/testing.hpp"
+
+// @Todo Once we have an equivalent of std::numeric_limits,
+// properly compare floating point values in these tests.
+
+ASL_TEST(parse_float_error)
+{
+ const asl::string_view sv = "this is not a number lmao";
+ auto res = asl::parse_float(sv);
+ ASL_TEST_EXPECT(!res.ok());
+}
+
+ASL_TEST(parse_float_empty)
+{
+ const asl::string_view sv = "";
+ auto res = asl::parse_float(sv);
+ ASL_TEST_EXPECT(!res.ok());
+}
+
+ASL_TEST(parse_float_simple)
+{
+ const asl::string_view sv = "3.1415";
+ auto res = asl::parse_float(sv);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == 3.1415F);
+ ASL_TEST_EXPECT(res.value().remaining.size() == 0);
+}
+
+ASL_TEST(parse_float_integer)
+{
+ const asl::string_view sv = "31415";
+ auto res = asl::parse_float(sv);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == 31415.0F);
+ ASL_TEST_EXPECT(res.value().remaining.size() == 0);
+}
+
+ASL_TEST(parse_float_scientific)
+{
+ const asl::string_view sv = "314.15e-2";
+ auto res = asl::parse_float(sv);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == 3.1415F);
+ ASL_TEST_EXPECT(res.value().remaining.size() == 0);
+}
+
+ASL_TEST(parse_float_suffix)
+{
+ const asl::string_view sv = "3.1415 yoyoyo";
+ auto res = asl::parse_float(sv);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == 3.1415F);
+ ASL_TEST_EXPECT(res.value().remaining == " yoyoyo");
+}
+
+ASL_TEST(parse_int)
+{
+ const asl::string_view sv = "926473";
+ auto res = asl::parse_uint32(sv);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == 926473);
+ ASL_TEST_EXPECT(res.value().remaining.is_empty());
+}
+
+ASL_TEST(parse_int_negative)
+{
+ const asl::string_view sv = "-926473";
+ auto res = asl::parse_int32(sv);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == -926473);
+ ASL_TEST_EXPECT(res.value().remaining.is_empty());
+}
+
+ASL_TEST(parse_int_suffix)
+{
+ const asl::string_view sv = "926473 what's this then";
+ auto res = asl::parse_uint32(sv);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == 926473);
+ ASL_TEST_EXPECT(res.value().remaining == " what's this then");
+}
+
+ASL_TEST(parse_uint_with_minus)
+{
+ const asl::string_view sv = "-926473";
+ auto res = asl::parse_uint32(sv);
+ ASL_TEST_EXPECT(!res.ok());
+}
+
+ASL_TEST(parse_int_with_only_minus)
+{
+ const asl::string_view sv = "-@";
+ auto res = asl::parse_int32(sv);
+ ASL_TEST_EXPECT(!res.ok());
+}
+
+ASL_TEST(parse_uint_invalid)
+{
+ const asl::string_view sv = "abcd";
+ auto res = asl::parse_uint32(sv);
+ ASL_TEST_EXPECT(!res.ok());
+}
+
+ASL_TEST(parse_uint_empty)
+{
+ const asl::string_view sv = "";
+ auto res = asl::parse_uint32(sv);
+ ASL_TEST_EXPECT(!res.ok());
+}
+
+ASL_TEST(parse_uint_overflow)
+{
+ ASL_TEST_EXPECT(!asl::parse_uint16("80000").ok());
+ ASL_TEST_EXPECT(!asl::parse_uint16("65536").ok());
+}
+
+ASL_TEST(parse_uint16_max)
+{
+ const asl::string_view sv = "65535";
+ auto res = asl::parse_uint16(sv);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == 65535);
+ ASL_TEST_EXPECT(res.value().remaining.is_empty());
+}
+
+ASL_TEST(parse_uint16_zero)
+{
+ const asl::string_view sv = "0";
+ auto res = asl::parse_uint16(sv);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == 0);
+ ASL_TEST_EXPECT(res.value().remaining.is_empty());
+}
+
+ASL_TEST(parse_uint16_zeros)
+{
+ const asl::string_view sv = "00000";
+ auto res = asl::parse_uint16(sv);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == 0);
+ ASL_TEST_EXPECT(res.value().remaining.is_empty());
+}
+
+ASL_TEST(parse_int_overflow)
+{
+ ASL_TEST_EXPECT(!asl::parse_int16("80000").ok());
+ ASL_TEST_EXPECT(!asl::parse_int16("40000").ok());
+ ASL_TEST_EXPECT(!asl::parse_int16("32768").ok());
+ ASL_TEST_EXPECT(!asl::parse_int16("-80000").ok());
+ ASL_TEST_EXPECT(!asl::parse_int16("-40000").ok());
+ ASL_TEST_EXPECT(!asl::parse_int16("-32769").ok());
+}
+
+ASL_TEST(parse_int16_max)
+{
+ const asl::string_view sv = "32767";
+ auto res = asl::parse_int16(sv);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == 32767);
+ ASL_TEST_EXPECT(res.value().remaining.is_empty());
+}
+
+ASL_TEST(parse_int16_min)
+{
+ const asl::string_view sv = "-32768";
+ auto res = asl::parse_int16(sv);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == -32768);
+ ASL_TEST_EXPECT(res.value().remaining.is_empty());
+}
+
+ASL_TEST(parse_hex)
+{
+ const asl::string_view sv = "1000a";
+ auto res = asl::parse_uint32(sv, 16);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == 65546);
+ ASL_TEST_EXPECT(res.value().remaining.is_empty());
+}
+
+ASL_TEST(parse_bin)
+{
+ const asl::string_view sv = "101010";
+ auto res = asl::parse_uint32(sv, 2);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == 42);
+ ASL_TEST_EXPECT(res.value().remaining.is_empty());
+}
+
+ASL_TEST(parse_oct)
+{
+ const asl::string_view sv = "644";
+ auto res = asl::parse_uint32(sv, 8);
+ ASL_TEST_EXPECT(res.ok());
+ ASL_TEST_EXPECT(res.value().value == 6 * 64 + 4 * 8 + 4);
+ ASL_TEST_EXPECT(res.value().remaining.is_empty());
+}
+