PageRenderTime 69ms CodeModel.GetById 2ms app.highlight 63ms RepoModel.GetById 1ms app.codeStats 1ms

/src/test/run-pass/syntax-extension-fmt.rs

http://github.com/jruderman/rust
Rust | 251 lines | 205 code | 25 blank | 21 comment | 7 complexity | 57761b1af233d524b0586963c0e4616b MD5 | raw file
  1use std;
  2import str;
  3
  4fn test(actual: ~str, expected: ~str) {
  5    log(debug, actual);
  6    log(debug, expected);
  7    assert (actual == expected);
  8}
  9
 10fn main() {
 11    test(fmt!{"hello %d friends and %s things", 10, ~"formatted"},
 12         ~"hello 10 friends and formatted things");
 13
 14    test(fmt!{"test"}, ~"test");
 15
 16    // a quadratic optimization in LLVM (jump-threading) makes this test a
 17    // bit slow to compile unless we break it up
 18    part1();
 19    part2();
 20    part3();
 21    part4();
 22    part5();
 23    part6();
 24    percent();
 25    more_floats();
 26}
 27
 28fn part1() {
 29    // Simple tests for types
 30
 31    test(fmt!{"%d", 1}, ~"1");
 32    test(fmt!{"%i", 2}, ~"2");
 33    test(fmt!{"%i", -1}, ~"-1");
 34    test(fmt!{"%u", 10u}, ~"10");
 35    test(fmt!{"%s", ~"test"}, ~"test");
 36    test(fmt!{"%b", true}, ~"true");
 37    test(fmt!{"%b", false}, ~"false");
 38    test(fmt!{"%c", 'A'}, ~"A");
 39    test(fmt!{"%x", 0xff_u}, ~"ff");
 40    test(fmt!{"%X", 0x12ab_u}, ~"12AB");
 41    test(fmt!{"%o", 10u}, ~"12");
 42    test(fmt!{"%t", 0b11010101_u}, ~"11010101");
 43    test(fmt!{"%f", 5.82}, ~"5.82");
 44    // 32-bit limits
 45
 46    test(fmt!{"%i", -2147483648}, ~"-2147483648");
 47    test(fmt!{"%i", 2147483647}, ~"2147483647");
 48    test(fmt!{"%u", 4294967295u}, ~"4294967295");
 49    test(fmt!{"%x", 0xffffffff_u}, ~"ffffffff");
 50    test(fmt!{"%o", 0xffffffff_u}, ~"37777777777");
 51    test(fmt!{"%t", 0xffffffff_u}, ~"11111111111111111111111111111111");
 52}
 53fn part2() {
 54    // Widths
 55
 56    test(fmt!{"%1d", 500}, ~"500");
 57    test(fmt!{"%10d", 500}, ~"       500");
 58    test(fmt!{"%10d", -500}, ~"      -500");
 59    test(fmt!{"%10u", 500u}, ~"       500");
 60    test(fmt!{"%10s", ~"test"}, ~"      test");
 61    test(fmt!{"%10b", true}, ~"      true");
 62    test(fmt!{"%10x", 0xff_u}, ~"        ff");
 63    test(fmt!{"%10X", 0xff_u}, ~"        FF");
 64    test(fmt!{"%10o", 10u}, ~"        12");
 65    test(fmt!{"%10t", 0xff_u}, ~"  11111111");
 66    test(fmt!{"%10c", 'A'}, ~"         A");
 67    test(fmt!{"%10f", 5.82}, ~"      5.82");
 68    // Left justify
 69
 70    test(fmt!{"%-10d", 500}, ~"500       ");
 71    test(fmt!{"%-10d", -500}, ~"-500      ");
 72    test(fmt!{"%-10u", 500u}, ~"500       ");
 73    test(fmt!{"%-10s", ~"test"}, ~"test      ");
 74    test(fmt!{"%-10b", true}, ~"true      ");
 75    test(fmt!{"%-10x", 0xff_u}, ~"ff        ");
 76    test(fmt!{"%-10X", 0xff_u}, ~"FF        ");
 77    test(fmt!{"%-10o", 10u}, ~"12        ");
 78    test(fmt!{"%-10t", 0xff_u}, ~"11111111  ");
 79    test(fmt!{"%-10c", 'A'}, ~"A         ");
 80    test(fmt!{"%-10f", 5.82}, ~"5.82      ");
 81}
 82
 83fn part3() {
 84    // Precision
 85
 86    test(fmt!{"%.d", 0}, ~"");
 87    test(fmt!{"%.u", 0u}, ~"");
 88    test(fmt!{"%.x", 0u}, ~"");
 89    test(fmt!{"%.t", 0u}, ~"");
 90    test(fmt!{"%.d", 10}, ~"10");
 91    test(fmt!{"%.d", -10}, ~"-10");
 92    test(fmt!{"%.u", 10u}, ~"10");
 93    test(fmt!{"%.s", ~"test"}, ~"");
 94    test(fmt!{"%.x", 127u}, ~"7f");
 95    test(fmt!{"%.o", 10u}, ~"12");
 96    test(fmt!{"%.t", 3u}, ~"11");
 97    test(fmt!{"%.c", 'A'}, ~"A");
 98    test(fmt!{"%.f", 5.82}, ~"6");
 99    test(fmt!{"%.0d", 0}, ~"");
100    test(fmt!{"%.0u", 0u}, ~"");
101    test(fmt!{"%.0x", 0u}, ~"");
102    test(fmt!{"%.0t", 0u}, ~"");
103    test(fmt!{"%.0d", 10}, ~"10");
104    test(fmt!{"%.0d", -10}, ~"-10");
105    test(fmt!{"%.0u", 10u}, ~"10");
106    test(fmt!{"%.0s", ~"test"}, ~"");
107    test(fmt!{"%.0x", 127u}, ~"7f");
108    test(fmt!{"%.0o", 10u}, ~"12");
109    test(fmt!{"%.0t", 3u}, ~"11");
110    test(fmt!{"%.0c", 'A'}, ~"A");
111    test(fmt!{"%.0f", 5.892}, ~"6");
112    test(fmt!{"%.1d", 0}, ~"0");
113    test(fmt!{"%.1u", 0u}, ~"0");
114    test(fmt!{"%.1x", 0u}, ~"0");
115    test(fmt!{"%.1t", 0u}, ~"0");
116    test(fmt!{"%.1d", 10}, ~"10");
117    test(fmt!{"%.1d", -10}, ~"-10");
118    test(fmt!{"%.1u", 10u}, ~"10");
119    test(fmt!{"%.1s", ~"test"}, ~"t");
120    test(fmt!{"%.1x", 127u}, ~"7f");
121    test(fmt!{"%.1o", 10u}, ~"12");
122    test(fmt!{"%.1t", 3u}, ~"11");
123    test(fmt!{"%.1c", 'A'}, ~"A");
124    test(fmt!{"%.1f", 5.82}, ~"5.8");
125}
126fn part4() {
127    test(fmt!{"%.5d", 0}, ~"00000");
128    test(fmt!{"%.5u", 0u}, ~"00000");
129    test(fmt!{"%.5x", 0u}, ~"00000");
130    test(fmt!{"%.5t", 0u}, ~"00000");
131    test(fmt!{"%.5d", 10}, ~"00010");
132    test(fmt!{"%.5d", -10}, ~"-00010");
133    test(fmt!{"%.5u", 10u}, ~"00010");
134    test(fmt!{"%.5s", ~"test"}, ~"test");
135    test(fmt!{"%.5x", 127u}, ~"0007f");
136    test(fmt!{"%.5o", 10u}, ~"00012");
137    test(fmt!{"%.5t", 3u}, ~"00011");
138    test(fmt!{"%.5c", 'A'}, ~"A");
139    test(fmt!{"%.5f", 5.82}, ~"5.82000");
140    test(fmt!{"%.5f", 5.0}, ~"5.00000");
141    // Bool precision. I'm not sure if it's good or bad to have bool
142    // conversions support precision - it's not standard printf so we
143    // can do whatever. For now I'm making it behave the same as string
144    // conversions.
145
146    test(fmt!{"%.b", true}, ~"");
147    test(fmt!{"%.0b", true}, ~"");
148    test(fmt!{"%.1b", true}, ~"t");
149}
150
151fn part5() {
152    // Explicit + sign. Only for signed conversions
153
154    test(fmt!{"%+d", 0}, ~"+0");
155    test(fmt!{"%+d", 1}, ~"+1");
156    test(fmt!{"%+d", -1}, ~"-1");
157    test(fmt!{"%+f", 0.0}, ~"+0");
158    // Leave space for sign
159
160    test(fmt!{"% d", 0}, ~" 0");
161    test(fmt!{"% d", 1}, ~" 1");
162    test(fmt!{"% d", -1}, ~"-1");
163    test(fmt!{"% f", 0.0}, ~" 0");
164    // Plus overrides space
165
166    test(fmt!{"% +d", 0}, ~"+0");
167    test(fmt!{"%+ d", 0}, ~"+0");
168    test(fmt!{"% +f", 0.0}, ~"+0");
169    test(fmt!{"%+ f", 0.0}, ~"+0");
170    // 0-padding
171
172    test(fmt!{"%05d", 0}, ~"00000");
173    test(fmt!{"%05d", 1}, ~"00001");
174    test(fmt!{"%05d", -1}, ~"-0001");
175    test(fmt!{"%05u", 1u}, ~"00001");
176    test(fmt!{"%05x", 127u}, ~"0007f");
177    test(fmt!{"%05X", 127u}, ~"0007F");
178    test(fmt!{"%05o", 10u}, ~"00012");
179    test(fmt!{"%05t", 3u}, ~"00011");
180    test(fmt!{"%05f", 5.82}, ~"05.82");
181    // 0-padding a string is undefined but glibc does this:
182
183    test(fmt!{"%05s", ~"test"}, ~" test");
184    test(fmt!{"%05c", 'A'}, ~"    A");
185    test(fmt!{"%05b", true}, ~" true");
186    // Left-justify overrides 0-padding
187
188    test(fmt!{"%-05d", 0}, ~"0    ");
189    test(fmt!{"%-05d", 1}, ~"1    ");
190    test(fmt!{"%-05d", -1}, ~"-1   ");
191    test(fmt!{"%-05u", 1u}, ~"1    ");
192    test(fmt!{"%-05x", 127u}, ~"7f   ");
193    test(fmt!{"%-05X", 127u}, ~"7F   ");
194    test(fmt!{"%-05o", 10u}, ~"12   ");
195    test(fmt!{"%-05t", 3u}, ~"11   ");
196    test(fmt!{"%-05s", ~"test"}, ~"test ");
197    test(fmt!{"%-05c", 'A'}, ~"A    ");
198    test(fmt!{"%-05b", true}, ~"true ");
199    test(fmt!{"%-05f", 5.82}, ~"5.82 ");
200}
201fn part6() {
202    // Precision overrides 0-padding
203    // FIXME #2481: Recent gcc's report some of these as warnings
204
205    test(fmt!{"%06.5d", 0}, ~" 00000");
206    test(fmt!{"%06.5u", 0u}, ~" 00000");
207    test(fmt!{"%06.5x", 0u}, ~" 00000");
208    test(fmt!{"%06.5d", 10}, ~" 00010");
209    test(fmt!{"%06.5d", -10}, ~"-00010");
210    test(fmt!{"%06.5u", 10u}, ~" 00010");
211    test(fmt!{"%06.5s", ~"test"}, ~"  test");
212    test(fmt!{"%06.5c", 'A'}, ~"     A");
213    test(fmt!{"%06.5x", 127u}, ~" 0007f");
214    test(fmt!{"%06.5X", 127u}, ~" 0007F");
215    test(fmt!{"%06.5o", 10u}, ~" 00012");
216
217    // Precision does not override zero-padding for floats
218    test(fmt!{"%08.5f", 5.82}, ~"05.82000");
219
220    // Signed combinations
221
222    test(fmt!{"% 5d", 1}, ~"    1");
223    test(fmt!{"% 5d", -1}, ~"   -1");
224    test(fmt!{"%+5d", 1}, ~"   +1");
225    test(fmt!{"%+5d", -1}, ~"   -1");
226    test(fmt!{"% 05d", 1}, ~" 0001");
227    test(fmt!{"% 05d", -1}, ~"-0001");
228    test(fmt!{"%+05d", 1}, ~"+0001");
229    test(fmt!{"%+05d", -1}, ~"-0001");
230    test(fmt!{"%- 5d", 1}, ~" 1   ");
231    test(fmt!{"%- 5d", -1}, ~"-1   ");
232    test(fmt!{"%-+5d", 1}, ~"+1   ");
233    test(fmt!{"%-+5d", -1}, ~"-1   ");
234    test(fmt!{"%- 05d", 1}, ~" 1   ");
235    test(fmt!{"%- 05d", -1}, ~"-1   ");
236    test(fmt!{"%-+05d", 1}, ~"+1   ");
237    test(fmt!{"%-+05d", -1}, ~"-1   ");
238}
239
240fn percent() {
241    let s = fmt!{"ab%%cd"};
242    assert(s == ~"ab%cd");
243}
244
245fn more_floats() {
246    assert ~"3.1416"      == fmt!{"%.4f", 3.14159};
247    assert ~"3"           == fmt!{"%.0f", 3.14159};
248    assert ~"99"          == fmt!{"%.0f", 98.5};
249    assert ~"7.0000"      == fmt!{"%.4f", 6.999999999};
250    assert ~"3.141590000" == fmt!{"%.9f", 3.14159};
251}