OSDN Git Service

Please enter the commit message for your changes. Lines starting
[eos/base.git] / util / src / TclTk / tcl8.6.12 / tests / format.test
1 # Commands covered:  format
2 #
3 # This file contains a collection of tests for one or more of the Tcl
4 # built-in commands.  Sourcing this file into Tcl runs the tests and
5 # generates output for errors.  No output means no errors were found.
6 #
7 # Copyright (c) 1991-1994 The Regents of the University of California.
8 # Copyright (c) 1994-1998 Sun Microsystems, Inc.
9 #
10 # See the file "license.terms" for information on usage and redistribution
11 # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
12
13 if {"::tcltest" ni [namespace children]} {
14     package require tcltest 2.5
15     namespace import -force ::tcltest::*
16 }
17
18 # %u output depends on word length, so this test is not portable.
19 testConstraint longIs32bit [expr {int(0x80000000) < 0}]
20 testConstraint longIs64bit [expr {int(0x8000000000000000) < 0}]
21 testConstraint wideIs64bit [expr {
22     (wide(0x80000000) > 0) && (wide(0x8000000000000000) < 0)}]
23 testConstraint wideBiggerThanInt [expr {wide(0x80000000) != int(0x80000000)}]
24 # MSVC uses a broken libc that gets sprintf("%g") wrong. This is a pain
25 # particularly in Continuous Integration, and there isn't anything much we can
26 # do about it.
27 testConstraint notWinCI [expr {
28     ($::tcl_platform(platform) ne "windows") || ![info exists ::env(CI)]}]
29 \f
30 test format-1.1 {integer formatting} {
31     format "%*d %d %d %d" 6 34 16923 -12 -1
32 } {    34 16923 -12 -1}
33 test format-1.2 {integer formatting} {
34     format "%4d %4d %4d %4d %d %#x %#X" 6 34 16923 -12 -1 14 12
35 } {   6   34 16923  -12 -1 0xe 0XC}
36 test format-1.3 {integer formatting} longIs32bit {
37     format "%4u %4u %4u %4u %d %#o" 6 34 16923 -12 -1 0
38 } {   6   34 16923 4294967284 -1 0}
39 test format-1.3.1 {integer formatting} longIs64bit {
40     format "%4u %4u %4u %4u %d %#o" 6 34 16923 -12 -1 0
41 } {   6   34 16923 18446744073709551604 -1 0}
42 test format-1.4 {integer formatting} {
43     format "%-4d %-4i %-4d %-4ld" 6 34 16923 -12 -1
44 } {6    34   16923 -12 }
45 test format-1.5 {integer formatting} {
46     format "%04d %04d %04d %04i" 6 34 16923 -12 -1
47 } {0006 0034 16923 -012}
48 test format-1.6 {integer formatting} {
49     format "%00*d" 6 34
50 } {000034}
51 # Printing negative numbers in hex or octal format depends on word
52 # length, so these tests are not portable.
53 test format-1.7 {integer formatting} longIs32bit {
54     format "%4x %4x %4x %4x" 6 34 16923 -12 -1
55 } {   6   22 421b fffffff4}
56 test format-1.7.1 {integer formatting} longIs64bit {
57     format "%4x %4x %4x %4x" 6 34 16923 -12 -1
58 } {   6   22 421b fffffffffffffff4}
59 test format-1.8 {integer formatting} longIs32bit {
60     format "%#x %#x %#X %#X %#x" 0 6 34 16923 -12 -1
61 } {0x0 0x6 0X22 0X421B 0xfffffff4}
62 test format-1.8.1 {integer formatting} longIs64bit {
63     format "%#x %#x %#X %#X %#x" 0 6 34 16923 -12 -1
64 } {0x0 0x6 0X22 0X421B 0xfffffffffffffff4}
65 test format-1.9 {integer formatting} longIs32bit {
66     format "%#5x %#20x %#20x %#20x %#20x" 0 6 34 16923 -12 -1
67 } {  0x0                  0x6                 0x22               0x421b           0xfffffff4}
68 test format-1.9.1 {integer formatting} longIs64bit {
69     format "%#5x %#20x %#20x %#20x %#20x" 0 6 34 16923 -12 -1
70 } {  0x0                  0x6                 0x22               0x421b   0xfffffffffffffff4}
71 test format-1.10 {integer formatting} longIs32bit {
72     format "%-#5x %-#20x %-#20x %-#20x %-#20x" 0 6 34 16923 -12 -1
73 } {0x0   0x6                  0x22                 0x421b               0xfffffff4          }
74 test format-1.10.1 {integer formatting} longIs64bit {
75     format "%-#5x %-#20x %-#20x %-#20x %-#20x" 0 6 34 16923 -12 -1
76 } {0x0   0x6                  0x22                 0x421b               0xfffffffffffffff4  }
77 test format-1.11 {integer formatting} longIs32bit {
78     format "%-#5o %-#20o %#-20o %#-20o %#-20o" 0 6 34 16923 -12 -1
79 } {0     06                   042                  041033               037777777764        }
80 test format-1.11.1 {integer formatting} longIs64bit {
81     format "%-#5o %-#20o %#-20o %#-20o %#-20o" 0 6 34 16923 -12 -1
82 } {0     06                   042                  041033               01777777777777777777764}
83 test format-1.12 {integer formatting} {
84     format "%b %#b %#b %llb" 5 0 5 [expr {2**100}]
85 } {101 0b0 0b101 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000}
86 test format-1.13 {integer formatting} longIs32bit {
87     format "%#d %#d %#d %#d %#d" 0 6 34 16923 -12 -1
88 } {0 6 34 16923 -12}
89 test format-1.13.1 {integer formatting} longIs64bit {
90     format "%#d %#d %#d %#d %#d" 0 6 34 16923 -12 -1
91 } {0 6 34 16923 -12}
92 test format-1.14 {integer formatting} longIs32bit {
93     format "%#5d %#20d %#20d %#20d %#20d" 0 6 34 16923 -12 -1
94 } {    0                    6                   34                16923                  -12}
95 test format-1.14.1 {integer formatting} longIs64bit {
96     format "%#5d %#20d %#20d %#20d %#20d" 0 6 34 16923 -12 -1
97 } {    0                    6                   34                16923                  -12}
98 test format-1.15 {integer formatting} longIs32bit {
99     format "%-#5d %-#20d %-#20d %-#20d %-#20d" 0 6 34 16923 -12 -1
100 } {0     6                    34                   16923                -12                 }
101 test format-1.15.1 {integer formatting} longIs64bit {
102     format "%-#5d %-#20d %-#20d %-#20d %-#20d" 0 6 34 16923 -12 -1
103 } {0     6                    34                   16923                -12                 }
104
105
106 test format-2.1 {string formatting} {
107     format "%s %s %c %s" abcd {This is a very long test string.} 120 x
108 } {abcd This is a very long test string. x x}
109 test format-2.2 {string formatting} {
110     format "%20s %20s %20c %20s" abcd {This is a very long test string.} 120 x
111 } {                abcd This is a very long test string.                    x                    x}
112 test format-2.3 {string formatting} {
113     format "%.10s %.10s %c %.10s" abcd {This is a very long test string.} 120 x
114 } {abcd This is a  x x}
115 test format-2.4 {string formatting} {
116     format "%s %s %% %c %s" abcd {This is a very long test string.} 120 x
117 } {abcd This is a very long test string. % x x}
118 test format-2.5 {string formatting, embedded nulls} {
119     format "%10s" abc\0def
120 } "   abc\0def"
121 test format-2.6 {string formatting, international chars} {
122     format "%10s" abc\ufeffdef
123 } "   abc\ufeffdef"
124 test format-2.7 {string formatting, international chars} {
125     format "%.5s" abc\ufeffdef
126 } "abc\ufeffd"
127 test format-2.8 {string formatting, international chars} {
128     format "foo\ufeffbar%s" baz
129 } "foo\ufeffbarbaz"
130 test format-2.9 {string formatting, width} {
131     format "a%5sa" f
132 } "a    fa"
133 test format-2.10 {string formatting, width} {
134     format "a%-5sa" f
135 } "af    a"
136 test format-2.11 {string formatting, width} {
137     format "a%2sa" foo
138 } "afooa"
139 test format-2.12 {string formatting, width} {
140     format "a%0sa" foo
141 } "afooa"
142 test format-2.13 {string formatting, precision} {
143     format "a%.2sa" foobarbaz
144 } "afoa"
145 test format-2.14 {string formatting, precision} {
146     format "a%.sa" foobarbaz
147 } "aa"
148 test format-2.15 {string formatting, precision} {
149     list [catch {format "a%.-2sa" foobarbaz} msg] $msg
150 } {1 {bad field specifier "-"}}
151 test format-2.16 {string formatting, width and precision} {
152     format "a%5.2sa" foobarbaz
153 } "a   foa"
154 test format-2.17 {string formatting, width and precision} {
155     format "a%5.7sa" foobarbaz
156 } "afoobarba"
157
158 test format-3.1 {Tcl_FormatObjCmd: character formatting} {
159     format "|%c|%0c|%-1c|%1c|%-6c|%6c|%*c|%*c|" 65 65 65 65 65 65 3 65 -4 65
160 } "|A|A|A|A|A     |     A|  A|A   |"
161 test format-3.2 {Tcl_FormatObjCmd: international character formatting} {
162     format "|%c|%0c|%-1c|%1c|%-6c|%6c|%*c|%*c|" 0xa2 0x4e4e 0x25a 0xc3 0xff08 0 3 0x6575 -4 0x4e4f
163 } "|\ua2|\u4e4e|\u25a|\uc3|\uff08     |     \0|  \u6575|\u4e4f   |"
164
165 test format-4.1 {e and f formats} {eformat} {
166     format "%e %e %e %e" 34.2e12 68.514 -.125 -16000. .000053
167 } {3.420000e+13 6.851400e+01 -1.250000e-01 -1.600000e+04}
168 test format-4.2 {e and f formats} {eformat} {
169     format "%20e %20e %20e %20e" 34.2e12 68.514 -.125 -16000. .000053
170 } {        3.420000e+13         6.851400e+01        -1.250000e-01        -1.600000e+04}
171 test format-4.3 {e and f formats} {eformat} {
172     format "%.1e %.1e %.1e %.1e" 34.2e12 68.514 -.126 -16000. .000053
173 } {3.4e+13 6.9e+01 -1.3e-01 -1.6e+04}
174 test format-4.4 {e and f formats} {eformat} {
175     format "%020e %020e %020e %020e" 34.2e12 68.514 -.126 -16000. .000053
176 } {000000003.420000e+13 000000006.851400e+01 -00000001.260000e-01 -00000001.600000e+04}
177 test format-4.5 {e and f formats} {eformat} {
178     format "%7.1e %7.1e %7.1e %7.1e" 34.2e12 68.514 -.126 -16000. .000053
179 } {3.4e+13 6.9e+01 -1.3e-01 -1.6e+04}
180 test format-4.6 {e and f formats} {
181     format "%f %f %f %f" 34.2e12 68.514 -.125 -16000. .000053
182 } {34200000000000.000000 68.514000 -0.125000 -16000.000000}
183 test format-4.7 {e and f formats} {
184     format "%.4f %.4f %.4f %.4f %.4f" 34.2e12 68.514 -.125 -16000. .000053
185 } {34200000000000.0000 68.5140 -0.1250 -16000.0000 0.0001}
186 test format-4.8 {e and f formats} {eformat} {
187     format "%.4e %.5e %.6e" -9.99996 -9.99996 9.99996
188 } {-1.0000e+01 -9.99996e+00 9.999960e+00}
189 test format-4.9 {e and f formats} {
190     format "%.4f %.5f %.6f" -9.99996 -9.99996 9.99996
191 } {-10.0000 -9.99996 9.999960}
192 test format-4.10 {e and f formats} {
193     format "%20f %-20f %020f" -9.99996 -9.99996 9.99996
194 } {           -9.999960 -9.999960            0000000000009.999960}
195 test format-4.11 {e and f formats} {
196     format "%-020f %020f" -9.99996 -9.99996 9.99996
197 } {-9.999960            -000000000009.999960}
198 test format-4.12 {e and f formats} {eformat} {
199     format "%.0e %#.0e" -9.99996 -9.99996 9.99996
200 } {-1e+01 -1.e+01}
201 test format-4.13 {e and f formats} {
202     format "%.0f %#.0f" -9.99996 -9.99996 9.99996
203 } {-10 -10.}
204 test format-4.14 {e and f formats} {
205     format "%.4f %.5f %.6f" -9.99996 -9.99996 9.99996
206 } {-10.0000 -9.99996 9.999960}
207 test format-4.15 {e and f formats} {
208     format "%3.0f %3.0f %3.0f %3.0f" 1.0 1.1 1.01 1.001
209 } {  1   1   1   1}
210 test format-4.16 {e and f formats} {
211     format "%3.1f %3.1f %3.1f %3.1f" 0.0 0.1 0.01 0.001
212 } {0.0 0.1 0.0 0.0}
213
214 test format-5.1 {g-format} {eformat} {
215     format "%.3g" 12341.0
216 } {1.23e+04}
217 test format-5.2 {g-format} {eformat} {
218     format "%.3G" 1234.12345
219 } {1.23E+03}
220 test format-5.3 {g-format} {
221     format "%.3g" 123.412345
222 } {123}
223 test format-5.4 {g-format} {
224     format "%.3g" 12.3412345
225 } {12.3}
226 test format-5.5 {g-format} {
227     format "%.3g" 1.23412345
228 } {1.23}
229 test format-5.6 {g-format} {
230     format "%.3g" 1.23412345
231 } {1.23}
232 test format-5.7 {g-format} {
233     format "%.3g" .123412345
234 } {0.123}
235 test format-5.8 {g-format} {
236     format "%.3g" .012341
237 } {0.0123}
238 test format-5.9 {g-format} {
239     format "%.3g" .0012341
240 } {0.00123}
241 test format-5.10 {g-format} {
242     format "%.3g" .00012341
243 } {0.000123}
244 test format-5.11 {g-format} {eformat} {
245     format "%.3g" .00001234
246 } {1.23e-05}
247 test format-5.12 {g-format} {eformat} {
248     format "%.4g" 9999.6
249 } {1e+04}
250 test format-5.13 {g-format} {
251     format "%.4g" 999.96
252 } {1000}
253 test format-5.14 {g-format} {
254     format "%.3g" 1.0
255 } {1}
256 test format-5.15 {g-format} {
257     format "%.3g" .1
258 } {0.1}
259 test format-5.16 {g-format} {
260     format "%.3g" .01
261 } {0.01}
262 test format-5.17 {g-format} {
263     format "%.3g" .001
264 } {0.001}
265 test format-5.18 {g-format} {eformat} {
266     format "%.3g" .00001
267 } {1e-05}
268 test format-5.19 {g-format} {eformat} {
269     format "%#.3g" 1234.0
270 } {1.23e+03}
271 test format-5.20 {g-format} {eformat} {
272     format "%#.3G" 9999.5
273 } {1.00E+04}
274
275 test format-6.1 {floating-point zeroes} {eformat} {
276     format "%e %f %g" 0.0 0.0 0.0 0.0
277 } {0.000000e+00 0.000000 0}
278 test format-6.2 {floating-point zeroes} {eformat} {
279     format "%.4e %.4f %.4g" 0.0 0.0 0.0 0.0
280 } {0.0000e+00 0.0000 0}
281 test format-6.3 {floating-point zeroes} {eformat notWinCI} {
282     format "%#.4e %#.4f %#.4g" 0.0 0.0 0.0 0.0
283 } {0.0000e+00 0.0000 0.000}
284 test format-6.4 {floating-point zeroes} {eformat} {
285     format "%.0e %.0f %.0g" 0.0 0.0 0.0 0.0
286 } {0e+00 0 0}
287 test format-6.5 {floating-point zeroes} {eformat notWinCI} {
288     format "%#.0e %#.0f %#.0g" 0.0 0.0 0.0 0.0
289 } {0.e+00 0. 0.}
290 test format-6.6 {floating-point zeroes} {
291     format "%3.0f %3.0f %3.0f %3.0f" 0.0 0.0 0.0 0.0
292 } {  0   0   0   0}
293 test format-6.7 {floating-point zeroes} {
294     format "%3.0f %3.0f %3.0f %3.0f" 1.0 1.1 1.01 1.001
295 } {  1   1   1   1}
296 test format-6.8 {floating-point zeroes} {
297     format "%3.1f %3.1f %3.1f %3.1f" 0.0 0.1 0.01 0.001
298 } {0.0 0.1 0.0 0.0}
299
300 test format-7.1 {various syntax features} {
301     format "%*.*f" 12 3 12.345678901
302 } {      12.346}
303 test format-7.2 {various syntax features} {
304     format "%0*.*f" 12 3 12.345678901
305 } {00000012.346}
306 test format-7.3 {various syntax features} {
307     format "\*\t\\n"
308 } {*    \n}
309
310 test format-8.1 {error conditions} {
311     catch format
312 } 1
313 test format-8.2 {error conditions} {
314     catch format msg
315     set msg
316 } {wrong # args: should be "format formatString ?arg ...?"}
317 test format-8.3 {error conditions} {
318     catch {format %*d}
319 } 1
320 test format-8.4 {error conditions} {
321     catch {format %*d} msg
322     set msg
323 } {not enough arguments for all format specifiers}
324 test format-8.5 {error conditions} {
325     catch {format %*.*f 12}
326 } 1
327 test format-8.6 {error conditions} {
328     catch {format %*.*f 12} msg
329     set msg
330 } {not enough arguments for all format specifiers}
331 test format-8.7 {error conditions} {
332     catch {format %*.*f 12 3}
333 } 1
334 test format-8.8 {error conditions} {
335     catch {format %*.*f 12 3} msg
336     set msg
337 } {not enough arguments for all format specifiers}
338 test format-8.9 {error conditions} {
339     list [catch {format %*d x 3} msg] $msg
340 } {1 {expected integer but got "x"}}
341 test format-8.10 {error conditions} {
342     list [catch {format %*.*f 2 xyz 3} msg] $msg
343 } {1 {expected integer but got "xyz"}}
344 test format-8.11 {error conditions} {
345     catch {format %d 2a}
346 } 1
347 test format-8.12 {error conditions} {
348     catch {format %d 2a} msg
349     set msg
350 } {expected integer but got "2a"}
351 test format-8.13 {error conditions} {
352     catch {format %c 2x}
353 } 1
354 test format-8.14 {error conditions} {
355     catch {format %c 2x} msg
356     set msg
357 } {expected integer but got "2x"}
358 test format-8.15 {error conditions} {
359     catch {format %f 2.1z}
360 } 1
361 test format-8.16 {error conditions} {
362     catch {format %f 2.1z} msg
363     set msg
364 } {expected floating-point number but got "2.1z"}
365 test format-8.17 {error conditions} {
366     catch {format ab%}
367 } 1
368 test format-8.18 {error conditions} {
369     catch {format ab% 12} msg
370     set msg
371 } {format string ended in middle of field specifier}
372 test format-8.19 {error conditions} {
373     catch {format %q x}
374 } 1
375 test format-8.20 {error conditions} {
376     catch {format %q x} msg
377     set msg
378 } {bad field specifier "q"}
379 test format-8.21 {error conditions} {
380     catch {format %d}
381 } 1
382 test format-8.22 {error conditions} {
383     catch {format %d} msg
384     set msg
385 } {not enough arguments for all format specifiers}
386 test format-8.23 {error conditions} {
387     catch {format "%d %d" 24 xyz} msg
388     set msg
389 } {expected integer but got "xyz"}
390
391 test format-9.1 {long result} {
392     set a {1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z}
393     format {1111 2222 3333 4444 5555 6666 7777 8888 9999 aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn oooo pppp qqqq rrrr ssss tttt uuuu vvvv wwww xxxx yyyy zzzz AAAA BBBB CCCC DDDD EEEE FFFF GGGG %s %s} $a $a
394 } {1111 2222 3333 4444 5555 6666 7777 8888 9999 aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn oooo pppp qqqq rrrr ssss tttt uuuu vvvv wwww xxxx yyyy zzzz AAAA BBBB CCCC DDDD EEEE FFFF GGGG 1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z}
395
396 test format-10.1 {"h" format specifier} {
397     format %hd 0xffff
398 } -1
399 test format-10.2 {"h" format specifier} {
400     format %hx 0x10fff
401 } fff
402 test format-10.3 {"h" format specifier} {
403     format %hd 0x10000
404 } 0
405 test format-10.4 {"h" format specifier} {
406     # Bug 1154163: This is minimal behaviour for %hx specifier!
407     format %hx 1
408 } 1
409 test format-10.5 {"h" format specifier} {
410     # Bug 1284178: Highly out-of-range values shouldn't cause errors
411     format %hu 0x100000000
412 } 0
413
414 test format-11.1 {XPG3 %$n specifiers} {
415     format {%2$d %1$d} 4 5
416 } {5 4}
417 test format-11.2 {XPG3 %$n specifiers} {
418     format {%2$d %1$d %1$d %3$d} 4 5 6
419 } {5 4 4 6}
420 test format-11.3 {XPG3 %$n specifiers} {
421     list [catch {format {%2$d %3$d} 4 5} msg] $msg
422 } {1 {"%n$" argument index out of range}}
423 test format-11.4 {XPG3 %$n specifiers} {
424     list [catch {format {%2$d %0$d} 4 5 6} msg] $msg
425 } {1 {"%n$" argument index out of range}}
426 test format-11.5 {XPG3 %$n specifiers} {
427     list [catch {format {%d %1$d} 4 5 6} msg] $msg
428 } {1 {cannot mix "%" and "%n$" conversion specifiers}}
429 test format-11.6 {XPG3 %$n specifiers} {
430     list [catch {format {%2$d %d} 4 5 6} msg] $msg
431 } {1 {cannot mix "%" and "%n$" conversion specifiers}}
432 test format-11.7 {XPG3 %$n specifiers} {
433     list [catch {format {%2$d %3d} 4 5 6} msg] $msg
434 } {1 {cannot mix "%" and "%n$" conversion specifiers}}
435 test format-11.8 {XPG3 %$n specifiers} {
436     format {%2$*d %3$d} 1 10 4
437 } {         4 4}
438 test format-11.9 {XPG3 %$n specifiers} {
439     format {%2$.*s %4$d} 1 5 abcdefghijklmnop 44
440 } {abcde 44}
441 test format-11.10 {XPG3 %$n specifiers} {
442     list [catch {format {%2$*d} 4} msg] $msg
443 } {1 {"%n$" argument index out of range}}
444 test format-11.11 {XPG3 %$n specifiers} {
445     list [catch {format {%2$*d} 4 5} msg] $msg
446 } {1 {"%n$" argument index out of range}}
447 test format-11.12 {XPG3 %$n specifiers} {
448     list [catch {format {%2$*d} 4 5 6} msg] $msg
449 } {0 {    6}}
450
451 test format-12.1 {negative width specifiers} {
452     format "%*d" -47 25
453 } {25                                             }
454
455 test format-13.1 {tcl_precision fuzzy comparison} {
456     catch {unset a}
457     catch {unset b}
458     catch {unset c}
459     catch {unset d}
460     set a 0.0000000000001
461     set b 0.00000000000001
462     set c 0.00000000000000001
463     set d [expr {$a + $b + $c}]
464     format {%0.10f %0.12f %0.15f %0.17f} $d $d $d $d
465 } {0.0000000000 0.000000000000 0.000000000000110 0.00000000000011001}
466 test format-13.2 {tcl_precision fuzzy comparison} {
467     catch {unset a}
468     catch {unset b}
469     catch {unset c}
470     catch {unset d}
471     set a 0.000000000001
472     set b 0.000000000000005
473     set c 0.0000000000000008
474     set d [expr {$a + $b + $c}]
475     format {%0.10f %0.12f %0.15f %0.17f} $d $d $d $d
476 } {0.0000000000 0.000000000001 0.000000000001006 0.00000000000100580}
477 test format-13.3 {tcl_precision fuzzy comparison} {
478     catch {unset a}
479     catch {unset b}
480     catch {unset c}
481     set a 0.00000000000099
482     set b 0.000000000000011
483     set c [expr {$a + $b}]
484     format {%0.10f %0.12f %0.15f %0.17f} $c $c $c $c
485 } {0.0000000000 0.000000000001 0.000000000001001 0.00000000000100100}
486 test format-13.4 {tcl_precision fuzzy comparison} {
487     catch {unset a}
488     catch {unset b}
489     catch {unset c}
490     set a 0.444444444444
491     set b 0.33333333333333
492     set c [expr {$a + $b}]
493     format {%0.10f %0.12f %0.15f %0.16f} $c $c $c $c
494 } {0.7777777778 0.777777777777 0.777777777777330 0.7777777777773300}
495 test format-13.5 {tcl_precision fuzzy comparison} {
496     catch {unset a}
497     catch {unset b}
498     catch {unset c}
499     set a 0.444444444444
500     set b 0.99999999999999
501     set c [expr {$a + $b}]
502     format {%0.10f %0.12f %0.15f} $c $c $c
503 } {1.4444444444 1.444444444444 1.444444444443990}
504
505 test format-14.1 {testing MAX_FLOAT_SIZE for 0 and 1} {
506     format {%s} ""
507 } {}
508 test format-14.2 {testing MAX_FLOAT_SIZE for 0 and 1} {
509     format {%s} "a"
510 } {a}
511
512 test format-15.1 {testing %0..s 0 padding for chars/strings} {
513     format %05s a
514 } {0000a}
515 test format-15.2 {testing %0..s 0 padding for chars/strings} {
516     format "% 5s" a
517 } {    a}
518 test format-15.3 {testing %0..s 0 padding for chars/strings} {
519     format %5s a
520 } {    a}
521 test format-15.4 {testing %0..s 0 padding for chars/strings} {
522     format %05c 61
523 } {0000=}
524 test format-15.5 {testing %d space padding for integers} {
525     format "(% 1d) (% 1d)" 10 -10
526 } {( 10) (-10)}
527 test format-15.6 {testing %d plus padding for integers} {
528     format "(%+1d) (%+1d)" 10 -10
529 } {(+10) (-10)}
530
531 set a "0123456789"
532 set b ""
533 for {set i 0} {$i < 290} {incr i} {
534     append b $a
535 }
536 for {set i 290} {$i < 400} {incr i} {
537     test format-16.[expr {$i -289}] {testing MAX_FLOAT_SIZE} {
538         format {%s} $b
539     } $b
540     append b "x"
541 }
542
543 test format-17.1 {testing %d with wide} {wideIs64bit wideBiggerThanInt} {
544     format %d 7810179016327718216
545 } 1819043144
546 test format-17.2 {testing %ld with wide} {wideIs64bit} {
547     format %ld 7810179016327718216
548 } 7810179016327718216
549 test format-17.3 {testing %ld with non-wide} {wideIs64bit} {
550     format %ld 42
551 } 42
552 test format-17.4 {testing %l with non-integer} {
553     format %lf 1
554 } 1.000000
555 test format-17.5 {testing %llu with positive bignum} -body {
556     format %llu 0xabcdef0123456789abcdef
557 } -returnCodes 1 -result {unsigned bignum format is invalid}
558 test format-17.6 {testing %llu with negative number} -body {
559     format %llu -1
560 } -returnCodes 1 -result {unsigned bignum format is invalid}
561
562 test format-18.1 {do not demote existing numeric values} {
563     set a 0xaaaaaaaa
564     # Ensure $a and $b are separate objects
565     set b 0xaaaa
566     append b aaaa
567     set result [expr {$a == $b}]
568     format %08lx $b
569     lappend result [expr {$a == $b}]
570     set b 0xaaaa
571     append b aaaa
572     lappend result [expr {$a == $b}]
573     format %08x $b
574     lappend result [expr {$a == $b}]
575 } {1 1 1 1}
576 test format-18.2 {do not demote existing numeric values} {wideBiggerThanInt} {
577     set a [expr {0xaaaaaaaaaa + 1}]
578     set b 0xaaaaaaaaab
579     list [format %08x $a] [expr {$a == $b}]
580 } {aaaaaaab 1}
581
582 test format-19.1 {regression test - tcl-core message by Brian Griffin on 26 0ctober 2004} -body {
583     set x 0x8fedc654
584     list [expr { ~ $x }] [format %08x [expr { ~$x }]]
585 } -match regexp -result {-2414724693 f*701239ab}
586 test format-19.2 {Bug 1867855} {
587     format %llx 0
588 } 0
589 test format-19.3 {Bug 2830354} {
590     string length [format %340f 0]
591 } 340
592
593 test format-19.4.1 {Bug d498578df4: width overflow should cause limit exceeded} \
594 -constraints {longIs32bit} -body {
595     # in case of overflow into negative, it produces width -2 (and limit exceeded),
596     # in case of width will be unsigned, it will be outside limit (2GB for 32bit)...
597     # and it don't throw an error in case the bug is not fixed (and probably no segfault).
598     format %[expr {0xffffffff - 1}]g 0
599 } -returnCodes error -result "max size for a Tcl value exceeded"
600
601 test format-19.4.2 {Bug d498578df4: width overflow should cause limit exceeded} -body {
602     # limit should exceeds in any case,
603     # and it don't throw an error in case the bug is not fixed (and probably no segfault).
604     format %[expr {0xffffffffffffffff - 1}]g 0
605 } -returnCodes error -result "max size for a Tcl value exceeded"
606
607 # Note that this test may fail in future versions
608 test format-20.1 {Bug 2932421: plain %s caused internalrep change of args} -body {
609     set x [dict create a b c d]
610     format %s $x
611     # After this, obj in $x should be a dict
612     # We are testing to make sure it has not been shimmered to a
613     # different internalrep when that is not necessary.
614     # Whether or not there is a string rep - we should not care!
615     tcl::unsupported::representation $x
616 } -match glob -result {value is a dict *}
617 \f
618 # cleanup
619 catch {unset a}
620 catch {unset b}
621 catch {unset c}
622 catch {unset d}
623 ::tcltest::cleanupTests
624 return
625
626 # Local Variables:
627 # mode: tcl
628 # End: