6
6
@test (@sprintf " %a" typemax (Int64)) == " 0x7.fffffffffffffffp+60"
7
7
@test (@sprintf " %A" typemax (Int64)) == " 0X7.FFFFFFFFFFFFFFFP+60"
8
8
9
+ # printing an int value
9
10
for (fmt, val) in ((" %i" , " 42" ),
10
11
(" %u" , " 42" ),
11
12
(" Test: %i" , " Test: 42" ),
12
13
(" %#x" , " 0x2a" ),
13
14
(" %#o" , " 052" ),
14
- (" %X " , " 2A " ),
15
+ (" %x " , " 2a " ),
15
16
(" %X" , " 2A" ),
16
17
(" % i" , " 42" ),
17
18
(" %+i" , " +42" ),
18
19
(" %4i" , " 42" ),
19
20
(" %-4i" , " 42 " ),
20
- (" %a" ," 0x2.ap+4" ),
21
+ (" %a" , " 0x2.ap+4" ),
22
+ (" %A" , " 0X2.AP+4" ),
21
23
(" %20a" ," 0x2.ap+4" ),
22
- (" %-20a" ," 0x2.ap+4 " ))
23
- @test ( @eval (@sprintf ($ fmt, 42 ) == $ val))
24
+ (" %-20a" ," 0x2.ap+4 " ),
25
+ (" %f" , " 42.000000" ),
26
+ (" %g" , " 42" )),
27
+ num in (UInt16 (42 ), UInt32 (42 ), UInt64 (42 ), UInt128 (42 ),
28
+ Int16 (42 ), Int32 (42 ), Int64 (42 ), Int128 (42 ))
29
+ # big"42" causes stack overflow on %a ; gh #14409
30
+ @test @eval (@sprintf ($ fmt, $ num) == $ val)
31
+ end
32
+
33
+ # pointers
34
+ if WORD_SIZE == 64
35
+ @test (@sprintf " %20p" 0 ) == " 0x0000000000000000"
36
+ @test (@sprintf " %-20p" 0 ) == " 0x0000000000000000 "
37
+ elseif WORD_SIZE == 32
38
+ @test (@sprintf " %20p" 0 ) == " 0x00000000"
39
+ @test (@sprintf " %-20p" 0 ) == " 0x00000000 "
24
40
end
25
41
26
42
# float / BigFloat
@@ -29,9 +45,66 @@ for (fmt, val) in (("%7.2f", " 1.23"),
29
45
(" %07.2f" , " 0001.23" ),
30
46
(" %.0f" , " 1" ),
31
47
(" %#.0f" , " 1." ),
32
- (" %.4e" , " 1.2345e+00" )),
48
+ (" %.4e" , " 1.2345e+00" ),
49
+ (" %.4E" , " 1.2345E+00" ),
50
+ (" %.2a" , " 0x1.3cp+0" ),
51
+ (" %.2A" , " 0X1.3CP+0" )),
33
52
num in (1.2345 , big " 1.2345" )
34
- @test ( @eval (@sprintf ($ fmt, $ num) == $ val))
53
+ @test @eval (@sprintf ($ fmt, $ num) == $ val)
54
+ end
55
+
56
+ # numeric spacing and various flag tests
57
+ function _test_flags (val, vflag:: AbstractString , fmt:: AbstractString , res:: AbstractString , prefix:: AbstractString )
58
+ vflag = string (" %" , vflag)
59
+ space_fmt = string (length (res) + length (prefix) + 3 , fmt)
60
+ fsign = string ((val < 0 ? " -" : " +" ), prefix)
61
+ nsign = string ((val < 0 ? " -" : " " ), prefix)
62
+ osign = val < 0 ? string (" -" , prefix) : string (prefix, " 0" )
63
+ esign = string (val < 0 ? " -" : " " , prefix)
64
+ esignend = val < 0 ? " " : " "
65
+
66
+ for (flag:: AbstractString , ans:: AbstractString ) in (
67
+ (" " , string (" " , nsign, res)),
68
+ (" +" , string (" " , fsign, res)),
69
+ (" " , string (" " , nsign, res)),
70
+ (" 0" , string (osign, " 00" , res)),
71
+ (" -" , string (esign, res, " " , esignend)),
72
+ (" 0+" , string (fsign, " 00" , res)),
73
+ (" 0 " , string (nsign, " 00" , res)),
74
+ (" -+" , string (fsign, res, " " )),
75
+ (" - " , string (nsign, res, " " )),
76
+ )
77
+ fmt_string = string (vflag, flag, space_fmt)
78
+ @test @eval (@sprintf ($ fmt_string, $ val) == $ ans)
79
+ end
80
+ end
81
+
82
+ for i in (
83
+ (42 , " " , " i" , " 42" , " " ),
84
+ (42 , " " , " d" , " 42" , " " ),
85
+
86
+ (42 , " " , " u" , " 42" , " " ),
87
+ (42 , " " , " x" , " 2a" , " " ),
88
+ (42 , " " , " X" , " 2A" , " " ),
89
+ (42 , " " , " o" , " 52" , " " ),
90
+
91
+ (42 , " #" , " x" , " 2a" , " 0x" ),
92
+ (42 , " #" , " X" , " 2A" , " 0X" ),
93
+ (42 , " #" , " o" , " 052" , " " ),
94
+
95
+ (1.2345 , " " , " .2f" , " 1.23" , " " ),
96
+ (1.2345 , " " , " .2e" , " 1.23e+00" , " " ),
97
+ (1.2345 , " " , " .2E" , " 1.23E+00" , " " ),
98
+
99
+ (1.2345 , " #" , " .0f" , " 1." , " " ),
100
+ (1.2345 , " #" , " .0e" , " 1.e+00" , " " ),
101
+ (1.2345 , " #" , " .0E" , " 1.E+00" , " " ),
102
+
103
+ (1.2345 , " " , " .2a" , " 1.3cp+0" , " 0x" ),
104
+ (1.2345 , " " , " .2A" , " 1.3CP+0" , " 0X" ),
105
+ )
106
+ _test_flags (i... )
107
+ _test_flags (- i[1 ], i[2 : 5 ]. .. )
35
108
end
36
109
37
110
# Inf / NaN handling
46
119
@test (@sprintf " %.0e" big " 3e142" ) == " 3e+142"
47
120
@test (@sprintf " %#.0e" big " 3e142" ) == " 3.e+142"
48
121
122
+ @test (@sprintf " %.0e" big " 3e1042" ) == " 3e+1042"
123
+
124
+ @test (@sprintf " %e" 3e42 ) == " 3.000000e+42"
125
+ @test (@sprintf " %E" 3e42 ) == " 3.000000E+42"
126
+ @test (@sprintf " %e" 3e-42 ) == " 3.000000e-42"
127
+ @test (@sprintf " %E" 3e-42 ) == " 3.000000E-42"
128
+ @test (@sprintf " %a" 3e4 ) == " 0x1.d4cp+14"
129
+ @test (@sprintf " %A" 3e4 ) == " 0X1.D4CP+14"
130
+ @test (@sprintf " %.4a" 3e-4 ) == " 0x1.3a93p-12"
131
+ @test (@sprintf " %.4A" 3e-4 ) == " 0X1.3A93P-12"
132
+
49
133
# %g
50
134
for (val, res) in ((12345678. , " 1.23457e+07" ),
51
135
(1234567.8 , " 1.23457e+06" ),
52
136
(123456.78 , " 123457" ),
53
137
(12345.678 , " 12345.7" ),
54
138
(12340000.0 , " 1.234e+07" ))
55
- @test ( @sprintf (" %.6g" , val) == res)
139
+ @test ( @sprintf (" %.6g" , val) == res)
56
140
end
57
141
for (val, res) in ((big " 12345678." , " 1.23457e+07" ),
58
142
(big " 1234567.8" , " 1.23457e+06" ),
59
143
(big " 123456.78" , " 123457" ),
60
144
(big " 12345.678" , " 12345.7" ))
61
- @test ( @sprintf (" %.6g" , val) == res)
145
+ @test ( @sprintf (" %.6g" , val) == res)
62
146
end
63
147
for (fmt, val) in ((" %10.5g" , " 123.4" ),
64
148
(" %+10.5g" , " +123.4" ),
@@ -68,7 +152,7 @@ for (fmt, val) in (("%10.5g", " 123.4"),
68
152
(" %-+10.5g" , " +123.4 " ),
69
153
(" %010.5g" , " 00000123.4" )),
70
154
num in (123.4 , big " 123.4" )
71
- @test ( @eval (@sprintf ($ fmt, $ num) == $ val) )
155
+ @test @eval (@sprintf ($ fmt, $ num) == $ val)
72
156
end
73
157
@test ( @sprintf ( " %10.5g" , - 123.4 ) == " -123.4" )
74
158
@test ( @sprintf ( " %010.5g" , - 123.4 ) == " -0000123.4" )
94
178
# chars
95
179
@test (@sprintf " %c" 65 ) == " A"
96
180
@test (@sprintf " %c" ' A' ) == " A"
181
+ @test (@sprintf " %3c" ' A' ) == " A"
182
+ @test (@sprintf " %-3c" ' A' ) == " A "
97
183
@test (@sprintf " %c" 248 ) == " ø"
98
184
@test (@sprintf " %c" ' ø' ) == " ø"
99
185
186
+ # escape %
187
+ @test (@sprintf " %%" ) == " %"
188
+ @test (@sprintf " %%s" ) == " %s"
189
+ @test_throws ArgumentError eval (:(@sprintf " %" ))
190
+
191
+ # argument count
192
+ @test_throws ArgumentError eval (:(@sprintf " %s" ))
193
+ @test_throws ArgumentError eval (:(@sprintf " %s" " 1" " 2" ))
194
+
195
+ # no interpolation
196
+ @test_throws ArgumentError eval (:(@sprintf " $n " ))
197
+
198
+ # type width specifier parsing (ignored)
199
+ @test (@sprintf " %llf" 1.2 ) == " 1.200000"
200
+ @test (@sprintf " %Lf" 1.2 ) == " 1.200000"
201
+ @test (@sprintf " %hhu" 1 ) == " 1"
202
+ @test (@sprintf " %hu" 1 ) == " 1"
203
+ @test (@sprintf " %lu" 1 ) == " 1"
204
+ @test (@sprintf " %llu" 1 ) == " 1"
205
+ @test (@sprintf " %Lu" 1 ) == " 1"
206
+ @test (@sprintf " %zu" 1 ) == " 1"
207
+ @test (@sprintf " %ju" 1 ) == " 1"
208
+ @test (@sprintf " %tu" 1 ) == " 1"
209
+
100
210
# strings
101
211
@test (@sprintf " %s" " test" ) == " test"
102
212
@test (@sprintf " %s" " tést" ) == " tést"
103
213
214
+ @test (@sprintf " %8s" " test" ) == " test"
215
+ @test (@sprintf " %-8s" " test" ) == " test "
216
+
217
+ @test (@sprintf " %s" " tést" ) == " tést"
218
+
219
+ @test (@sprintf " %s" :test ) == " test"
220
+ @test (@sprintf " %#s" :test ) == " :test"
221
+ @test (@sprintf " %#8s" :test ) == " :test"
222
+ @test (@sprintf " %#-8s" :test ) == " :test "
223
+
104
224
# reasonably complex
105
225
@test (@sprintf " Test: %s%c%C%c%#-.0f." " t" 65 66 67 - 42 ) == " Test: tABC-42.."
106
226
107
227
# test simple splatting
108
228
@test (@sprintf " %d%d" [1 2 ]. .. ) == " 12"
109
229
230
+ # invalid format specifiers, not "diouxXDOUeEfFgGaAcCsSpn"
231
+ for c in " bBhHIjJkKlLmMNPqQrRtTvVwWyYzZ"
232
+ fmt_str = string (" %" , c)
233
+ @test_throws ArgumentError eval (:(@sprintf $ fmt_str 1 ))
234
+ end
235
+
110
236
# combo
111
237
@test (@sprintf " %f %d %d %f" 1.0 [3 4 ]. .. 5 ) == " 1.000000 3 4 5.000000"
112
238
115
241
116
242
# comprehension
117
243
@test (@sprintf " %s %s %s %d %d %d %f %f %f" Any[10 ^ x+ y for x= 1 : 3 ,y= 1 : 3 ]. .. ) == " 11 101 1001 12 102 1002 13.000000 103.000000 1003.000000"
244
+
245
+ # @printf
246
+ @test_throws ArgumentError eval (:(@printf 1 ))
0 commit comments