OSDN Git Service

ruby-1.9.1-rc1
[splhack/AndroidRuby.git] / lib / ruby-1.9.1-rc1 / test / ruby / test_sprintf.rb
1 require 'test/unit'
2
3 class TestSprintf < Test::Unit::TestCase
4   def test_positional
5     assert_equal("     00001", sprintf("%*1$.*2$3$d", 10, 5, 1))
6   end
7
8   def test_binary
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))
13
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))
18
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))
23
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))
28
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))
33
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))
38
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))
43
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))
48
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))
53
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))
58
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))
63
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))
68
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))
73
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))
78   end
79
80   def test_nan
81     nan = 0.0 / 0.0
82     assert_equal("NaN", sprintf("%f", nan))
83     assert_equal("NaN", sprintf("%-f", nan))
84     assert_equal("+NaN", sprintf("%+f", nan))
85
86     assert_equal("     NaN", sprintf("%8f", nan))
87     assert_equal("NaN     ", sprintf("%-8f", nan))
88     assert_equal("    +NaN", sprintf("%+8f", nan))
89
90     assert_equal("     NaN", sprintf("%08f", nan))
91     assert_equal("NaN     ", sprintf("%-08f", nan))
92     assert_equal("    +NaN", sprintf("%+08f", nan))
93
94     assert_equal("     NaN", sprintf("% 8f", nan))
95     assert_equal(" NaN    ", sprintf("%- 8f", nan))
96     assert_equal("    +NaN", sprintf("%+ 8f", nan))
97
98     assert_equal("     NaN", sprintf("% 08f", nan))
99     assert_equal(" NaN    ", sprintf("%- 08f", nan))
100     assert_equal("    +NaN", sprintf("%+ 08f", nan))
101   end
102
103   def test_inf
104     inf = 1.0 / 0.0
105     assert_equal("Inf", sprintf("%f", inf))
106     assert_equal("Inf", sprintf("%-f", inf))
107     assert_equal("+Inf", sprintf("%+f", inf))
108
109     assert_equal("     Inf", sprintf("%8f", inf))
110     assert_equal("Inf     ", sprintf("%-8f", inf))
111     assert_equal("    +Inf", sprintf("%+8f", inf))
112
113     assert_equal("     Inf", sprintf("%08f", inf))
114     assert_equal("Inf     ", sprintf("%-08f", inf))
115     assert_equal("    +Inf", sprintf("%+08f", inf))
116
117     assert_equal("     Inf", sprintf("% 8f", inf))
118     assert_equal(" Inf    ", sprintf("%- 8f", inf))
119     assert_equal("    +Inf", sprintf("%+ 8f", inf))
120
121     assert_equal("     Inf", sprintf("% 08f", inf))
122     assert_equal(" Inf    ", sprintf("%- 08f", inf))
123     assert_equal("    +Inf", sprintf("%+ 08f", inf))
124
125     assert_equal("-Inf", sprintf("%f", -inf))
126     assert_equal("-Inf", sprintf("%-f", -inf))
127     assert_equal("-Inf", sprintf("%+f", -inf))
128
129     assert_equal("    -Inf", sprintf("%8f", -inf))
130     assert_equal("-Inf    ", sprintf("%-8f", -inf))
131     assert_equal("    -Inf", sprintf("%+8f", -inf))
132
133     assert_equal("    -Inf", sprintf("%08f", -inf))
134     assert_equal("-Inf    ", sprintf("%-08f", -inf))
135     assert_equal("    -Inf", sprintf("%+08f", -inf))
136
137     assert_equal("    -Inf", sprintf("% 8f", -inf))
138     assert_equal("-Inf    ", sprintf("%- 8f", -inf))
139     assert_equal("    -Inf", sprintf("%+ 8f", -inf))
140
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]')
149   end
150
151   def test_invalid
152     # Star precision before star width:
153     assert_raise(ArgumentError, "[ruby-core:11569]") {sprintf("%.**d", 5, 10, 1)}
154
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)}
158
159     # Overriding a star width with a numeric one:
160     assert_raise(ArgumentError, "[ruby-core:11569]") {sprintf("%*1s", 5, 1)}
161
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)}
165
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)}
169
170     # Specifying the precision multiple times with negative star arguments:
171     assert_raise(ArgumentError, "[ruby-core:11570]") {sprintf("%.*.*.*.*f", -1, -1, -1, 5, 1)}
172
173     # Null bytes after percent signs are removed:
174     assert_equal("%\0x hello", sprintf("%\0x hello"), "[ruby-core:11571]")
175
176     assert_raise(ArgumentError, "[ruby-core:11573]") {sprintf("%.25555555555555555555555555555555555555s", "hello")}
177
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) }
184   ensure
185     $VERBOSE = verbose
186   end
187
188   def test_float
189     assert_equal("36893488147419111424",
190                  sprintf("%20.0f", 36893488147419107329.0))
191     assert_equal(" Inf", sprintf("% 0e", 1.0/0.0), "moved from btest/knownbug")
192   end
193
194   BSIZ = 120
195
196   def test_skip
197     assert_equal(" " * BSIZ + "1", sprintf(" " * BSIZ + "%d", 1))
198   end
199
200   def test_char
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))
208   end
209
210   def test_string
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"))
217   end
218
219   def test_integer
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))
245   end
246
247   def test_float2
248     inf = 1.0 / 0.0
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))
252   end
253
254   class T012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
255   end
256
257   def test_star
258     assert_equal("-1 ", sprintf("%*d", -3, -1))
259   end
260
261   def test_escape
262     assert_equal("%" * BSIZ, sprintf("%%" * BSIZ))
263   end
264
265   def test_rb_sprintf
266     assert(T012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.new.inspect =~ /^#<TestSprintf::T012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789:0x[0-9a-f]+>$/)
267   end
268
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]")
275   end
276 end