==> 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}