1 /* Unit tests for gprintf
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This work is provided "as is"; redistribution and modification
5 * in whole or in part, in any medium, physical or electronic is
6 * permitted without restriction.
8 * This work is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 * In no event shall the authors or contributors be liable for any
13 * direct, indirect, incidental, special, exemplary, or consequential
14 * damages (including, but not limited to, procurement of substitute
15 * goods or services; loss of use, data, or profits; or business
16 * interruption) however caused and on any theory of liability, whether
17 * in contract, strict liability, or tort (including negligence or
18 * otherwise) arising in any way out of the use of this software, even
19 * if advised of the possibility of such damage.
29 test_retval_and_trunc (void)
34 res = g_snprintf (buf, 0, "abc");
35 g_assert_cmpint (res, ==, 3);
37 res = g_snprintf (NULL, 0, "abc");
38 g_assert_cmpint (res, ==, 3);
40 res = g_snprintf (buf, 5, "abc");
41 g_assert_cmpint (res, ==, 3);
43 res = g_snprintf (buf, 1, "abc");
44 g_assert_cmpint (res, ==, 3);
45 g_assert (buf[0] == '\0');
46 g_assert_cmpstr (buf, ==, "");
48 res = g_snprintf (buf, 2, "abc");
49 g_assert_cmpint (res, ==, 3);
50 g_assert (buf[1] == '\0');
51 g_assert_cmpstr (buf, ==, "a");
53 res = g_snprintf (buf, 3, "abc");
54 g_assert_cmpint (res, ==, 3);
55 g_assert (buf[2] == '\0');
56 g_assert_cmpstr (buf, ==, "ab");
58 res = g_snprintf (buf, 4, "abc");
59 g_assert_cmpint (res, ==, 3);
60 g_assert (buf[3] == '\0');
61 g_assert_cmpstr (buf, ==, "abc");
63 res = g_snprintf (buf, 5, "abc");
64 g_assert_cmpint (res, ==, 3);
65 g_assert (buf[3] == '\0');
66 g_assert_cmpstr (buf, ==, "abc");
76 /* %d basic formatting */
78 res = g_snprintf (buf, 128, "%d", 5);
79 g_assert_cmpint (res, ==, 1);
80 g_assert_cmpstr (buf, ==, "5");
82 res = g_snprintf (buf, 128, "%d", 0);
83 g_assert_cmpint (res, ==, 1);
84 g_assert_cmpstr (buf, ==, "0");
86 res = g_snprintf (buf, 128, "%.0d", 0);
87 g_assert_cmpint (res, ==, 0);
88 g_assert_cmpstr (buf, ==, "");
90 res = g_snprintf (buf, 128, "%.0d", 1);
91 g_assert_cmpint (res, ==, 1);
92 g_assert_cmpstr (buf, ==, "1");
94 res = g_snprintf (buf, 128, "%.d", 2);
95 g_assert_cmpint (res, ==, 1);
96 g_assert_cmpstr (buf, ==, "2");
98 res = g_snprintf (buf, 128, "%d", -1);
99 g_assert_cmpint (res, ==, 2);
100 g_assert_cmpstr (buf, ==, "-1");
102 res = g_snprintf (buf, 128, "%.3d", 5);
103 g_assert_cmpint (res, ==, 3);
104 g_assert_cmpstr (buf, ==, "005");
106 res = g_snprintf (buf, 128, "%.3d", -5);
107 g_assert_cmpint (res, ==, 4);
108 g_assert_cmpstr (buf, ==, "-005");
110 res = g_snprintf (buf, 128, "%5.3d", 5);
111 g_assert_cmpint (res, ==, 5);
112 g_assert_cmpstr (buf, ==, " 005");
114 res = g_snprintf (buf, 128, "%-5.3d", -5);
115 g_assert_cmpint (res, ==, 5);
116 g_assert_cmpstr (buf, ==, "-005 ");
118 /* %d, length modifiers */
120 res = g_snprintf (buf, 128, "%" G_GINT16_FORMAT, (gint16)-5);
121 g_assert_cmpint (res, ==, 2);
122 g_assert_cmpstr (buf, ==, "-5");
124 res = g_snprintf (buf, 128, "%" G_GUINT16_FORMAT, (guint16)5);
125 g_assert_cmpint (res, ==, 1);
126 g_assert_cmpstr (buf, ==, "5");
128 res = g_snprintf (buf, 128, "%" G_GINT32_FORMAT, (gint32)-5);
129 g_assert_cmpint (res, ==, 2);
130 g_assert_cmpstr (buf, ==, "-5");
132 res = g_snprintf (buf, 128, "%" G_GUINT32_FORMAT, (guint32)5);
133 g_assert_cmpint (res, ==, 1);
134 g_assert_cmpstr (buf, ==, "5");
136 res = g_snprintf (buf, 128, "%" G_GINT64_FORMAT, (gint64)-5);
137 g_assert_cmpint (res, ==, 2);
138 g_assert_cmpstr (buf, ==, "-5");
140 res = g_snprintf (buf, 128, "%" G_GUINT64_FORMAT, (guint64)5);
141 g_assert_cmpint (res, ==, 1);
142 g_assert_cmpstr (buf, ==, "5");
144 res = g_snprintf (buf, 128, "%" G_GSSIZE_FORMAT, (gssize)-5);
145 g_assert_cmpint (res, ==, 2);
146 g_assert_cmpstr (buf, ==, "-5");
148 res = g_snprintf (buf, 128, "%" G_GSIZE_FORMAT, (gsize)5);
149 g_assert_cmpint (res, ==, 1);
150 g_assert_cmpstr (buf, ==, "5");
154 res = g_snprintf (buf, 128, "%-d", 5);
155 g_assert_cmpint (res, ==, 1);
156 g_assert_cmpstr (buf, ==, "5");
158 res = g_snprintf (buf, 128, "%-+d", 5);
159 g_assert_cmpint (res, ==, 2);
160 g_assert_cmpstr (buf, ==, "+5");
162 res = g_snprintf (buf, 128, "%+-d", 5);
163 g_assert_cmpint (res, ==, 2);
164 g_assert_cmpstr (buf, ==, "+5");
166 res = g_snprintf (buf, 128, "%+d", -5);
167 g_assert_cmpint (res, ==, 2);
168 g_assert_cmpstr (buf, ==, "-5");
170 res = g_snprintf (buf, 128, "% d", 5);
171 g_assert_cmpint (res, ==, 2);
172 g_assert_cmpstr (buf, ==, " 5");
174 res = g_snprintf (buf, 128, "% .0d", 0);
175 g_assert_cmpint (res, ==, 1);
176 g_assert_cmpstr (buf, ==, " ");
178 res = g_snprintf (buf, 128, "%03d", 5);
179 g_assert_cmpint (res, ==, 3);
180 g_assert_cmpstr (buf, ==, "005");
182 res = g_snprintf (buf, 128, "%03d", -5);
183 g_assert_cmpint (res, ==, 3);
184 g_assert_cmpstr (buf, ==, "-05");
186 /* gcc emits warnings for the following formats, since the C spec
187 * says some of the flags must be ignored. (The " " in "% +d" and
188 * the "0" in "%-03d".) But we need to test that our printf gets
189 * those rules right. So we fool gcc into not warning.
191 #pragma GCC diagnostic push
192 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
194 res = g_snprintf (buf, 128, fmt, 5);
195 g_assert_cmpint (res, ==, 2);
196 g_assert_cmpstr (buf, ==, "+5");
199 res = g_snprintf (buf, 128, fmt, -5);
200 g_assert_cmpint (res, ==, 3);
201 g_assert_cmpstr (buf, ==, "-5 ");
202 #pragma GCC diagnostic pop
211 /* %o basic formatting */
213 res = g_snprintf (buf, 128, "%o", 5);
214 g_assert_cmpint (res, ==, 1);
215 g_assert_cmpstr (buf, ==, "5");
217 res = g_snprintf (buf, 128, "%o", 8);
218 g_assert_cmpint (res, ==, 2);
219 g_assert_cmpstr (buf, ==, "10");
221 res = g_snprintf (buf, 128, "%o", 0);
222 g_assert_cmpint (res, ==, 1);
223 g_assert_cmpstr (buf, ==, "0");
225 res = g_snprintf (buf, 128, "%.0o", 0);
226 g_assert_cmpint (res, ==, 0);
227 g_assert_cmpstr (buf, ==, "");
229 res = g_snprintf (buf, 128, "%.0o", 1);
230 g_assert_cmpint (res, ==, 1);
231 g_assert_cmpstr (buf, ==, "1");
233 res = g_snprintf (buf, 128, "%.3o", 5);
234 g_assert_cmpint (res, ==, 3);
235 g_assert_cmpstr (buf, ==, "005");
237 res = g_snprintf (buf, 128, "%.3o", 8);
238 g_assert_cmpint (res, ==, 3);
239 g_assert_cmpstr (buf, ==, "010");
241 res = g_snprintf (buf, 128, "%5.3o", 5);
242 g_assert_cmpint (res, ==, 5);
243 g_assert_cmpstr (buf, ==, " 005");
252 /* %u, basic formatting */
254 res = g_snprintf (buf, 128, "%u", 5);
255 g_assert_cmpint (res, ==, 1);
256 g_assert_cmpstr (buf, ==, "5");
258 res = g_snprintf (buf, 128, "%u", 0);
259 g_assert_cmpint (res, ==, 1);
260 g_assert_cmpstr (buf, ==, "0");
262 res = g_snprintf (buf, 128, "%.0u", 0);
263 g_assert_cmpint (res, ==, 0);
264 g_assert_cmpstr (buf, ==, "");
266 res = g_snprintf (buf, 128, "%.0u", 1);
267 g_assert_cmpint (res, ==, 1);
268 g_assert_cmpstr (buf, ==, "1");
270 res = g_snprintf (buf, 128, "%.3u", 5);
271 g_assert_cmpint (res, ==, 3);
272 g_assert_cmpstr (buf, ==, "005");
274 res = g_snprintf (buf, 128, "%5.3u", 5);
275 g_assert_cmpint (res, ==, 5);
276 g_assert_cmpstr (buf, ==, " 005");
285 /* %x, basic formatting */
287 res = g_snprintf (buf, 128, "%x", 5);
288 g_assert_cmpint (res, ==, 1);
289 g_assert_cmpstr (buf, ==, "5");
291 res = g_snprintf (buf, 128, "%x", 31);
292 g_assert_cmpint (res, ==, 2);
293 g_assert_cmpstr (buf, ==, "1f");
295 res = g_snprintf (buf, 128, "%x", 0);
296 g_assert_cmpint (res, ==, 1);
297 g_assert_cmpstr (buf, ==, "0");
299 res = g_snprintf (buf, 128, "%.0x", 0);
300 g_assert_cmpint (res, ==, 0);
301 g_assert_cmpstr (buf, ==, "");
303 res = g_snprintf (buf, 128, "%.0x", 1);
304 g_assert_cmpint (res, ==, 1);
305 g_assert_cmpstr (buf, ==, "1");
307 res = g_snprintf (buf, 128, "%.3x", 5);
308 g_assert_cmpint (res, ==, 3);
309 g_assert_cmpstr (buf, ==, "005");
311 res = g_snprintf (buf, 128, "%.3x", 31);
312 g_assert_cmpint (res, ==, 3);
313 g_assert_cmpstr (buf, ==, "01f");
315 res = g_snprintf (buf, 128, "%5.3x", 5);
316 g_assert_cmpint (res, ==, 5);
317 g_assert_cmpstr (buf, ==, " 005");
321 res = g_snprintf (buf, 128, "%-x", 5);
322 g_assert_cmpint (res, ==, 1);
323 g_assert_cmpstr (buf, ==, "5");
325 res = g_snprintf (buf, 128, "%03x", 5);
326 g_assert_cmpint (res, ==, 3);
327 g_assert_cmpstr (buf, ==, "005");
329 res = g_snprintf (buf, 128, "%#x", 31);
330 g_assert_cmpint (res, ==, 4);
331 g_assert_cmpstr (buf, ==, "0x1f");
333 res = g_snprintf (buf, 128, "%#x", 0);
334 g_assert_cmpint (res, ==, 1);
335 g_assert_cmpstr (buf, ==, "0");
344 /* %X, basic formatting */
346 res = g_snprintf (buf, 128, "%X", 5);
347 g_assert_cmpint (res, ==, 1);
348 g_assert_cmpstr (buf, ==, "5");
350 res = g_snprintf (buf, 128, "%X", 31);
351 g_assert_cmpint (res, ==, 2);
352 g_assert_cmpstr (buf, ==, "1F");
354 res = g_snprintf (buf, 128, "%X", 0);
355 g_assert_cmpint (res, ==, 1);
356 g_assert_cmpstr (buf, ==, "0");
358 res = g_snprintf (buf, 128, "%.0X", 0);
359 g_assert_cmpint (res, ==, 0);
360 g_assert_cmpstr (buf, ==, "");
362 res = g_snprintf (buf, 128, "%.0X", 1);
363 g_assert_cmpint (res, ==, 1);
364 g_assert_cmpstr (buf, ==, "1");
366 res = g_snprintf (buf, 128, "%.3X", 5);
367 g_assert_cmpint (res, ==, 3);
368 g_assert_cmpstr (buf, ==, "005");
370 res = g_snprintf (buf, 128, "%.3X", 31);
371 g_assert_cmpint (res, ==, 3);
372 g_assert_cmpstr (buf, ==, "01F");
374 res = g_snprintf (buf, 128, "%5.3X", 5);
375 g_assert_cmpint (res, ==, 5);
376 g_assert_cmpstr (buf, ==, " 005");
380 res = g_snprintf (buf, 128, "%-X", 5);
381 g_assert_cmpint (res, ==, 1);
382 g_assert_cmpstr (buf, ==, "5");
384 res = g_snprintf (buf, 128, "%03X", 5);
385 g_assert_cmpint (res, ==, 3);
386 g_assert_cmpstr (buf, ==, "005");
388 res = g_snprintf (buf, 128, "%#X", 31);
389 g_assert_cmpint (res, ==, 4);
390 g_assert_cmpstr (buf, ==, "0X1F");
392 res = g_snprintf (buf, 128, "%#X", 0);
393 g_assert_cmpint (res, ==, 1);
394 g_assert_cmpstr (buf, ==, "0");
403 /* %f, basic formattting */
405 res = g_snprintf (buf, 128, "%f", G_PI);
406 g_assert_cmpint (res, ==, 8);
407 g_assert (0 == strncmp (buf, "3.14159", 7));
409 res = g_snprintf (buf, 128, "%.8f", G_PI);
410 g_assert_cmpint (res, ==, 10);
411 g_assert (0 == strncmp (buf, "3.1415926", 9));
413 res = g_snprintf (buf, 128, "%.0f", G_PI);
414 g_assert_cmpint (res, ==, 1);
415 g_assert_cmpstr (buf, ==, "3");
417 res = g_snprintf (buf, 128, "%1.f", G_PI);
418 g_assert_cmpint (res, ==, 1);
419 g_assert_cmpstr (buf, ==, "3");
421 res = g_snprintf (buf, 128, "%3.f", G_PI);
422 g_assert_cmpint (res, ==, 3);
423 g_assert_cmpstr (buf, ==, " 3");
427 res = g_snprintf (buf, 128, "%+f", G_PI);
428 g_assert_cmpint (res, ==, 9);
429 g_assert (0 == strncmp (buf, "+3.14159", 8));
431 res = g_snprintf (buf, 128, "% f", G_PI);
432 g_assert_cmpint (res, ==, 9);
433 g_assert (0 == strncmp (buf, " 3.14159", 8));
435 res = g_snprintf (buf, 128, "%#.0f", G_PI);
436 g_assert_cmpint (res, ==, 2);
437 g_assert_cmpstr (buf, ==, "3.");
439 res = g_snprintf (buf, 128, "%05.2f", G_PI);
440 g_assert_cmpint (res, ==, 5);
441 g_assert_cmpstr (buf, ==, "03.14");
445 same_value (const gchar *actual,
446 const gchar *expected)
448 gdouble actual_value, expected_value;
450 actual_value = g_ascii_strtod (actual, NULL);
451 expected_value = g_ascii_strtod (expected, NULL);
453 return actual_value == expected_value;
462 /* %e, basic formatting */
463 /* for %e we can't expect to reproduce exact strings and lengths, since SUS
464 * only guarantees that the exponent shall always contain at least two
465 * digits. On Windows, it seems to be at least three digits long.
466 * Therefore, we compare the results of parsing the expected result and the
470 res = g_snprintf (buf, 128, "%e", G_PI);
471 g_assert_cmpint (res, >=, 12);
472 g_assert (same_value (buf, "3.141593e+00"));
474 res = g_snprintf (buf, 128, "%.8e", G_PI);
475 g_assert_cmpint (res, >=, 14);
476 g_assert (same_value (buf, "3.14159265e+00"));
478 res = g_snprintf (buf, 128, "%.0e", G_PI);
479 g_assert_cmpint (res, >=, 5);
480 g_assert (same_value (buf, "3e+00"));
482 res = g_snprintf (buf, 128, "%.1e", 0.0);
483 g_assert_cmpint (res, >=, 7);
484 g_assert (same_value (buf, "0.0e+00"));
486 res = g_snprintf (buf, 128, "%.1e", 0.00001);
487 g_assert_cmpint (res, >=, 7);
488 g_assert (same_value (buf, "1.0e-05"));
490 res = g_snprintf (buf, 128, "%.1e", 10000.0);
491 g_assert_cmpint (res, >=, 7);
492 g_assert (same_value (buf, "1.0e+04"));
496 res = g_snprintf (buf, 128, "%+e", G_PI);
497 g_assert_cmpint (res, >=, 13);
498 g_assert (same_value (buf, "+3.141593e+00"));
500 res = g_snprintf (buf, 128, "% e", G_PI);
501 g_assert_cmpint (res, >=, 13);
502 g_assert (same_value (buf, " 3.141593e+00"));
504 res = g_snprintf (buf, 128, "%#.0e", G_PI);
505 g_assert_cmpint (res, >=, 6);
506 g_assert (same_value (buf, "3.e+00"));
508 res = g_snprintf (buf, 128, "%09.2e", G_PI);
509 g_assert_cmpint (res, >=, 9);
510 g_assert (same_value (buf, "03.14e+00"));
519 res = g_snprintf (buf, 128, "%c", 'a');
520 g_assert_cmpint (res, ==, 1);
521 g_assert_cmpstr (buf, ==, "a");
530 res = g_snprintf (buf, 128, "%.2s", "abc");
531 g_assert_cmpint (res, ==, 2);
532 g_assert_cmpstr (buf, ==, "ab");
534 res = g_snprintf (buf, 128, "%.6s", "abc");
535 g_assert_cmpint (res, ==, 3);
536 g_assert_cmpstr (buf, ==, "abc");
538 res = g_snprintf (buf, 128, "%5s", "abc");
539 g_assert_cmpint (res, ==, 5);
540 g_assert_cmpstr (buf, ==, " abc");
542 res = g_snprintf (buf, 128, "%-5s", "abc");
543 g_assert_cmpint (res, ==, 5);
544 g_assert_cmpstr (buf, ==, "abc ");
546 res = g_snprintf (buf, 128, "%5.2s", "abc");
547 g_assert_cmpint (res, ==, 5);
548 g_assert_cmpstr (buf, ==, " ab");
550 res = g_snprintf (buf, 128, "%*s", 5, "abc");
551 g_assert_cmpint (res, ==, 5);
552 g_assert_cmpstr (buf, ==, " abc");
554 res = g_snprintf (buf, 128, "%*s", -5, "abc");
555 g_assert_cmpint (res, ==, 5);
556 g_assert_cmpstr (buf, ==, "abc ");
558 res = g_snprintf (buf, 128, "%*.*s", 5, 2, "abc");
559 g_assert_cmpint (res, ==, 5);
560 g_assert_cmpstr (buf, ==, " ab");
571 res = g_snprintf (buf, 128, "abc%n", &i);
572 g_assert_cmpint (res, ==, 3);
573 g_assert_cmpstr (buf, ==, "abc");
574 g_assert_cmpint (i, ==, 3);
576 res = g_snprintf (buf, 128, "abc%ln", &l);
577 g_assert_cmpint (res, ==, 3);
578 g_assert_cmpstr (buf, ==, "abc");
579 g_assert_cmpint (l, ==, 3);
588 res = g_snprintf (buf, 128, "%%");
589 g_assert_cmpint (res, ==, 1);
590 g_assert_cmpstr (buf, ==, "%");
594 test_positional_params (void)
599 res = g_snprintf (buf, 128, "%2$c %1$c", 'b', 'a');
600 g_assert_cmpint (res, ==, 3);
601 g_assert_cmpstr (buf, ==, "a b");
603 res = g_snprintf (buf, 128, "%1$*2$.*3$s", "abc", 5, 2);
604 g_assert_cmpint (res, ==, 5);
605 g_assert_cmpstr (buf, ==, " ab");
607 res = g_snprintf (buf, 128, "%1$s%1$s", "abc");
608 g_assert_cmpint (res, ==, 6);
609 g_assert_cmpstr (buf, ==, "abcabc");
613 test_positional_params2_subprocess (void)
617 res = g_printf ("%2$c %1$c\n", 'b', 'a');
618 g_assert_cmpint (res, ==, 4);
620 res = g_printf ("%1$*2$.*3$s\n", "abc", 5, 2);
621 g_assert_cmpint (res, ==, 6);
623 res = g_printf ("%1$s%1$s\n", "abc");
624 g_assert_cmpint (res, ==, 7);
628 test_positional_params2 (void)
630 g_test_trap_subprocess ("/printf/test-positional-params/subprocess", 0, 0);
631 g_test_trap_assert_passed ();
632 g_test_trap_assert_stdout ("a b\n ab\nabcabc\n");
636 test_positional_params3 (void)
641 res = g_sprintf (buf, "%2$c %1$c", 'b', 'a');
642 g_assert_cmpint (res, ==, 3);
643 g_assert_cmpstr (buf, ==, "a b");
645 res = g_sprintf (buf, "%1$*2$.*3$s", "abc", 5, 2);
646 g_assert_cmpint (res, ==, 5);
647 g_assert_cmpstr (buf, ==, " ab");
649 res = g_sprintf (buf, "%1$s%1$s", "abc");
650 g_assert_cmpint (res, ==, 6);
651 g_assert_cmpstr (buf, ==, "abcabc");
655 test_percent2_subprocess (void)
659 res = g_printf ("%%");
660 g_assert_cmpint (res, ==, 1);
666 g_test_trap_subprocess ("/printf/test-percent/subprocess", 0, 0);
667 g_test_trap_assert_passed ();
668 g_test_trap_assert_stdout ("*%*");
677 res = g_snprintf (buf, 128, "%" G_GINT64_FORMAT, (gint64)123456);
678 g_assert_cmpint (res, ==, 6);
679 g_assert_cmpstr (buf, ==, "123456");
681 res = g_snprintf (buf, 128, "%" G_GINT64_FORMAT, (gint64)-123456);
682 g_assert_cmpint (res, ==, 7);
683 g_assert_cmpstr (buf, ==, "-123456");
685 res = g_snprintf (buf, 128, "%" G_GUINT64_FORMAT, (guint64)123456);
686 g_assert_cmpint (res, ==, 6);
687 g_assert_cmpstr (buf, ==, "123456");
689 res = g_snprintf (buf, 128, "%" G_GINT64_MODIFIER "o", (gint64)123456);
690 g_assert_cmpint (res, ==, 6);
691 g_assert_cmpstr (buf, ==, "361100");
693 res = g_snprintf (buf, 128, "%#" G_GINT64_MODIFIER "o", (gint64)123456);
694 g_assert_cmpint (res, ==, 7);
695 g_assert_cmpstr (buf, ==, "0361100");
697 res = g_snprintf (buf, 128, "%" G_GINT64_MODIFIER "x", (gint64)123456);
698 g_assert_cmpint (res, ==, 5);
699 g_assert_cmpstr (buf, ==, "1e240");
701 res = g_snprintf (buf, 128, "%#" G_GINT64_MODIFIER "x", (gint64)123456);
702 g_assert_cmpint (res, ==, 7);
703 g_assert_cmpstr (buf, ==, "0x1e240");
705 res = g_snprintf (buf, 128, "%" G_GINT64_MODIFIER "X", (gint64)123456);
706 g_assert_cmpint (res, ==, 5);
707 g_assert_cmpstr (buf, ==, "1E240");
710 /* On Win32, test that the "ll" modifier also works, for backward
711 * compatibility. One really should use the G_GINT64_MODIFIER (which
712 * on Win32 is the "I64" that the (msvcrt) C library's printf uses),
713 * but "ll" used to work with the "trio" g_printf implementation in
714 * GLib 2.2, so it's best if it continues to work.
717 /* However, gcc doesn't know about this, so we need to disable printf
720 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
721 _Pragma ("GCC diagnostic push")
722 _Pragma ("GCC diagnostic ignored \"-Wformat\"")
723 _Pragma ("GCC diagnostic ignored \"-Wformat-extra-args\"")
726 res = g_snprintf (buf, 128, "%" "lli", (gint64)123456);
727 g_assert_cmpint (res, ==, 6);
728 g_assert_cmpstr (buf, ==, "123456");
730 res = g_snprintf (buf, 128, "%" "lli", (gint64)-123456);
731 g_assert_cmpint (res, ==, 7);
732 g_assert_cmpstr (buf, ==, "-123456");
734 res = g_snprintf (buf, 128, "%" "llu", (guint64)123456);
735 g_assert_cmpint (res, ==, 6);
736 g_assert_cmpstr (buf, ==, "123456");
738 res = g_snprintf (buf, 128, "%" "ll" "o", (gint64)123456);
739 g_assert_cmpint (res, ==, 6);
740 g_assert_cmpstr (buf, ==, "361100");
742 res = g_snprintf (buf, 128, "%#" "ll" "o", (gint64)123456);
743 g_assert_cmpint (res, ==, 7);
744 g_assert_cmpstr (buf, ==, "0361100");
746 res = g_snprintf (buf, 128, "%" "ll" "x", (gint64)123456);
747 g_assert_cmpint (res, ==, 5);
748 g_assert_cmpstr (buf, ==, "1e240");
750 res = g_snprintf (buf, 128, "%#" "ll" "x", (gint64)123456);
751 g_assert_cmpint (res, ==, 7);
752 g_assert_cmpstr (buf, ==, "0x1e240");
754 res = g_snprintf (buf, 128, "%" "ll" "X", (gint64)123456);
755 g_assert_cmpint (res, ==, 5);
756 g_assert_cmpstr (buf, ==, "1E240");
758 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
759 _Pragma ("GCC diagnostic pop")
766 test_64bit2_base (void)
770 res = g_printf ("%" G_GINT64_FORMAT "\n", (gint64)123456);
771 g_assert_cmpint (res, ==, 7);
773 res = g_printf ("%" G_GINT64_FORMAT "\n", (gint64)-123456);
774 g_assert_cmpint (res, ==, 8);
776 res = g_printf ("%" G_GUINT64_FORMAT "\n", (guint64)123456);
777 g_assert_cmpint (res, ==, 7);
779 res = g_printf ("%" G_GINT64_MODIFIER "o\n", (gint64)123456);
780 g_assert_cmpint (res, ==, 7);
782 res = g_printf ("%#" G_GINT64_MODIFIER "o\n", (gint64)123456);
783 g_assert_cmpint (res, ==, 8);
785 res = g_printf ("%" G_GINT64_MODIFIER "x\n", (gint64)123456);
786 g_assert_cmpint (res, ==, 6);
788 res = g_printf ("%#" G_GINT64_MODIFIER "x\n", (gint64)123456);
789 g_assert_cmpint (res, ==, 8);
791 res = g_printf ("%" G_GINT64_MODIFIER "X\n", (gint64)123456);
792 g_assert_cmpint (res, ==, 6);
797 test_64bit2_win32 (void)
801 /* On Win32, test that the "ll" modifier also works, for backward
802 * compatibility. One really should use the G_GINT64_MODIFIER (which
803 * on Win32 is the "I64" that the (msvcrt) C library's printf uses),
804 * but "ll" used to work with the "trio" g_printf implementation in
805 * GLib 2.2, so it's best if it continues to work.
808 /* However, gcc doesn't know about this, so we need to disable printf
811 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
812 _Pragma ("GCC diagnostic push")
813 _Pragma ("GCC diagnostic ignored \"-Wformat\"")
814 _Pragma ("GCC diagnostic ignored \"-Wformat-extra-args\"")
817 res = g_printf ("%" "lli\n", (gint64)123456);
818 g_assert_cmpint (res, ==, 7);
820 res = g_printf ("%" "lli\n", (gint64)-123456);
821 g_assert_cmpint (res, ==, 8);
823 res = g_printf ("%" "llu\n", (guint64)123456);
824 g_assert_cmpint (res, ==, 7);
826 res = g_printf ("%" "ll" "o\n", (gint64)123456);
827 g_assert_cmpint (res, ==, 7);
829 res = g_printf ("%#" "ll" "o\n", (gint64)123456);
830 g_assert_cmpint (res, ==, 8);
832 res = g_printf ("%" "ll" "x\n", (gint64)123456);
833 g_assert_cmpint (res, ==, 6);
835 res = g_printf ("%#" "ll" "x\n", (gint64)123456);
836 g_assert_cmpint (res, ==, 8);
838 res = g_printf ("%" "ll" "X\n", (gint64)123456);
839 g_assert_cmpint (res, ==, 6);
841 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
842 _Pragma ("GCC diagnostic pop")
850 g_test_trap_subprocess ("/printf/test-64bit/subprocess/base", 0, 0);
851 g_test_trap_assert_passed ();
852 g_test_trap_assert_stdout ("123456\n-123456\n123456\n"
853 "361100\n0361100\n1e240\n"
857 g_test_trap_subprocess ("/printf/test-64bit/subprocess/win32", 0, 0);
858 g_test_trap_assert_passed ();
859 g_test_trap_assert_stdout ("123456\n-123456\n123456\n"
860 "361100\n0361100\n1e240\n"
867 upper_bound (const gchar *format, ...)
872 va_start (args, format);
873 res = g_printf_string_upper_bound (format, args);
880 test_upper_bound (void)
884 res = upper_bound ("bla %s %d: %g\n", "bla", 123, 0.123);
885 g_assert_cmpint (res, ==, 20);
892 g_test_init (&argc, &argv, NULL);
894 g_test_add_func ("/snprintf/retval-and-trunc", test_retval_and_trunc);
895 g_test_add_func ("/snprintf/%d", test_d);
896 g_test_add_func ("/snprintf/%o", test_o);
897 g_test_add_func ("/snprintf/%u", test_u);
898 g_test_add_func ("/snprintf/%x", test_x);
899 g_test_add_func ("/snprintf/%X", test_X);
900 g_test_add_func ("/snprintf/%f", test_f);
901 g_test_add_func ("/snprintf/%e", test_e);
902 g_test_add_func ("/snprintf/%c", test_c);
903 g_test_add_func ("/snprintf/%s", test_s);
904 g_test_add_func ("/snprintf/%n", test_n);
905 g_test_add_func ("/snprintf/test-percent", test_percent);
906 g_test_add_func ("/snprintf/test-positional-params", test_positional_params);
907 g_test_add_func ("/snprintf/test-64bit", test_64bit);
909 g_test_add_func ("/printf/test-percent", test_percent2);
910 g_test_add_func ("/printf/test-percent/subprocess", test_percent2_subprocess);
911 g_test_add_func ("/printf/test-positional-params", test_positional_params2);
912 g_test_add_func ("/printf/test-positional-params/subprocess", test_positional_params2_subprocess);
913 g_test_add_func ("/printf/test-64bit", test_64bit2);
914 g_test_add_func ("/printf/test-64bit/subprocess/base", test_64bit2_base);
916 g_test_add_func ("/printf/test-64bit/subprocess/win32", test_64bit2_win32);
919 g_test_add_func ("/sprintf/test-positional-params", test_positional_params3);
920 g_test_add_func ("/sprintf/upper-bound", test_upper_bound);