diff --git a/test/libc/stdio/sscanf_test.c b/test/libc/stdio/sscanf_test.c index e1408c09a..411f176b1 100644 --- a/test/libc/stdio/sscanf_test.c +++ b/test/libc/stdio/sscanf_test.c @@ -21,6 +21,7 @@ #include "libc/intrin/bits.h" #include "libc/inttypes.h" #include "libc/limits.h" +#include "libc/math.h" #include "libc/mem/mem.h" #include "libc/runtime/runtime.h" #include "libc/stdio/internal.h" @@ -328,6 +329,114 @@ TEST(sscanf, flexdecimal_hex) { EXPECT_EQ(666, y); } +TEST(sscanf, floating_point_simple) { + float x = 666.666f, y = x, z = y; + EXPECT_EQ(3, sscanf("0.3715 .3715 3715", "%f %f %f", &x, &y, &z)); + EXPECT_EQ(0.3715f, x); + EXPECT_EQ(0.3715f, y); + EXPECT_EQ(3715.0f, z); +} + +TEST(sscanf, floating_point_simple_double_precision) { + double x = 666.666, y = x, z = y; + EXPECT_EQ(3, sscanf("0.3715 .3715 3715", "%lf %lf %lf", &x, &y, &z)); + EXPECT_EQ(0.3715, x); + EXPECT_EQ(0.3715, y); + EXPECT_EQ(3715.0, z); +} + +TEST(sscanf, floating_point_nan) { + float a = 666.666f, b = a, c = b, d = c, e = d, f = e; + EXPECT_EQ(4, sscanf("nan -NAN nAn NaN", "%f %f %f %f", &a, &b, &c, &d)); + EXPECT_EQ(2, sscanf("nan(2) -NaN(_ABCDzxcv1234_)", "%f %f", &e, &f)); + EXPECT_TRUE(isnan(a)); + EXPECT_TRUE(isnan(b)); + EXPECT_TRUE(isnan(c)); + EXPECT_TRUE(isnan(d)); + EXPECT_TRUE(isnan(e)); + EXPECT_TRUE(isnan(f)); +} + +TEST(sscanf, floating_point_nan_double_precision) { + double a = 666.666, b = a, c = b, d = c, e = d, f = e; + EXPECT_EQ(4, sscanf("nan -NAN nAn NaN", "%lf %lf %lf %lf", &a, &b, &c, &d)); + EXPECT_EQ(2, sscanf("nan(2) -NAN(_ABCDzxcv1234_)", "%lf %lf", &e, &f)); + EXPECT_TRUE(isnan(a)); + EXPECT_TRUE(isnan(b)); + EXPECT_TRUE(isnan(c)); + EXPECT_TRUE(isnan(d)); + EXPECT_TRUE(isnan(e)); + EXPECT_TRUE(isnan(f)); +} + +TEST(sscanf, floating_point_infinity) { + float a = 666.666f, b = a, c = b, d = c, e = d, f = e, g = f; + EXPECT_EQ(4, sscanf("inf +INF -iNf InF", "%f %f %f %f", &a, &b, &c, &d)); + EXPECT_EQ(3, sscanf("+infinity -INFINITY iNfInItY", "%f %f %f", &e, &f, &g)); + EXPECT_TRUE(isinf(a)); + EXPECT_TRUE(isinf(b)); + EXPECT_TRUE(isinf(c)); + EXPECT_TRUE(isinf(d)); + EXPECT_TRUE(isinf(e)); + EXPECT_TRUE(isinf(f)); + EXPECT_TRUE(isinf(g)); +} + +TEST(sscanf, floating_point_infinity_double_precision) { + double a = 666.666, b = a, c = b, d = c, e = d, f = e, g = f; + EXPECT_EQ(4, sscanf("inf +INF -iNf InF", "%lf %lf %lf %lf", &a, &b, &c, &d)); + EXPECT_EQ(3, sscanf("+infinity -INFINITY iNfInItY", "%lf %lf %lf", &e, &f, &g)); + EXPECT_TRUE(isinf(a)); + EXPECT_TRUE(isinf(b)); + EXPECT_TRUE(isinf(c)); + EXPECT_TRUE(isinf(d)); + EXPECT_TRUE(isinf(e)); + EXPECT_TRUE(isinf(f)); + EXPECT_TRUE(isinf(g)); +} + +TEST(sscanf, floating_point_documentation_examples) { + float a = 666.666f, b = a, c = b, d = c, e = d, f = e, g = f, h = g, i = h; + + EXPECT_EQ(2, sscanf("111.11 -2.22", "%f %f", &a, &b)); + EXPECT_EQ(2, sscanf("Nan nan(2)", "%f %f", &c, &d)); + EXPECT_EQ(1, sscanf("inF", "%f", &e)); + EXPECT_EQ(2, sscanf("0X1.BC70A3D70A3D7P+6 1.18973e+4932zzz", "%f %f", &f, &g)); + EXPECT_EQ(1, sscanf("-0.0000000123junk", "%f", &h)); + EXPECT_EQ(1, sscanf("junk", "%f", &i)); + + EXPECT_EQ(111.11f, a); + EXPECT_EQ(-2.22f, b); + EXPECT_TRUE(isnan(c)); + EXPECT_TRUE(isnan(d)); + EXPECT_TRUE(isinf(e)); + EXPECT_EQ(0X1.BC70A3D70A3D7P+6f, f); + EXPECT_TRUE(isinf(g)); + EXPECT_EQ(-0.0000000123f, h); + EXPECT_EQ(.0f, i); +} + +TEST(sscanf, floating_point_documentation_examples_double_precision) { + double a = 666.666f, b = a, c = b, d = c, e = d, f = e, g = f, h = g, i = h; + + EXPECT_EQ(2, sscanf("111.11 -2.22", "%lf %lf", &a, &b)); + EXPECT_EQ(2, sscanf("Nan nan(2)", "%lf %lf", &c, &d)); + EXPECT_EQ(1, sscanf("inF", "%lf", &e)); + EXPECT_EQ(2, sscanf("0X1.BC70A3D70A3D7P+6 1.18973e+4932zzz", "%lf %lf", &f, &g)); + EXPECT_EQ(1, sscanf("-0.0000000123junk", "%lf", &h)); + EXPECT_EQ(1, sscanf("junk", "%lf", &i)); + + EXPECT_EQ(111.11, a); + EXPECT_EQ(-2.22, b); + EXPECT_TRUE(isnan(c)); + EXPECT_TRUE(isnan(d)); + EXPECT_TRUE(isinf(e)); + EXPECT_EQ(0X1.BC70A3D70A3D7P+6, f); + EXPECT_TRUE(isinf(g)); + EXPECT_EQ(-0.0000000123, h); + EXPECT_EQ(.0, i); +} + TEST(sscanf, luplus) { long x = 666; EXPECT_EQ(1, sscanf("+123", "%lu", &x));