skip to content
==> 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}