skip to content
==> tests/fmt.c <==
1/* Rust's outputs, checked by hand against rustc 1.88: `format!("{}", x)` and `format!("{:?}", s)`. */
2#include "mesh/check.h"
3#include "mesh/rust_fmt.h"
4
5#include <math.h>
6#include <stdlib.h>
7
8int main(void) {
9    char b[RF_FLOAT_MAX];
10    CHECK_S(rf_f32(b, 1.0f), "1");
11    CHECK_S(rf_f32(b, 0.5f), "0.5");
12    CHECK_S(rf_f32(b, 0.1f), "0.1");
13    CHECK_S(rf_f32(b, 0.3f), "0.3");
14    CHECK_S(rf_f32(b, 100.0f), "100");
15    CHECK_S(rf_f32(b, 1e-7f), "0.0000001");
16    CHECK_S(rf_f32(b, 1e20f), "100000000000000000000");
17    CHECK_S(rf_f32(b, 16777216.0f), "16777216");
18    CHECK_S(rf_f32(b, 3.4028235e38f), "340282350000000000000000000000000000000");
19    CHECK_S(rf_f32(b, -2.5f), "-2.5");
20    CHECK_S(rf_f32(b, 0.0f), "0");
21    CHECK_S(rf_f32(b, -0.0f), "-0");
22    CHECK_S(rf_f32(b, NAN), "NaN");
23    CHECK_S(rf_f32(b, INFINITY), "inf");
24    CHECK_S(rf_f32(b, -INFINITY), "-inf");
25    CHECK_S(rf_f32(b, 1.4e-45f), "0.000000000000000000000000000000000000000000001");
26    CHECK_S(rf_f32(b, 0.25f * 1.33f), "0.3325");
27    CHECK_S(rf_f32(b, 123456.789f), "123456.79");
28    CHECK_S(rf_f64(b, 0.1), "0.1");
29    CHECK_S(rf_f64(b, 0.1 + 0.2), "0.30000000000000004");
30    CHECK_S(rf_f64(b, 1e21), "1000000000000000000000");
31    CHECK_S(rf_f64(b, 2.5), "2.5");
32    CHECK_S(rf_f64(b, 1.0 / 3.0), "0.3333333333333333");
33    CHECK_S(rf_f64(b, (double)0.1f), "0.10000000149011612");
34    char *d = rf_debug_str("a\"b\\c\nd\te\rf");
35    CHECK_S(d, "\"a\\\"b\\\\c\\nd\\te\\rf\"");
36    free(d);
37    d = rf_debug_str("x\x01y'");
38    CHECK_S(d, "\"x\\u{1}y'\"");
39    free(d);
40    d = rf_debug_str("");
41    CHECK_S(d, "\"\"");
42    free(d);
43    char h[24];
44    CHECK_S(rf_hex_alt(h, 0), "0x0");
45    CHECK_S(rf_hex_alt(h, 0xbeef), "0xbeef");
46    /* Every f32 Display reads back as the same f32 (a sweep over bit patterns). */
47    for (uint32_t u = 1; u < 0x7f800000u; u += 0x00012345u) {
48        float f;
49        memcpy(&f, &u, 4);
50        rf_f32(b, f);
51        CHECK(strtof(b, NULL) == f);
52    }
53    return mesh_check_done();
54}