==> tests/parse.c <==1/* What Rust's parse accepts and refuses. */
2#include "mesh/check.h"
3#include "mesh/parse.h"
4
5#include <math.h>
6
7int main(void) {
8 uint64_t u;
9 uint32_t w;
10 int32_t i;
11 float f;
12 double d;
13 CHECK(mp_u64("0", &u) && u == 0);
14 CHECK(mp_u64("+42", &u) && u == 42);
15 CHECK(mp_u64("18446744073709551615", &u) && u == UINT64_MAX);
16 CHECK(!mp_u64("18446744073709551616", &u) && !mp_u64("", &u) && !mp_u64("+", &u) && !mp_u64("-1", &u));
17 CHECK(!mp_u64(" 1", &u) && !mp_u64("1 ", &u) && !mp_u64("0x10", &u) && !mp_u64("1_000", &u));
18 CHECK(mp_u32("4294967295", &w) && w == UINT32_MAX && !mp_u32("4294967296", &w));
19 uint16_t h;
20 CHECK(mp_u16("27801", &h) && h == 27801 && !mp_u16("65536", &h) && !mp_u16("x", &h));
21 CHECK(mp_i32("-2", &i) && i == -2 && mp_i32("+7", &i) && i == 7);
22 CHECK(mp_i32("-2147483648", &i) && i == INT32_MIN && !mp_i32("2147483648", &i) && !mp_i32("-+1", &i) && !mp_i32("-", &i));
23 CHECK(mp_hex_u64("00000000000000aB", &u) && u == 0xab && mp_hex_u64("ffffffffffffffff", &u) && u == UINT64_MAX);
24 CHECK(!mp_hex_u64("0x1", &u) && !mp_hex_u64("g", &u) && !mp_hex_u64("10000000000000000", &u));
25 CHECK(mp_hex_u32("ff", &w) && w == 255);
26 CHECK(mp_f32("0.5", &f) && f == 0.5f && mp_f32(".5", &f) && mp_f32("5.", &f) && f == 5.0f && mp_f32("1e3", &f) && f == 1000.0f);
27 CHECK(mp_f32("-2.5E-1", &f) && f == -0.25f && mp_f32("+3", &f));
28 CHECK(mp_f32("nan", &f) && isnan(f) && mp_f32("NaN", &f) && mp_f32("inf", &f) && isinf(f) && mp_f32("-Infinity", &f) && f < 0);
29 CHECK(!mp_f32("", &f) && !mp_f32(".", &f) && !mp_f32("1e", &f) && !mp_f32(" 1", &f) && !mp_f32("0x1p3", &f) && !mp_f32("1.5x", &f));
30 CHECK(mp_f64("0.25", &d) && d == 0.25 && !mp_f64("abc", &d));
31 return mesh_check_done();
32}