]> git.ipfire.org Git - thirdparty/glibc.git/blob - misc/tst-ldbl-warn.c
69a528755cfc0fa9c290028dbc8b8a34c10e86f8
[thirdparty/glibc.git] / misc / tst-ldbl-warn.c
1 /* Test for the long double conversions in *warn* functions.
2 Copyright (C) 2018 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
18
19 #include <err.h>
20 #include <errno.h>
21 #include <stdarg.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25
26 #include <support/check.h>
27 #include <support/xmemstream.h>
28
29 enum {WARN, WARNX, VWARN, VWARNX};
30
31 static void
32 do_one_test (int select, const char *format, va_list args,
33 long double arg1, double arg2, long double arg3,
34 double arg4, const char *expected)
35 {
36 /* Prepare in-memory buffer to hold the output. */
37 struct xmemstream stream;
38 xopen_memstream (&stream);
39 FILE *old_stderr = stderr;
40 stderr = stream.out;
41
42 /* Write to the buffer using one of the *warn* functions. */
43 errno = 0;
44 switch (select)
45 {
46 case WARN:
47 warn (format, arg1, arg2, arg3, arg4);
48 break;
49 case WARNX:
50 warnx (format, arg1, arg2, arg3, arg4);
51 break;
52 case VWARN:
53 vwarn (format, args);
54 break;
55 case VWARNX:
56 vwarnx (format, args);
57 break;
58 }
59
60 stderr = old_stderr;
61
62 /* Close the in-memory stream and check the output buffer. */
63 xfclose_memstream (&stream);
64 TEST_COMPARE_STRING (stream.buffer, expected);
65
66 if (stream.buffer != NULL)
67 free (stream.buffer);
68 }
69
70 static void
71 do_test_call_varg (const char *format, ...)
72 {
73 va_list args;
74
75 va_start (args, format);
76 do_one_test (VWARN, format, args, 0, 0, 0, 0,
77 "tst-ldbl-warn: "
78 "-1.000000 - -2.000000 - -3.000000 - -4.000000: Success\n");
79 va_end (args);
80
81 va_start (args, format);
82 do_one_test (VWARNX, format, args, 0, 0, 0, 0,
83 "tst-ldbl-warn: "
84 "-1.000000 - -2.000000 - -3.000000 - -4.000000\n");
85 va_end (args);
86 }
87
88 static void
89 do_test_call_rarg (const char *format, long double arg1, double arg2,
90 long double arg3, double arg4)
91 {
92 va_list args;
93 memset (&args, 0, sizeof (args));
94 do_one_test (WARN, format, args, arg1, arg2, arg3, arg4,
95 "tst-ldbl-warn: "
96 "-1.000000 - -2.000000 - -3.000000 - -4.000000: Success\n");
97 do_one_test (WARNX, format, args, arg1, arg2, arg3, arg4,
98 "tst-ldbl-warn: "
99 "-1.000000 - -2.000000 - -3.000000 - -4.000000\n");
100 }
101
102 static int
103 do_test (void)
104 {
105 long double arg1 = -1;
106 long double arg3 = -3;
107 double arg2 = -2;
108 double arg4 = -4;
109
110 do_test_call_rarg ("%Lf - %f - %Lf - %f", arg1, arg2, arg3, arg4);
111 do_test_call_varg ("%Lf - %f - %Lf - %f", arg1, arg2, arg3, arg4);
112
113 return 0;
114 }
115
116 #include <support/test-driver.c>