3 class TestSprintf < Test::Unit::TestCase
5 assert_equal(" 00001", sprintf("%*1$.*2$3$d", 10, 5, 1))
9 assert_equal("0", sprintf("%b", 0))
10 assert_equal("1", sprintf("%b", 1))
11 assert_equal("10", sprintf("%b", 2))
12 assert_equal("..1", sprintf("%b", -1))
14 assert_equal(" 0", sprintf("%4b", 0))
15 assert_equal(" 1", sprintf("%4b", 1))
16 assert_equal(" 10", sprintf("%4b", 2))
17 assert_equal(" ..1", sprintf("%4b", -1))
19 assert_equal("0000", sprintf("%04b", 0))
20 assert_equal("0001", sprintf("%04b", 1))
21 assert_equal("0010", sprintf("%04b", 2))
22 assert_equal("..11", sprintf("%04b", -1))
24 assert_equal("0000", sprintf("%.4b", 0))
25 assert_equal("0001", sprintf("%.4b", 1))
26 assert_equal("0010", sprintf("%.4b", 2))
27 assert_equal("..11", sprintf("%.4b", -1))
29 assert_equal(" 0000", sprintf("%6.4b", 0))
30 assert_equal(" 0001", sprintf("%6.4b", 1))
31 assert_equal(" 0010", sprintf("%6.4b", 2))
32 assert_equal(" ..11", sprintf("%6.4b", -1))
34 assert_equal(" 0", sprintf("%#4b", 0))
35 assert_equal(" 0b1", sprintf("%#4b", 1))
36 assert_equal("0b10", sprintf("%#4b", 2))
37 assert_equal("0b..1", sprintf("%#4b", -1))
39 assert_equal("0000", sprintf("%#04b", 0))
40 assert_equal("0b01", sprintf("%#04b", 1))
41 assert_equal("0b10", sprintf("%#04b", 2))
42 assert_equal("0b..1", sprintf("%#04b", -1))
44 assert_equal("0000", sprintf("%#.4b", 0))
45 assert_equal("0b0001", sprintf("%#.4b", 1))
46 assert_equal("0b0010", sprintf("%#.4b", 2))
47 assert_equal("0b..11", sprintf("%#.4b", -1))
49 assert_equal(" 0000", sprintf("%#6.4b", 0))
50 assert_equal("0b0001", sprintf("%#6.4b", 1))
51 assert_equal("0b0010", sprintf("%#6.4b", 2))
52 assert_equal("0b..11", sprintf("%#6.4b", -1))
54 assert_equal("+0", sprintf("%+b", 0))
55 assert_equal("+1", sprintf("%+b", 1))
56 assert_equal("+10", sprintf("%+b", 2))
57 assert_equal("-1", sprintf("%+b", -1))
59 assert_equal(" +0", sprintf("%+4b", 0))
60 assert_equal(" +1", sprintf("%+4b", 1))
61 assert_equal(" +10", sprintf("%+4b", 2))
62 assert_equal(" -1", sprintf("%+4b", -1))
64 assert_equal("+000", sprintf("%+04b", 0))
65 assert_equal("+001", sprintf("%+04b", 1))
66 assert_equal("+010", sprintf("%+04b", 2))
67 assert_equal("-001", sprintf("%+04b", -1))
69 assert_equal("+0000", sprintf("%+.4b", 0))
70 assert_equal("+0001", sprintf("%+.4b", 1))
71 assert_equal("+0010", sprintf("%+.4b", 2))
72 assert_equal("-0001", sprintf("%+.4b", -1))
74 assert_equal(" +0000", sprintf("%+6.4b", 0))
75 assert_equal(" +0001", sprintf("%+6.4b", 1))
76 assert_equal(" +0010", sprintf("%+6.4b", 2))
77 assert_equal(" -0001", sprintf("%+6.4b", -1))
82 assert_equal("NaN", sprintf("%f", nan))
83 assert_equal("NaN", sprintf("%-f", nan))
84 assert_equal("+NaN", sprintf("%+f", nan))
86 assert_equal(" NaN", sprintf("%8f", nan))
87 assert_equal("NaN ", sprintf("%-8f", nan))
88 assert_equal(" +NaN", sprintf("%+8f", nan))
90 assert_equal(" NaN", sprintf("%08f", nan))
91 assert_equal("NaN ", sprintf("%-08f", nan))
92 assert_equal(" +NaN", sprintf("%+08f", nan))
94 assert_equal(" NaN", sprintf("% 8f", nan))
95 assert_equal(" NaN ", sprintf("%- 8f", nan))
96 assert_equal(" +NaN", sprintf("%+ 8f", nan))
98 assert_equal(" NaN", sprintf("% 08f", nan))
99 assert_equal(" NaN ", sprintf("%- 08f", nan))
100 assert_equal(" +NaN", sprintf("%+ 08f", nan))
105 assert_equal("Inf", sprintf("%f", inf))
106 assert_equal("Inf", sprintf("%-f", inf))
107 assert_equal("+Inf", sprintf("%+f", inf))
109 assert_equal(" Inf", sprintf("%8f", inf))
110 assert_equal("Inf ", sprintf("%-8f", inf))
111 assert_equal(" +Inf", sprintf("%+8f", inf))
113 assert_equal(" Inf", sprintf("%08f", inf))
114 assert_equal("Inf ", sprintf("%-08f", inf))
115 assert_equal(" +Inf", sprintf("%+08f", inf))
117 assert_equal(" Inf", sprintf("% 8f", inf))
118 assert_equal(" Inf ", sprintf("%- 8f", inf))
119 assert_equal(" +Inf", sprintf("%+ 8f", inf))
121 assert_equal(" Inf", sprintf("% 08f", inf))
122 assert_equal(" Inf ", sprintf("%- 08f", inf))
123 assert_equal(" +Inf", sprintf("%+ 08f", inf))
125 assert_equal("-Inf", sprintf("%f", -inf))
126 assert_equal("-Inf", sprintf("%-f", -inf))
127 assert_equal("-Inf", sprintf("%+f", -inf))
129 assert_equal(" -Inf", sprintf("%8f", -inf))
130 assert_equal("-Inf ", sprintf("%-8f", -inf))
131 assert_equal(" -Inf", sprintf("%+8f", -inf))
133 assert_equal(" -Inf", sprintf("%08f", -inf))
134 assert_equal("-Inf ", sprintf("%-08f", -inf))
135 assert_equal(" -Inf", sprintf("%+08f", -inf))
137 assert_equal(" -Inf", sprintf("% 8f", -inf))
138 assert_equal("-Inf ", sprintf("%- 8f", -inf))
139 assert_equal(" -Inf", sprintf("%+ 8f", -inf))
141 assert_equal(" -Inf", sprintf("% 08f", -inf))
142 assert_equal("-Inf ", sprintf("%- 08f", -inf))
143 assert_equal(" -Inf", sprintf("%+ 08f", -inf))
144 assert_equal('..f00000000',
145 sprintf("%x", -2**32), '[ruby-dev:32351]')
146 assert_equal("..101111111111111111111111111111111",
147 sprintf("%b", -2147483649), '[ruby-dev:32365]')
148 assert_equal(" Inf", sprintf("% e", inf), '[ruby-dev:34002]')
152 # Star precision before star width:
153 assert_raise(ArgumentError, "[ruby-core:11569]") {sprintf("%.**d", 5, 10, 1)}
155 # Precision before flags and width:
156 assert_raise(ArgumentError, "[ruby-core:11569]") {sprintf("%.5+05d", 5)}
157 assert_raise(ArgumentError, "[ruby-core:11569]") {sprintf("%.5 5d", 5)}
159 # Overriding a star width with a numeric one:
160 assert_raise(ArgumentError, "[ruby-core:11569]") {sprintf("%*1s", 5, 1)}
162 # Width before flags:
163 assert_raise(ArgumentError, "[ruby-core:11569]") {sprintf("%5+0d", 1)}
164 assert_raise(ArgumentError, "[ruby-core:11569]") {sprintf("%5 0d", 1)}
166 # Specifying width multiple times:
167 assert_raise(ArgumentError, "[ruby-core:11569]") {sprintf("%50+30+20+10+5d", 5)}
168 assert_raise(ArgumentError, "[ruby-core:11569]") {sprintf("%50 30 20 10 5d", 5)}
170 # Specifying the precision multiple times with negative star arguments:
171 assert_raise(ArgumentError, "[ruby-core:11570]") {sprintf("%.*.*.*.*f", -1, -1, -1, 5, 1)}
173 # Null bytes after percent signs are removed:
174 assert_equal("%\0x hello", sprintf("%\0x hello"), "[ruby-core:11571]")
176 assert_raise(ArgumentError, "[ruby-core:11573]") {sprintf("%.25555555555555555555555555555555555555s", "hello")}
178 assert_raise(ArgumentError) { sprintf("%\1", 1) }
179 assert_raise(ArgumentError) { sprintf("%!", 1) }
180 assert_raise(ArgumentError) { sprintf("%1$1$d", 1) }
181 assert_raise(ArgumentError) { sprintf("%0%") }
182 verbose, $VERBOSE = $VERBOSE, nil
183 assert_nothing_raised { sprintf("", 1) }
189 assert_equal("36893488147419111424",
190 sprintf("%20.0f", 36893488147419107329.0))
191 assert_equal(" Inf", sprintf("% 0e", 1.0/0.0), "moved from btest/knownbug")
197 assert_equal(" " * BSIZ + "1", sprintf(" " * BSIZ + "%d", 1))
201 assert_equal("a", sprintf("%c", 97))
202 assert_equal("a", sprintf("%c", ?a))
203 assert_raise(ArgumentError) { sprintf("%c", sprintf("%c%c", ?a, ?a)) }
204 assert_equal(" " * (BSIZ - 1) + "a", sprintf(" " * (BSIZ - 1) + "%c", ?a))
205 assert_equal(" " * (BSIZ - 1) + "a", sprintf(" " * (BSIZ - 1) + "%-1c", ?a))
206 assert_equal(" " * BSIZ + "a", sprintf("%#{ BSIZ + 1 }c", ?a))
207 assert_equal("a" + " " * BSIZ, sprintf("%-#{ BSIZ + 1 }c", ?a))
211 assert_equal("foo", sprintf("%s", "foo"))
212 assert_equal("fo", sprintf("%.2s", "foo"))
213 assert_equal(" " * BSIZ, sprintf("%s", " " * BSIZ))
214 assert_equal(" " * (BSIZ - 1) + "foo", sprintf("%#{ BSIZ - 1 + 3 }s", "foo"))
215 assert_equal(" " * BSIZ + "foo", sprintf("%#{ BSIZ + 3 }s", "foo"))
216 assert_equal("foo" + " " * BSIZ, sprintf("%-#{ BSIZ + 3 }s", "foo"))
220 assert_equal("01", sprintf("%#o", 1))
221 assert_equal("0x1", sprintf("%#x", 1))
222 assert_equal("0X1", sprintf("%#X", 1))
223 assert_equal("0b1", sprintf("%#b", 1))
224 assert_equal("0B1", sprintf("%#B", 1))
225 assert_equal("1", sprintf("%d", 1.0))
226 assert_equal("4294967296", sprintf("%d", (2**32).to_f))
227 assert_equal("-2147483648", sprintf("%d", -(2**31).to_f))
228 assert_equal("18446744073709551616", sprintf("%d", (2**64).to_f))
229 assert_equal("-9223372036854775808", sprintf("%d", -(2**63).to_f))
230 assert_equal("1", sprintf("%d", "1"))
231 o = Object.new; def o.to_int; 1; end
232 assert_equal("1", sprintf("%d", o))
233 assert_equal("+1", sprintf("%+d", 1))
234 assert_equal(" 1", sprintf("% d", 1))
235 assert_equal("..f", sprintf("%x", -1))
236 assert_equal("..7", sprintf("%o", -1))
237 one = (2**32).coerce(1).first
238 mone = (2**32).coerce(-1).first
239 assert_equal("+1", sprintf("%+d", one))
240 assert_equal(" 1", sprintf("% d", one))
241 assert_equal("..f", sprintf("%x", mone))
242 assert_equal("..7", sprintf("%o", mone))
243 assert_equal(" " * BSIZ + "1", sprintf("%#{ BSIZ + 1 }d", one))
244 assert_equal(" " * (BSIZ - 1) + "1", sprintf(" " * (BSIZ - 1) + "%d", 1))
249 assert_equal(" " * BSIZ + "Inf", sprintf("%#{ BSIZ + 3 }.1f", inf))
250 assert_equal("+Inf", sprintf("%+-f", inf))
251 assert_equal(" " * BSIZ + "1.0", sprintf("%#{ BSIZ + 3 }.1f", 1.0))
254 class T012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
258 assert_equal("-1 ", sprintf("%*d", -3, -1))
262 assert_equal("%" * BSIZ, sprintf("%%" * BSIZ))
266 assert(T012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.new.inspect =~ /^#<TestSprintf::T012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789:0x[0-9a-f]+>$/)
269 def test_negative_hex
270 s1 = sprintf("%0x", -0x40000000)
271 s2 = sprintf("%0x", -0x40000001)
272 b1 = (/\.\./ =~ s1) != nil
273 b2 = (/\.\./ =~ s2) != nil
274 assert(b1 == b2, "[ruby-dev:33224]")