1 | /* Test program for %a printf formats. */ |
2 | |
3 | #include <array_length.h> |
4 | #include <stdio.h> |
5 | #include <string.h> |
6 | |
7 | #ifndef WIDE |
8 | # define STR_LEN strlen |
9 | # define STR_CMP strcmp |
10 | # define SPRINT snprintf |
11 | # define CHAR_T char |
12 | # define PRINT printf |
13 | # define L_(Str) Str |
14 | # define S "%s" |
15 | #else |
16 | # define STR_LEN wcslen |
17 | # define SPRINT swprintf |
18 | # define STR_CMP wcscmp |
19 | # define CHAR_T wchar_t |
20 | # define PRINT wprintf |
21 | # define L_(Str) L##Str |
22 | # define S "%ls" |
23 | #endif |
24 | |
25 | struct testcase |
26 | { |
27 | double value; |
28 | const CHAR_T *fmt; |
29 | const CHAR_T *expect; |
30 | }; |
31 | |
32 | static const struct testcase testcases[] = |
33 | { |
34 | { 0x0.0030p+0, L_("%a" ), L_("0x1.8p-11" ) }, |
35 | { 0x0.0040p+0, L_("%a" ), L_("0x1p-10" ) }, |
36 | { 0x0.0030p+0, L_("%040a" ), L_("0x00000000000000000000000000000001.8p-11" ) }, |
37 | { 0x0.0040p+0, L_("%040a" ), L_("0x0000000000000000000000000000000001p-10" ) }, |
38 | { 0x0.0040p+0, L_("%40a" ), L_(" 0x1p-10" ) }, |
39 | { 0x0.0040p+0, L_("%#40a" ), L_(" 0x1.p-10" ) }, |
40 | { 0x0.0040p+0, L_("%-40a" ), L_("0x1p-10 " ) }, |
41 | { 0x0.0040p+0, L_("%#-40a" ), L_("0x1.p-10 " ) }, |
42 | { 0x0.0030p+0, L_("%040e" ), L_("00000000000000000000000000007.324219e-04" ) }, |
43 | { 0x0.0040p+0, L_("%040e" ), L_("00000000000000000000000000009.765625e-04" ) }, |
44 | }; |
45 | |
46 | |
47 | static int |
48 | do_test (void) |
49 | { |
50 | const struct testcase *t; |
51 | int result = 0; |
52 | |
53 | for (t = testcases; t < array_end (testcases); ++t) |
54 | { |
55 | CHAR_T buf[1024]; |
56 | int n = SPRINT (s: buf, array_length (buf), format: t->fmt, t->value); |
57 | if (n != STR_LEN (s: t->expect) || STR_CMP (s1: buf, s2: t->expect) != 0) |
58 | { |
59 | PRINT (L_("" S "\tExpected \"" S "\" (%Zu)\n\tGot \"" |
60 | S "\" (%d, %Zu)\n" ), |
61 | t->fmt, t->expect, STR_LEN (s: t->expect), |
62 | buf, n, STR_LEN (s: buf)); |
63 | result = 1; |
64 | } |
65 | } |
66 | |
67 | return result; |
68 | } |
69 | |
70 | #define TEST_FUNCTION do_test () |
71 | #include "../test-skeleton.c" |
72 | |