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