==> tests/rs_parse.c <==1/* mesh-rs-parse against what Rust's parse::<T>() and from_str_radix accept and refuse. */
2#include "mesh/rs_parse.h"
3#include "mesh/check.h"
4
5#include <string.h>
6
7static bool u64s(const char *s, uint64_t *v) { return rs_u64(s, strlen(s), v); }
8
9int main(void) {
10 uint64_t v;
11 CHECK(u64s("0", &v) && v == 0);
12 CHECK(u64s("+7", &v) && v == 7);
13 CHECK(u64s("18446744073709551615", &v) && v == UINT64_MAX);
14 CHECK(!u64s("18446744073709551616", &v));
15 CHECK(!u64s("", &v) && !u64s("+", &v) && !u64s("-0", &v) && !u64s(" 1", &v) && !u64s("1 ", &v) && !u64s("0x1", &v));
16 uint32_t u;
17 CHECK(rs_u32("4294967295", 10, &u) && u == UINT32_MAX);
18 CHECK(!rs_u32("4294967296", 10, &u));
19 int32_t i;
20 CHECK(rs_i32("-2147483648", 11, &i) && i == INT32_MIN);
21 CHECK(rs_i32("2147483647", 10, &i) && i == INT32_MAX);
22 CHECK(rs_i32("-0", 2, &i) && i == 0);
23 CHECK(rs_i32("+5", 2, &i) && i == 5);
24 CHECK(!rs_i32("2147483648", 10, &i) && !rs_i32("-2147483649", 11, &i) && !rs_i32("-", 1, &i));
25 CHECK(rs_parse_uint("fF", 2, 16, UINT32_MAX, &v) && v == 255);
26 CHECK(rs_parse_uint("+a", 2, 16, UINT32_MAX, &v) && v == 10);
27 CHECK(!rs_parse_uint("g", 1, 16, UINT32_MAX, &v) && !rs_parse_uint("100000000", 9, 16, UINT32_MAX, &v));
28 int64_t w;
29 CHECK(rs_parse_int("-9223372036854775808", 20, INT64_MIN, INT64_MAX, &w) && w == INT64_MIN);
30 return mesh_check_done();
31}