1 /*===========================================================================
2  *  Filename : test-format.c
3  *  About    : unit test for format functions
4  *
5  *  Copyright (C) 2006 YAMAMOTO Kengo <yamaken AT bp.iij4u.or.jp>
6  *  Copyright (c) 2007-2008 SigScheme Project <uim-en AT googlegroups.com>
7  *
8  *  All rights reserved.
9  *
10  *  Redistribution and use in source and binary forms, with or without
11  *  modification, are permitted provided that the following conditions
12  *  are met:
13  *
14  *  1. Redistributions of source code must retain the above copyright
15  *     notice, this list of conditions and the following disclaimer.
16  *  2. Redistributions in binary form must reproduce the above copyright
17  *     notice, this list of conditions and the following disclaimer in the
18  *     documentation and/or other materials provided with the distribution.
19  *  3. Neither the name of authors nor the names of its contributors
20  *     may be used to endorse or promote products derived from this software
21  *     without specific prior written permission.
22  *
23  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
24  *  IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
25  *  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26  *  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
27  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
30  *  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31  *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
32  *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
33  *  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 ===========================================================================*/
35 
36 #include <stddef.h>
37 #include <stdarg.h>
38 #include <string.h>
39 
40 #include <sigscheme/config.h>
41 #if (!SCM_USE_CHAR || !SCM_USE_STRING || !SCM_USE_INT)
42 #define TST_EXCLUDE_THIS
43 #endif
44 
45 #define TST_HAVE_MAIN 1
46 #include "sscm-test.h"
47 
48 #ifndef TST_EXCLUDE_THIS
49 
50 #include <sigscheme/sigscheme.h>
51 #include "sigschemeinternal.h"
52 
53 #define MSG_SSCM_DIRECTIVE_HELP                                              \
54 "(format+ [<port>] <format-string> [<arg>...])\n"                            \
55 "  - <port> is #t, #f or an output-port\n"                                   \
56 "  - any escape sequence is case insensitive\n"                              \
57 "\n"                                                                         \
58 "  The format+ procedure is a SigScheme-specific superset of SRFI-48.\n"     \
59 "  Following directives accept optional width w and d digits after the decimal,\n" \
60 "  and w accepts leading zero as zero-digit-padding specifier. All other rules\n" \
61 "  are same as SRFI-48. See also the help message for SRFI-48.\n"            \
62 "\n"                                                                         \
63 "SEQ        MNEMONIC       DESCRIPTION\n"                                    \
64 "~[w[,d]]D  [Decimal]      the arg is a number output in decimal radix\n"    \
65 "~[w[,d]]X  [heXadecimal]  the arg is a number output in hexdecimal radix\n" \
66 "~[w[,d]]O  [Octal]        the arg is a number output in octal radix\n"      \
67 "~[w[,d]]B  [Binary]       the arg is a number output in binary radix\n"     \
68 "~[w[,d]]F  [Fixed]        the arg is a string or number\n"
69 
70 #define I32 (SIZEOF_INT    == SIZEOF_INT32_T)
71 #define L32 (SIZEOF_LONG   == SIZEOF_INT32_T)
72 #define P32 (SIZEOF_VOID_P == SIZEOF_INT32_T)
73 
74 #define I64 (SIZEOF_INT    == SIZEOF_INT64_T)
75 #define L64 (SIZEOF_LONG   == SIZEOF_INT64_T)
76 #define P64 (SIZEOF_VOID_P == SIZEOF_INT64_T)
77 
78 #define IMAX32 (SIZEOF_INTMAX_T == SIZEOF_INT32_T)
79 #define IMAX64 (SIZEOF_INTMAX_T == SIZEOF_INT64_T)
80 
81 #define PDIFF32 (SIZEOF_PTRDIFF_T == SIZEOF_INT32_T)
82 #define PDIFF64 (SIZEOF_PTRDIFF_T == SIZEOF_INT64_T)
83 
84 #define M32 (SIZEOF_SCM_INT_T == SIZEOF_INT32_T)
85 #define M64 (SIZEOF_SCM_INT_T == SIZEOF_INT64_T)
86 
87 #define STR SCM_STRING_STR
88 
89 static ScmObj lst, clst;
90 
91 static ScmObj
format(const char * fmt,...)92 format(const char *fmt, ...)
93 {
94     va_list args;
95     ScmObj ret;
96 
97     va_start(args, fmt);
98     ret = scm_vformat(SCM_FALSE, SCM_FMT_INTERNAL, fmt, args);
99     va_end(args);
100 
101     return ret;
102 }
103 
104 int
main(int argc,char ** argv)105 main(int argc, char **argv)
106 {
107     tst_suite_info suite = TST_DEFAULT_SUITE_SETUP;
108     const char *my_argv[] = {
109         "dummy",
110         "--system-load-path", TST_SCM_SYSTEM_LOAD_PATH,
111         NULL
112     };
113 
114     scm_initialize(NULL, my_argv);
115 
116     scm_gc_protect_with_init(&lst,
117                              LIST_5(SCM_TRUE,
118                                     MAKE_INT(123),
119                                     MAKE_CHAR('a'),
120                                     CONST_STRING("aBc"),
121                                     LIST_1(MAKE_INT(0))));
122 
123     scm_gc_protect_with_init(&clst, LIST_2(MAKE_INT(0), MAKE_INT(1)));
124     SET_CDR(CDR(clst), clst);
125 
126     tst_main(&suite);
127 
128     scm_finalize();
129 
130     TST_DEFAULT_SUITE_CLEANUP(suite);
131     return !!suite.stats.fail;
132 }
133 
134 TST_CASE("format no directives")
135 {
136     TST_TN_EQ_STR("",   STR(format("")));
137     TST_TN_EQ_STR("\"", STR(format("\"")));
138     TST_TN_EQ_STR("\\", STR(format("\\")));
139     TST_TN_EQ_STR("a",  STR(format("a")));
140     TST_TN_EQ_STR("aBc",     STR(format("aBc")));
141     TST_TN_EQ_STR("あ",      STR(format("あ")));
142     TST_TN_EQ_STR("あい",    STR(format("あい")));
143     TST_TN_EQ_STR("aあBいc", STR(format("aあBいc")));
144 }
145 
146 TST_CASE("format ~C")
147 {
148     TST_TN_EQ_STR("",   STR(format("~C", (scm_ichar_t)'\0')));
149     TST_TN_EQ_STR("a",  STR(format("~C", (scm_ichar_t)'a')));
150     TST_TN_EQ_STR("\"", STR(format("~C", (scm_ichar_t)'\"')));
151     TST_TN_EQ_STR("\\", STR(format("~C", (scm_ichar_t)'\\')));
152     TST_TN_EQ_STR("あ", STR(format("~C", (scm_ichar_t)0x3042)));
153 }
154 
155 TST_CASE("format ~S")
156 {
157     TST_TN_EQ_STR("",          STR(format("~S",   "")));
158     TST_TN_EQ_STR("",          STR(format("~0S",  "")));
159     TST_TN_EQ_STR(" ",         STR(format("~1S",  "")));
160     TST_TN_EQ_STR("",          STR(format("~00S", "")));
161     TST_TN_EQ_STR(" ",         STR(format("~01S", "")));
162     TST_TN_EQ_STR("\"",        STR(format("~S",   "\"")));
163     TST_TN_EQ_STR("\\",        STR(format("~S",   "\\")));
164     TST_TN_EQ_STR("a",         STR(format("~S",   "a")));
165     TST_TN_EQ_STR("aBc",       STR(format("~S",   "aBc")));
166     TST_TN_EQ_STR("あ",        STR(format("~S",   "あ")));
167     TST_TN_EQ_STR("あい",      STR(format("~S",   "あい")));
168     TST_TN_EQ_STR("aあBいc",   STR(format("~S",   "aあBいc")));
169     TST_TN_EQ_STR("aBc",       STR(format("~0S",  "aBc")));
170     TST_TN_EQ_STR("aBc",       STR(format("~1S",  "aBc")));
171     TST_TN_EQ_STR("aBc",       STR(format("~2S",  "aBc")));
172     TST_TN_EQ_STR("aBc",       STR(format("~3S",  "aBc")));
173     TST_TN_EQ_STR(" aBc",      STR(format("~4S",  "aBc")));
174     TST_TN_EQ_STR("  aBc",     STR(format("~5S",  "aBc")));
175     TST_TN_EQ_STR("aBc",       STR(format("~00S", "aBc")));
176     TST_TN_EQ_STR("aBc",       STR(format("~01S", "aBc")));
177     TST_TN_EQ_STR("aBc",       STR(format("~02S", "aBc")));
178     TST_TN_EQ_STR("aBc",       STR(format("~03S", "aBc")));
179     TST_TN_EQ_STR(" aBc",      STR(format("~04S", "aBc")));
180     TST_TN_EQ_STR("  aBc",     STR(format("~05S", "aBc")));
181     TST_TN_EQ_STR("aあBいc",   STR(format("~0S",  "aあBいc")));
182     TST_TN_EQ_STR("aあBいc",   STR(format("~1S",  "aあBいc")));
183     TST_TN_EQ_STR("aあBいc",   STR(format("~2S",  "aあBいc")));
184     TST_TN_EQ_STR("aあBいc",   STR(format("~3S",  "aあBいc")));
185     TST_TN_EQ_STR("aあBいc",   STR(format("~4S",  "aあBいc")));
186     TST_TN_EQ_STR("aあBいc",   STR(format("~5S",  "aあBいc")));
187     TST_TN_EQ_STR(" aあBいc",  STR(format("~6S",  "aあBいc")));
188     TST_TN_EQ_STR("  aあBいc", STR(format("~7S",  "aあBいc")));
189     TST_TN_EQ_STR("aあBいc",   STR(format("~00S", "aあBいc")));
190     TST_TN_EQ_STR("aあBいc",   STR(format("~01S", "aあBいc")));
191     TST_TN_EQ_STR("aあBいc",   STR(format("~02S", "aあBいc")));
192     TST_TN_EQ_STR("aあBいc",   STR(format("~03S", "aあBいc")));
193     TST_TN_EQ_STR("aあBいc",   STR(format("~04S", "aあBいc")));
194     TST_TN_EQ_STR("aあBいc",   STR(format("~05S", "aあBいc")));
195     TST_TN_EQ_STR(" aあBいc",  STR(format("~06S", "aあBいc")));
196     TST_TN_EQ_STR("  aあBいc", STR(format("~07S", "aあBいc")));
197 }
198 
199 TST_CASE("format ~P")
200 {
201 #if P32
202     TST_TN_EQ_STR("0x00000000", STR(format("~P", (void *)NULL)));
203     TST_TN_EQ_STR("0xffffffff", STR(format("~P", (void *)~0UL)));
204     TST_TN_EQ_STR("0x00012abc", STR(format("~P", (void *)0x12ABC)));
205 #elif P64
206     TST_TN_EQ_STR("0x0000000000000000", STR(format("~P", (void *)NULL)));
207     TST_TN_EQ_STR("0xffffffffffffffff", STR(format("~P", (void *)~0UL)));
208     TST_TN_EQ_STR("0x0000000000012abc", STR(format("~P", (void *)0x12ABC)));
209     TST_TN_EQ_STR("0x000deadbeef12abc",
210                   STR(format("~P", (void *)0xDEADBEEF12ABC)));
211 #endif
212 }
213 
214 TST_CASE("format ~D")
215 {
216     TST_TN_EQ_STR("-100", STR(format("~D",   -100)));
217     TST_TN_EQ_STR("-10",  STR(format("~D",   -10)));
218     TST_TN_EQ_STR("-1",   STR(format("~D",   -1)));
219     TST_TN_EQ_STR("0",    STR(format("~D",   0)));
220     TST_TN_EQ_STR("1",    STR(format("~D",   1)));
221     TST_TN_EQ_STR("10",   STR(format("~D",   10)));
222     TST_TN_EQ_STR("100",  STR(format("~D",   100)));
223 
224     TST_TN_EQ_STR("-100", STR(format("~0D",  -100)));
225     TST_TN_EQ_STR("-10",  STR(format("~0D",  -10)));
226     TST_TN_EQ_STR("-1",   STR(format("~0D",  -1)));
227     TST_TN_EQ_STR("0",    STR(format("~0D",  0)));
228     TST_TN_EQ_STR("1",    STR(format("~0D",  1)));
229     TST_TN_EQ_STR("10",   STR(format("~0D",  10)));
230     TST_TN_EQ_STR("100",  STR(format("~0D",  100)));
231 
232     TST_TN_EQ_STR("-100", STR(format("~03D", -100)));
233     TST_TN_EQ_STR("-10",  STR(format("~03D", -10)));
234     TST_TN_EQ_STR("-01",  STR(format("~03D", -1)));
235     TST_TN_EQ_STR("000",  STR(format("~03D", 0)));
236     TST_TN_EQ_STR("001",  STR(format("~03D", 1)));
237     TST_TN_EQ_STR("010",  STR(format("~03D", 10)));
238     TST_TN_EQ_STR("100",  STR(format("~03D", 100)));
239 
240     TST_TN_EQ_STR("-100", STR(format("~3D",  -100)));
241     TST_TN_EQ_STR("-10",  STR(format("~3D",  -10)));
242     TST_TN_EQ_STR(" -1",  STR(format("~3D",  -1)));
243     TST_TN_EQ_STR("  0",  STR(format("~3D",  0)));
244     TST_TN_EQ_STR("  1",  STR(format("~3D",  1)));
245     TST_TN_EQ_STR(" 10",  STR(format("~3D",  10)));
246     TST_TN_EQ_STR("100",  STR(format("~3D",  100)));
247 
248     TST_TN_EQ_STR("                                                                                                                            123",
249                   STR(format("~127D", 123)));
250     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
251                   STR(format("~0127D", 123)));
252 }
253 
254 TST_CASE("format ~U")
255 {
256     TST_TN_EQ_STR("0",    STR(format("~U",   0)));
257     TST_TN_EQ_STR("1",    STR(format("~U",   1)));
258     TST_TN_EQ_STR("10",   STR(format("~U",   10)));
259     TST_TN_EQ_STR("100",  STR(format("~U",   100)));
260 
261     TST_TN_EQ_STR("0",    STR(format("~0U",  0)));
262     TST_TN_EQ_STR("1",    STR(format("~0U",  1)));
263     TST_TN_EQ_STR("10",   STR(format("~0U",  10)));
264     TST_TN_EQ_STR("100",  STR(format("~0U",  100)));
265 
266     TST_TN_EQ_STR("000",  STR(format("~03U", 0)));
267     TST_TN_EQ_STR("001",  STR(format("~03U", 1)));
268     TST_TN_EQ_STR("010",  STR(format("~03U", 10)));
269     TST_TN_EQ_STR("100",  STR(format("~03U", 100)));
270 
271     TST_TN_EQ_STR("  0",  STR(format("~3U",  0)));
272     TST_TN_EQ_STR("  1",  STR(format("~3U",  1)));
273     TST_TN_EQ_STR(" 10",  STR(format("~3U",  10)));
274     TST_TN_EQ_STR("100",  STR(format("~3U",  100)));
275 
276 #if I32
277     TST_TN_EQ_STR("4294967196", STR(format("~U",   -100)));
278     TST_TN_EQ_STR("4294967286", STR(format("~U",   -10)));
279     TST_TN_EQ_STR("4294967295", STR(format("~U",   -1)));
280 
281     TST_TN_EQ_STR("4294967196", STR(format("~0U",  -100)));
282     TST_TN_EQ_STR("4294967286", STR(format("~0U",  -10)));
283     TST_TN_EQ_STR("4294967295", STR(format("~0U",  -1)));
284 
285     TST_TN_EQ_STR("4294967196", STR(format("~03U", -100)));
286     TST_TN_EQ_STR("4294967286", STR(format("~03U", -10)));
287     TST_TN_EQ_STR("4294967295", STR(format("~03U", -1)));
288 
289     TST_TN_EQ_STR("4294967196", STR(format("~3U",  -100)));
290     TST_TN_EQ_STR("4294967286", STR(format("~3U",  -10)));
291     TST_TN_EQ_STR("4294967295", STR(format("~3U",  -1)));
292 #elif I64
293     TST_TN_EQ_STR("18446744073709551516", STR(format("~U",   -100)));
294     TST_TN_EQ_STR("18446744073709551606", STR(format("~U",   -10)));
295     TST_TN_EQ_STR("18446744073709551615", STR(format("~U",   -1)));
296 
297     TST_TN_EQ_STR("18446744073709551516", STR(format("~0U",  -100)));
298     TST_TN_EQ_STR("18446744073709551606", STR(format("~0U",  -10)));
299     TST_TN_EQ_STR("18446744073709551615", STR(format("~0U",  -1)));
300 
301     TST_TN_EQ_STR("18446744073709551516", STR(format("~03U", -100)));
302     TST_TN_EQ_STR("18446744073709551606", STR(format("~03U", -10)));
303     TST_TN_EQ_STR("18446744073709551615", STR(format("~03U", -1)));
304 
305     TST_TN_EQ_STR("18446744073709551516", STR(format("~3U",  -100)));
306     TST_TN_EQ_STR("18446744073709551606", STR(format("~3U",  -10)));
307     TST_TN_EQ_STR("18446744073709551615", STR(format("~3U",  -1)));
308 #endif
309 
310     TST_TN_EQ_STR("                                                                                                                            123",
311                   STR(format("~127U", 123)));
312     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
313                   STR(format("~0127U", 123)));
314 }
315 
316 TST_CASE("format ~X")
317 {
318     TST_TN_EQ_STR("0",    STR(format("~X",   0)));
319     TST_TN_EQ_STR("1",    STR(format("~X",   1)));
320     TST_TN_EQ_STR("a",    STR(format("~X",   10)));
321     TST_TN_EQ_STR("64",   STR(format("~X",   100)));
322 
323     TST_TN_EQ_STR("0",    STR(format("~0X",  0)));
324     TST_TN_EQ_STR("1",    STR(format("~0X",  1)));
325     TST_TN_EQ_STR("a",    STR(format("~0X",  10)));
326     TST_TN_EQ_STR("64",   STR(format("~0X",  100)));
327 
328     TST_TN_EQ_STR("000",  STR(format("~03X", 0)));
329     TST_TN_EQ_STR("001",  STR(format("~03X", 1)));
330     TST_TN_EQ_STR("00a",  STR(format("~03X", 10)));
331     TST_TN_EQ_STR("064",  STR(format("~03X", 100)));
332 
333     TST_TN_EQ_STR("  0",  STR(format("~3X",  0)));
334     TST_TN_EQ_STR("  1",  STR(format("~3X",  1)));
335     TST_TN_EQ_STR("  a",  STR(format("~3X",  10)));
336     TST_TN_EQ_STR(" 64",  STR(format("~3X",  100)));
337 
338 #if I32
339     TST_TN_EQ_STR("ffffff9c", STR(format("~X",   -100)));
340     TST_TN_EQ_STR("fffffff6", STR(format("~X",   -10)));
341     TST_TN_EQ_STR("ffffffff", STR(format("~X",   -1)));
342 
343     TST_TN_EQ_STR("ffffff9c", STR(format("~0X",  -100)));
344     TST_TN_EQ_STR("fffffff6", STR(format("~0X",  -10)));
345     TST_TN_EQ_STR("ffffffff", STR(format("~0X",  -1)));
346 
347     TST_TN_EQ_STR("ffffff9c", STR(format("~03X", -100)));
348     TST_TN_EQ_STR("fffffff6", STR(format("~03X", -10)));
349     TST_TN_EQ_STR("ffffffff", STR(format("~03X", -1)));
350 
351     TST_TN_EQ_STR("ffffff9c", STR(format("~3X",  -100)));
352     TST_TN_EQ_STR("fffffff6", STR(format("~3X",  -10)));
353     TST_TN_EQ_STR("ffffffff", STR(format("~3X",  -1)));
354 #elif I64
355     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~X",   -100)));
356     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~X",   -10)));
357     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~X",   -1)));
358 
359     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~0X",  -100)));
360     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~0X",  -10)));
361     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~0X",  -1)));
362 
363     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~03X", -100)));
364     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~03X", -10)));
365     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~03X", -1)));
366 
367     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~3X",  -100)));
368     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~3X",  -10)));
369     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~3X",  -1)));
370 #endif
371 
372     TST_TN_EQ_STR("                                                                                                                            1ac",
373                   STR(format("~127X", 0x1ac)));
374     TST_TN_EQ_STR("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ac",
375                   STR(format("~0127X", 0x1ac)));
376 }
377 
378 TST_CASE("format ~O")
379 {
380     TST_TN_EQ_STR("0",    STR(format("~O",   0)));
381     TST_TN_EQ_STR("1",    STR(format("~O",   1)));
382     TST_TN_EQ_STR("12",   STR(format("~O",   10)));
383     TST_TN_EQ_STR("144",  STR(format("~O",   100)));
384 
385     TST_TN_EQ_STR("0",    STR(format("~0O",  0)));
386     TST_TN_EQ_STR("1",    STR(format("~0O",  1)));
387     TST_TN_EQ_STR("12",   STR(format("~0O",  10)));
388     TST_TN_EQ_STR("144",  STR(format("~0O",  100)));
389 
390     TST_TN_EQ_STR("000",  STR(format("~03O", 0)));
391     TST_TN_EQ_STR("001",  STR(format("~03O", 1)));
392     TST_TN_EQ_STR("012",  STR(format("~03O", 10)));
393     TST_TN_EQ_STR("144",  STR(format("~03O", 100)));
394 
395     TST_TN_EQ_STR("  0",  STR(format("~3O",  0)));
396     TST_TN_EQ_STR("  1",  STR(format("~3O",  1)));
397     TST_TN_EQ_STR(" 12",  STR(format("~3O",  10)));
398     TST_TN_EQ_STR("144",  STR(format("~3O",  100)));
399 
400 #if I32
401     TST_TN_EQ_STR("37777777634", STR(format("~O",   -100)));
402     TST_TN_EQ_STR("37777777766", STR(format("~O",   -10)));
403     TST_TN_EQ_STR("37777777777", STR(format("~O",   -1)));
404 
405     TST_TN_EQ_STR("37777777634", STR(format("~0O",  -100)));
406     TST_TN_EQ_STR("37777777766", STR(format("~0O",  -10)));
407     TST_TN_EQ_STR("37777777777", STR(format("~0O",  -1)));
408 
409     TST_TN_EQ_STR("37777777634", STR(format("~03O", -100)));
410     TST_TN_EQ_STR("37777777766", STR(format("~03O", -10)));
411     TST_TN_EQ_STR("37777777777", STR(format("~03O", -1)));
412 
413     TST_TN_EQ_STR("37777777634", STR(format("~3O",  -100)));
414     TST_TN_EQ_STR("37777777766", STR(format("~3O",  -10)));
415     TST_TN_EQ_STR("37777777777", STR(format("~3O",  -1)));
416 #elif I64
417     TST_TN_EQ_STR("1777777777777777777634", STR(format("~O",  -100)));
418     TST_TN_EQ_STR("1777777777777777777766", STR(format("~O",  -10)));
419     TST_TN_EQ_STR("1777777777777777777777", STR(format("~O",  -1)));
420 
421     TST_TN_EQ_STR("1777777777777777777634", STR(format("~0O", -100)));
422     TST_TN_EQ_STR("1777777777777777777766", STR(format("~0O", -10)));
423     TST_TN_EQ_STR("1777777777777777777777", STR(format("~0O", -1)));
424 
425     TST_TN_EQ_STR("1777777777777777777634", STR(format("~03O", -100)));
426     TST_TN_EQ_STR("1777777777777777777766", STR(format("~03O", -10)));
427     TST_TN_EQ_STR("1777777777777777777777", STR(format("~03O", -1)));
428 
429     TST_TN_EQ_STR("1777777777777777777634", STR(format("~3O", -100)));
430     TST_TN_EQ_STR("1777777777777777777766", STR(format("~3O", -10)));
431     TST_TN_EQ_STR("1777777777777777777777", STR(format("~3O", -1)));
432 #endif
433 
434     TST_TN_EQ_STR("                                                                                                                            123",
435                   STR(format("~127O", 0123)));
436     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
437                   STR(format("~0127O", 0123)));
438 }
439 
440 TST_CASE("format ~B")
441 {
442     TST_TN_EQ_STR("0",       STR(format("~B",   0)));
443     TST_TN_EQ_STR("1",       STR(format("~B",   1)));
444     TST_TN_EQ_STR("1010",    STR(format("~B",   10)));
445     TST_TN_EQ_STR("1100100", STR(format("~B",   100)));
446 
447     TST_TN_EQ_STR("0",       STR(format("~0B",  0)));
448     TST_TN_EQ_STR("1",       STR(format("~0B",  1)));
449     TST_TN_EQ_STR("1010",    STR(format("~0B",  10)));
450     TST_TN_EQ_STR("1100100", STR(format("~0B",  100)));
451 
452     TST_TN_EQ_STR("00000",   STR(format("~05B", 0)));
453     TST_TN_EQ_STR("00001",   STR(format("~05B", 1)));
454     TST_TN_EQ_STR("01010",   STR(format("~05B", 10)));
455     TST_TN_EQ_STR("1100100", STR(format("~05B", 100)));
456 
457     TST_TN_EQ_STR("    0",   STR(format("~5B",  0)));
458     TST_TN_EQ_STR("    1",   STR(format("~5B",  1)));
459     TST_TN_EQ_STR(" 1010",   STR(format("~5B",  10)));
460     TST_TN_EQ_STR("1100100", STR(format("~5B",  100)));
461 
462 #if I32
463     TST_TN_EQ_STR("11111111111111111111111110011100",
464                   STR(format("~B", -100)));
465     TST_TN_EQ_STR("11111111111111111111111111110110",
466                   STR(format("~B", -10)));
467     TST_TN_EQ_STR("11111111111111111111111111111111",
468                   STR(format("~B", -1)));
469 
470     TST_TN_EQ_STR("11111111111111111111111110011100",
471                   STR(format("~0B", -100)));
472     TST_TN_EQ_STR("11111111111111111111111111110110",
473                   STR(format("~0B", -10)));
474     TST_TN_EQ_STR("11111111111111111111111111111111",
475                   STR(format("~0B", -1)));
476 
477     TST_TN_EQ_STR("11111111111111111111111110011100",
478                   STR(format("~05B", -100)));
479     TST_TN_EQ_STR("11111111111111111111111111110110",
480                   STR(format("~05B", -10)));
481     TST_TN_EQ_STR("11111111111111111111111111111111",
482                   STR(format("~05B", -1)));
483 
484     TST_TN_EQ_STR("11111111111111111111111110011100",
485                   STR(format("~5B", -100)));
486     TST_TN_EQ_STR("11111111111111111111111111110110",
487                   STR(format("~5B", -10)));
488     TST_TN_EQ_STR("11111111111111111111111111111111",
489                   STR(format("~5B", -1)));
490 #elif I64
491     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
492                   STR(format("~B", -100)));
493     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
494                   STR(format("~B", -10)));
495     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
496                   STR(format("~B", -1)));
497 
498     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
499                   STR(format("~0B", -100)));
500     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
501                   STR(format("~0B", -10)));
502     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
503                   STR(format("~0B", -1)));
504 
505     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
506                   STR(format("~05B", -100)));
507     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
508                   STR(format("~05B", -10)));
509     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
510                   STR(format("~05B", -1)));
511 
512     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
513                   STR(format("~5B", -100)));
514     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
515                   STR(format("~5B", -10)));
516     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
517                   STR(format("~5B", -1)));
518 #endif
519 
520     TST_TN_EQ_STR("                                                                                                                            101",
521                   STR(format("~127B", 0x5)));
522     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101",
523                   STR(format("~0127B", 0x5)));
524 }
525 
526 TST_CASE("format ~WD")
527 {
528     TST_TN_EQ_STR("-100", STR(format("~WD",   (int32_t)-100)));
529     TST_TN_EQ_STR("-10",  STR(format("~WD",   (int32_t)-10)));
530     TST_TN_EQ_STR("-1",   STR(format("~WD",   (int32_t)-1)));
531     TST_TN_EQ_STR("0",    STR(format("~WD",   (int32_t)0)));
532     TST_TN_EQ_STR("1",    STR(format("~WD",   (int32_t)1)));
533     TST_TN_EQ_STR("10",   STR(format("~WD",   (int32_t)10)));
534     TST_TN_EQ_STR("100",  STR(format("~WD",   (int32_t)100)));
535 
536     TST_TN_EQ_STR("-100", STR(format("~0WD",  (int32_t)-100)));
537     TST_TN_EQ_STR("-10",  STR(format("~0WD",  (int32_t)-10)));
538     TST_TN_EQ_STR("-1",   STR(format("~0WD",  (int32_t)-1)));
539     TST_TN_EQ_STR("0",    STR(format("~0WD",  (int32_t)0)));
540     TST_TN_EQ_STR("1",    STR(format("~0WD",  (int32_t)1)));
541     TST_TN_EQ_STR("10",   STR(format("~0WD",  (int32_t)10)));
542     TST_TN_EQ_STR("100",  STR(format("~0WD",  (int32_t)100)));
543 
544     TST_TN_EQ_STR("-100", STR(format("~03WD", (int32_t)-100)));
545     TST_TN_EQ_STR("-10",  STR(format("~03WD", (int32_t)-10)));
546     TST_TN_EQ_STR("-01",  STR(format("~03WD", (int32_t)-1)));
547     TST_TN_EQ_STR("000",  STR(format("~03WD", (int32_t)0)));
548     TST_TN_EQ_STR("001",  STR(format("~03WD", (int32_t)1)));
549     TST_TN_EQ_STR("010",  STR(format("~03WD", (int32_t)10)));
550     TST_TN_EQ_STR("100",  STR(format("~03WD", (int32_t)100)));
551 
552     TST_TN_EQ_STR("-100", STR(format("~3WD",  (int32_t)-100)));
553     TST_TN_EQ_STR("-10",  STR(format("~3WD",  (int32_t)-10)));
554     TST_TN_EQ_STR(" -1",  STR(format("~3WD",  (int32_t)-1)));
555     TST_TN_EQ_STR("  0",  STR(format("~3WD",  (int32_t)0)));
556     TST_TN_EQ_STR("  1",  STR(format("~3WD",  (int32_t)1)));
557     TST_TN_EQ_STR(" 10",  STR(format("~3WD",  (int32_t)10)));
558     TST_TN_EQ_STR("100",  STR(format("~3WD",  (int32_t)100)));
559 
560     TST_TN_EQ_STR("                                                                                                                            123",
561                   STR(format("~127WD", (int32_t)123)));
562     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
563                   STR(format("~0127WD", (int32_t)123)));
564 }
565 
566 TST_CASE("format ~WU")
567 {
568     TST_TN_EQ_STR("0",    STR(format("~WU",   (int32_t)0)));
569     TST_TN_EQ_STR("1",    STR(format("~WU",   (int32_t)1)));
570     TST_TN_EQ_STR("10",   STR(format("~WU",   (int32_t)10)));
571     TST_TN_EQ_STR("100",  STR(format("~WU",   (int32_t)100)));
572 
573     TST_TN_EQ_STR("0",    STR(format("~0WU",  (int32_t)0)));
574     TST_TN_EQ_STR("1",    STR(format("~0WU",  (int32_t)1)));
575     TST_TN_EQ_STR("10",   STR(format("~0WU",  (int32_t)10)));
576     TST_TN_EQ_STR("100",  STR(format("~0WU",  (int32_t)100)));
577 
578     TST_TN_EQ_STR("000",  STR(format("~03WU", (int32_t)0)));
579     TST_TN_EQ_STR("001",  STR(format("~03WU", (int32_t)1)));
580     TST_TN_EQ_STR("010",  STR(format("~03WU", (int32_t)10)));
581     TST_TN_EQ_STR("100",  STR(format("~03WU", (int32_t)100)));
582 
583     TST_TN_EQ_STR("  0",  STR(format("~3WU",  (int32_t)0)));
584     TST_TN_EQ_STR("  1",  STR(format("~3WU",  (int32_t)1)));
585     TST_TN_EQ_STR(" 10",  STR(format("~3WU",  (int32_t)10)));
586     TST_TN_EQ_STR("100",  STR(format("~3WU",  (int32_t)100)));
587 
588     TST_TN_EQ_STR("4294967196", STR(format("~WU",   (int32_t)-100)));
589     TST_TN_EQ_STR("4294967286", STR(format("~WU",   (int32_t)-10)));
590     TST_TN_EQ_STR("4294967295", STR(format("~WU",   (int32_t)-1)));
591 
592     TST_TN_EQ_STR("4294967196", STR(format("~0WU",  (int32_t)-100)));
593     TST_TN_EQ_STR("4294967286", STR(format("~0WU",  (int32_t)-10)));
594     TST_TN_EQ_STR("4294967295", STR(format("~0WU",  (int32_t)-1)));
595 
596     TST_TN_EQ_STR("4294967196", STR(format("~03WU", (int32_t)-100)));
597     TST_TN_EQ_STR("4294967286", STR(format("~03WU", (int32_t)-10)));
598     TST_TN_EQ_STR("4294967295", STR(format("~03WU", (int32_t)-1)));
599 
600     TST_TN_EQ_STR("4294967196", STR(format("~3WU",  (int32_t)-100)));
601     TST_TN_EQ_STR("4294967286", STR(format("~3WU",  (int32_t)-10)));
602     TST_TN_EQ_STR("4294967295", STR(format("~3WU",  (int32_t)-1)));
603 
604     TST_TN_EQ_STR("                                                                                                                            123",
605                   STR(format("~127WU", (int32_t)123)));
606     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
607                   STR(format("~0127WU", (int32_t)123)));
608 }
609 
610 TST_CASE("format ~WX")
611 {
612     TST_TN_EQ_STR("0",    STR(format("~WX",   (int32_t)0)));
613     TST_TN_EQ_STR("1",    STR(format("~WX",   (int32_t)1)));
614     TST_TN_EQ_STR("a",    STR(format("~WX",   (int32_t)10)));
615     TST_TN_EQ_STR("64",   STR(format("~WX",   (int32_t)100)));
616 
617     TST_TN_EQ_STR("0",    STR(format("~0WX",  (int32_t)0)));
618     TST_TN_EQ_STR("1",    STR(format("~0WX",  (int32_t)1)));
619     TST_TN_EQ_STR("a",    STR(format("~0WX",  (int32_t)10)));
620     TST_TN_EQ_STR("64",   STR(format("~0WX",  (int32_t)100)));
621 
622     TST_TN_EQ_STR("000",  STR(format("~03WX", (int32_t)0)));
623     TST_TN_EQ_STR("001",  STR(format("~03WX", (int32_t)1)));
624     TST_TN_EQ_STR("00a",  STR(format("~03WX", (int32_t)10)));
625     TST_TN_EQ_STR("064",  STR(format("~03WX", (int32_t)100)));
626 
627     TST_TN_EQ_STR("  0",  STR(format("~3WX",  (int32_t)0)));
628     TST_TN_EQ_STR("  1",  STR(format("~3WX",  (int32_t)1)));
629     TST_TN_EQ_STR("  a",  STR(format("~3WX",  (int32_t)10)));
630     TST_TN_EQ_STR(" 64",  STR(format("~3WX",  (int32_t)100)));
631 
632     TST_TN_EQ_STR("ffffff9c", STR(format("~WX",   (int32_t)-100)));
633     TST_TN_EQ_STR("fffffff6", STR(format("~WX",   (int32_t)-10)));
634     TST_TN_EQ_STR("ffffffff", STR(format("~WX",   (int32_t)-1)));
635 
636     TST_TN_EQ_STR("ffffff9c", STR(format("~0WX",  (int32_t)-100)));
637     TST_TN_EQ_STR("fffffff6", STR(format("~0WX",  (int32_t)-10)));
638     TST_TN_EQ_STR("ffffffff", STR(format("~0WX",  (int32_t)-1)));
639 
640     TST_TN_EQ_STR("ffffff9c", STR(format("~03WX", (int32_t)-100)));
641     TST_TN_EQ_STR("fffffff6", STR(format("~03WX", (int32_t)-10)));
642     TST_TN_EQ_STR("ffffffff", STR(format("~03WX", (int32_t)-1)));
643 
644     TST_TN_EQ_STR("ffffff9c", STR(format("~3WX",  (int32_t)-100)));
645     TST_TN_EQ_STR("fffffff6", STR(format("~3WX",  (int32_t)-10)));
646     TST_TN_EQ_STR("ffffffff", STR(format("~3WX",  (int32_t)-1)));
647 
648     TST_TN_EQ_STR("                                                                                                                            1ac",
649                   STR(format("~127WX", (int32_t)0x1ac)));
650     TST_TN_EQ_STR("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ac",
651                   STR(format("~0127WX", (int32_t)0x1ac)));
652 }
653 
654 TST_CASE("format ~WO")
655 {
656     TST_TN_EQ_STR("0",    STR(format("~WO",   (int32_t)0)));
657     TST_TN_EQ_STR("1",    STR(format("~WO",   (int32_t)1)));
658     TST_TN_EQ_STR("12",   STR(format("~WO",   (int32_t)10)));
659     TST_TN_EQ_STR("144",  STR(format("~WO",   (int32_t)100)));
660 
661     TST_TN_EQ_STR("0",    STR(format("~0WO",  (int32_t)0)));
662     TST_TN_EQ_STR("1",    STR(format("~0WO",  (int32_t)1)));
663     TST_TN_EQ_STR("12",   STR(format("~0WO",  (int32_t)10)));
664     TST_TN_EQ_STR("144",  STR(format("~0WO",  (int32_t)100)));
665 
666     TST_TN_EQ_STR("000",  STR(format("~03WO", (int32_t)0)));
667     TST_TN_EQ_STR("001",  STR(format("~03WO", (int32_t)1)));
668     TST_TN_EQ_STR("012",  STR(format("~03WO", (int32_t)10)));
669     TST_TN_EQ_STR("144",  STR(format("~03WO", (int32_t)100)));
670 
671     TST_TN_EQ_STR("  0",  STR(format("~3WO",  (int32_t)0)));
672     TST_TN_EQ_STR("  1",  STR(format("~3WO",  (int32_t)1)));
673     TST_TN_EQ_STR(" 12",  STR(format("~3WO",  (int32_t)10)));
674     TST_TN_EQ_STR("144",  STR(format("~3WO",  (int32_t)100)));
675 
676     TST_TN_EQ_STR("37777777634", STR(format("~WO",   (int32_t)-100)));
677     TST_TN_EQ_STR("37777777766", STR(format("~WO",   (int32_t)-10)));
678     TST_TN_EQ_STR("37777777777", STR(format("~WO",   (int32_t)-1)));
679 
680     TST_TN_EQ_STR("37777777634", STR(format("~0WO",  (int32_t)-100)));
681     TST_TN_EQ_STR("37777777766", STR(format("~0WO",  (int32_t)-10)));
682     TST_TN_EQ_STR("37777777777", STR(format("~0WO",  (int32_t)-1)));
683 
684     TST_TN_EQ_STR("37777777634", STR(format("~03WO", (int32_t)-100)));
685     TST_TN_EQ_STR("37777777766", STR(format("~03WO", (int32_t)-10)));
686     TST_TN_EQ_STR("37777777777", STR(format("~03WO", (int32_t)-1)));
687 
688     TST_TN_EQ_STR("37777777634", STR(format("~3WO",  (int32_t)-100)));
689     TST_TN_EQ_STR("37777777766", STR(format("~3WO",  (int32_t)-10)));
690     TST_TN_EQ_STR("37777777777", STR(format("~3WO",  (int32_t)-1)));
691 
692     TST_TN_EQ_STR("                                                                                                                            123",
693                   STR(format("~127WO", (int32_t)0123)));
694     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
695                   STR(format("~0127WO", (int32_t)0123)));
696 }
697 
698 TST_CASE("format ~WB")
699 {
700     TST_TN_EQ_STR("0",       STR(format("~WB",   (int32_t)0)));
701     TST_TN_EQ_STR("1",       STR(format("~WB",   (int32_t)1)));
702     TST_TN_EQ_STR("1010",    STR(format("~WB",   (int32_t)10)));
703     TST_TN_EQ_STR("1100100", STR(format("~WB",   (int32_t)100)));
704 
705     TST_TN_EQ_STR("0",       STR(format("~0WB",  (int32_t)0)));
706     TST_TN_EQ_STR("1",       STR(format("~0WB",  (int32_t)1)));
707     TST_TN_EQ_STR("1010",    STR(format("~0WB",  (int32_t)10)));
708     TST_TN_EQ_STR("1100100", STR(format("~0WB",  (int32_t)100)));
709 
710     TST_TN_EQ_STR("00000",   STR(format("~05WB", (int32_t)0)));
711     TST_TN_EQ_STR("00001",   STR(format("~05WB", (int32_t)1)));
712     TST_TN_EQ_STR("01010",   STR(format("~05WB", (int32_t)10)));
713     TST_TN_EQ_STR("1100100", STR(format("~05WB", (int32_t)100)));
714 
715     TST_TN_EQ_STR("    0",   STR(format("~5WB",  (int32_t)0)));
716     TST_TN_EQ_STR("    1",   STR(format("~5WB",  (int32_t)1)));
717     TST_TN_EQ_STR(" 1010",   STR(format("~5WB",  (int32_t)10)));
718     TST_TN_EQ_STR("1100100", STR(format("~5WB",  (int32_t)100)));
719 
720     TST_TN_EQ_STR("11111111111111111111111110011100",
721                   STR(format("~WB", (int32_t)-100)));
722     TST_TN_EQ_STR("11111111111111111111111111110110",
723                   STR(format("~WB", (int32_t)-10)));
724     TST_TN_EQ_STR("11111111111111111111111111111111",
725                   STR(format("~WB", (int32_t)-1)));
726 
727     TST_TN_EQ_STR("11111111111111111111111110011100",
728                   STR(format("~0WB", (int32_t)-100)));
729     TST_TN_EQ_STR("11111111111111111111111111110110",
730                   STR(format("~0WB", (int32_t)-10)));
731     TST_TN_EQ_STR("11111111111111111111111111111111",
732                   STR(format("~0WB", (int32_t)-1)));
733 
734     TST_TN_EQ_STR("11111111111111111111111110011100",
735                   STR(format("~05WB", (int32_t)-100)));
736     TST_TN_EQ_STR("11111111111111111111111111110110",
737                   STR(format("~05WB", (int32_t)-10)));
738     TST_TN_EQ_STR("11111111111111111111111111111111",
739                   STR(format("~05WB", (int32_t)-1)));
740 
741     TST_TN_EQ_STR("11111111111111111111111110011100",
742                   STR(format("~5WB", (int32_t)-100)));
743     TST_TN_EQ_STR("11111111111111111111111111110110",
744                   STR(format("~5WB", (int32_t)-10)));
745     TST_TN_EQ_STR("11111111111111111111111111111111",
746                   STR(format("~5WB", (int32_t)-1)));
747 
748     TST_TN_EQ_STR("                                                                                                                            101",
749                   STR(format("~127WB", (int32_t)0x5)));
750     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101",
751                   STR(format("~0127WB", (int32_t)0x5)));
752 }
753 
754 TST_CASE("format ~MD")
755 {
756     TST_TN_EQ_STR("-100", STR(format("~MD",   (scm_int_t)-100)));
757     TST_TN_EQ_STR("-10",  STR(format("~MD",   (scm_int_t)-10)));
758     TST_TN_EQ_STR("-1",   STR(format("~MD",   (scm_int_t)-1)));
759     TST_TN_EQ_STR("0",    STR(format("~MD",   (scm_int_t)0)));
760     TST_TN_EQ_STR("1",    STR(format("~MD",   (scm_int_t)1)));
761     TST_TN_EQ_STR("10",   STR(format("~MD",   (scm_int_t)10)));
762     TST_TN_EQ_STR("100",  STR(format("~MD",   (scm_int_t)100)));
763 
764     TST_TN_EQ_STR("-100", STR(format("~0MD",  (scm_int_t)-100)));
765     TST_TN_EQ_STR("-10",  STR(format("~0MD",  (scm_int_t)-10)));
766     TST_TN_EQ_STR("-1",   STR(format("~0MD",  (scm_int_t)-1)));
767     TST_TN_EQ_STR("0",    STR(format("~0MD",  (scm_int_t)0)));
768     TST_TN_EQ_STR("1",    STR(format("~0MD",  (scm_int_t)1)));
769     TST_TN_EQ_STR("10",   STR(format("~0MD",  (scm_int_t)10)));
770     TST_TN_EQ_STR("100",  STR(format("~0MD",  (scm_int_t)100)));
771 
772     TST_TN_EQ_STR("-100", STR(format("~03MD", (scm_int_t)-100)));
773     TST_TN_EQ_STR("-10",  STR(format("~03MD", (scm_int_t)-10)));
774     TST_TN_EQ_STR("-01",  STR(format("~03MD", (scm_int_t)-1)));
775     TST_TN_EQ_STR("000",  STR(format("~03MD", (scm_int_t)0)));
776     TST_TN_EQ_STR("001",  STR(format("~03MD", (scm_int_t)1)));
777     TST_TN_EQ_STR("010",  STR(format("~03MD", (scm_int_t)10)));
778     TST_TN_EQ_STR("100",  STR(format("~03MD", (scm_int_t)100)));
779 
780     TST_TN_EQ_STR("-100", STR(format("~3MD",  (scm_int_t)-100)));
781     TST_TN_EQ_STR("-10",  STR(format("~3MD",  (scm_int_t)-10)));
782     TST_TN_EQ_STR(" -1",  STR(format("~3MD",  (scm_int_t)-1)));
783     TST_TN_EQ_STR("  0",  STR(format("~3MD",  (scm_int_t)0)));
784     TST_TN_EQ_STR("  1",  STR(format("~3MD",  (scm_int_t)1)));
785     TST_TN_EQ_STR(" 10",  STR(format("~3MD",  (scm_int_t)10)));
786     TST_TN_EQ_STR("100",  STR(format("~3MD",  (scm_int_t)100)));
787 
788     TST_TN_EQ_STR("                                                                                                                            123",
789                   STR(format("~127MD", (scm_int_t)123)));
790     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
791                   STR(format("~0127MD", (scm_int_t)123)));
792 }
793 
794 TST_CASE("format ~MU")
795 {
796     TST_TN_EQ_STR("0",    STR(format("~MU",   (scm_int_t)0)));
797     TST_TN_EQ_STR("1",    STR(format("~MU",   (scm_int_t)1)));
798     TST_TN_EQ_STR("10",   STR(format("~MU",   (scm_int_t)10)));
799     TST_TN_EQ_STR("100",  STR(format("~MU",   (scm_int_t)100)));
800 
801     TST_TN_EQ_STR("0",    STR(format("~0MU",  (scm_int_t)0)));
802     TST_TN_EQ_STR("1",    STR(format("~0MU",  (scm_int_t)1)));
803     TST_TN_EQ_STR("10",   STR(format("~0MU",  (scm_int_t)10)));
804     TST_TN_EQ_STR("100",  STR(format("~0MU",  (scm_int_t)100)));
805 
806     TST_TN_EQ_STR("000",  STR(format("~03MU", (scm_int_t)0)));
807     TST_TN_EQ_STR("001",  STR(format("~03MU", (scm_int_t)1)));
808     TST_TN_EQ_STR("010",  STR(format("~03MU", (scm_int_t)10)));
809     TST_TN_EQ_STR("100",  STR(format("~03MU", (scm_int_t)100)));
810 
811     TST_TN_EQ_STR("  0",  STR(format("~3MU",  (scm_int_t)0)));
812     TST_TN_EQ_STR("  1",  STR(format("~3MU",  (scm_int_t)1)));
813     TST_TN_EQ_STR(" 10",  STR(format("~3MU",  (scm_int_t)10)));
814     TST_TN_EQ_STR("100",  STR(format("~3MU",  (scm_int_t)100)));
815 
816 #if M32
817     TST_TN_EQ_STR("4294967196", STR(format("~MU",   (scm_int_t)-100)));
818     TST_TN_EQ_STR("4294967286", STR(format("~MU",   (scm_int_t)-10)));
819     TST_TN_EQ_STR("4294967295", STR(format("~MU",   (scm_int_t)-1)));
820 
821     TST_TN_EQ_STR("4294967196", STR(format("~0MU",  (scm_int_t)-100)));
822     TST_TN_EQ_STR("4294967286", STR(format("~0MU",  (scm_int_t)-10)));
823     TST_TN_EQ_STR("4294967295", STR(format("~0MU",  (scm_int_t)-1)));
824 
825     TST_TN_EQ_STR("4294967196", STR(format("~03MU", (scm_int_t)-100)));
826     TST_TN_EQ_STR("4294967286", STR(format("~03MU", (scm_int_t)-10)));
827     TST_TN_EQ_STR("4294967295", STR(format("~03MU", (scm_int_t)-1)));
828 
829     TST_TN_EQ_STR("4294967196", STR(format("~3MU",  (scm_int_t)-100)));
830     TST_TN_EQ_STR("4294967286", STR(format("~3MU",  (scm_int_t)-10)));
831     TST_TN_EQ_STR("4294967295", STR(format("~3MU",  (scm_int_t)-1)));
832 #elif M64
833     TST_TN_EQ_STR("18446744073709551516", STR(format("~MU",  (scm_int_t)-100)));
834     TST_TN_EQ_STR("18446744073709551606", STR(format("~MU",  (scm_int_t)-10)));
835     TST_TN_EQ_STR("18446744073709551615", STR(format("~MU",  (scm_int_t)-1)));
836 
837     TST_TN_EQ_STR("18446744073709551516", STR(format("~0MU", (scm_int_t)-100)));
838     TST_TN_EQ_STR("18446744073709551606", STR(format("~0MU", (scm_int_t)-10)));
839     TST_TN_EQ_STR("18446744073709551615", STR(format("~0MU", (scm_int_t)-1)));
840 
841     TST_TN_EQ_STR("18446744073709551516", STR(format("~03MU",(scm_int_t)-100)));
842     TST_TN_EQ_STR("18446744073709551606", STR(format("~03MU",(scm_int_t)-10)));
843     TST_TN_EQ_STR("18446744073709551615", STR(format("~03MU",(scm_int_t)-1)));
844 
845     TST_TN_EQ_STR("18446744073709551516", STR(format("~3MU", (scm_int_t)-100)));
846     TST_TN_EQ_STR("18446744073709551606", STR(format("~3MU", (scm_int_t)-10)));
847     TST_TN_EQ_STR("18446744073709551615", STR(format("~3MU", (scm_int_t)-1)));
848 #endif
849 
850     TST_TN_EQ_STR("                                                                                                                            123",
851                   STR(format("~127MU", (scm_int_t)123)));
852     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
853                   STR(format("~0127MU", (scm_int_t)123)));
854 }
855 
856 TST_CASE("format ~MX")
857 {
858     TST_TN_EQ_STR("0",    STR(format("~MX",   (scm_int_t)0)));
859     TST_TN_EQ_STR("1",    STR(format("~MX",   (scm_int_t)1)));
860     TST_TN_EQ_STR("a",    STR(format("~MX",   (scm_int_t)10)));
861     TST_TN_EQ_STR("64",   STR(format("~MX",   (scm_int_t)100)));
862 
863     TST_TN_EQ_STR("0",    STR(format("~0MX",  (scm_int_t)0)));
864     TST_TN_EQ_STR("1",    STR(format("~0MX",  (scm_int_t)1)));
865     TST_TN_EQ_STR("a",    STR(format("~0MX",  (scm_int_t)10)));
866     TST_TN_EQ_STR("64",   STR(format("~0MX",  (scm_int_t)100)));
867 
868     TST_TN_EQ_STR("000",  STR(format("~03MX", (scm_int_t)0)));
869     TST_TN_EQ_STR("001",  STR(format("~03MX", (scm_int_t)1)));
870     TST_TN_EQ_STR("00a",  STR(format("~03MX", (scm_int_t)10)));
871     TST_TN_EQ_STR("064",  STR(format("~03MX", (scm_int_t)100)));
872 
873     TST_TN_EQ_STR("  0",  STR(format("~3MX",  (scm_int_t)0)));
874     TST_TN_EQ_STR("  1",  STR(format("~3MX",  (scm_int_t)1)));
875     TST_TN_EQ_STR("  a",  STR(format("~3MX",  (scm_int_t)10)));
876     TST_TN_EQ_STR(" 64",  STR(format("~3MX",  (scm_int_t)100)));
877 
878 #if M32
879     TST_TN_EQ_STR("ffffff9c", STR(format("~MX",   (scm_int_t)-100)));
880     TST_TN_EQ_STR("fffffff6", STR(format("~MX",   (scm_int_t)-10)));
881     TST_TN_EQ_STR("ffffffff", STR(format("~MX",   (scm_int_t)-1)));
882 
883     TST_TN_EQ_STR("ffffff9c", STR(format("~0MX",  (scm_int_t)-100)));
884     TST_TN_EQ_STR("fffffff6", STR(format("~0MX",  (scm_int_t)-10)));
885     TST_TN_EQ_STR("ffffffff", STR(format("~0MX",  (scm_int_t)-1)));
886 
887     TST_TN_EQ_STR("ffffff9c", STR(format("~03MX", (scm_int_t)-100)));
888     TST_TN_EQ_STR("fffffff6", STR(format("~03MX", (scm_int_t)-10)));
889     TST_TN_EQ_STR("ffffffff", STR(format("~03MX", (scm_int_t)-1)));
890 
891     TST_TN_EQ_STR("ffffff9c", STR(format("~3MX",  (scm_int_t)-100)));
892     TST_TN_EQ_STR("fffffff6", STR(format("~3MX",  (scm_int_t)-10)));
893     TST_TN_EQ_STR("ffffffff", STR(format("~3MX",  (scm_int_t)-1)));
894 #elif M64
895     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~MX",   (scm_int_t)-100)));
896     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~MX",   (scm_int_t)-10)));
897     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~MX",   (scm_int_t)-1)));
898 
899     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~0MX",  (scm_int_t)-100)));
900     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~0MX",  (scm_int_t)-10)));
901     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~0MX",  (scm_int_t)-1)));
902 
903     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~03MX", (scm_int_t)-100)));
904     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~03MX", (scm_int_t)-10)));
905     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~03MX", (scm_int_t)-1)));
906 
907     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~3MX",  (scm_int_t)-100)));
908     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~3MX",  (scm_int_t)-10)));
909     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~3MX",  (scm_int_t)-1)));
910 #endif
911 
912     TST_TN_EQ_STR("                                                                                                                            1ac",
913                   STR(format("~127MX", (scm_int_t)0x1ac)));
914     TST_TN_EQ_STR("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ac",
915                   STR(format("~0127MX", (scm_int_t)0x1ac)));
916 }
917 
918 TST_CASE("format ~MO")
919 {
920     TST_TN_EQ_STR("0",    STR(format("~MO",   (scm_int_t)0)));
921     TST_TN_EQ_STR("1",    STR(format("~MO",   (scm_int_t)1)));
922     TST_TN_EQ_STR("12",   STR(format("~MO",   (scm_int_t)10)));
923     TST_TN_EQ_STR("144",  STR(format("~MO",   (scm_int_t)100)));
924 
925     TST_TN_EQ_STR("0",    STR(format("~0MO",  (scm_int_t)0)));
926     TST_TN_EQ_STR("1",    STR(format("~0MO",  (scm_int_t)1)));
927     TST_TN_EQ_STR("12",   STR(format("~0MO",  (scm_int_t)10)));
928     TST_TN_EQ_STR("144",  STR(format("~0MO",  (scm_int_t)100)));
929 
930     TST_TN_EQ_STR("000",  STR(format("~03MO", (scm_int_t)0)));
931     TST_TN_EQ_STR("001",  STR(format("~03MO", (scm_int_t)1)));
932     TST_TN_EQ_STR("012",  STR(format("~03MO", (scm_int_t)10)));
933     TST_TN_EQ_STR("144",  STR(format("~03MO", (scm_int_t)100)));
934 
935     TST_TN_EQ_STR("  0",  STR(format("~3MO",  (scm_int_t)0)));
936     TST_TN_EQ_STR("  1",  STR(format("~3MO",  (scm_int_t)1)));
937     TST_TN_EQ_STR(" 12",  STR(format("~3MO",  (scm_int_t)10)));
938     TST_TN_EQ_STR("144",  STR(format("~3MO",  (scm_int_t)100)));
939 
940 #if M32
941     TST_TN_EQ_STR("37777777634", STR(format("~MO",   (scm_int_t)-100)));
942     TST_TN_EQ_STR("37777777766", STR(format("~MO",   (scm_int_t)-10)));
943     TST_TN_EQ_STR("37777777777", STR(format("~MO",   (scm_int_t)-1)));
944 
945     TST_TN_EQ_STR("37777777634", STR(format("~0MO",  (scm_int_t)-100)));
946     TST_TN_EQ_STR("37777777766", STR(format("~0MO",  (scm_int_t)-10)));
947     TST_TN_EQ_STR("37777777777", STR(format("~0MO",  (scm_int_t)-1)));
948 
949     TST_TN_EQ_STR("37777777634", STR(format("~03MO", (scm_int_t)-100)));
950     TST_TN_EQ_STR("37777777766", STR(format("~03MO", (scm_int_t)-10)));
951     TST_TN_EQ_STR("37777777777", STR(format("~03MO", (scm_int_t)-1)));
952 
953     TST_TN_EQ_STR("37777777634", STR(format("~3MO",  (scm_int_t)-100)));
954     TST_TN_EQ_STR("37777777766", STR(format("~3MO",  (scm_int_t)-10)));
955     TST_TN_EQ_STR("37777777777", STR(format("~3MO",  (scm_int_t)-1)));
956 #elif M64
957     TST_TN_EQ_STR("1777777777777777777634",
958                   STR(format("~MO",   (scm_int_t)-100)));
959     TST_TN_EQ_STR("1777777777777777777766",
960                   STR(format("~MO",   (scm_int_t)-10)));
961     TST_TN_EQ_STR("1777777777777777777777",
962                   STR(format("~MO",   (scm_int_t)-1)));
963 
964     TST_TN_EQ_STR("1777777777777777777634",
965                   STR(format("~0MO",  (scm_int_t)-100)));
966     TST_TN_EQ_STR("1777777777777777777766",
967                   STR(format("~0MO",  (scm_int_t)-10)));
968     TST_TN_EQ_STR("1777777777777777777777",
969                   STR(format("~0MO",  (scm_int_t)-1)));
970 
971     TST_TN_EQ_STR("1777777777777777777634",
972                   STR(format("~03MO", (scm_int_t)-100)));
973     TST_TN_EQ_STR("1777777777777777777766",
974                   STR(format("~03MO", (scm_int_t)-10)));
975     TST_TN_EQ_STR("1777777777777777777777",
976                   STR(format("~03MO", (scm_int_t)-1)));
977 
978     TST_TN_EQ_STR("1777777777777777777634",
979                   STR(format("~3MO",  (scm_int_t)-100)));
980     TST_TN_EQ_STR("1777777777777777777766",
981                   STR(format("~3MO",  (scm_int_t)-10)));
982     TST_TN_EQ_STR("1777777777777777777777",
983                   STR(format("~3MO",  (scm_int_t)-1)));
984 #endif
985 
986     TST_TN_EQ_STR("                                                                                                                            123",
987                   STR(format("~127MO", (scm_int_t)0123)));
988     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
989                   STR(format("~0127MO", (scm_int_t)0123)));
990 }
991 
992 TST_CASE("format ~MB")
993 {
994     TST_TN_EQ_STR("0",       STR(format("~MB",   (scm_int_t)0)));
995     TST_TN_EQ_STR("1",       STR(format("~MB",   (scm_int_t)1)));
996     TST_TN_EQ_STR("1010",    STR(format("~MB",   (scm_int_t)10)));
997     TST_TN_EQ_STR("1100100", STR(format("~MB",   (scm_int_t)100)));
998 
999     TST_TN_EQ_STR("0",       STR(format("~0MB",  (scm_int_t)0)));
1000     TST_TN_EQ_STR("1",       STR(format("~0MB",  (scm_int_t)1)));
1001     TST_TN_EQ_STR("1010",    STR(format("~0MB",  (scm_int_t)10)));
1002     TST_TN_EQ_STR("1100100", STR(format("~0MB",  (scm_int_t)100)));
1003 
1004     TST_TN_EQ_STR("00000",   STR(format("~05MB", (scm_int_t)0)));
1005     TST_TN_EQ_STR("00001",   STR(format("~05MB", (scm_int_t)1)));
1006     TST_TN_EQ_STR("01010",   STR(format("~05MB", (scm_int_t)10)));
1007     TST_TN_EQ_STR("1100100", STR(format("~05MB", (scm_int_t)100)));
1008 
1009     TST_TN_EQ_STR("    0",   STR(format("~5MB",  (scm_int_t)0)));
1010     TST_TN_EQ_STR("    1",   STR(format("~5MB",  (scm_int_t)1)));
1011     TST_TN_EQ_STR(" 1010",   STR(format("~5MB",  (scm_int_t)10)));
1012     TST_TN_EQ_STR("1100100", STR(format("~5MB",  (scm_int_t)100)));
1013 
1014 #if M32
1015     TST_TN_EQ_STR("11111111111111111111111110011100",
1016                   STR(format("~MB", (scm_int_t)-100)));
1017     TST_TN_EQ_STR("11111111111111111111111111110110",
1018                   STR(format("~MB", (scm_int_t)-10)));
1019     TST_TN_EQ_STR("11111111111111111111111111111111",
1020                   STR(format("~MB", (scm_int_t)-1)));
1021 
1022     TST_TN_EQ_STR("11111111111111111111111110011100",
1023                   STR(format("~0MB", (scm_int_t)-100)));
1024     TST_TN_EQ_STR("11111111111111111111111111110110",
1025                   STR(format("~0MB", (scm_int_t)-10)));
1026     TST_TN_EQ_STR("11111111111111111111111111111111",
1027                   STR(format("~0MB", (scm_int_t)-1)));
1028 
1029     TST_TN_EQ_STR("11111111111111111111111110011100",
1030                   STR(format("~05MB", (scm_int_t)-100)));
1031     TST_TN_EQ_STR("11111111111111111111111111110110",
1032                   STR(format("~05MB", (scm_int_t)-10)));
1033     TST_TN_EQ_STR("11111111111111111111111111111111",
1034                   STR(format("~05MB", (scm_int_t)-1)));
1035 
1036     TST_TN_EQ_STR("11111111111111111111111110011100",
1037                   STR(format("~5MB", (scm_int_t)-100)));
1038     TST_TN_EQ_STR("11111111111111111111111111110110",
1039                   STR(format("~5MB", (scm_int_t)-10)));
1040     TST_TN_EQ_STR("11111111111111111111111111111111",
1041                   STR(format("~5MB", (scm_int_t)-1)));
1042 #elif M64
1043     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1044                   STR(format("~MB", (scm_int_t)-100)));
1045     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1046                   STR(format("~MB", (scm_int_t)-10)));
1047     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1048                   STR(format("~MB", (scm_int_t)-1)));
1049 
1050     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1051                   STR(format("~0MB", (scm_int_t)-100)));
1052     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1053                   STR(format("~0MB", (scm_int_t)-10)));
1054     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1055                   STR(format("~0MB", (scm_int_t)-1)));
1056 
1057     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1058                   STR(format("~05MB", (scm_int_t)-100)));
1059     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1060                   STR(format("~05MB", (scm_int_t)-10)));
1061     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1062                   STR(format("~05MB", (scm_int_t)-1)));
1063 
1064     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1065                   STR(format("~5MB", (scm_int_t)-100)));
1066     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1067                   STR(format("~5MB", (scm_int_t)-10)));
1068     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1069                   STR(format("~5MB", (scm_int_t)-1)));
1070 #endif
1071 
1072     TST_TN_EQ_STR("                                                                                                                            101",
1073                   STR(format("~127MB", (scm_int_t)0x5)));
1074     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101",
1075                   STR(format("~0127MB", (scm_int_t)0x5)));
1076 }
1077 
1078 TST_CASE("format ~QD")
1079 {
1080     TST_TN_EQ_STR("-100", STR(format("~QD",   (int64_t)-100)));
1081     TST_TN_EQ_STR("-10",  STR(format("~QD",   (int64_t)-10)));
1082     TST_TN_EQ_STR("-1",   STR(format("~QD",   (int64_t)-1)));
1083     TST_TN_EQ_STR("0",    STR(format("~QD",   (int64_t)0)));
1084     TST_TN_EQ_STR("1",    STR(format("~QD",   (int64_t)1)));
1085     TST_TN_EQ_STR("10",   STR(format("~QD",   (int64_t)10)));
1086     TST_TN_EQ_STR("100",  STR(format("~QD",   (int64_t)100)));
1087 
1088     TST_TN_EQ_STR("-100", STR(format("~0QD",  (int64_t)-100)));
1089     TST_TN_EQ_STR("-10",  STR(format("~0QD",  (int64_t)-10)));
1090     TST_TN_EQ_STR("-1",   STR(format("~0QD",  (int64_t)-1)));
1091     TST_TN_EQ_STR("0",    STR(format("~0QD",  (int64_t)0)));
1092     TST_TN_EQ_STR("1",    STR(format("~0QD",  (int64_t)1)));
1093     TST_TN_EQ_STR("10",   STR(format("~0QD",  (int64_t)10)));
1094     TST_TN_EQ_STR("100",  STR(format("~0QD",  (int64_t)100)));
1095 
1096     TST_TN_EQ_STR("-100", STR(format("~03QD", (int64_t)-100)));
1097     TST_TN_EQ_STR("-10",  STR(format("~03QD", (int64_t)-10)));
1098     TST_TN_EQ_STR("-01",  STR(format("~03QD", (int64_t)-1)));
1099     TST_TN_EQ_STR("000",  STR(format("~03QD", (int64_t)0)));
1100     TST_TN_EQ_STR("001",  STR(format("~03QD", (int64_t)1)));
1101     TST_TN_EQ_STR("010",  STR(format("~03QD", (int64_t)10)));
1102     TST_TN_EQ_STR("100",  STR(format("~03QD", (int64_t)100)));
1103 
1104     TST_TN_EQ_STR("-100", STR(format("~3QD",  (int64_t)-100)));
1105     TST_TN_EQ_STR("-10",  STR(format("~3QD",  (int64_t)-10)));
1106     TST_TN_EQ_STR(" -1",  STR(format("~3QD",  (int64_t)-1)));
1107     TST_TN_EQ_STR("  0",  STR(format("~3QD",  (int64_t)0)));
1108     TST_TN_EQ_STR("  1",  STR(format("~3QD",  (int64_t)1)));
1109     TST_TN_EQ_STR(" 10",  STR(format("~3QD",  (int64_t)10)));
1110     TST_TN_EQ_STR("100",  STR(format("~3QD",  (int64_t)100)));
1111 
1112     TST_TN_EQ_STR("                                                                                                                            123",
1113                   STR(format("~127QD", (int64_t)123)));
1114     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
1115                   STR(format("~0127QD", (int64_t)123)));
1116 }
1117 
1118 TST_CASE("format ~QU")
1119 {
1120     TST_TN_EQ_STR("0",    STR(format("~QU",   (int64_t)0)));
1121     TST_TN_EQ_STR("1",    STR(format("~QU",   (int64_t)1)));
1122     TST_TN_EQ_STR("10",   STR(format("~QU",   (int64_t)10)));
1123     TST_TN_EQ_STR("100",  STR(format("~QU",   (int64_t)100)));
1124 
1125     TST_TN_EQ_STR("0",    STR(format("~0QU",  (int64_t)0)));
1126     TST_TN_EQ_STR("1",    STR(format("~0QU",  (int64_t)1)));
1127     TST_TN_EQ_STR("10",   STR(format("~0QU",  (int64_t)10)));
1128     TST_TN_EQ_STR("100",  STR(format("~0QU",  (int64_t)100)));
1129 
1130     TST_TN_EQ_STR("000",  STR(format("~03QU", (int64_t)0)));
1131     TST_TN_EQ_STR("001",  STR(format("~03QU", (int64_t)1)));
1132     TST_TN_EQ_STR("010",  STR(format("~03QU", (int64_t)10)));
1133     TST_TN_EQ_STR("100",  STR(format("~03QU", (int64_t)100)));
1134 
1135     TST_TN_EQ_STR("  0",  STR(format("~3QU",  (int64_t)0)));
1136     TST_TN_EQ_STR("  1",  STR(format("~3QU",  (int64_t)1)));
1137     TST_TN_EQ_STR(" 10",  STR(format("~3QU",  (int64_t)10)));
1138     TST_TN_EQ_STR("100",  STR(format("~3QU",  (int64_t)100)));
1139 
1140     TST_TN_EQ_STR("18446744073709551516", STR(format("~QU",   (int64_t)-100)));
1141     TST_TN_EQ_STR("18446744073709551606", STR(format("~QU",   (int64_t)-10)));
1142     TST_TN_EQ_STR("18446744073709551615", STR(format("~QU",   (int64_t)-1)));
1143 
1144     TST_TN_EQ_STR("18446744073709551516", STR(format("~0QU",  (int64_t)-100)));
1145     TST_TN_EQ_STR("18446744073709551606", STR(format("~0QU",  (int64_t)-10)));
1146     TST_TN_EQ_STR("18446744073709551615", STR(format("~0QU",  (int64_t)-1)));
1147 
1148     TST_TN_EQ_STR("18446744073709551516", STR(format("~03QU", (int64_t)-100)));
1149     TST_TN_EQ_STR("18446744073709551606", STR(format("~03QU", (int64_t)-10)));
1150     TST_TN_EQ_STR("18446744073709551615", STR(format("~03QU", (int64_t)-1)));
1151 
1152     TST_TN_EQ_STR("18446744073709551516", STR(format("~3QU",  (int64_t)-100)));
1153     TST_TN_EQ_STR("18446744073709551606", STR(format("~3QU",  (int64_t)-10)));
1154     TST_TN_EQ_STR("18446744073709551615", STR(format("~3QU",  (int64_t)-1)));
1155 
1156     TST_TN_EQ_STR("                                                                                                                            123",
1157                   STR(format("~127QU", (int64_t)123)));
1158     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
1159                   STR(format("~0127QU", (int64_t)123)));
1160 }
1161 
1162 TST_CASE("format ~QX")
1163 {
1164     TST_TN_EQ_STR("0",    STR(format("~QX",   (int64_t)0)));
1165     TST_TN_EQ_STR("1",    STR(format("~QX",   (int64_t)1)));
1166     TST_TN_EQ_STR("a",    STR(format("~QX",   (int64_t)10)));
1167     TST_TN_EQ_STR("64",   STR(format("~QX",   (int64_t)100)));
1168 
1169     TST_TN_EQ_STR("0",    STR(format("~0QX",  (int64_t)0)));
1170     TST_TN_EQ_STR("1",    STR(format("~0QX",  (int64_t)1)));
1171     TST_TN_EQ_STR("a",    STR(format("~0QX",  (int64_t)10)));
1172     TST_TN_EQ_STR("64",   STR(format("~0QX",  (int64_t)100)));
1173 
1174     TST_TN_EQ_STR("000",  STR(format("~03QX", (int64_t)0)));
1175     TST_TN_EQ_STR("001",  STR(format("~03QX", (int64_t)1)));
1176     TST_TN_EQ_STR("00a",  STR(format("~03QX", (int64_t)10)));
1177     TST_TN_EQ_STR("064",  STR(format("~03QX", (int64_t)100)));
1178 
1179     TST_TN_EQ_STR("  0",  STR(format("~3QX",  (int64_t)0)));
1180     TST_TN_EQ_STR("  1",  STR(format("~3QX",  (int64_t)1)));
1181     TST_TN_EQ_STR("  a",  STR(format("~3QX",  (int64_t)10)));
1182     TST_TN_EQ_STR(" 64",  STR(format("~3QX",  (int64_t)100)));
1183 
1184     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~QX",   (int64_t)-100)));
1185     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~QX",   (int64_t)-10)));
1186     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~QX",   (int64_t)-1)));
1187 
1188     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~0QX",  (int64_t)-100)));
1189     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~0QX",  (int64_t)-10)));
1190     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~0QX",  (int64_t)-1)));
1191 
1192     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~03QX", (int64_t)-100)));
1193     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~03QX", (int64_t)-10)));
1194     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~03QX", (int64_t)-1)));
1195 
1196     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~3QX",  (int64_t)-100)));
1197     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~3QX",  (int64_t)-10)));
1198     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~3QX",  (int64_t)-1)));
1199 
1200     TST_TN_EQ_STR("                                                                                                                            1ac",
1201                            STR(format("~127QX", (int64_t)0x1ac)));
1202     TST_TN_EQ_STR("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ac",
1203                            STR(format("~0127QX", (int64_t)0x1ac)));
1204 }
1205 
1206 TST_CASE("format ~QO")
1207 {
1208     TST_TN_EQ_STR("0",    STR(format("~QO",   (int64_t)0)));
1209     TST_TN_EQ_STR("1",    STR(format("~QO",   (int64_t)1)));
1210     TST_TN_EQ_STR("12",   STR(format("~QO",   (int64_t)10)));
1211     TST_TN_EQ_STR("144",  STR(format("~QO",   (int64_t)100)));
1212 
1213     TST_TN_EQ_STR("0",    STR(format("~0QO",  (int64_t)0)));
1214     TST_TN_EQ_STR("1",    STR(format("~0QO",  (int64_t)1)));
1215     TST_TN_EQ_STR("12",   STR(format("~0QO",  (int64_t)10)));
1216     TST_TN_EQ_STR("144",  STR(format("~0QO",  (int64_t)100)));
1217 
1218     TST_TN_EQ_STR("000",  STR(format("~03QO", (int64_t)0)));
1219     TST_TN_EQ_STR("001",  STR(format("~03QO", (int64_t)1)));
1220     TST_TN_EQ_STR("012",  STR(format("~03QO", (int64_t)10)));
1221     TST_TN_EQ_STR("144",  STR(format("~03QO", (int64_t)100)));
1222 
1223     TST_TN_EQ_STR("  0",  STR(format("~3QO",  (int64_t)0)));
1224     TST_TN_EQ_STR("  1",  STR(format("~3QO",  (int64_t)1)));
1225     TST_TN_EQ_STR(" 12",  STR(format("~3QO",  (int64_t)10)));
1226     TST_TN_EQ_STR("144",  STR(format("~3QO",  (int64_t)100)));
1227 
1228     TST_TN_EQ_STR("1777777777777777777634",
1229                   STR(format("~QO",   (int64_t)-100)));
1230     TST_TN_EQ_STR("1777777777777777777766",
1231                   STR(format("~QO",   (int64_t)-10)));
1232     TST_TN_EQ_STR("1777777777777777777777",
1233                   STR(format("~QO",   (int64_t)-1)));
1234 
1235     TST_TN_EQ_STR("1777777777777777777634",
1236                   STR(format("~0QO",  (int64_t)-100)));
1237     TST_TN_EQ_STR("1777777777777777777766",
1238                   STR(format("~0QO",  (int64_t)-10)));
1239     TST_TN_EQ_STR("1777777777777777777777",
1240                   STR(format("~0QO",  (int64_t)-1)));
1241 
1242     TST_TN_EQ_STR("1777777777777777777634",
1243                   STR(format("~03QO", (int64_t)-100)));
1244     TST_TN_EQ_STR("1777777777777777777766",
1245                   STR(format("~03QO", (int64_t)-10)));
1246     TST_TN_EQ_STR("1777777777777777777777",
1247                   STR(format("~03QO", (int64_t)-1)));
1248 
1249     TST_TN_EQ_STR("1777777777777777777634",
1250                   STR(format("~3QO",  (int64_t)-100)));
1251     TST_TN_EQ_STR("1777777777777777777766",
1252                   STR(format("~3QO",  (int64_t)-10)));
1253     TST_TN_EQ_STR("1777777777777777777777",
1254                   STR(format("~3QO",  (int64_t)-1)));
1255 
1256     TST_TN_EQ_STR("                                                                                                                            123",
1257                   STR(format("~127QO", (int64_t)0123)));
1258     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
1259                   STR(format("~0127QO", (int64_t)0123)));
1260 }
1261 
1262 TST_CASE("format ~QB")
1263 {
1264     TST_TN_EQ_STR("0",       STR(format("~QB",   (int64_t)0)));
1265     TST_TN_EQ_STR("1",       STR(format("~QB",   (int64_t)1)));
1266     TST_TN_EQ_STR("1010",    STR(format("~QB",   (int64_t)10)));
1267     TST_TN_EQ_STR("1100100", STR(format("~QB",   (int64_t)100)));
1268 
1269     TST_TN_EQ_STR("0",       STR(format("~0QB",  (int64_t)0)));
1270     TST_TN_EQ_STR("1",       STR(format("~0QB",  (int64_t)1)));
1271     TST_TN_EQ_STR("1010",    STR(format("~0QB",  (int64_t)10)));
1272     TST_TN_EQ_STR("1100100", STR(format("~0QB",  (int64_t)100)));
1273 
1274     TST_TN_EQ_STR("00000",   STR(format("~05QB", (int64_t)0)));
1275     TST_TN_EQ_STR("00001",   STR(format("~05QB", (int64_t)1)));
1276     TST_TN_EQ_STR("01010",   STR(format("~05QB", (int64_t)10)));
1277     TST_TN_EQ_STR("1100100", STR(format("~05QB", (int64_t)100)));
1278 
1279     TST_TN_EQ_STR("    0",   STR(format("~5QB",  (int64_t)0)));
1280     TST_TN_EQ_STR("    1",   STR(format("~5QB",  (int64_t)1)));
1281     TST_TN_EQ_STR(" 1010",   STR(format("~5QB",  (int64_t)10)));
1282     TST_TN_EQ_STR("1100100", STR(format("~5QB",  (int64_t)100)));
1283 
1284     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1285                   STR(format("~QB", (int64_t)-100)));
1286     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1287                   STR(format("~QB", (int64_t)-10)));
1288     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1289                   STR(format("~QB", (int64_t)-1)));
1290 
1291     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1292                   STR(format("~0QB", (int64_t)-100)));
1293     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1294                   STR(format("~0QB", (int64_t)-10)));
1295     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1296                   STR(format("~0QB", (int64_t)-1)));
1297 
1298     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1299                   STR(format("~05QB", (int64_t)-100)));
1300     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1301                   STR(format("~05QB", (int64_t)-10)));
1302     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1303                   STR(format("~05QB", (int64_t)-1)));
1304 
1305     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1306                   STR(format("~5QB", (int64_t)-100)));
1307     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1308                   STR(format("~5QB", (int64_t)-10)));
1309     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1310                   STR(format("~5QB", (int64_t)-1)));
1311 
1312     TST_TN_EQ_STR("                                                                                                                            101",
1313                   STR(format("~127QB", (int64_t)0x5)));
1314     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101",
1315                   STR(format("~0127QB", (int64_t)0x5)));
1316 }
1317 
1318 TST_CASE("format ~LD")
1319 {
1320     TST_TN_EQ_STR("-100", STR(format("~LD",   (long)-100)));
1321     TST_TN_EQ_STR("-10",  STR(format("~LD",   (long)-10)));
1322     TST_TN_EQ_STR("-1",   STR(format("~LD",   (long)-1)));
1323     TST_TN_EQ_STR("0",    STR(format("~LD",   (long)0)));
1324     TST_TN_EQ_STR("1",    STR(format("~LD",   (long)1)));
1325     TST_TN_EQ_STR("10",   STR(format("~LD",   (long)10)));
1326     TST_TN_EQ_STR("100",  STR(format("~LD",   (long)100)));
1327 
1328     TST_TN_EQ_STR("-100", STR(format("~0LD",  (long)-100)));
1329     TST_TN_EQ_STR("-10",  STR(format("~0LD",  (long)-10)));
1330     TST_TN_EQ_STR("-1",   STR(format("~0LD",  (long)-1)));
1331     TST_TN_EQ_STR("0",    STR(format("~0LD",  (long)0)));
1332     TST_TN_EQ_STR("1",    STR(format("~0LD",  (long)1)));
1333     TST_TN_EQ_STR("10",   STR(format("~0LD",  (long)10)));
1334     TST_TN_EQ_STR("100",  STR(format("~0LD",  (long)100)));
1335 
1336     TST_TN_EQ_STR("-100", STR(format("~03LD", (long)-100)));
1337     TST_TN_EQ_STR("-10",  STR(format("~03LD", (long)-10)));
1338     TST_TN_EQ_STR("-01",  STR(format("~03LD", (long)-1)));
1339     TST_TN_EQ_STR("000",  STR(format("~03LD", (long)0)));
1340     TST_TN_EQ_STR("001",  STR(format("~03LD", (long)1)));
1341     TST_TN_EQ_STR("010",  STR(format("~03LD", (long)10)));
1342     TST_TN_EQ_STR("100",  STR(format("~03LD", (long)100)));
1343 
1344     TST_TN_EQ_STR("-100", STR(format("~3LD",  (long)-100)));
1345     TST_TN_EQ_STR("-10",  STR(format("~3LD",  (long)-10)));
1346     TST_TN_EQ_STR(" -1",  STR(format("~3LD",  (long)-1)));
1347     TST_TN_EQ_STR("  0",  STR(format("~3LD",  (long)0)));
1348     TST_TN_EQ_STR("  1",  STR(format("~3LD",  (long)1)));
1349     TST_TN_EQ_STR(" 10",  STR(format("~3LD",  (long)10)));
1350     TST_TN_EQ_STR("100",  STR(format("~3LD",  (long)100)));
1351 
1352     TST_TN_EQ_STR("                                                                                                                            123",
1353                   STR(format("~127LD", (long)123)));
1354     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
1355                   STR(format("~0127LD", (long)123)));
1356 }
1357 
1358 TST_CASE("format ~LU")
1359 {
1360     TST_TN_EQ_STR("0",    STR(format("~LU",   (long)0)));
1361     TST_TN_EQ_STR("1",    STR(format("~LU",   (long)1)));
1362     TST_TN_EQ_STR("10",   STR(format("~LU",   (long)10)));
1363     TST_TN_EQ_STR("100",  STR(format("~LU",   (long)100)));
1364 
1365     TST_TN_EQ_STR("0",    STR(format("~0LU",  (long)0)));
1366     TST_TN_EQ_STR("1",    STR(format("~0LU",  (long)1)));
1367     TST_TN_EQ_STR("10",   STR(format("~0LU",  (long)10)));
1368     TST_TN_EQ_STR("100",  STR(format("~0LU",  (long)100)));
1369 
1370     TST_TN_EQ_STR("000",  STR(format("~03LU", (long)0)));
1371     TST_TN_EQ_STR("001",  STR(format("~03LU", (long)1)));
1372     TST_TN_EQ_STR("010",  STR(format("~03LU", (long)10)));
1373     TST_TN_EQ_STR("100",  STR(format("~03LU", (long)100)));
1374 
1375     TST_TN_EQ_STR("  0",  STR(format("~3LU",  (long)0)));
1376     TST_TN_EQ_STR("  1",  STR(format("~3LU",  (long)1)));
1377     TST_TN_EQ_STR(" 10",  STR(format("~3LU",  (long)10)));
1378     TST_TN_EQ_STR("100",  STR(format("~3LU",  (long)100)));
1379 
1380 #if L32
1381     TST_TN_EQ_STR("4294967196", STR(format("~LU",   (long)-100)));
1382     TST_TN_EQ_STR("4294967286", STR(format("~LU",   (long)-10)));
1383     TST_TN_EQ_STR("4294967295", STR(format("~LU",   (long)-1)));
1384 
1385     TST_TN_EQ_STR("4294967196", STR(format("~0LU",  (long)-100)));
1386     TST_TN_EQ_STR("4294967286", STR(format("~0LU",  (long)-10)));
1387     TST_TN_EQ_STR("4294967295", STR(format("~0LU",  (long)-1)));
1388 
1389     TST_TN_EQ_STR("4294967196", STR(format("~03LU", (long)-100)));
1390     TST_TN_EQ_STR("4294967286", STR(format("~03LU", (long)-10)));
1391     TST_TN_EQ_STR("4294967295", STR(format("~03LU", (long)-1)));
1392 
1393     TST_TN_EQ_STR("4294967196", STR(format("~3LU",  (long)-100)));
1394     TST_TN_EQ_STR("4294967286", STR(format("~3LU",  (long)-10)));
1395     TST_TN_EQ_STR("4294967295", STR(format("~3LU",  (long)-1)));
1396 #elif L64
1397     TST_TN_EQ_STR("18446744073709551516", STR(format("~LU",   (long)-100)));
1398     TST_TN_EQ_STR("18446744073709551606", STR(format("~LU",   (long)-10)));
1399     TST_TN_EQ_STR("18446744073709551615", STR(format("~LU",   (long)-1)));
1400 
1401     TST_TN_EQ_STR("18446744073709551516", STR(format("~0LU",  (long)-100)));
1402     TST_TN_EQ_STR("18446744073709551606", STR(format("~0LU",  (long)-10)));
1403     TST_TN_EQ_STR("18446744073709551615", STR(format("~0LU",  (long)-1)));
1404 
1405     TST_TN_EQ_STR("18446744073709551516", STR(format("~03LU", (long)-100)));
1406     TST_TN_EQ_STR("18446744073709551606", STR(format("~03LU", (long)-10)));
1407     TST_TN_EQ_STR("18446744073709551615", STR(format("~03LU", (long)-1)));
1408 
1409     TST_TN_EQ_STR("18446744073709551516", STR(format("~3LU",  (long)-100)));
1410     TST_TN_EQ_STR("18446744073709551606", STR(format("~3LU",  (long)-10)));
1411     TST_TN_EQ_STR("18446744073709551615", STR(format("~3LU",  (long)-1)));
1412 #endif
1413 
1414     TST_TN_EQ_STR("                                                                                                                            123",
1415                   STR(format("~127LU", (long)123)));
1416     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
1417                   STR(format("~0127LU", (long)123)));
1418 }
1419 
1420 TST_CASE("format ~LX")
1421 {
1422     TST_TN_EQ_STR("0",    STR(format("~LX",   (long)0)));
1423     TST_TN_EQ_STR("1",    STR(format("~LX",   (long)1)));
1424     TST_TN_EQ_STR("a",    STR(format("~LX",   (long)10)));
1425     TST_TN_EQ_STR("64",   STR(format("~LX",   (long)100)));
1426 
1427     TST_TN_EQ_STR("0",    STR(format("~0LX",  (long)0)));
1428     TST_TN_EQ_STR("1",    STR(format("~0LX",  (long)1)));
1429     TST_TN_EQ_STR("a",    STR(format("~0LX",  (long)10)));
1430     TST_TN_EQ_STR("64",   STR(format("~0LX",  (long)100)));
1431 
1432     TST_TN_EQ_STR("000",  STR(format("~03LX", (long)0)));
1433     TST_TN_EQ_STR("001",  STR(format("~03LX", (long)1)));
1434     TST_TN_EQ_STR("00a",  STR(format("~03LX", (long)10)));
1435     TST_TN_EQ_STR("064",  STR(format("~03LX", (long)100)));
1436 
1437     TST_TN_EQ_STR("  0",  STR(format("~3LX",  (long)0)));
1438     TST_TN_EQ_STR("  1",  STR(format("~3LX",  (long)1)));
1439     TST_TN_EQ_STR("  a",  STR(format("~3LX",  (long)10)));
1440     TST_TN_EQ_STR(" 64",  STR(format("~3LX",  (long)100)));
1441 
1442 #if L32
1443     TST_TN_EQ_STR("ffffff9c", STR(format("~LX",   (long)-100)));
1444     TST_TN_EQ_STR("fffffff6", STR(format("~LX",   (long)-10)));
1445     TST_TN_EQ_STR("ffffffff", STR(format("~LX",   (long)-1)));
1446 
1447     TST_TN_EQ_STR("ffffff9c", STR(format("~0LX",  (long)-100)));
1448     TST_TN_EQ_STR("fffffff6", STR(format("~0LX",  (long)-10)));
1449     TST_TN_EQ_STR("ffffffff", STR(format("~0LX",  (long)-1)));
1450 
1451     TST_TN_EQ_STR("ffffff9c", STR(format("~03LX", (long)-100)));
1452     TST_TN_EQ_STR("fffffff6", STR(format("~03LX", (long)-10)));
1453     TST_TN_EQ_STR("ffffffff", STR(format("~03LX", (long)-1)));
1454 
1455     TST_TN_EQ_STR("ffffff9c", STR(format("~3LX",  (long)-100)));
1456     TST_TN_EQ_STR("fffffff6", STR(format("~3LX",  (long)-10)));
1457     TST_TN_EQ_STR("ffffffff", STR(format("~3LX",  (long)-1)));
1458 #elif L64
1459     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~LX",   (long)-100)));
1460     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~LX",   (long)-10)));
1461     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~LX",   (long)-1)));
1462 
1463     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~0LX",  (long)-100)));
1464     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~0LX",  (long)-10)));
1465     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~0LX",  (long)-1)));
1466 
1467     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~03LX", (long)-100)));
1468     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~03LX", (long)-10)));
1469     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~03LX", (long)-1)));
1470 
1471     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~3LX",  (long)-100)));
1472     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~3LX",  (long)-10)));
1473     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~3LX",  (long)-1)));
1474 #endif
1475 
1476     TST_TN_EQ_STR("                                                                                                                            1ac",
1477                   STR(format("~127LX", (long)0x1ac)));
1478     TST_TN_EQ_STR("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ac",
1479                   STR(format("~0127LX", (long)0x1ac)));
1480 }
1481 
1482 TST_CASE("format ~LO")
1483 {
1484     TST_TN_EQ_STR("0",    STR(format("~LO",   (long)0)));
1485     TST_TN_EQ_STR("1",    STR(format("~LO",   (long)1)));
1486     TST_TN_EQ_STR("12",   STR(format("~LO",   (long)10)));
1487     TST_TN_EQ_STR("144",  STR(format("~LO",   (long)100)));
1488 
1489     TST_TN_EQ_STR("0",    STR(format("~0LO",  (long)0)));
1490     TST_TN_EQ_STR("1",    STR(format("~0LO",  (long)1)));
1491     TST_TN_EQ_STR("12",   STR(format("~0LO",  (long)10)));
1492     TST_TN_EQ_STR("144",  STR(format("~0LO",  (long)100)));
1493 
1494     TST_TN_EQ_STR("000",  STR(format("~03LO", (long)0)));
1495     TST_TN_EQ_STR("001",  STR(format("~03LO", (long)1)));
1496     TST_TN_EQ_STR("012",  STR(format("~03LO", (long)10)));
1497     TST_TN_EQ_STR("144",  STR(format("~03LO", (long)100)));
1498 
1499     TST_TN_EQ_STR("  0",  STR(format("~3LO",  (long)0)));
1500     TST_TN_EQ_STR("  1",  STR(format("~3LO",  (long)1)));
1501     TST_TN_EQ_STR(" 12",  STR(format("~3LO",  (long)10)));
1502     TST_TN_EQ_STR("144",  STR(format("~3LO",  (long)100)));
1503 
1504 #if L32
1505     TST_TN_EQ_STR("37777777634", STR(format("~LO",   (long)-100)));
1506     TST_TN_EQ_STR("37777777766", STR(format("~LO",   (long)-10)));
1507     TST_TN_EQ_STR("37777777777", STR(format("~LO",   (long)-1)));
1508 
1509     TST_TN_EQ_STR("37777777634", STR(format("~0LO",  (long)-100)));
1510     TST_TN_EQ_STR("37777777766", STR(format("~0LO",  (long)-10)));
1511     TST_TN_EQ_STR("37777777777", STR(format("~0LO",  (long)-1)));
1512 
1513     TST_TN_EQ_STR("37777777634", STR(format("~03LO", (long)-100)));
1514     TST_TN_EQ_STR("37777777766", STR(format("~03LO", (long)-10)));
1515     TST_TN_EQ_STR("37777777777", STR(format("~03LO", (long)-1)));
1516 
1517     TST_TN_EQ_STR("37777777634", STR(format("~3LO",  (long)-100)));
1518     TST_TN_EQ_STR("37777777766", STR(format("~3LO",  (long)-10)));
1519     TST_TN_EQ_STR("37777777777", STR(format("~3LO",  (long)-1)));
1520 #elif L64
1521     TST_TN_EQ_STR("1777777777777777777634", STR(format("~LO",   (long)-100)));
1522     TST_TN_EQ_STR("1777777777777777777766", STR(format("~LO",   (long)-10)));
1523     TST_TN_EQ_STR("1777777777777777777777", STR(format("~LO",   (long)-1)));
1524 
1525     TST_TN_EQ_STR("1777777777777777777634", STR(format("~0LO",  (long)-100)));
1526     TST_TN_EQ_STR("1777777777777777777766", STR(format("~0LO",  (long)-10)));
1527     TST_TN_EQ_STR("1777777777777777777777", STR(format("~0LO",  (long)-1)));
1528 
1529     TST_TN_EQ_STR("1777777777777777777634", STR(format("~03LO", (long)-100)));
1530     TST_TN_EQ_STR("1777777777777777777766", STR(format("~03LO", (long)-10)));
1531     TST_TN_EQ_STR("1777777777777777777777", STR(format("~03LO", (long)-1)));
1532 
1533     TST_TN_EQ_STR("1777777777777777777634", STR(format("~3LO",  (long)-100)));
1534     TST_TN_EQ_STR("1777777777777777777766", STR(format("~3LO",  (long)-10)));
1535     TST_TN_EQ_STR("1777777777777777777777", STR(format("~3LO",  (long)-1)));
1536 #endif
1537 
1538     TST_TN_EQ_STR("                                                                                                                            123",
1539                   STR(format("~127LO", (long)0123)));
1540     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
1541                   STR(format("~0127LO", (long)0123)));
1542 }
1543 
1544 TST_CASE("format ~LB")
1545 {
1546     TST_TN_EQ_STR("0",       STR(format("~LB",   (long)0)));
1547     TST_TN_EQ_STR("1",       STR(format("~LB",   (long)1)));
1548     TST_TN_EQ_STR("1010",    STR(format("~LB",   (long)10)));
1549     TST_TN_EQ_STR("1100100", STR(format("~LB",   (long)100)));
1550 
1551     TST_TN_EQ_STR("0",       STR(format("~0LB",  (long)0)));
1552     TST_TN_EQ_STR("1",       STR(format("~0LB",  (long)1)));
1553     TST_TN_EQ_STR("1010",    STR(format("~0LB",  (long)10)));
1554     TST_TN_EQ_STR("1100100", STR(format("~0LB",  (long)100)));
1555 
1556     TST_TN_EQ_STR("00000",   STR(format("~05LB", (long)0)));
1557     TST_TN_EQ_STR("00001",   STR(format("~05LB", (long)1)));
1558     TST_TN_EQ_STR("01010",   STR(format("~05LB", (long)10)));
1559     TST_TN_EQ_STR("1100100", STR(format("~05LB", (long)100)));
1560 
1561     TST_TN_EQ_STR("    0",   STR(format("~5LB",  (long)0)));
1562     TST_TN_EQ_STR("    1",   STR(format("~5LB",  (long)1)));
1563     TST_TN_EQ_STR(" 1010",   STR(format("~5LB",  (long)10)));
1564     TST_TN_EQ_STR("1100100", STR(format("~5LB",  (long)100)));
1565 
1566 #if L32
1567     TST_TN_EQ_STR("11111111111111111111111110011100",
1568                   STR(format("~LB", (long)-100)));
1569     TST_TN_EQ_STR("11111111111111111111111111110110",
1570                   STR(format("~LB", (long)-10)));
1571     TST_TN_EQ_STR("11111111111111111111111111111111",
1572                   STR(format("~LB", (long)-1)));
1573 
1574     TST_TN_EQ_STR("11111111111111111111111110011100",
1575                   STR(format("~0LB", (long)-100)));
1576     TST_TN_EQ_STR("11111111111111111111111111110110",
1577                   STR(format("~0LB", (long)-10)));
1578     TST_TN_EQ_STR("11111111111111111111111111111111",
1579                   STR(format("~0LB", (long)-1)));
1580 
1581     TST_TN_EQ_STR("11111111111111111111111110011100",
1582                   STR(format("~05LB", (long)-100)));
1583     TST_TN_EQ_STR("11111111111111111111111111110110",
1584                   STR(format("~05LB", (long)-10)));
1585     TST_TN_EQ_STR("11111111111111111111111111111111",
1586                   STR(format("~05LB", (long)-1)));
1587 
1588     TST_TN_EQ_STR("11111111111111111111111110011100",
1589                   STR(format("~5LB", (long)-100)));
1590     TST_TN_EQ_STR("11111111111111111111111111110110",
1591                   STR(format("~5LB", (long)-10)));
1592     TST_TN_EQ_STR("11111111111111111111111111111111",
1593                   STR(format("~5LB", (long)-1)));
1594 #elif L64
1595     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1596                   STR(format("~LB", (long)-100)));
1597     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1598                   STR(format("~LB", (long)-10)));
1599     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1600                   STR(format("~LB", (long)-1)));
1601 
1602     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1603                   STR(format("~0LB", (long)-100)));
1604     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1605                   STR(format("~0LB", (long)-10)));
1606     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1607                   STR(format("~0LB", (long)-1)));
1608 
1609     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1610                   STR(format("~05LB", (long)-100)));
1611     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1612                   STR(format("~05LB", (long)-10)));
1613     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1614                   STR(format("~05LB", (long)-1)));
1615 
1616     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1617                   STR(format("~5LB", (long)-100)));
1618     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1619                   STR(format("~5LB", (long)-10)));
1620     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1621                   STR(format("~5LB", (long)-1)));
1622 #endif
1623 
1624     TST_TN_EQ_STR("                                                                                                                            101",
1625                   STR(format("~127LB", (long)0x5)));
1626     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101",
1627                   STR(format("~0127LB", (long)0x5)));
1628 }
1629 
1630 TST_CASE("format ~JD")
1631 {
1632     TST_TN_EQ_STR("-100", STR(format("~JD",   (intmax_t)-100)));
1633     TST_TN_EQ_STR("-10",  STR(format("~JD",   (intmax_t)-10)));
1634     TST_TN_EQ_STR("-1",   STR(format("~JD",   (intmax_t)-1)));
1635     TST_TN_EQ_STR("0",    STR(format("~JD",   (intmax_t)0)));
1636     TST_TN_EQ_STR("1",    STR(format("~JD",   (intmax_t)1)));
1637     TST_TN_EQ_STR("10",   STR(format("~JD",   (intmax_t)10)));
1638     TST_TN_EQ_STR("100",  STR(format("~JD",   (intmax_t)100)));
1639 
1640     TST_TN_EQ_STR("-100", STR(format("~0JD",  (intmax_t)-100)));
1641     TST_TN_EQ_STR("-10",  STR(format("~0JD",  (intmax_t)-10)));
1642     TST_TN_EQ_STR("-1",   STR(format("~0JD",  (intmax_t)-1)));
1643     TST_TN_EQ_STR("0",    STR(format("~0JD",  (intmax_t)0)));
1644     TST_TN_EQ_STR("1",    STR(format("~0JD",  (intmax_t)1)));
1645     TST_TN_EQ_STR("10",   STR(format("~0JD",  (intmax_t)10)));
1646     TST_TN_EQ_STR("100",  STR(format("~0JD",  (intmax_t)100)));
1647 
1648     TST_TN_EQ_STR("-100", STR(format("~03JD", (intmax_t)-100)));
1649     TST_TN_EQ_STR("-10",  STR(format("~03JD", (intmax_t)-10)));
1650     TST_TN_EQ_STR("-01",  STR(format("~03JD", (intmax_t)-1)));
1651     TST_TN_EQ_STR("000",  STR(format("~03JD", (intmax_t)0)));
1652     TST_TN_EQ_STR("001",  STR(format("~03JD", (intmax_t)1)));
1653     TST_TN_EQ_STR("010",  STR(format("~03JD", (intmax_t)10)));
1654     TST_TN_EQ_STR("100",  STR(format("~03JD", (intmax_t)100)));
1655 
1656     TST_TN_EQ_STR("-100", STR(format("~3JD",  (intmax_t)-100)));
1657     TST_TN_EQ_STR("-10",  STR(format("~3JD",  (intmax_t)-10)));
1658     TST_TN_EQ_STR(" -1",  STR(format("~3JD",  (intmax_t)-1)));
1659     TST_TN_EQ_STR("  0",  STR(format("~3JD",  (intmax_t)0)));
1660     TST_TN_EQ_STR("  1",  STR(format("~3JD",  (intmax_t)1)));
1661     TST_TN_EQ_STR(" 10",  STR(format("~3JD",  (intmax_t)10)));
1662     TST_TN_EQ_STR("100",  STR(format("~3JD",  (intmax_t)100)));
1663 
1664     TST_TN_EQ_STR("                                                                                                                            123",
1665                   STR(format("~127JD", (intmax_t)123)));
1666     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
1667                   STR(format("~0127JD", (intmax_t)123)));
1668 }
1669 
1670 TST_CASE("format ~JU")
1671 {
1672     TST_TN_EQ_STR("0",    STR(format("~JU",   (intmax_t)0)));
1673     TST_TN_EQ_STR("1",    STR(format("~JU",   (intmax_t)1)));
1674     TST_TN_EQ_STR("10",   STR(format("~JU",   (intmax_t)10)));
1675     TST_TN_EQ_STR("100",  STR(format("~JU",   (intmax_t)100)));
1676 
1677     TST_TN_EQ_STR("0",    STR(format("~0JU",  (intmax_t)0)));
1678     TST_TN_EQ_STR("1",    STR(format("~0JU",  (intmax_t)1)));
1679     TST_TN_EQ_STR("10",   STR(format("~0JU",  (intmax_t)10)));
1680     TST_TN_EQ_STR("100",  STR(format("~0JU",  (intmax_t)100)));
1681 
1682     TST_TN_EQ_STR("000",  STR(format("~03JU", (intmax_t)0)));
1683     TST_TN_EQ_STR("001",  STR(format("~03JU", (intmax_t)1)));
1684     TST_TN_EQ_STR("010",  STR(format("~03JU", (intmax_t)10)));
1685     TST_TN_EQ_STR("100",  STR(format("~03JU", (intmax_t)100)));
1686 
1687     TST_TN_EQ_STR("  0",  STR(format("~3JU",  (intmax_t)0)));
1688     TST_TN_EQ_STR("  1",  STR(format("~3JU",  (intmax_t)1)));
1689     TST_TN_EQ_STR(" 10",  STR(format("~3JU",  (intmax_t)10)));
1690     TST_TN_EQ_STR("100",  STR(format("~3JU",  (intmax_t)100)));
1691 
1692 #if IMAX32
1693     TST_TN_EQ_STR("4294967196", STR(format("~JU",   (intmax_t)-100)));
1694     TST_TN_EQ_STR("4294967286", STR(format("~JU",   (intmax_t)-10)));
1695     TST_TN_EQ_STR("4294967295", STR(format("~JU",   (intmax_t)-1)));
1696 
1697     TST_TN_EQ_STR("4294967196", STR(format("~0JU",  (intmax_t)-100)));
1698     TST_TN_EQ_STR("4294967286", STR(format("~0JU",  (intmax_t)-10)));
1699     TST_TN_EQ_STR("4294967295", STR(format("~0JU",  (intmax_t)-1)));
1700 
1701     TST_TN_EQ_STR("4294967196", STR(format("~03JU", (intmax_t)-100)));
1702     TST_TN_EQ_STR("4294967286", STR(format("~03JU", (intmax_t)-10)));
1703     TST_TN_EQ_STR("4294967295", STR(format("~03JU", (intmax_t)-1)));
1704 
1705     TST_TN_EQ_STR("4294967196", STR(format("~3JU",  (intmax_t)-100)));
1706     TST_TN_EQ_STR("4294967286", STR(format("~3JU",  (intmax_t)-10)));
1707     TST_TN_EQ_STR("4294967295", STR(format("~3JU",  (intmax_t)-1)));
1708 #elif IMAX64
1709     TST_TN_EQ_STR("18446744073709551516", STR(format("~JU",  (intmax_t)-100)));
1710     TST_TN_EQ_STR("18446744073709551606", STR(format("~JU",  (intmax_t)-10)));
1711     TST_TN_EQ_STR("18446744073709551615", STR(format("~JU",  (intmax_t)-1)));
1712 
1713     TST_TN_EQ_STR("18446744073709551516", STR(format("~0JU", (intmax_t)-100)));
1714     TST_TN_EQ_STR("18446744073709551606", STR(format("~0JU", (intmax_t)-10)));
1715     TST_TN_EQ_STR("18446744073709551615", STR(format("~0JU", (intmax_t)-1)));
1716 
1717     TST_TN_EQ_STR("18446744073709551516", STR(format("~03JU",(intmax_t)-100)));
1718     TST_TN_EQ_STR("18446744073709551606", STR(format("~03JU",(intmax_t)-10)));
1719     TST_TN_EQ_STR("18446744073709551615", STR(format("~03JU",(intmax_t)-1)));
1720 
1721     TST_TN_EQ_STR("18446744073709551516", STR(format("~3JU", (intmax_t)-100)));
1722     TST_TN_EQ_STR("18446744073709551606", STR(format("~3JU", (intmax_t)-10)));
1723     TST_TN_EQ_STR("18446744073709551615", STR(format("~3JU", (intmax_t)-1)));
1724 #endif
1725 
1726     TST_TN_EQ_STR("                                                                                                                            123",
1727                   STR(format("~127JU", (intmax_t)123)));
1728     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
1729                   STR(format("~0127JU", (intmax_t)123)));
1730 }
1731 
1732 TST_CASE("format ~JX")
1733 {
1734     TST_TN_EQ_STR("0",    STR(format("~JX",   (intmax_t)0)));
1735     TST_TN_EQ_STR("1",    STR(format("~JX",   (intmax_t)1)));
1736     TST_TN_EQ_STR("a",    STR(format("~JX",   (intmax_t)10)));
1737     TST_TN_EQ_STR("64",   STR(format("~JX",   (intmax_t)100)));
1738 
1739     TST_TN_EQ_STR("0",    STR(format("~0JX",  (intmax_t)0)));
1740     TST_TN_EQ_STR("1",    STR(format("~0JX",  (intmax_t)1)));
1741     TST_TN_EQ_STR("a",    STR(format("~0JX",  (intmax_t)10)));
1742     TST_TN_EQ_STR("64",   STR(format("~0JX",  (intmax_t)100)));
1743 
1744     TST_TN_EQ_STR("000",  STR(format("~03JX", (intmax_t)0)));
1745     TST_TN_EQ_STR("001",  STR(format("~03JX", (intmax_t)1)));
1746     TST_TN_EQ_STR("00a",  STR(format("~03JX", (intmax_t)10)));
1747     TST_TN_EQ_STR("064",  STR(format("~03JX", (intmax_t)100)));
1748 
1749     TST_TN_EQ_STR("  0",  STR(format("~3JX",  (intmax_t)0)));
1750     TST_TN_EQ_STR("  1",  STR(format("~3JX",  (intmax_t)1)));
1751     TST_TN_EQ_STR("  a",  STR(format("~3JX",  (intmax_t)10)));
1752     TST_TN_EQ_STR(" 64",  STR(format("~3JX",  (intmax_t)100)));
1753 
1754 #if IMAX32
1755     TST_TN_EQ_STR("ffffff9c", STR(format("~JX",   (intmax_t)-100)));
1756     TST_TN_EQ_STR("fffffff6", STR(format("~JX",   (intmax_t)-10)));
1757     TST_TN_EQ_STR("ffffffff", STR(format("~JX",   (intmax_t)-1)));
1758 
1759     TST_TN_EQ_STR("ffffff9c", STR(format("~0JX",  (intmax_t)-100)));
1760     TST_TN_EQ_STR("fffffff6", STR(format("~0JX",  (intmax_t)-10)));
1761     TST_TN_EQ_STR("ffffffff", STR(format("~0JX",  (intmax_t)-1)));
1762 
1763     TST_TN_EQ_STR("ffffff9c", STR(format("~03JX", (intmax_t)-100)));
1764     TST_TN_EQ_STR("fffffff6", STR(format("~03JX", (intmax_t)-10)));
1765     TST_TN_EQ_STR("ffffffff", STR(format("~03JX", (intmax_t)-1)));
1766 
1767     TST_TN_EQ_STR("ffffff9c", STR(format("~3JX",  (intmax_t)-100)));
1768     TST_TN_EQ_STR("fffffff6", STR(format("~3JX",  (intmax_t)-10)));
1769     TST_TN_EQ_STR("ffffffff", STR(format("~3JX",  (intmax_t)-1)));
1770 #elif IMAX64
1771     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~JX",   (intmax_t)-100)));
1772     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~JX",   (intmax_t)-10)));
1773     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~JX",   (intmax_t)-1)));
1774 
1775     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~0JX",  (intmax_t)-100)));
1776     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~0JX",  (intmax_t)-10)));
1777     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~0JX",  (intmax_t)-1)));
1778 
1779     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~03JX", (intmax_t)-100)));
1780     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~03JX", (intmax_t)-10)));
1781     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~03JX", (intmax_t)-1)));
1782 
1783     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~3JX",  (intmax_t)-100)));
1784     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~3JX",  (intmax_t)-10)));
1785     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~3JX",  (intmax_t)-1)));
1786 #endif
1787 
1788     TST_TN_EQ_STR("                                                                                                                            1ac",
1789                   STR(format("~127JX", (intmax_t)0x1ac)));
1790     TST_TN_EQ_STR("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ac",
1791                   STR(format("~0127JX", (intmax_t)0x1ac)));
1792 }
1793 
1794 TST_CASE("format ~JO")
1795 {
1796     TST_TN_EQ_STR("0",    STR(format("~JO",   (intmax_t)0)));
1797     TST_TN_EQ_STR("1",    STR(format("~JO",   (intmax_t)1)));
1798     TST_TN_EQ_STR("12",   STR(format("~JO",   (intmax_t)10)));
1799     TST_TN_EQ_STR("144",  STR(format("~JO",   (intmax_t)100)));
1800 
1801     TST_TN_EQ_STR("0",    STR(format("~0JO",  (intmax_t)0)));
1802     TST_TN_EQ_STR("1",    STR(format("~0JO",  (intmax_t)1)));
1803     TST_TN_EQ_STR("12",   STR(format("~0JO",  (intmax_t)10)));
1804     TST_TN_EQ_STR("144",  STR(format("~0JO",  (intmax_t)100)));
1805 
1806     TST_TN_EQ_STR("000",  STR(format("~03JO", (intmax_t)0)));
1807     TST_TN_EQ_STR("001",  STR(format("~03JO", (intmax_t)1)));
1808     TST_TN_EQ_STR("012",  STR(format("~03JO", (intmax_t)10)));
1809     TST_TN_EQ_STR("144",  STR(format("~03JO", (intmax_t)100)));
1810 
1811     TST_TN_EQ_STR("  0",  STR(format("~3JO",  (intmax_t)0)));
1812     TST_TN_EQ_STR("  1",  STR(format("~3JO",  (intmax_t)1)));
1813     TST_TN_EQ_STR(" 12",  STR(format("~3JO",  (intmax_t)10)));
1814     TST_TN_EQ_STR("144",  STR(format("~3JO",  (intmax_t)100)));
1815 
1816 #if IMAX32
1817     TST_TN_EQ_STR("37777777634", STR(format("~JO",   (intmax_t)-100)));
1818     TST_TN_EQ_STR("37777777766", STR(format("~JO",   (intmax_t)-10)));
1819     TST_TN_EQ_STR("37777777777", STR(format("~JO",   (intmax_t)-1)));
1820 
1821     TST_TN_EQ_STR("37777777634", STR(format("~0JO",  (intmax_t)-100)));
1822     TST_TN_EQ_STR("37777777766", STR(format("~0JO",  (intmax_t)-10)));
1823     TST_TN_EQ_STR("37777777777", STR(format("~0JO",  (intmax_t)-1)));
1824 
1825     TST_TN_EQ_STR("37777777634", STR(format("~03JO", (intmax_t)-100)));
1826     TST_TN_EQ_STR("37777777766", STR(format("~03JO", (intmax_t)-10)));
1827     TST_TN_EQ_STR("37777777777", STR(format("~03JO", (intmax_t)-1)));
1828 
1829     TST_TN_EQ_STR("37777777634", STR(format("~3JO",  (intmax_t)-100)));
1830     TST_TN_EQ_STR("37777777766", STR(format("~3JO",  (intmax_t)-10)));
1831     TST_TN_EQ_STR("37777777777", STR(format("~3JO",  (intmax_t)-1)));
1832 #elif IMAX64
1833     TST_TN_EQ_STR("1777777777777777777634",
1834                   STR(format("~JO",   (intmax_t)-100)));
1835     TST_TN_EQ_STR("1777777777777777777766",
1836                   STR(format("~JO",   (intmax_t)-10)));
1837     TST_TN_EQ_STR("1777777777777777777777",
1838                   STR(format("~JO",   (intmax_t)-1)));
1839 
1840     TST_TN_EQ_STR("1777777777777777777634",
1841                   STR(format("~0JO",  (intmax_t)-100)));
1842     TST_TN_EQ_STR("1777777777777777777766",
1843                   STR(format("~0JO",  (intmax_t)-10)));
1844     TST_TN_EQ_STR("1777777777777777777777",
1845                   STR(format("~0JO",  (intmax_t)-1)));
1846 
1847     TST_TN_EQ_STR("1777777777777777777634",
1848                   STR(format("~03JO", (intmax_t)-100)));
1849     TST_TN_EQ_STR("1777777777777777777766",
1850                   STR(format("~03JO", (intmax_t)-10)));
1851     TST_TN_EQ_STR("1777777777777777777777",
1852                   STR(format("~03JO", (intmax_t)-1)));
1853 
1854     TST_TN_EQ_STR("1777777777777777777634",
1855                   STR(format("~3JO",  (intmax_t)-100)));
1856     TST_TN_EQ_STR("1777777777777777777766",
1857                   STR(format("~3JO",  (intmax_t)-10)));
1858     TST_TN_EQ_STR("1777777777777777777777",
1859                   STR(format("~3JO",  (intmax_t)-1)));
1860 #endif
1861 
1862     TST_TN_EQ_STR("                                                                                                                            123",
1863                   STR(format("~127JO", (intmax_t)0123)));
1864     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
1865                   STR(format("~0127JO", (intmax_t)0123)));
1866 }
1867 
1868 TST_CASE("format ~JB")
1869 {
1870     TST_TN_EQ_STR("0",       STR(format("~JB",   (intmax_t)0)));
1871     TST_TN_EQ_STR("1",       STR(format("~JB",   (intmax_t)1)));
1872     TST_TN_EQ_STR("1010",    STR(format("~JB",   (intmax_t)10)));
1873     TST_TN_EQ_STR("1100100", STR(format("~JB",   (intmax_t)100)));
1874 
1875     TST_TN_EQ_STR("0",       STR(format("~0JB",  (intmax_t)0)));
1876     TST_TN_EQ_STR("1",       STR(format("~0JB",  (intmax_t)1)));
1877     TST_TN_EQ_STR("1010",    STR(format("~0JB",  (intmax_t)10)));
1878     TST_TN_EQ_STR("1100100", STR(format("~0JB",  (intmax_t)100)));
1879 
1880     TST_TN_EQ_STR("00000",   STR(format("~05JB", (intmax_t)0)));
1881     TST_TN_EQ_STR("00001",   STR(format("~05JB", (intmax_t)1)));
1882     TST_TN_EQ_STR("01010",   STR(format("~05JB", (intmax_t)10)));
1883     TST_TN_EQ_STR("1100100", STR(format("~05JB", (intmax_t)100)));
1884 
1885     TST_TN_EQ_STR("    0",   STR(format("~5JB",  (intmax_t)0)));
1886     TST_TN_EQ_STR("    1",   STR(format("~5JB",  (intmax_t)1)));
1887     TST_TN_EQ_STR(" 1010",   STR(format("~5JB",  (intmax_t)10)));
1888     TST_TN_EQ_STR("1100100", STR(format("~5JB",  (intmax_t)100)));
1889 
1890 #if IMAX32
1891     TST_TN_EQ_STR("11111111111111111111111110011100",
1892                   STR(format("~JB", (intmax_t)-100)));
1893     TST_TN_EQ_STR("11111111111111111111111111110110",
1894                   STR(format("~JB", (intmax_t)-10)));
1895     TST_TN_EQ_STR("11111111111111111111111111111111",
1896                   STR(format("~JB", (intmax_t)-1)));
1897 
1898     TST_TN_EQ_STR("11111111111111111111111110011100",
1899                   STR(format("~0JB", (intmax_t)-100)));
1900     TST_TN_EQ_STR("11111111111111111111111111110110",
1901                   STR(format("~0JB", (intmax_t)-10)));
1902     TST_TN_EQ_STR("11111111111111111111111111111111",
1903                   STR(format("~0JB", (intmax_t)-1)));
1904 
1905     TST_TN_EQ_STR("11111111111111111111111110011100",
1906                   STR(format("~05JB", (intmax_t)-100)));
1907     TST_TN_EQ_STR("11111111111111111111111111110110",
1908                   STR(format("~05JB", (intmax_t)-10)));
1909     TST_TN_EQ_STR("11111111111111111111111111111111",
1910                   STR(format("~05JB", (intmax_t)-1)));
1911 
1912     TST_TN_EQ_STR("11111111111111111111111110011100",
1913                   STR(format("~5JB", (intmax_t)-100)));
1914     TST_TN_EQ_STR("11111111111111111111111111110110",
1915                   STR(format("~5JB", (intmax_t)-10)));
1916     TST_TN_EQ_STR("11111111111111111111111111111111",
1917                   STR(format("~5JB", (intmax_t)-1)));
1918 #elif IMAX64
1919     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1920                   STR(format("~JB", (intmax_t)-100)));
1921     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1922                   STR(format("~JB", (intmax_t)-10)));
1923     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1924                   STR(format("~JB", (intmax_t)-1)));
1925 
1926     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1927                   STR(format("~0JB", (intmax_t)-100)));
1928     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1929                   STR(format("~0JB", (intmax_t)-10)));
1930     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1931                   STR(format("~0JB", (intmax_t)-1)));
1932 
1933     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1934                   STR(format("~05JB", (intmax_t)-100)));
1935     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1936                   STR(format("~05JB", (intmax_t)-10)));
1937     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1938                   STR(format("~05JB", (intmax_t)-1)));
1939 
1940     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
1941                   STR(format("~5JB", (intmax_t)-100)));
1942     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
1943                   STR(format("~5JB", (intmax_t)-10)));
1944     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
1945                   STR(format("~5JB", (intmax_t)-1)));
1946 #endif
1947 
1948     TST_TN_EQ_STR("                                                                                                                            101",
1949                   STR(format("~127JB", (intmax_t)0x5)));
1950     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101",
1951                   STR(format("~0127JB", (intmax_t)0x5)));
1952 }
1953 
1954 TST_CASE("format ~TD")
1955 {
1956     TST_TN_EQ_STR("-100", STR(format("~TD",   (ptrdiff_t)-100)));
1957     TST_TN_EQ_STR("-10",  STR(format("~TD",   (ptrdiff_t)-10)));
1958     TST_TN_EQ_STR("-1",   STR(format("~TD",   (ptrdiff_t)-1)));
1959     TST_TN_EQ_STR("0",    STR(format("~TD",   (ptrdiff_t)0)));
1960     TST_TN_EQ_STR("1",    STR(format("~TD",   (ptrdiff_t)1)));
1961     TST_TN_EQ_STR("10",   STR(format("~TD",   (ptrdiff_t)10)));
1962     TST_TN_EQ_STR("100",  STR(format("~TD",   (ptrdiff_t)100)));
1963 
1964     TST_TN_EQ_STR("-100", STR(format("~0TD",  (ptrdiff_t)-100)));
1965     TST_TN_EQ_STR("-10",  STR(format("~0TD",  (ptrdiff_t)-10)));
1966     TST_TN_EQ_STR("-1",   STR(format("~0TD",  (ptrdiff_t)-1)));
1967     TST_TN_EQ_STR("0",    STR(format("~0TD",  (ptrdiff_t)0)));
1968     TST_TN_EQ_STR("1",    STR(format("~0TD",  (ptrdiff_t)1)));
1969     TST_TN_EQ_STR("10",   STR(format("~0TD",  (ptrdiff_t)10)));
1970     TST_TN_EQ_STR("100",  STR(format("~0TD",  (ptrdiff_t)100)));
1971 
1972     TST_TN_EQ_STR("-100", STR(format("~03TD", (ptrdiff_t)-100)));
1973     TST_TN_EQ_STR("-10",  STR(format("~03TD", (ptrdiff_t)-10)));
1974     TST_TN_EQ_STR("-01",  STR(format("~03TD", (ptrdiff_t)-1)));
1975     TST_TN_EQ_STR("000",  STR(format("~03TD", (ptrdiff_t)0)));
1976     TST_TN_EQ_STR("001",  STR(format("~03TD", (ptrdiff_t)1)));
1977     TST_TN_EQ_STR("010",  STR(format("~03TD", (ptrdiff_t)10)));
1978     TST_TN_EQ_STR("100",  STR(format("~03TD", (ptrdiff_t)100)));
1979 
1980     TST_TN_EQ_STR("-100", STR(format("~3TD",  (ptrdiff_t)-100)));
1981     TST_TN_EQ_STR("-10",  STR(format("~3TD",  (ptrdiff_t)-10)));
1982     TST_TN_EQ_STR(" -1",  STR(format("~3TD",  (ptrdiff_t)-1)));
1983     TST_TN_EQ_STR("  0",  STR(format("~3TD",  (ptrdiff_t)0)));
1984     TST_TN_EQ_STR("  1",  STR(format("~3TD",  (ptrdiff_t)1)));
1985     TST_TN_EQ_STR(" 10",  STR(format("~3TD",  (ptrdiff_t)10)));
1986     TST_TN_EQ_STR("100",  STR(format("~3TD",  (ptrdiff_t)100)));
1987 
1988     TST_TN_EQ_STR("                                                                                                                            123",
1989                   STR(format("~127TD", (ptrdiff_t)123)));
1990     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
1991                   STR(format("~0127TD", (ptrdiff_t)123)));
1992 }
1993 
1994 TST_CASE("format ~TU")
1995 {
1996     TST_TN_EQ_STR("0",    STR(format("~TU",   (ptrdiff_t)0)));
1997     TST_TN_EQ_STR("1",    STR(format("~TU",   (ptrdiff_t)1)));
1998     TST_TN_EQ_STR("10",   STR(format("~TU",   (ptrdiff_t)10)));
1999     TST_TN_EQ_STR("100",  STR(format("~TU",   (ptrdiff_t)100)));
2000 
2001     TST_TN_EQ_STR("0",    STR(format("~0TU",  (ptrdiff_t)0)));
2002     TST_TN_EQ_STR("1",    STR(format("~0TU",  (ptrdiff_t)1)));
2003     TST_TN_EQ_STR("10",   STR(format("~0TU",  (ptrdiff_t)10)));
2004     TST_TN_EQ_STR("100",  STR(format("~0TU",  (ptrdiff_t)100)));
2005 
2006     TST_TN_EQ_STR("000",  STR(format("~03TU", (ptrdiff_t)0)));
2007     TST_TN_EQ_STR("001",  STR(format("~03TU", (ptrdiff_t)1)));
2008     TST_TN_EQ_STR("010",  STR(format("~03TU", (ptrdiff_t)10)));
2009     TST_TN_EQ_STR("100",  STR(format("~03TU", (ptrdiff_t)100)));
2010 
2011     TST_TN_EQ_STR("  0",  STR(format("~3TU",  (ptrdiff_t)0)));
2012     TST_TN_EQ_STR("  1",  STR(format("~3TU",  (ptrdiff_t)1)));
2013     TST_TN_EQ_STR(" 10",  STR(format("~3TU",  (ptrdiff_t)10)));
2014     TST_TN_EQ_STR("100",  STR(format("~3TU",  (ptrdiff_t)100)));
2015 
2016 #if PDIFF32
2017     TST_TN_EQ_STR("4294967196", STR(format("~TU",   (ptrdiff_t)-100)));
2018     TST_TN_EQ_STR("4294967286", STR(format("~TU",   (ptrdiff_t)-10)));
2019     TST_TN_EQ_STR("4294967295", STR(format("~TU",   (ptrdiff_t)-1)));
2020 
2021     TST_TN_EQ_STR("4294967196", STR(format("~0TU",  (ptrdiff_t)-100)));
2022     TST_TN_EQ_STR("4294967286", STR(format("~0TU",  (ptrdiff_t)-10)));
2023     TST_TN_EQ_STR("4294967295", STR(format("~0TU",  (ptrdiff_t)-1)));
2024 
2025     TST_TN_EQ_STR("4294967196", STR(format("~03TU", (ptrdiff_t)-100)));
2026     TST_TN_EQ_STR("4294967286", STR(format("~03TU", (ptrdiff_t)-10)));
2027     TST_TN_EQ_STR("4294967295", STR(format("~03TU", (ptrdiff_t)-1)));
2028 
2029     TST_TN_EQ_STR("4294967196", STR(format("~3TU",  (ptrdiff_t)-100)));
2030     TST_TN_EQ_STR("4294967286", STR(format("~3TU",  (ptrdiff_t)-10)));
2031     TST_TN_EQ_STR("4294967295", STR(format("~3TU",  (ptrdiff_t)-1)));
2032 #elif PDIFF64
2033     TST_TN_EQ_STR("18446744073709551516",
2034                   STR(format("~TU",   (ptrdiff_t)-100)));
2035     TST_TN_EQ_STR("18446744073709551606",
2036                   STR(format("~TU",   (ptrdiff_t)-10)));
2037     TST_TN_EQ_STR("18446744073709551615",
2038                   STR(format("~TU",   (ptrdiff_t)-1)));
2039 
2040     TST_TN_EQ_STR("18446744073709551516",
2041                   STR(format("~0TU",  (ptrdiff_t)-100)));
2042     TST_TN_EQ_STR("18446744073709551606",
2043                   STR(format("~0TU",  (ptrdiff_t)-10)));
2044     TST_TN_EQ_STR("18446744073709551615",
2045                   STR(format("~0TU",  (ptrdiff_t)-1)));
2046 
2047     TST_TN_EQ_STR("18446744073709551516",
2048                   STR(format("~03TU", (ptrdiff_t)-100)));
2049     TST_TN_EQ_STR("18446744073709551606",
2050                   STR(format("~03TU", (ptrdiff_t)-10)));
2051     TST_TN_EQ_STR("18446744073709551615",
2052                   STR(format("~03TU", (ptrdiff_t)-1)));
2053 
2054     TST_TN_EQ_STR("18446744073709551516",
2055                   STR(format("~3TU",  (ptrdiff_t)-100)));
2056     TST_TN_EQ_STR("18446744073709551606",
2057                   STR(format("~3TU",  (ptrdiff_t)-10)));
2058     TST_TN_EQ_STR("18446744073709551615",
2059                   STR(format("~3TU",  (ptrdiff_t)-1)));
2060 #endif
2061 
2062     TST_TN_EQ_STR("                                                                                                                            123",
2063                   STR(format("~127TU", (ptrdiff_t)123)));
2064     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
2065                   STR(format("~0127TU", (ptrdiff_t)123)));
2066 }
2067 
2068 TST_CASE("format ~TX")
2069 {
2070     TST_TN_EQ_STR("0",    STR(format("~TX",   (ptrdiff_t)0)));
2071     TST_TN_EQ_STR("1",    STR(format("~TX",   (ptrdiff_t)1)));
2072     TST_TN_EQ_STR("a",    STR(format("~TX",   (ptrdiff_t)10)));
2073     TST_TN_EQ_STR("64",   STR(format("~TX",   (ptrdiff_t)100)));
2074 
2075     TST_TN_EQ_STR("0",    STR(format("~0TX",  (ptrdiff_t)0)));
2076     TST_TN_EQ_STR("1",    STR(format("~0TX",  (ptrdiff_t)1)));
2077     TST_TN_EQ_STR("a",    STR(format("~0TX",  (ptrdiff_t)10)));
2078     TST_TN_EQ_STR("64",   STR(format("~0TX",  (ptrdiff_t)100)));
2079 
2080     TST_TN_EQ_STR("000",  STR(format("~03TX", (ptrdiff_t)0)));
2081     TST_TN_EQ_STR("001",  STR(format("~03TX", (ptrdiff_t)1)));
2082     TST_TN_EQ_STR("00a",  STR(format("~03TX", (ptrdiff_t)10)));
2083     TST_TN_EQ_STR("064",  STR(format("~03TX", (ptrdiff_t)100)));
2084 
2085     TST_TN_EQ_STR("  0",  STR(format("~3TX",  (ptrdiff_t)0)));
2086     TST_TN_EQ_STR("  1",  STR(format("~3TX",  (ptrdiff_t)1)));
2087     TST_TN_EQ_STR("  a",  STR(format("~3TX",  (ptrdiff_t)10)));
2088     TST_TN_EQ_STR(" 64",  STR(format("~3TX",  (ptrdiff_t)100)));
2089 
2090 #if PDIFF32
2091     TST_TN_EQ_STR("ffffff9c", STR(format("~TX",   (ptrdiff_t)-100)));
2092     TST_TN_EQ_STR("fffffff6", STR(format("~TX",   (ptrdiff_t)-10)));
2093     TST_TN_EQ_STR("ffffffff", STR(format("~TX",   (ptrdiff_t)-1)));
2094 
2095     TST_TN_EQ_STR("ffffff9c", STR(format("~0TX",  (ptrdiff_t)-100)));
2096     TST_TN_EQ_STR("fffffff6", STR(format("~0TX",  (ptrdiff_t)-10)));
2097     TST_TN_EQ_STR("ffffffff", STR(format("~0TX",  (ptrdiff_t)-1)));
2098 
2099     TST_TN_EQ_STR("ffffff9c", STR(format("~03TX", (ptrdiff_t)-100)));
2100     TST_TN_EQ_STR("fffffff6", STR(format("~03TX", (ptrdiff_t)-10)));
2101     TST_TN_EQ_STR("ffffffff", STR(format("~03TX", (ptrdiff_t)-1)));
2102 
2103     TST_TN_EQ_STR("ffffff9c", STR(format("~3TX",  (ptrdiff_t)-100)));
2104     TST_TN_EQ_STR("fffffff6", STR(format("~3TX",  (ptrdiff_t)-10)));
2105     TST_TN_EQ_STR("ffffffff", STR(format("~3TX",  (ptrdiff_t)-1)));
2106 #elif PDIFF64
2107     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~TX",   (ptrdiff_t)-100)));
2108     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~TX",   (ptrdiff_t)-10)));
2109     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~TX",   (ptrdiff_t)-1)));
2110 
2111     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~0TX",  (ptrdiff_t)-100)));
2112     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~0TX",  (ptrdiff_t)-10)));
2113     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~0TX",  (ptrdiff_t)-1)));
2114 
2115     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~03TX", (ptrdiff_t)-100)));
2116     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~03TX", (ptrdiff_t)-10)));
2117     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~03TX", (ptrdiff_t)-1)));
2118 
2119     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~3TX",  (ptrdiff_t)-100)));
2120     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~3TX",  (ptrdiff_t)-10)));
2121     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~3TX",  (ptrdiff_t)-1)));
2122 #endif
2123 
2124     TST_TN_EQ_STR("                                                                                                                            1ac",
2125                   STR(format("~127TX", (ptrdiff_t)0x1ac)));
2126     TST_TN_EQ_STR("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ac",
2127                   STR(format("~0127TX", (ptrdiff_t)0x1ac)));
2128 }
2129 
2130 TST_CASE("format ~TO")
2131 {
2132     TST_TN_EQ_STR("0",    STR(format("~TO",   (ptrdiff_t)0)));
2133     TST_TN_EQ_STR("1",    STR(format("~TO",   (ptrdiff_t)1)));
2134     TST_TN_EQ_STR("12",   STR(format("~TO",   (ptrdiff_t)10)));
2135     TST_TN_EQ_STR("144",  STR(format("~TO",   (ptrdiff_t)100)));
2136 
2137     TST_TN_EQ_STR("0",    STR(format("~0TO",  (ptrdiff_t)0)));
2138     TST_TN_EQ_STR("1",    STR(format("~0TO",  (ptrdiff_t)1)));
2139     TST_TN_EQ_STR("12",   STR(format("~0TO",  (ptrdiff_t)10)));
2140     TST_TN_EQ_STR("144",  STR(format("~0TO",  (ptrdiff_t)100)));
2141 
2142     TST_TN_EQ_STR("000",  STR(format("~03TO", (ptrdiff_t)0)));
2143     TST_TN_EQ_STR("001",  STR(format("~03TO", (ptrdiff_t)1)));
2144     TST_TN_EQ_STR("012",  STR(format("~03TO", (ptrdiff_t)10)));
2145     TST_TN_EQ_STR("144",  STR(format("~03TO", (ptrdiff_t)100)));
2146 
2147     TST_TN_EQ_STR("  0",  STR(format("~3TO",  (ptrdiff_t)0)));
2148     TST_TN_EQ_STR("  1",  STR(format("~3TO",  (ptrdiff_t)1)));
2149     TST_TN_EQ_STR(" 12",  STR(format("~3TO",  (ptrdiff_t)10)));
2150     TST_TN_EQ_STR("144",  STR(format("~3TO",  (ptrdiff_t)100)));
2151 
2152 #if PDIFF32
2153     TST_TN_EQ_STR("37777777634", STR(format("~TO",   (ptrdiff_t)-100)));
2154     TST_TN_EQ_STR("37777777766", STR(format("~TO",   (ptrdiff_t)-10)));
2155     TST_TN_EQ_STR("37777777777", STR(format("~TO",   (ptrdiff_t)-1)));
2156 
2157     TST_TN_EQ_STR("37777777634", STR(format("~0TO",  (ptrdiff_t)-100)));
2158     TST_TN_EQ_STR("37777777766", STR(format("~0TO",  (ptrdiff_t)-10)));
2159     TST_TN_EQ_STR("37777777777", STR(format("~0TO",  (ptrdiff_t)-1)));
2160 
2161     TST_TN_EQ_STR("37777777634", STR(format("~03TO", (ptrdiff_t)-100)));
2162     TST_TN_EQ_STR("37777777766", STR(format("~03TO", (ptrdiff_t)-10)));
2163     TST_TN_EQ_STR("37777777777", STR(format("~03TO", (ptrdiff_t)-1)));
2164 
2165     TST_TN_EQ_STR("37777777634", STR(format("~3TO",  (ptrdiff_t)-100)));
2166     TST_TN_EQ_STR("37777777766", STR(format("~3TO",  (ptrdiff_t)-10)));
2167     TST_TN_EQ_STR("37777777777", STR(format("~3TO",  (ptrdiff_t)-1)));
2168 #elif PDIFF64
2169     TST_TN_EQ_STR("1777777777777777777634",
2170                   STR(format("~TO",   (ptrdiff_t)-100)));
2171     TST_TN_EQ_STR("1777777777777777777766",
2172                   STR(format("~TO",   (ptrdiff_t)-10)));
2173     TST_TN_EQ_STR("1777777777777777777777",
2174                   STR(format("~TO",   (ptrdiff_t)-1)));
2175 
2176     TST_TN_EQ_STR("1777777777777777777634",
2177                   STR(format("~0TO",  (ptrdiff_t)-100)));
2178     TST_TN_EQ_STR("1777777777777777777766",
2179                   STR(format("~0TO",  (ptrdiff_t)-10)));
2180     TST_TN_EQ_STR("1777777777777777777777",
2181                   STR(format("~0TO",  (ptrdiff_t)-1)));
2182 
2183     TST_TN_EQ_STR("1777777777777777777634",
2184                   STR(format("~03TO", (ptrdiff_t)-100)));
2185     TST_TN_EQ_STR("1777777777777777777766",
2186                   STR(format("~03TO", (ptrdiff_t)-10)));
2187     TST_TN_EQ_STR("1777777777777777777777",
2188                   STR(format("~03TO", (ptrdiff_t)-1)));
2189 
2190     TST_TN_EQ_STR("1777777777777777777634",
2191                   STR(format("~3TO",  (ptrdiff_t)-100)));
2192     TST_TN_EQ_STR("1777777777777777777766",
2193                   STR(format("~3TO",  (ptrdiff_t)-10)));
2194     TST_TN_EQ_STR("1777777777777777777777",
2195                   STR(format("~3TO",  (ptrdiff_t)-1)));
2196 #endif
2197 
2198     TST_TN_EQ_STR("                                                                                                                            123",
2199                   STR(format("~127TO", (ptrdiff_t)0123)));
2200     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
2201                   STR(format("~0127TO", (ptrdiff_t)0123)));
2202 }
2203 
2204 TST_CASE("format ~TB")
2205 {
2206     TST_TN_EQ_STR("0",       STR(format("~TB",   (ptrdiff_t)0)));
2207     TST_TN_EQ_STR("1",       STR(format("~TB",   (ptrdiff_t)1)));
2208     TST_TN_EQ_STR("1010",    STR(format("~TB",   (ptrdiff_t)10)));
2209     TST_TN_EQ_STR("1100100", STR(format("~TB",   (ptrdiff_t)100)));
2210 
2211     TST_TN_EQ_STR("0",       STR(format("~0TB",  (ptrdiff_t)0)));
2212     TST_TN_EQ_STR("1",       STR(format("~0TB",  (ptrdiff_t)1)));
2213     TST_TN_EQ_STR("1010",    STR(format("~0TB",  (ptrdiff_t)10)));
2214     TST_TN_EQ_STR("1100100", STR(format("~0TB",  (ptrdiff_t)100)));
2215 
2216     TST_TN_EQ_STR("00000",   STR(format("~05TB", (ptrdiff_t)0)));
2217     TST_TN_EQ_STR("00001",   STR(format("~05TB", (ptrdiff_t)1)));
2218     TST_TN_EQ_STR("01010",   STR(format("~05TB", (ptrdiff_t)10)));
2219     TST_TN_EQ_STR("1100100", STR(format("~05TB", (ptrdiff_t)100)));
2220 
2221     TST_TN_EQ_STR("    0",   STR(format("~5TB",  (ptrdiff_t)0)));
2222     TST_TN_EQ_STR("    1",   STR(format("~5TB",  (ptrdiff_t)1)));
2223     TST_TN_EQ_STR(" 1010",   STR(format("~5TB",  (ptrdiff_t)10)));
2224     TST_TN_EQ_STR("1100100", STR(format("~5TB",  (ptrdiff_t)100)));
2225 
2226 #if PDIFF32
2227     TST_TN_EQ_STR("11111111111111111111111110011100",
2228                   STR(format("~TB", (ptrdiff_t)-100)));
2229     TST_TN_EQ_STR("11111111111111111111111111110110",
2230                   STR(format("~TB", (ptrdiff_t)-10)));
2231     TST_TN_EQ_STR("11111111111111111111111111111111",
2232                   STR(format("~TB", (ptrdiff_t)-1)));
2233 
2234     TST_TN_EQ_STR("11111111111111111111111110011100",
2235                   STR(format("~0TB", (ptrdiff_t)-100)));
2236     TST_TN_EQ_STR("11111111111111111111111111110110",
2237                   STR(format("~0TB", (ptrdiff_t)-10)));
2238     TST_TN_EQ_STR("11111111111111111111111111111111",
2239                   STR(format("~0TB", (ptrdiff_t)-1)));
2240 
2241     TST_TN_EQ_STR("11111111111111111111111110011100",
2242                   STR(format("~05TB", (ptrdiff_t)-100)));
2243     TST_TN_EQ_STR("11111111111111111111111111110110",
2244                   STR(format("~05TB", (ptrdiff_t)-10)));
2245     TST_TN_EQ_STR("11111111111111111111111111111111",
2246                   STR(format("~05TB", (ptrdiff_t)-1)));
2247 
2248     TST_TN_EQ_STR("11111111111111111111111110011100",
2249                   STR(format("~5TB", (ptrdiff_t)-100)));
2250     TST_TN_EQ_STR("11111111111111111111111111110110",
2251                   STR(format("~5TB", (ptrdiff_t)-10)));
2252     TST_TN_EQ_STR("11111111111111111111111111111111",
2253                   STR(format("~5TB", (ptrdiff_t)-1)));
2254 #elif PDIFF64
2255     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
2256                   STR(format("~TB", (ptrdiff_t)-100)));
2257     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
2258                   STR(format("~TB", (ptrdiff_t)-10)));
2259     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
2260                   STR(format("~TB", (ptrdiff_t)-1)));
2261 
2262     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
2263                   STR(format("~0TB", (ptrdiff_t)-100)));
2264     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
2265                   STR(format("~0TB", (ptrdiff_t)-10)));
2266     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
2267                   STR(format("~0TB", (ptrdiff_t)-1)));
2268 
2269     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
2270                   STR(format("~05TB", (ptrdiff_t)-100)));
2271     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
2272                   STR(format("~05TB", (ptrdiff_t)-10)));
2273     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
2274                   STR(format("~05TB", (ptrdiff_t)-1)));
2275 
2276     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
2277                   STR(format("~5TB", (ptrdiff_t)-100)));
2278     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
2279                   STR(format("~5TB", (ptrdiff_t)-10)));
2280     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
2281                   STR(format("~5TB", (ptrdiff_t)-1)));
2282 #endif
2283 
2284     TST_TN_EQ_STR("                                                                                                                            101",
2285                   STR(format("~127TB", (ptrdiff_t)0x5)));
2286     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101",
2287                   STR(format("~0127TB", (ptrdiff_t)0x5)));
2288 }
2289 
2290 TST_CASE("format ~ZD")
2291 {
2292     TST_TN_EQ_STR("-100", STR(format("~ZD",   (size_t)-100)));
2293     TST_TN_EQ_STR("-10",  STR(format("~ZD",   (size_t)-10)));
2294     TST_TN_EQ_STR("-1",   STR(format("~ZD",   (size_t)-1)));
2295     TST_TN_EQ_STR("0",    STR(format("~ZD",   (size_t)0)));
2296     TST_TN_EQ_STR("1",    STR(format("~ZD",   (size_t)1)));
2297     TST_TN_EQ_STR("10",   STR(format("~ZD",   (size_t)10)));
2298     TST_TN_EQ_STR("100",  STR(format("~ZD",   (size_t)100)));
2299 
2300     TST_TN_EQ_STR("-100", STR(format("~0ZD",  (size_t)-100)));
2301     TST_TN_EQ_STR("-10",  STR(format("~0ZD",  (size_t)-10)));
2302     TST_TN_EQ_STR("-1",   STR(format("~0ZD",  (size_t)-1)));
2303     TST_TN_EQ_STR("0",    STR(format("~0ZD",  (size_t)0)));
2304     TST_TN_EQ_STR("1",    STR(format("~0ZD",  (size_t)1)));
2305     TST_TN_EQ_STR("10",   STR(format("~0ZD",  (size_t)10)));
2306     TST_TN_EQ_STR("100",  STR(format("~0ZD",  (size_t)100)));
2307 
2308     TST_TN_EQ_STR("-100", STR(format("~03ZD", (size_t)-100)));
2309     TST_TN_EQ_STR("-10",  STR(format("~03ZD", (size_t)-10)));
2310     TST_TN_EQ_STR("-01",  STR(format("~03ZD", (size_t)-1)));
2311     TST_TN_EQ_STR("000",  STR(format("~03ZD", (size_t)0)));
2312     TST_TN_EQ_STR("001",  STR(format("~03ZD", (size_t)1)));
2313     TST_TN_EQ_STR("010",  STR(format("~03ZD", (size_t)10)));
2314     TST_TN_EQ_STR("100",  STR(format("~03ZD", (size_t)100)));
2315 
2316     TST_TN_EQ_STR("-100", STR(format("~3ZD",  (size_t)-100)));
2317     TST_TN_EQ_STR("-10",  STR(format("~3ZD",  (size_t)-10)));
2318     TST_TN_EQ_STR(" -1",  STR(format("~3ZD",  (size_t)-1)));
2319     TST_TN_EQ_STR("  0",  STR(format("~3ZD",  (size_t)0)));
2320     TST_TN_EQ_STR("  1",  STR(format("~3ZD",  (size_t)1)));
2321     TST_TN_EQ_STR(" 10",  STR(format("~3ZD",  (size_t)10)));
2322     TST_TN_EQ_STR("100",  STR(format("~3ZD",  (size_t)100)));
2323 
2324     TST_TN_EQ_STR("                                                                                                                            123",
2325                   STR(format("~127ZD", (size_t)123)));
2326     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
2327                   STR(format("~0127ZD", (size_t)123)));
2328 }
2329 
2330 TST_CASE("format ~ZU")
2331 {
2332     TST_TN_EQ_STR("0",    STR(format("~ZU",   (size_t)0)));
2333     TST_TN_EQ_STR("1",    STR(format("~ZU",   (size_t)1)));
2334     TST_TN_EQ_STR("10",   STR(format("~ZU",   (size_t)10)));
2335     TST_TN_EQ_STR("100",  STR(format("~ZU",   (size_t)100)));
2336 
2337     TST_TN_EQ_STR("0",    STR(format("~0ZU",  (size_t)0)));
2338     TST_TN_EQ_STR("1",    STR(format("~0ZU",  (size_t)1)));
2339     TST_TN_EQ_STR("10",   STR(format("~0ZU",  (size_t)10)));
2340     TST_TN_EQ_STR("100",  STR(format("~0ZU",  (size_t)100)));
2341 
2342     TST_TN_EQ_STR("000",  STR(format("~03ZU", (size_t)0)));
2343     TST_TN_EQ_STR("001",  STR(format("~03ZU", (size_t)1)));
2344     TST_TN_EQ_STR("010",  STR(format("~03ZU", (size_t)10)));
2345     TST_TN_EQ_STR("100",  STR(format("~03ZU", (size_t)100)));
2346 
2347     TST_TN_EQ_STR("  0",  STR(format("~3ZU",  (size_t)0)));
2348     TST_TN_EQ_STR("  1",  STR(format("~3ZU",  (size_t)1)));
2349     TST_TN_EQ_STR(" 10",  STR(format("~3ZU",  (size_t)10)));
2350     TST_TN_EQ_STR("100",  STR(format("~3ZU",  (size_t)100)));
2351 
2352 #if P32
2353     TST_TN_EQ_STR("4294967196", STR(format("~ZU",   (size_t)-100)));
2354     TST_TN_EQ_STR("4294967286", STR(format("~ZU",   (size_t)-10)));
2355     TST_TN_EQ_STR("4294967295", STR(format("~ZU",   (size_t)-1)));
2356 
2357     TST_TN_EQ_STR("4294967196", STR(format("~0ZU",  (size_t)-100)));
2358     TST_TN_EQ_STR("4294967286", STR(format("~0ZU",  (size_t)-10)));
2359     TST_TN_EQ_STR("4294967295", STR(format("~0ZU",  (size_t)-1)));
2360 
2361     TST_TN_EQ_STR("4294967196", STR(format("~03ZU", (size_t)-100)));
2362     TST_TN_EQ_STR("4294967286", STR(format("~03ZU", (size_t)-10)));
2363     TST_TN_EQ_STR("4294967295", STR(format("~03ZU", (size_t)-1)));
2364 
2365     TST_TN_EQ_STR("4294967196", STR(format("~3ZU",  (size_t)-100)));
2366     TST_TN_EQ_STR("4294967286", STR(format("~3ZU",  (size_t)-10)));
2367     TST_TN_EQ_STR("4294967295", STR(format("~3ZU",  (size_t)-1)));
2368 #elif P64
2369     TST_TN_EQ_STR("18446744073709551516", STR(format("~ZU",   (size_t)-100)));
2370     TST_TN_EQ_STR("18446744073709551606", STR(format("~ZU",   (size_t)-10)));
2371     TST_TN_EQ_STR("18446744073709551615", STR(format("~ZU",   (size_t)-1)));
2372 
2373     TST_TN_EQ_STR("18446744073709551516", STR(format("~0ZU",  (size_t)-100)));
2374     TST_TN_EQ_STR("18446744073709551606", STR(format("~0ZU",  (size_t)-10)));
2375     TST_TN_EQ_STR("18446744073709551615", STR(format("~0ZU",  (size_t)-1)));
2376 
2377     TST_TN_EQ_STR("18446744073709551516", STR(format("~03ZU", (size_t)-100)));
2378     TST_TN_EQ_STR("18446744073709551606", STR(format("~03ZU", (size_t)-10)));
2379     TST_TN_EQ_STR("18446744073709551615", STR(format("~03ZU", (size_t)-1)));
2380 
2381     TST_TN_EQ_STR("18446744073709551516", STR(format("~3ZU",  (size_t)-100)));
2382     TST_TN_EQ_STR("18446744073709551606", STR(format("~3ZU",  (size_t)-10)));
2383     TST_TN_EQ_STR("18446744073709551615", STR(format("~3ZU",  (size_t)-1)));
2384 #endif
2385 
2386     TST_TN_EQ_STR("                                                                                                                            123",
2387                   STR(format("~127ZU", (size_t)123)));
2388     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
2389                   STR(format("~0127ZU", (size_t)123)));
2390 }
2391 
2392 TST_CASE("format ~ZX")
2393 {
2394     TST_TN_EQ_STR("0",    STR(format("~ZX",   (size_t)0)));
2395     TST_TN_EQ_STR("1",    STR(format("~ZX",   (size_t)1)));
2396     TST_TN_EQ_STR("a",    STR(format("~ZX",   (size_t)10)));
2397     TST_TN_EQ_STR("64",   STR(format("~ZX",   (size_t)100)));
2398 
2399     TST_TN_EQ_STR("0",    STR(format("~0ZX",  (size_t)0)));
2400     TST_TN_EQ_STR("1",    STR(format("~0ZX",  (size_t)1)));
2401     TST_TN_EQ_STR("a",    STR(format("~0ZX",  (size_t)10)));
2402     TST_TN_EQ_STR("64",   STR(format("~0ZX",  (size_t)100)));
2403 
2404     TST_TN_EQ_STR("000",  STR(format("~03ZX", (size_t)0)));
2405     TST_TN_EQ_STR("001",  STR(format("~03ZX", (size_t)1)));
2406     TST_TN_EQ_STR("00a",  STR(format("~03ZX", (size_t)10)));
2407     TST_TN_EQ_STR("064",  STR(format("~03ZX", (size_t)100)));
2408 
2409     TST_TN_EQ_STR("  0",  STR(format("~3ZX",  (size_t)0)));
2410     TST_TN_EQ_STR("  1",  STR(format("~3ZX",  (size_t)1)));
2411     TST_TN_EQ_STR("  a",  STR(format("~3ZX",  (size_t)10)));
2412     TST_TN_EQ_STR(" 64",  STR(format("~3ZX",  (size_t)100)));
2413 
2414 #if P32
2415     TST_TN_EQ_STR("ffffffff", STR(format("~ZX",   ~(size_t)0)));
2416 
2417     TST_TN_EQ_STR("ffffff9c", STR(format("~ZX",   (size_t)-100)));
2418     TST_TN_EQ_STR("fffffff6", STR(format("~ZX",   (size_t)-10)));
2419     TST_TN_EQ_STR("ffffffff", STR(format("~ZX",   (size_t)-1)));
2420 
2421     TST_TN_EQ_STR("ffffff9c", STR(format("~0ZX",  (size_t)-100)));
2422     TST_TN_EQ_STR("fffffff6", STR(format("~0ZX",  (size_t)-10)));
2423     TST_TN_EQ_STR("ffffffff", STR(format("~0ZX",  (size_t)-1)));
2424 
2425     TST_TN_EQ_STR("ffffff9c", STR(format("~03ZX", (size_t)-100)));
2426     TST_TN_EQ_STR("fffffff6", STR(format("~03ZX", (size_t)-10)));
2427     TST_TN_EQ_STR("ffffffff", STR(format("~03ZX", (size_t)-1)));
2428 
2429     TST_TN_EQ_STR("ffffff9c", STR(format("~3ZX",  (size_t)-100)));
2430     TST_TN_EQ_STR("fffffff6", STR(format("~3ZX",  (size_t)-10)));
2431     TST_TN_EQ_STR("ffffffff", STR(format("~3ZX",  (size_t)-1)));
2432 #elif P64
2433     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~ZX",   ~(size_t)0)));
2434 
2435     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~ZX",   (size_t)-100)));
2436     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~ZX",   (size_t)-10)));
2437     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~ZX",   (size_t)-1)));
2438 
2439     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~0ZX",  (size_t)-100)));
2440     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~0ZX",  (size_t)-10)));
2441     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~0ZX",  (size_t)-1)));
2442 
2443     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~03ZX", (size_t)-100)));
2444     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~03ZX", (size_t)-10)));
2445     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~03ZX", (size_t)-1)));
2446 
2447     TST_TN_EQ_STR("ffffffffffffff9c", STR(format("~3ZX",  (size_t)-100)));
2448     TST_TN_EQ_STR("fffffffffffffff6", STR(format("~3ZX",  (size_t)-10)));
2449     TST_TN_EQ_STR("ffffffffffffffff", STR(format("~3ZX",  (size_t)-1)));
2450 #endif
2451 
2452     TST_TN_EQ_STR("                                                                                                                            1ac",
2453                   STR(format("~127ZX", (size_t)0x1ac)));
2454     TST_TN_EQ_STR("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ac",
2455                   STR(format("~0127ZX", (size_t)0x1ac)));
2456 }
2457 
2458 TST_CASE("format ~ZO")
2459 {
2460     TST_TN_EQ_STR("0",    STR(format("~ZO",   (size_t)0)));
2461     TST_TN_EQ_STR("1",    STR(format("~ZO",   (size_t)1)));
2462     TST_TN_EQ_STR("12",   STR(format("~ZO",   (size_t)10)));
2463     TST_TN_EQ_STR("144",  STR(format("~ZO",   (size_t)100)));
2464 
2465     TST_TN_EQ_STR("0",    STR(format("~0ZO",  (size_t)0)));
2466     TST_TN_EQ_STR("1",    STR(format("~0ZO",  (size_t)1)));
2467     TST_TN_EQ_STR("12",   STR(format("~0ZO",  (size_t)10)));
2468     TST_TN_EQ_STR("144",  STR(format("~0ZO",  (size_t)100)));
2469 
2470     TST_TN_EQ_STR("000",  STR(format("~03ZO", (size_t)0)));
2471     TST_TN_EQ_STR("001",  STR(format("~03ZO", (size_t)1)));
2472     TST_TN_EQ_STR("012",  STR(format("~03ZO", (size_t)10)));
2473     TST_TN_EQ_STR("144",  STR(format("~03ZO", (size_t)100)));
2474 
2475     TST_TN_EQ_STR("  0",  STR(format("~3ZO",  (size_t)0)));
2476     TST_TN_EQ_STR("  1",  STR(format("~3ZO",  (size_t)1)));
2477     TST_TN_EQ_STR(" 12",  STR(format("~3ZO",  (size_t)10)));
2478     TST_TN_EQ_STR("144",  STR(format("~3ZO",  (size_t)100)));
2479 
2480 #if P32
2481     TST_TN_EQ_STR("37777777634", STR(format("~ZO",   (size_t)-100)));
2482     TST_TN_EQ_STR("37777777766", STR(format("~ZO",   (size_t)-10)));
2483     TST_TN_EQ_STR("37777777777", STR(format("~ZO",   (size_t)-1)));
2484 
2485     TST_TN_EQ_STR("37777777634", STR(format("~0ZO",  (size_t)-100)));
2486     TST_TN_EQ_STR("37777777766", STR(format("~0ZO",  (size_t)-10)));
2487     TST_TN_EQ_STR("37777777777", STR(format("~0ZO",  (size_t)-1)));
2488 
2489     TST_TN_EQ_STR("37777777634", STR(format("~03ZO", (size_t)-100)));
2490     TST_TN_EQ_STR("37777777766", STR(format("~03ZO", (size_t)-10)));
2491     TST_TN_EQ_STR("37777777777", STR(format("~03ZO", (size_t)-1)));
2492 
2493     TST_TN_EQ_STR("37777777634", STR(format("~3ZO",  (size_t)-100)));
2494     TST_TN_EQ_STR("37777777766", STR(format("~3ZO",  (size_t)-10)));
2495     TST_TN_EQ_STR("37777777777", STR(format("~3ZO",  (size_t)-1)));
2496 #elif P64
2497     TST_TN_EQ_STR("1777777777777777777634",
2498                   STR(format("~ZO",   (size_t)-100)));
2499     TST_TN_EQ_STR("1777777777777777777766",
2500                   STR(format("~ZO",   (size_t)-10)));
2501     TST_TN_EQ_STR("1777777777777777777777",
2502                   STR(format("~ZO",   (size_t)-1)));
2503 
2504     TST_TN_EQ_STR("1777777777777777777634",
2505                   STR(format("~0ZO",  (size_t)-100)));
2506     TST_TN_EQ_STR("1777777777777777777766",
2507                   STR(format("~0ZO",  (size_t)-10)));
2508     TST_TN_EQ_STR("1777777777777777777777",
2509                   STR(format("~0ZO",  (size_t)-1)));
2510 
2511     TST_TN_EQ_STR("1777777777777777777634",
2512                   STR(format("~03ZO", (size_t)-100)));
2513     TST_TN_EQ_STR("1777777777777777777766",
2514                   STR(format("~03ZO", (size_t)-10)));
2515     TST_TN_EQ_STR("1777777777777777777777",
2516                   STR(format("~03ZO", (size_t)-1)));
2517 
2518     TST_TN_EQ_STR("1777777777777777777634",
2519                   STR(format("~3ZO",  (size_t)-100)));
2520     TST_TN_EQ_STR("1777777777777777777766",
2521                   STR(format("~3ZO",  (size_t)-10)));
2522     TST_TN_EQ_STR("1777777777777777777777",
2523                   STR(format("~3ZO",  (size_t)-1)));
2524 #endif
2525 
2526     TST_TN_EQ_STR("                                                                                                                            123",
2527                   STR(format("~127ZO", (size_t)0123)));
2528     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123",
2529                   STR(format("~0127ZO", (size_t)0123)));
2530 }
2531 
2532 TST_CASE("format ~ZB")
2533 {
2534     TST_TN_EQ_STR("0",       STR(format("~ZB",   (size_t)0)));
2535     TST_TN_EQ_STR("1",       STR(format("~ZB",   (size_t)1)));
2536     TST_TN_EQ_STR("1010",    STR(format("~ZB",   (size_t)10)));
2537     TST_TN_EQ_STR("1100100", STR(format("~ZB",   (size_t)100)));
2538 
2539     TST_TN_EQ_STR("0",       STR(format("~0ZB",  (size_t)0)));
2540     TST_TN_EQ_STR("1",       STR(format("~0ZB",  (size_t)1)));
2541     TST_TN_EQ_STR("1010",    STR(format("~0ZB",  (size_t)10)));
2542     TST_TN_EQ_STR("1100100", STR(format("~0ZB",  (size_t)100)));
2543 
2544     TST_TN_EQ_STR("00000",   STR(format("~05ZB", (size_t)0)));
2545     TST_TN_EQ_STR("00001",   STR(format("~05ZB", (size_t)1)));
2546     TST_TN_EQ_STR("01010",   STR(format("~05ZB", (size_t)10)));
2547     TST_TN_EQ_STR("1100100", STR(format("~05ZB", (size_t)100)));
2548 
2549     TST_TN_EQ_STR("    0",   STR(format("~5ZB",  (size_t)0)));
2550     TST_TN_EQ_STR("    1",   STR(format("~5ZB",  (size_t)1)));
2551     TST_TN_EQ_STR(" 1010",   STR(format("~5ZB",  (size_t)10)));
2552     TST_TN_EQ_STR("1100100", STR(format("~5ZB",  (size_t)100)));
2553 
2554 #if P32
2555     TST_TN_EQ_STR("11111111111111111111111110011100",
2556                   STR(format("~ZB", (size_t)-100)));
2557     TST_TN_EQ_STR("11111111111111111111111111110110",
2558                   STR(format("~ZB", (size_t)-10)));
2559     TST_TN_EQ_STR("11111111111111111111111111111111",
2560                   STR(format("~ZB", (size_t)-1)));
2561 
2562     TST_TN_EQ_STR("11111111111111111111111110011100",
2563                   STR(format("~0ZB", (size_t)-100)));
2564     TST_TN_EQ_STR("11111111111111111111111111110110",
2565                   STR(format("~0ZB", (size_t)-10)));
2566     TST_TN_EQ_STR("11111111111111111111111111111111",
2567                   STR(format("~0ZB", (size_t)-1)));
2568 
2569     TST_TN_EQ_STR("11111111111111111111111110011100",
2570                   STR(format("~05ZB", (size_t)-100)));
2571     TST_TN_EQ_STR("11111111111111111111111111110110",
2572                   STR(format("~05ZB", (size_t)-10)));
2573     TST_TN_EQ_STR("11111111111111111111111111111111",
2574                   STR(format("~05ZB", (size_t)-1)));
2575 
2576     TST_TN_EQ_STR("11111111111111111111111110011100",
2577                   STR(format("~5ZB", (size_t)-100)));
2578     TST_TN_EQ_STR("11111111111111111111111111110110",
2579                   STR(format("~5ZB", (size_t)-10)));
2580     TST_TN_EQ_STR("11111111111111111111111111111111",
2581                   STR(format("~5ZB", (size_t)-1)));
2582 #elif P64
2583     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
2584                   STR(format("~ZB", (size_t)-100)));
2585     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
2586                   STR(format("~ZB", (size_t)-10)));
2587     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
2588                   STR(format("~ZB", (size_t)-1)));
2589 
2590     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
2591                   STR(format("~0ZB", (size_t)-100)));
2592     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
2593                   STR(format("~0ZB", (size_t)-10)));
2594     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
2595                   STR(format("~0ZB", (size_t)-1)));
2596 
2597     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
2598                   STR(format("~05ZB", (size_t)-100)));
2599     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
2600                   STR(format("~05ZB", (size_t)-10)));
2601     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
2602                   STR(format("~05ZB", (size_t)-1)));
2603 
2604     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111110011100",
2605                   STR(format("~5ZB", (size_t)-100)));
2606     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111110110",
2607                   STR(format("~5ZB", (size_t)-10)));
2608     TST_TN_EQ_STR("1111111111111111111111111111111111111111111111111111111111111111",
2609                   STR(format("~5ZB", (size_t)-1)));
2610 #endif
2611 
2612     TST_TN_EQ_STR("                                                                                                                            101",
2613                   STR(format("~127ZB", (size_t)0x5)));
2614     TST_TN_EQ_STR("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101",
2615                   STR(format("~0127ZB", (size_t)0x5)));
2616 }
2617 
2618 TST_CASE("format ~c")
2619 {
2620     TST_TN_EQ_STR("",   STR(format("~c", MAKE_CHAR('\0'))));
2621     TST_TN_EQ_STR("a",  STR(format("~c", MAKE_CHAR('a'))));
2622     TST_TN_EQ_STR("\"", STR(format("~c", MAKE_CHAR('\"'))));
2623     TST_TN_EQ_STR("\\", STR(format("~c", MAKE_CHAR('\\'))));
2624     TST_TN_EQ_STR("あ", STR(format("~c", MAKE_CHAR(0x3042))));
2625 }
2626 
2627 TST_CASE("format ~d")
2628 {
2629     TST_TN_EQ_STR("-100", STR(format("~d",   MAKE_INT(-100))));
2630     TST_TN_EQ_STR("-10",  STR(format("~d",   MAKE_INT(-10))));
2631     TST_TN_EQ_STR("-1",   STR(format("~d",   MAKE_INT(-1))));
2632     TST_TN_EQ_STR("0",    STR(format("~d",   MAKE_INT(0))));
2633     TST_TN_EQ_STR("1",    STR(format("~d",   MAKE_INT(1))));
2634     TST_TN_EQ_STR("10",   STR(format("~d",   MAKE_INT(10))));
2635     TST_TN_EQ_STR("100",  STR(format("~d",   MAKE_INT(100))));
2636 
2637     TST_TN_EQ_STR("-100", STR(format("~0d",  MAKE_INT(-100))));
2638     TST_TN_EQ_STR("-10",  STR(format("~0d",  MAKE_INT(-10))));
2639     TST_TN_EQ_STR("-1",   STR(format("~0d",  MAKE_INT(-1))));
2640     TST_TN_EQ_STR("0",    STR(format("~0d",  MAKE_INT(0))));
2641     TST_TN_EQ_STR("1",    STR(format("~0d",  MAKE_INT(1))));
2642     TST_TN_EQ_STR("10",   STR(format("~0d",  MAKE_INT(10))));
2643     TST_TN_EQ_STR("100",  STR(format("~0d",  MAKE_INT(100))));
2644 
2645     TST_TN_EQ_STR("-100", STR(format("~03d", MAKE_INT(-100))));
2646     TST_TN_EQ_STR("-10",  STR(format("~03d", MAKE_INT(-10))));
2647     TST_TN_EQ_STR("-01",  STR(format("~03d", MAKE_INT(-1))));
2648     TST_TN_EQ_STR("000",  STR(format("~03d", MAKE_INT(0))));
2649     TST_TN_EQ_STR("001",  STR(format("~03d", MAKE_INT(1))));
2650     TST_TN_EQ_STR("010",  STR(format("~03d", MAKE_INT(10))));
2651     TST_TN_EQ_STR("100",  STR(format("~03d", MAKE_INT(100))));
2652 
2653     TST_TN_EQ_STR("-100", STR(format("~3d",  MAKE_INT(-100))));
2654     TST_TN_EQ_STR("-10",  STR(format("~3d",  MAKE_INT(-10))));
2655     TST_TN_EQ_STR(" -1",  STR(format("~3d",  MAKE_INT(-1))));
2656     TST_TN_EQ_STR("  0",  STR(format("~3d",  MAKE_INT(0))));
2657     TST_TN_EQ_STR("  1",  STR(format("~3d",  MAKE_INT(1))));
2658     TST_TN_EQ_STR(" 10",  STR(format("~3d",  MAKE_INT(10))));
2659     TST_TN_EQ_STR("100",  STR(format("~3d",  MAKE_INT(100))));
2660 }
2661 
2662 TST_CASE("format ~x")
2663 {
2664     TST_TN_EQ_STR("-64",  STR(format("~x",   MAKE_INT(-100))));
2665     TST_TN_EQ_STR("-a",   STR(format("~x",   MAKE_INT(-10))));
2666     TST_TN_EQ_STR("-1",   STR(format("~x",   MAKE_INT(-1))));
2667     TST_TN_EQ_STR("0",    STR(format("~x",   MAKE_INT(0))));
2668     TST_TN_EQ_STR("1",    STR(format("~x",   MAKE_INT(1))));
2669     TST_TN_EQ_STR("a",    STR(format("~x",   MAKE_INT(10))));
2670     TST_TN_EQ_STR("64",   STR(format("~x",   MAKE_INT(100))));
2671 
2672     TST_TN_EQ_STR("-64",  STR(format("~0x",  MAKE_INT(-100))));
2673     TST_TN_EQ_STR("-a",   STR(format("~0x",  MAKE_INT(-10))));
2674     TST_TN_EQ_STR("-1",   STR(format("~0x",  MAKE_INT(-1))));
2675     TST_TN_EQ_STR("0",    STR(format("~0x",  MAKE_INT(0))));
2676     TST_TN_EQ_STR("1",    STR(format("~0x",  MAKE_INT(1))));
2677     TST_TN_EQ_STR("a",    STR(format("~0x",  MAKE_INT(10))));
2678     TST_TN_EQ_STR("64",   STR(format("~0x",  MAKE_INT(100))));
2679 
2680     TST_TN_EQ_STR("-64",  STR(format("~03x", MAKE_INT(-100))));
2681     TST_TN_EQ_STR("-0a",  STR(format("~03x", MAKE_INT(-10))));
2682     TST_TN_EQ_STR("-01",  STR(format("~03x", MAKE_INT(-1))));
2683     TST_TN_EQ_STR("000",  STR(format("~03x", MAKE_INT(0))));
2684     TST_TN_EQ_STR("001",  STR(format("~03x", MAKE_INT(1))));
2685     TST_TN_EQ_STR("00a",  STR(format("~03x", MAKE_INT(10))));
2686     TST_TN_EQ_STR("064",  STR(format("~03x", MAKE_INT(100))));
2687 
2688     TST_TN_EQ_STR("-64",  STR(format("~3x",  MAKE_INT(-100))));
2689     TST_TN_EQ_STR(" -a",  STR(format("~3x",  MAKE_INT(-10))));
2690     TST_TN_EQ_STR(" -1",  STR(format("~3x",  MAKE_INT(-1))));
2691     TST_TN_EQ_STR("  0",  STR(format("~3x",  MAKE_INT(0))));
2692     TST_TN_EQ_STR("  1",  STR(format("~3x",  MAKE_INT(1))));
2693     TST_TN_EQ_STR("  a",  STR(format("~3x",  MAKE_INT(10))));
2694     TST_TN_EQ_STR(" 64",  STR(format("~3x",  MAKE_INT(100))));
2695 }
2696 
2697 TST_CASE("format ~o")
2698 {
2699     TST_TN_EQ_STR("-144", STR(format("~o",   MAKE_INT(-100))));
2700     TST_TN_EQ_STR("-12",  STR(format("~o",   MAKE_INT(-10))));
2701     TST_TN_EQ_STR("-1",   STR(format("~o",   MAKE_INT(-1))));
2702     TST_TN_EQ_STR("0",    STR(format("~o",   MAKE_INT(0))));
2703     TST_TN_EQ_STR("1",    STR(format("~o",   MAKE_INT(1))));
2704     TST_TN_EQ_STR("12",   STR(format("~o",   MAKE_INT(10))));
2705     TST_TN_EQ_STR("144",  STR(format("~o",   MAKE_INT(100))));
2706 
2707     TST_TN_EQ_STR("-144", STR(format("~0o",  MAKE_INT(-100))));
2708     TST_TN_EQ_STR("-12",  STR(format("~0o",  MAKE_INT(-10))));
2709     TST_TN_EQ_STR("-1",   STR(format("~0o",  MAKE_INT(-1))));
2710     TST_TN_EQ_STR("0",    STR(format("~0o",  MAKE_INT(0))));
2711     TST_TN_EQ_STR("1",    STR(format("~0o",  MAKE_INT(1))));
2712     TST_TN_EQ_STR("12",   STR(format("~0o",  MAKE_INT(10))));
2713     TST_TN_EQ_STR("144",  STR(format("~0o",  MAKE_INT(100))));
2714 
2715     TST_TN_EQ_STR("-144", STR(format("~03o", MAKE_INT(-100))));
2716     TST_TN_EQ_STR("-12",  STR(format("~03o", MAKE_INT(-10))));
2717     TST_TN_EQ_STR("-01",  STR(format("~03o", MAKE_INT(-1))));
2718     TST_TN_EQ_STR("000",  STR(format("~03o", MAKE_INT(0))));
2719     TST_TN_EQ_STR("001",  STR(format("~03o", MAKE_INT(1))));
2720     TST_TN_EQ_STR("012",  STR(format("~03o", MAKE_INT(10))));
2721     TST_TN_EQ_STR("144",  STR(format("~03o", MAKE_INT(100))));
2722 
2723     TST_TN_EQ_STR("-144", STR(format("~3o",  MAKE_INT(-100))));
2724     TST_TN_EQ_STR("-12",  STR(format("~3o",  MAKE_INT(-10))));
2725     TST_TN_EQ_STR(" -1",  STR(format("~3o",  MAKE_INT(-1))));
2726     TST_TN_EQ_STR("  0",  STR(format("~3o",  MAKE_INT(0))));
2727     TST_TN_EQ_STR("  1",  STR(format("~3o",  MAKE_INT(1))));
2728     TST_TN_EQ_STR(" 12",  STR(format("~3o",  MAKE_INT(10))));
2729     TST_TN_EQ_STR("144",  STR(format("~3o",  MAKE_INT(100))));
2730 }
2731 
2732 TST_CASE("format ~b")
2733 {
2734     TST_TN_EQ_STR("-1100100", STR(format("~b",   MAKE_INT(-100))));
2735     TST_TN_EQ_STR("-1010",    STR(format("~b",   MAKE_INT(-10))));
2736     TST_TN_EQ_STR("-1",       STR(format("~b",   MAKE_INT(-1))));
2737     TST_TN_EQ_STR("0",        STR(format("~b",   MAKE_INT(0))));
2738     TST_TN_EQ_STR("1",        STR(format("~b",   MAKE_INT(1))));
2739     TST_TN_EQ_STR("1010",     STR(format("~b",   MAKE_INT(10))));
2740     TST_TN_EQ_STR("1100100",  STR(format("~b",   MAKE_INT(100))));
2741 
2742     TST_TN_EQ_STR("-1100100", STR(format("~0b",  MAKE_INT(-100))));
2743     TST_TN_EQ_STR("-1010",    STR(format("~0b",  MAKE_INT(-10))));
2744     TST_TN_EQ_STR("-1",       STR(format("~0b",  MAKE_INT(-1))));
2745     TST_TN_EQ_STR("0",        STR(format("~0b",  MAKE_INT(0))));
2746     TST_TN_EQ_STR("1",        STR(format("~0b",  MAKE_INT(1))));
2747     TST_TN_EQ_STR("1010",     STR(format("~0b",  MAKE_INT(10))));
2748     TST_TN_EQ_STR("1100100",  STR(format("~0b",  MAKE_INT(100))));
2749 
2750     TST_TN_EQ_STR("-1100100", STR(format("~05b", MAKE_INT(-100))));
2751     TST_TN_EQ_STR("-1010",    STR(format("~05b", MAKE_INT(-10))));
2752     TST_TN_EQ_STR("-0001",    STR(format("~05b", MAKE_INT(-1))));
2753     TST_TN_EQ_STR("00000",    STR(format("~05b", MAKE_INT(0))));
2754     TST_TN_EQ_STR("00001",    STR(format("~05b", MAKE_INT(1))));
2755     TST_TN_EQ_STR("01010",    STR(format("~05b", MAKE_INT(10))));
2756     TST_TN_EQ_STR("1100100",  STR(format("~05b", MAKE_INT(100))));
2757 
2758     TST_TN_EQ_STR("-1100100", STR(format("~5b",  MAKE_INT(-100))));
2759     TST_TN_EQ_STR("-1010",    STR(format("~5b",  MAKE_INT(-10))));
2760     TST_TN_EQ_STR("   -1",    STR(format("~5b",  MAKE_INT(-1))));
2761     TST_TN_EQ_STR("    0",    STR(format("~5b",  MAKE_INT(0))));
2762     TST_TN_EQ_STR("    1",    STR(format("~5b",  MAKE_INT(1))));
2763     TST_TN_EQ_STR(" 1010",    STR(format("~5b",  MAKE_INT(10))));
2764     TST_TN_EQ_STR("1100100",  STR(format("~5b",  MAKE_INT(100))));
2765 }
2766 
2767 TST_CASE("format ~f (number)")
2768 {
2769     TST_TN_EQ_STR("-100", STR(format("~f",   MAKE_INT(-100))));
2770     TST_TN_EQ_STR("-10",  STR(format("~f",   MAKE_INT(-10))));
2771     TST_TN_EQ_STR("-1",   STR(format("~f",   MAKE_INT(-1))));
2772     TST_TN_EQ_STR("0",    STR(format("~f",   MAKE_INT(0))));
2773     TST_TN_EQ_STR("1",    STR(format("~f",   MAKE_INT(1))));
2774     TST_TN_EQ_STR("10",   STR(format("~f",   MAKE_INT(10))));
2775     TST_TN_EQ_STR("100",  STR(format("~f",   MAKE_INT(100))));
2776 
2777     TST_TN_EQ_STR("-100", STR(format("~0f",  MAKE_INT(-100))));
2778     TST_TN_EQ_STR("-10",  STR(format("~0f",  MAKE_INT(-10))));
2779     TST_TN_EQ_STR("-1",   STR(format("~0f",  MAKE_INT(-1))));
2780     TST_TN_EQ_STR("0",    STR(format("~0f",  MAKE_INT(0))));
2781     TST_TN_EQ_STR("1",    STR(format("~0f",  MAKE_INT(1))));
2782     TST_TN_EQ_STR("10",   STR(format("~0f",  MAKE_INT(10))));
2783     TST_TN_EQ_STR("100",  STR(format("~0f",  MAKE_INT(100))));
2784 
2785     TST_TN_EQ_STR("-100", STR(format("~03f", MAKE_INT(-100))));
2786     TST_TN_EQ_STR("-10",  STR(format("~03f", MAKE_INT(-10))));
2787     TST_TN_EQ_STR("-01",  STR(format("~03f", MAKE_INT(-1))));
2788     TST_TN_EQ_STR("000",  STR(format("~03f", MAKE_INT(0))));
2789     TST_TN_EQ_STR("001",  STR(format("~03f", MAKE_INT(1))));
2790     TST_TN_EQ_STR("010",  STR(format("~03f", MAKE_INT(10))));
2791     TST_TN_EQ_STR("100",  STR(format("~03f", MAKE_INT(100))));
2792 
2793     TST_TN_EQ_STR("-100", STR(format("~3f",  MAKE_INT(-100))));
2794     TST_TN_EQ_STR("-10",  STR(format("~3f",  MAKE_INT(-10))));
2795     TST_TN_EQ_STR(" -1",  STR(format("~3f",  MAKE_INT(-1))));
2796     TST_TN_EQ_STR("  0",  STR(format("~3f",  MAKE_INT(0))));
2797     TST_TN_EQ_STR("  1",  STR(format("~3f",  MAKE_INT(1))));
2798     TST_TN_EQ_STR(" 10",  STR(format("~3f",  MAKE_INT(10))));
2799     TST_TN_EQ_STR("100",  STR(format("~3f",  MAKE_INT(100))));
2800 
2801     TST_TN_EQ_STR("-100", STR(format("~3,02f", MAKE_INT(-100))));
2802     TST_TN_EQ_STR("-10",  STR(format("~3,02f", MAKE_INT(-10))));
2803     TST_TN_EQ_STR(" -1",  STR(format("~3,02f", MAKE_INT(-1))));
2804     TST_TN_EQ_STR("  0",  STR(format("~3,02f", MAKE_INT(0))));
2805     TST_TN_EQ_STR("  1",  STR(format("~3,02f", MAKE_INT(1))));
2806     TST_TN_EQ_STR(" 10",  STR(format("~3,02f", MAKE_INT(10))));
2807     TST_TN_EQ_STR("100",  STR(format("~3,02f", MAKE_INT(100))));
2808 }
2809 
2810 TST_CASE("format ~f (string)")
2811 {
2812     TST_TN_EQ_STR("",       STR(format("~f",   CONST_STRING(""))));
2813     TST_TN_EQ_STR("",       STR(format("~0f",  CONST_STRING(""))));
2814     TST_TN_EQ_STR(" ",      STR(format("~1f",  CONST_STRING(""))));
2815     TST_TN_EQ_STR("",       STR(format("~00f", CONST_STRING(""))));
2816     TST_TN_EQ_STR(" ",      STR(format("~01f", CONST_STRING(""))));
2817     TST_TN_EQ_STR("\"",     STR(format("~f",   CONST_STRING("\""))));
2818     TST_TN_EQ_STR("\\",     STR(format("~f",   CONST_STRING("\\"))));
2819     TST_TN_EQ_STR("a",      STR(format("~f",   CONST_STRING("a"))));
2820     TST_TN_EQ_STR("aBc",    STR(format("~f",   CONST_STRING("aBc"))));
2821     TST_TN_EQ_STR("あ",     STR(format("~f",   CONST_STRING("あ"))));
2822     TST_TN_EQ_STR("あい",   STR(format("~f",   CONST_STRING("あい"))));
2823     TST_TN_EQ_STR("aあBいc",
2824                            STR(format("~f",   CONST_STRING("aあBいc"))));
2825     TST_TN_EQ_STR("aBc",    STR(format("~0f",  CONST_STRING("aBc"))));
2826     TST_TN_EQ_STR("aBc",    STR(format("~1f",  CONST_STRING("aBc"))));
2827     TST_TN_EQ_STR("aBc",    STR(format("~2f",  CONST_STRING("aBc"))));
2828     TST_TN_EQ_STR("aBc",    STR(format("~3f",  CONST_STRING("aBc"))));
2829     TST_TN_EQ_STR(" aBc",   STR(format("~4f",  CONST_STRING("aBc"))));
2830     TST_TN_EQ_STR("  aBc",  STR(format("~5f",  CONST_STRING("aBc"))));
2831     TST_TN_EQ_STR("aBc",    STR(format("~00f", CONST_STRING("aBc"))));
2832     TST_TN_EQ_STR("aBc",    STR(format("~01f", CONST_STRING("aBc"))));
2833     TST_TN_EQ_STR("aBc",    STR(format("~02f", CONST_STRING("aBc"))));
2834     TST_TN_EQ_STR("aBc",    STR(format("~03f", CONST_STRING("aBc"))));
2835     TST_TN_EQ_STR(" aBc",   STR(format("~04f", CONST_STRING("aBc"))));
2836     TST_TN_EQ_STR("  aBc",  STR(format("~05f", CONST_STRING("aBc"))));
2837     TST_TN_EQ_STR("aBc",
2838                            STR(format("~00,01f", CONST_STRING("aBc"))));
2839     TST_TN_EQ_STR("aBc",
2840                            STR(format("~01,01f", CONST_STRING("aBc"))));
2841     TST_TN_EQ_STR("aBc",
2842                            STR(format("~02,01f", CONST_STRING("aBc"))));
2843     TST_TN_EQ_STR("aBc",
2844                            STR(format("~03,01f", CONST_STRING("aBc"))));
2845     TST_TN_EQ_STR(" aBc",
2846                            STR(format("~04,01f", CONST_STRING("aBc"))));
2847     TST_TN_EQ_STR("  aBc",
2848                            STR(format("~05,01f", CONST_STRING("aBc"))));
2849     TST_TN_EQ_STR("aあBいc",
2850                            STR(format("~0f",  CONST_STRING("aあBいc"))));
2851     TST_TN_EQ_STR("aあBいc",
2852                            STR(format("~1f",  CONST_STRING("aあBいc"))));
2853     TST_TN_EQ_STR("aあBいc",
2854                            STR(format("~2f",  CONST_STRING("aあBいc"))));
2855     TST_TN_EQ_STR("aあBいc",
2856                            STR(format("~3f",  CONST_STRING("aあBいc"))));
2857     TST_TN_EQ_STR("aあBいc",
2858                            STR(format("~4f",  CONST_STRING("aあBいc"))));
2859     TST_TN_EQ_STR("aあBいc",
2860                            STR(format("~5f",  CONST_STRING("aあBいc"))));
2861     TST_TN_EQ_STR(" aあBいc",
2862                            STR(format("~6f",  CONST_STRING("aあBいc"))));
2863     TST_TN_EQ_STR("  aあBいc",
2864                            STR(format("~7f",  CONST_STRING("aあBいc"))));
2865     TST_TN_EQ_STR("aあBいc",
2866                            STR(format("~00f", CONST_STRING("aあBいc"))));
2867     TST_TN_EQ_STR("aあBいc",
2868                            STR(format("~01f", CONST_STRING("aあBいc"))));
2869     TST_TN_EQ_STR("aあBいc",
2870                            STR(format("~02f", CONST_STRING("aあBいc"))));
2871     TST_TN_EQ_STR("aあBいc",
2872                            STR(format("~03f", CONST_STRING("aあBいc"))));
2873     TST_TN_EQ_STR("aあBいc",
2874                            STR(format("~04f", CONST_STRING("aあBいc"))));
2875     TST_TN_EQ_STR("aあBいc",
2876                            STR(format("~05f", CONST_STRING("aあBいc"))));
2877     TST_TN_EQ_STR(" aあBいc",
2878                            STR(format("~06f", CONST_STRING("aあBいc"))));
2879     TST_TN_EQ_STR("  aあBいc",
2880                            STR(format("~07f", CONST_STRING("aあBいc"))));
2881 }
2882 
2883 TST_CASE("format ~~")
2884 {
2885     TST_TN_EQ_STR("~", STR(format("~~")));
2886 }
2887 
2888 TST_CASE("format ~%")
2889 {
2890     TST_TN_EQ_STR("\n", STR(format("~%")));
2891 }
2892 
2893 TST_CASE("format ~&")
2894 {
2895     TST_TN_EQ_STR("\n",   STR(format("~&")));
2896     TST_TN_EQ_STR("\n",   STR(format("~&~&")));
2897     TST_TN_EQ_STR("\n",   STR(format("~&~&~&")));
2898     TST_TN_EQ_STR("\n",   STR(format("~%~&")));
2899     TST_TN_EQ_STR("\n",   STR(format("~%~&~&")));
2900     TST_TN_EQ_STR("\n\n", STR(format("~&~%")));
2901     TST_TN_EQ_STR("\n\n", STR(format("~&~%~&")));
2902     TST_TN_EQ_STR("\n",   STR(format("\n~&")));
2903     TST_TN_EQ_STR("\n\n", STR(format("~&\n")));
2904     TST_TN_EQ_STR("\n\n", STR(format("~&\n~&")));
2905     TST_TN_EQ_STR(" \n",  STR(format(" ~&")));
2906     TST_TN_EQ_STR("\n \n \n", STR(format("\n ~& ~&")));
2907 }
2908 
2909 TST_CASE("format ~t")
2910 {
2911     TST_TN_EQ_STR("\t", STR(format("~t")));
2912 }
2913 
2914 TST_CASE("format ~_")
2915 {
2916     TST_TN_EQ_STR(" ", STR(format("~_")));
2917 }
2918 
2919 TST_CASE("format ~a")
2920 {
2921     TST_TN_EQ_STR("#t",  STR(format("~a", SCM_TRUE)));
2922     TST_TN_EQ_STR("123", STR(format("~a", MAKE_INT(123))));
2923     TST_TN_EQ_STR("a",   STR(format("~a", MAKE_CHAR('a'))));
2924     TST_TN_EQ_STR("aBc", STR(format("~a", CONST_STRING("aBc"))));
2925     TST_TN_EQ_STR("(#t 123 a aBc (0))",
2926                            STR(format("~a", lst)));
2927 }
2928 
2929 TST_CASE("format ~s")
2930 {
2931     TST_TN_EQ_STR("#t",      STR(format("~s", SCM_TRUE)));
2932     TST_TN_EQ_STR("123",     STR(format("~s", MAKE_INT(123))));
2933     TST_TN_EQ_STR("#\\a",    STR(format("~s", MAKE_CHAR('a'))));
2934     TST_TN_EQ_STR("\"aBc\"", STR(format("~s", CONST_STRING("aBc"))));
2935     TST_TN_EQ_STR("(#t 123 #\\a \"aBc\" (0))",
2936                            STR(format("~s", lst)));
2937 }
2938 
2939 TST_CASE("format ~w")
2940 {
2941     TST_TN_EQ_STR("#t",      STR(format("~w", SCM_TRUE)));
2942     TST_TN_EQ_STR("123",     STR(format("~w", MAKE_INT(123))));
2943     TST_TN_EQ_STR("#\\a",    STR(format("~w", MAKE_CHAR('a'))));
2944     TST_TN_EQ_STR("\"aBc\"", STR(format("~w", CONST_STRING("aBc"))));
2945     TST_TN_EQ_STR("(#t 123 #\\a \"aBc\" (0))",
2946                            STR(format("~w", lst)));
2947     /* SigScheme starts the index with 1 */
2948     TST_TN_EQ_STR("#1=(0 1 . #1#)", STR(format("~w", clst)));
2949 }
2950 
2951 TST_CASE("format ~y")
2952 {
2953     TST_TN_EQ_STR("#t",      STR(format("~y", SCM_TRUE)));
2954     TST_TN_EQ_STR("123",     STR(format("~y", MAKE_INT(123))));
2955     TST_TN_EQ_STR("#\\a",    STR(format("~y", MAKE_CHAR('a'))));
2956     TST_TN_EQ_STR("\"aBc\"", STR(format("~y", CONST_STRING("aBc"))));
2957     /* no pretty-print procedure */
2958     TST_TN_EQ_STR("(#t 123 #\\a \"aBc\" (0))",
2959                            STR(format("~y", lst)));
2960 }
2961 
2962 TST_CASE("format ~?")
2963 {
2964     TST_TN_EQ_STR("~",  STR(format("~k", CONST_STRING("~~"), SCM_NULL)));
2965     TST_TN_EQ_STR(" ",  STR(format("~k", CONST_STRING("~_"), SCM_NULL)));
2966     TST_TN_EQ_STR("\n", STR(format("~k", CONST_STRING("~%"), SCM_NULL)));
2967     TST_TN_EQ_STR("\n", STR(format("~k", CONST_STRING("~&"), SCM_NULL)));
2968 #if 0
2969     /* hard to be this on current port implementation */
2970     TST_TN_EQ_STR("\n",    STR(format("~?",
2971                                       CONST_STRING("~%~?"),
2972                                       LIST_2(CONST_STRING("~&"), SCM_NULL))));
2973 #else
2974     TST_TN_EQ_STR("\n\n",  STR(format("~?",
2975                                       CONST_STRING("~%~?"),
2976                                       LIST_2(CONST_STRING("~&"), SCM_NULL))));
2977 #endif
2978     TST_TN_EQ_STR("\n \n", STR(format("~?",
2979                                       CONST_STRING("~% ~?"),
2980                                       LIST_2(CONST_STRING("~&"), SCM_NULL))));
2981     TST_TN_EQ_STR("\n \n", STR(format("~?",
2982                                       CONST_STRING("~%~?"),
2983                                       LIST_2(CONST_STRING(" ~&"), SCM_NULL))));
2984     TST_TN_EQ_STR("aBc",   STR(format("~?",
2985                                       CONST_STRING("aBc"), SCM_NULL)));
2986     TST_TN_EQ_STR("0aBc1", STR(format("~?",
2987                                       CONST_STRING("0~a1"),
2988                                       LIST_1(CONST_STRING("aBc")))));
2989     TST_TN_EQ_STR("02aBc31",
2990                   STR(format("~?",
2991                              CONST_STRING("0~?1"),
2992                              LIST_2(CONST_STRING("2~a3"),
2993                                     LIST_1(CONST_STRING("aBc"))))));
2994     TST_TN_EQ_STR("024aBc531",
2995                   STR(format("~?",
2996                              CONST_STRING("0~?1"),
2997                              LIST_2(CONST_STRING("2~?3"),
2998                                     LIST_2(CONST_STRING("4~a5"),
2999                                            LIST_1(CONST_STRING("aBc")))))));
3000     TST_TN_EQ_STR("#t",    STR(format("~?",
3001                                       CONST_STRING("~w"),
3002                                       LIST_1(SCM_TRUE))));
3003     TST_TN_EQ_STR("123",   STR(format("~?",
3004                                       CONST_STRING("~w"),
3005                                       LIST_1(MAKE_INT(123)))));
3006     TST_TN_EQ_STR("#\\a",  STR(format("~?",
3007                                       CONST_STRING("~w"),
3008                                       LIST_1(MAKE_CHAR('a')))));
3009     TST_TN_EQ_STR("\"\"",  STR(format("~?",
3010                                       CONST_STRING("~w"),
3011                                       LIST_1(CONST_STRING("")))));
3012     TST_TN_EQ_STR("\"\\\"\"",
3013                   STR(format("~?",
3014                              CONST_STRING("~w"),
3015                              LIST_1(CONST_STRING("\"")))));
3016     TST_TN_EQ_STR("\"aBc\"",
3017                   STR(format("~?",
3018                              CONST_STRING("~w"),
3019                              LIST_1(CONST_STRING("aBc")))));
3020     TST_TN_EQ_STR("(#t 123 #\\a \"aBc\" (0))",
3021                   STR(format("~?",
3022                              CONST_STRING("~w"), LIST_1(lst))));
3023     /* SigScheme starts the index with 1 */
3024     TST_TN_EQ_STR("#1=(0 1 . #1#)",
3025                   STR(format("~?",
3026                              CONST_STRING("~w"), LIST_1(clst))));
3027 }
3028 
3029 TST_CASE("format ~k")
3030 {
3031     TST_TN_EQ_STR("~",  STR(format("~k", CONST_STRING("~~"), SCM_NULL)));
3032     TST_TN_EQ_STR(" ",  STR(format("~k", CONST_STRING("~_"), SCM_NULL)));
3033     TST_TN_EQ_STR("\n", STR(format("~k", CONST_STRING("~%"), SCM_NULL)));
3034     TST_TN_EQ_STR("\n", STR(format("~k", CONST_STRING("~&"), SCM_NULL)));
3035 
3036     TST_TN_EQ_STR("024aBc531",
3037                   STR(format("~k",
3038                              CONST_STRING("0~k1"),
3039                              LIST_2(CONST_STRING("2~k3"),
3040                                     LIST_2(CONST_STRING("4~a5"),
3041                                            LIST_1(CONST_STRING("aBc")))))));
3042 }
3043 
3044 TST_CASE("format ~h")
3045 {
3046     TST_TN_EQ_STR(MSG_SSCM_DIRECTIVE_HELP, STR(format("~h")));
3047 }
3048 
3049 TST_CASE("format mixed raw C directives")
3050 {
3051     TST_TN_EQ_STR("-100 1010a64-01144100-01",
3052                   STR(format("~D~5QBa~WX~03JD~3LO~ZU~03TD",
3053                              -100,
3054                              (int64_t)10,
3055                              (int32_t)100,
3056                              (intmax_t)-1,
3057                              (long)100,
3058                              (size_t)100,
3059                              (ptrdiff_t)-1)));
3060 
3061     TST_TN_EQ_STR("-100 1010aa string64-01144あ100b-01",
3062                   STR(format("~D~5QBa~S~WX~03JD~3LO~C~ZU~C~03TD",
3063                              -100,
3064                              (int64_t)10,
3065                              "a string",
3066                              (int32_t)100,
3067                              (intmax_t)-1,
3068                              (long)100,
3069                              (scm_ichar_t)0x3042,
3070                              (size_t)100,
3071                              (scm_ichar_t)'b',
3072                              (ptrdiff_t)-1)));
3073 }
3074 
3075 TST_CASE("format mixed SRFI directives")
3076 {
3077     TST_TN_EQ_STR("~\n", STR(format("~~~%")));
3078     TST_TN_EQ_STR("slashified: #\\a\nany: a\n",
3079                   STR(format("slashified: ~s~%any: ~a~%",
3080                              MAKE_CHAR('a'), MAKE_CHAR('a'))));
3081 
3082     TST_TN_EQ_STR("-100 1010aa string64-01144あ100b-01",
3083                   STR(format("~d~5ba~a~x~03d~3o~c~d~c~03d",
3084                              MAKE_INT(-100),
3085                              MAKE_INT(10),
3086                              CONST_STRING("a string"),
3087                              MAKE_INT(100),
3088                              MAKE_INT(-1),
3089                              MAKE_INT(100),
3090                              MAKE_CHAR(0x3042),
3091                              MAKE_INT(100),
3092                              MAKE_CHAR('b'),
3093                              MAKE_INT(-1))));
3094 }
3095 
3096 TST_CASE("format mixed SRFI & raw C directives")
3097 {
3098     TST_TN_EQ_STR("-100 1010aa string64another string-01144~あ100b-01",
3099                   STR(format("~D~5ba~S~WX~a~03JD~3LO~~~c~ZU~C~03TD",
3100                              -100,
3101                              MAKE_INT(10),
3102                              "a string",
3103                              (int32_t)100,
3104                              CONST_STRING("another string"),
3105                              (intmax_t)-1,
3106                              (long)100,
3107                              MAKE_CHAR(0x3042),
3108                              (size_t)100,
3109                              (scm_ichar_t)'b',
3110                              (ptrdiff_t)-1)));
3111 }
3112 
3113 TST_CASE("format freshline by mixed SRFI & raw C directives")
3114 {
3115     TST_TN_EQ_STR("\n",     STR(format("~C~&",   (scm_ichar_t)'\n')));
3116     TST_TN_EQ_STR("\n\n",   STR(format("~&~C~&", (scm_ichar_t)'\n')));
3117     TST_TN_EQ_STR("\n",     STR(format("~S~&",   "\n")));
3118     TST_TN_EQ_STR("\n\n",   STR(format("~&~S~&", "\n")));
3119 
3120 #if 0
3121     /* current implementation does not support these behariors */
3122     TST_TN_EQ_STR("\n",
3123                   STR(format("~C~?",
3124                              (scm_ichar_t)'\n',
3125                              CONST_STRING("~&"), SCM_NULL)));
3126     TST_TN_EQ_STR("\n\n",
3127                   STR(format("~&~C~?",
3128                              (scm_ichar_t)'\n',
3129                              CONST_STRING("~&"), SCM_NULL)));
3130     TST_TN_EQ_STR("\n",
3131                   STR(format("~S~?",
3132                              "\n",
3133                              CONST_STRING("~&"), SCM_NULL)));
3134     TST_TN_EQ_STR("\n\n",
3135                   STR(format("~&~S~?",
3136                              "\n",
3137                              CONST_STRING("~&"), SCM_NULL)));
3138 #endif
3139 }
3140 #endif /* !TST_EXCLUDE_THIS */
3141