diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-07-03 18:37:18 +0200 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-07-04 20:44:04 +0200 |
commit | bcdad5b8762060c82a0b7840cb905e69ddb9a65e (patch) | |
tree | 468694d1662c61c12f813689520f43c8e1767538 /asl/strings/parse_number_tests.cpp | |
parent | cca2e267241a90f238e424e47501b1e8613a5955 (diff) |
Diffstat (limited to 'asl/strings/parse_number_tests.cpp')
-rw-r--r-- | asl/strings/parse_number_tests.cpp | 203 |
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()); +} + |