@@ -162,21 +162,44 @@ function Test_printf_misc()
162162 call assert_equal (' +123' , printf (' %+6d' , 123 ))
163163 call assert_equal (' 123' , printf (' % 6d' , 123 ))
164164 call assert_equal (' -123' , printf (' % 6d' , -123 ))
165+
166+ " Test left adjusted.
167+ call assert_equal (' 123 ' , printf (' %-6d' , 123 ))
165168 call assert_equal (' +123 ' , printf (' %-+6d' , 123 ))
166169 call assert_equal (' 123 ' , printf (' %- 6d' , 123 ))
167170 call assert_equal (' -123 ' , printf (' %- 6d' , -123 ))
168171
172+ call assert_equal (' 00123' , printf (' %7.5d' , 123 ))
173+ call assert_equal (' -00123' , printf (' %7.5d' , -123 ))
174+ call assert_equal (' +00123' , printf (' %+7.5d' , 123 ))
175+ " Precision field should not be used when combined with %0
176+ call assert_equal (' 00123' , printf (' %07.5d' , 123 ))
177+ call assert_equal (' -00123' , printf (' %07.5d' , -123 ))
178+
179+ call assert_equal (' 123' , printf (' %*d' , 5 , 123 ))
180+ call assert_equal (' 123 ' , printf (' %*d' , -5 , 123 ))
169181 call assert_equal (' 00123' , printf (' %.*d' , 5 , 123 ))
170182 call assert_equal (' 123' , printf (' % *d' , 5 , 123 ))
171183 call assert_equal (' +123' , printf (' %+ *d' , 5 , 123 ))
172184
173- call assert_equal (' 123 ' , printf (' %-5d' , 123 ))
185+ " Simple quote (thousand grouping char) is ignored.
186+ call assert_equal (' +00123456' , printf (" %+'09d" , 123456 ))
187+
188+ " Unrecognized format specifier kept as-is.
189+ call assert_equal (' _123' , printf (" %_%d" , 123 ))
190+
191+ " Test alternate forms.
174192 call assert_equal (' 0x7b' , printf (' %#x' , 123 ))
175193 call assert_equal (' 0X7B' , printf (' %#X' , 123 ))
176194 call assert_equal (' 0173' , printf (' %#o' , 123 ))
177195 call assert_equal (' 0173' , printf (' %#O' , 123 ))
178196 call assert_equal (' abc' , printf (' %#s' , ' abc' ))
179197 call assert_equal (' abc' , printf (' %#S' , ' abc' ))
198+ call assert_equal (' 0173' , printf (' %#6o' , 123 ))
199+ call assert_equal (' 00173' , printf (' %#6.5o' , 123 ))
200+ call assert_equal (' 0173' , printf (' %#6.2o' , 123 ))
201+ call assert_equal (' 0173' , printf (' %#6.2o' , 123 ))
202+ call assert_equal (' 0173' , printf (' %#2.2o' , 123 ))
180203
181204 call assert_equal (' 00123' , printf (' %6.5d' , 123 ))
182205 call assert_equal (' 0007b' , printf (' %6.5x' , 123 ))
@@ -201,6 +224,7 @@ endfunc
201224
202225function Test_printf_float ()
203226 if has (' float' )
227+ call assert_equal (' 1.000000' , printf (' %f' , 1 ))
204228 call assert_equal (' 1.230000' , printf (' %f' , 1.23 ))
205229 call assert_equal (' 1.230000' , printf (' %F' , 1.23 ))
206230 call assert_equal (' 9999999.9' , printf (' %g' , 9999999.9 ))
@@ -215,10 +239,31 @@ function Test_printf_float()
215239 call assert_equal (' 0.33' , printf (' %6.2f' , 1.0 /3.0 ))
216240 call assert_equal (' -0.33' , printf (' %6.2f' , -1.0 /3.0 ))
217241 call assert_equal (' 000.33' , printf (' %06.2f' , 1.0 /3.0 ))
218- " FIXME: call assert_equal('-00.33', printf('%06.2f', -1.0/3.0))
219- " FIXME: call assert_equal('-00.33', printf('%+06.2f', -1.0/3.0))
220- " FIXME: call assert_equal('+00.33', printf('%+06.2f', 1.0/3.0))
221- " FIXME: call assert_equal(' 00.33', printf('% 06.2f', 1.0/3.0))
242+ call assert_equal (' -00.33' , printf (' %06.2f' , -1.0 /3.0 ))
243+ call assert_equal (' -00.33' , printf (' %+06.2f' , -1.0 /3.0 ))
244+ call assert_equal (' +00.33' , printf (' %+06.2f' , 1.0 /3.0 ))
245+ call assert_equal (' 00.33' , printf (' % 06.2f' , 1.0 /3.0 ))
246+ call assert_equal (' 000.33' , printf (' %06.2g' , 1.0 /3.0 ))
247+ call assert_equal (' -00.33' , printf (' %06.2g' , -1.0 /3.0 ))
248+ call assert_equal (' 0.33' , printf (' %3.2f' , 1.0 /3.0 ))
249+ call assert_equal (' 003.33e-01' , printf (' %010.2e' , 1.0 /3.0 ))
250+ call assert_equal (' 03.33e-01' , printf (' % 010.2e' , 1.0 /3.0 ))
251+ call assert_equal (' +03.33e-01' , printf (' %+010.2e' , 1.0 /3.0 ))
252+ call assert_equal (' -03.33e-01' , printf (' %010.2e' , -1.0 /3.0 ))
253+
254+ " When precision is 0, the dot should be omitted.
255+ call assert_equal (' 2' , printf (' %3.f' , 7.0 /3.0 ))
256+ call assert_equal (' 2' , printf (' %3.g' , 7.0 /3.0 ))
257+ call assert_equal (' 2e+00' , printf (' %7.e' , 7.0 /3.0 ))
258+
259+ " Float zero can be signed.
260+ call assert_equal (' +0.000000' , printf (' %+f' , 0.0 ))
261+ call assert_equal (' 0.000000' , printf (' %f' , 1.0 /(1.0/ 0.0 )))
262+ call assert_equal (' -0.000000' , printf (' %f' , 1.0 /(-1.0/ 0.0 )))
263+ call assert_equal (' 0.0' , printf (' %s' , 1.0 /(1.0/ 0.0 )))
264+ call assert_equal (' -0.0' , printf (' %s' , 1.0 /(-1.0/ 0.0 )))
265+ call assert_equal (' 0.0' , printf (' %S' , 1.0 /(1.0/ 0.0 )))
266+ call assert_equal (' -0.0' , printf (' %S' , 1.0 /(-1.0/ 0.0 )))
222267
223268 " Float infinity can be signed.
224269 call assert_equal (' inf' , printf (' %f' , 1.0 /0.0 ))
@@ -227,6 +272,8 @@ function Test_printf_float()
227272 call assert_equal (' -inf' , printf (' %g' , -1.0 /0.0 ))
228273 call assert_equal (' inf' , printf (' %e' , 1.0 /0.0 ))
229274 call assert_equal (' -inf' , printf (' %e' , -1.0 /0.0 ))
275+ call assert_equal (' INF' , printf (' %F' , 1.0 /0.0 ))
276+ call assert_equal (' -INF' , printf (' %F' , -1.0 /0.0 ))
230277 call assert_equal (' INF' , printf (' %E' , 1.0 /0.0 ))
231278 call assert_equal (' -INF' , printf (' %E' , -1.0 /0.0 ))
232279 call assert_equal (' INF' , printf (' %E' , 1.0 /0.0 ))
@@ -245,29 +292,26 @@ function Test_printf_float()
245292 call assert_equal (' -inf ' , printf (' %-6f' , -1.0 /0.0 ))
246293 call assert_equal (' +inf ' , printf (' %-+6f' , 1.0 /0.0 ))
247294 call assert_equal (' inf ' , printf (' %- 6f' , 1.0 /0.0 ))
295+ call assert_equal (' -INF ' , printf (' %-6F' , -1.0 /0.0 ))
296+ call assert_equal (' +INF ' , printf (' %-+6F' , 1.0 /0.0 ))
297+ call assert_equal (' INF ' , printf (' %- 6F' , 1.0 /0.0 ))
248298 call assert_equal (' INF ' , printf (' %-6G' , 1.0 /0.0 ))
249299 call assert_equal (' -INF ' , printf (' %-6G' , -1.0 /0.0 ))
250300 call assert_equal (' INF ' , printf (' %-6E' , 1.0 /0.0 ))
251301 call assert_equal (' -INF ' , printf (' %-6E' , -1.0 /0.0 ))
252302 call assert_equal (' inf' , printf (' %s' , 1.0 /0.0 ))
253303 call assert_equal (' -inf' , printf (' %s' , -1.0 /0.0 ))
254304
255- " Float zero can be signed.
256- call assert_equal (' 0.000000' , printf (' %f' , 1.0 /(1.0/ 0.0 )))
257- call assert_equal (' -0.000000' , printf (' %f' , 1.0 /(-1.0/ 0.0 )))
258- call assert_equal (' 0.0' , printf (' %s' , 1.0 /(1.0/ 0.0 )))
259- call assert_equal (' -0.0' , printf (' %s' , 1.0 /(-1.0/ 0.0 )))
260- call assert_equal (' 0.0' , printf (' %S' , 1.0 /(1.0/ 0.0 )))
261- call assert_equal (' -0.0' , printf (' %S' , 1.0 /(-1.0/ 0.0 )))
262-
263305 " Float nan (not a number) has no sign.
264306 call assert_equal (' nan' , printf (' %f' , sqrt (-1.0 )))
265307 call assert_equal (' nan' , printf (' %f' , 0.0 /0.0 ))
266308 call assert_equal (' nan' , printf (' %f' , -0.0 /0.0 ))
267309 call assert_equal (' nan' , printf (' %g' , 0.0 /0.0 ))
268310 call assert_equal (' nan' , printf (' %e' , 0.0 /0.0 ))
311+ call assert_equal (' NAN' , printf (' %F' , 0.0 /0.0 ))
269312 call assert_equal (' NAN' , printf (' %G' , 0.0 /0.0 ))
270313 call assert_equal (' NAN' , printf (' %E' , 0.0 /0.0 ))
314+ call assert_equal (' NAN' , printf (' %F' , -0.0 /0.0 ))
271315 call assert_equal (' NAN' , printf (' %G' , -0.0 /0.0 ))
272316 call assert_equal (' NAN' , printf (' %E' , -0.0 /0.0 ))
273317 call assert_equal (' nan' , printf (' %6f' , 0.0 /0.0 ))
0 commit comments