2011-02-27 13:30:44 -06:00
|
|
|
use std;
|
2011-12-13 18:25:51 -06:00
|
|
|
import str;
|
2011-02-23 22:48:01 -06:00
|
|
|
|
2012-07-14 00:57:48 -05:00
|
|
|
fn test(actual: ~str, expected: ~str) {
|
2011-12-22 19:53:53 -06:00
|
|
|
log(debug, actual);
|
|
|
|
log(debug, expected);
|
2012-08-02 17:42:56 -05:00
|
|
|
assert (actual == expected);
|
2011-02-23 22:48:01 -06:00
|
|
|
}
|
|
|
|
|
2010-10-01 16:54:40 -05:00
|
|
|
fn main() {
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"hello %d friends and %s things", 10, ~"formatted"},
|
2012-07-14 00:57:48 -05:00
|
|
|
~"hello 10 friends and formatted things");
|
2011-06-21 09:49:40 -05:00
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"test"}, ~"test");
|
2011-06-21 09:49:40 -05:00
|
|
|
|
2011-07-13 17:44:09 -05:00
|
|
|
// a quadratic optimization in LLVM (jump-threading) makes this test a
|
2011-06-24 16:43:06 -05:00
|
|
|
// bit slow to compile unless we break it up
|
|
|
|
part1();
|
|
|
|
part2();
|
|
|
|
part3();
|
|
|
|
part4();
|
|
|
|
part5();
|
|
|
|
part6();
|
2012-01-21 15:20:03 -06:00
|
|
|
percent();
|
2012-06-02 18:45:20 -05:00
|
|
|
more_floats();
|
2011-06-24 16:43:06 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
fn part1() {
|
2011-06-15 13:19:50 -05:00
|
|
|
// Simple tests for types
|
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"%d", 1}, ~"1");
|
|
|
|
test(fmt!{"%i", 2}, ~"2");
|
|
|
|
test(fmt!{"%i", -1}, ~"-1");
|
|
|
|
test(fmt!{"%u", 10u}, ~"10");
|
|
|
|
test(fmt!{"%s", ~"test"}, ~"test");
|
|
|
|
test(fmt!{"%b", true}, ~"true");
|
|
|
|
test(fmt!{"%b", false}, ~"false");
|
|
|
|
test(fmt!{"%c", 'A'}, ~"A");
|
|
|
|
test(fmt!{"%x", 0xff_u}, ~"ff");
|
|
|
|
test(fmt!{"%X", 0x12ab_u}, ~"12AB");
|
|
|
|
test(fmt!{"%o", 10u}, ~"12");
|
|
|
|
test(fmt!{"%t", 0b11010101_u}, ~"11010101");
|
|
|
|
test(fmt!{"%f", 5.82}, ~"5.82");
|
2011-06-15 13:19:50 -05:00
|
|
|
// 32-bit limits
|
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"%i", -2147483648}, ~"-2147483648");
|
|
|
|
test(fmt!{"%i", 2147483647}, ~"2147483647");
|
|
|
|
test(fmt!{"%u", 4294967295u}, ~"4294967295");
|
|
|
|
test(fmt!{"%x", 0xffffffff_u}, ~"ffffffff");
|
|
|
|
test(fmt!{"%o", 0xffffffff_u}, ~"37777777777");
|
|
|
|
test(fmt!{"%t", 0xffffffff_u}, ~"11111111111111111111111111111111");
|
2011-06-24 16:43:06 -05:00
|
|
|
}
|
|
|
|
fn part2() {
|
2011-06-15 13:19:50 -05:00
|
|
|
// Widths
|
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"%1d", 500}, ~"500");
|
|
|
|
test(fmt!{"%10d", 500}, ~" 500");
|
|
|
|
test(fmt!{"%10d", -500}, ~" -500");
|
|
|
|
test(fmt!{"%10u", 500u}, ~" 500");
|
|
|
|
test(fmt!{"%10s", ~"test"}, ~" test");
|
|
|
|
test(fmt!{"%10b", true}, ~" true");
|
|
|
|
test(fmt!{"%10x", 0xff_u}, ~" ff");
|
|
|
|
test(fmt!{"%10X", 0xff_u}, ~" FF");
|
|
|
|
test(fmt!{"%10o", 10u}, ~" 12");
|
|
|
|
test(fmt!{"%10t", 0xff_u}, ~" 11111111");
|
|
|
|
test(fmt!{"%10c", 'A'}, ~" A");
|
|
|
|
test(fmt!{"%10f", 5.82}, ~" 5.82");
|
2011-06-15 13:19:50 -05:00
|
|
|
// Left justify
|
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"%-10d", 500}, ~"500 ");
|
|
|
|
test(fmt!{"%-10d", -500}, ~"-500 ");
|
|
|
|
test(fmt!{"%-10u", 500u}, ~"500 ");
|
|
|
|
test(fmt!{"%-10s", ~"test"}, ~"test ");
|
|
|
|
test(fmt!{"%-10b", true}, ~"true ");
|
|
|
|
test(fmt!{"%-10x", 0xff_u}, ~"ff ");
|
|
|
|
test(fmt!{"%-10X", 0xff_u}, ~"FF ");
|
|
|
|
test(fmt!{"%-10o", 10u}, ~"12 ");
|
|
|
|
test(fmt!{"%-10t", 0xff_u}, ~"11111111 ");
|
|
|
|
test(fmt!{"%-10c", 'A'}, ~"A ");
|
|
|
|
test(fmt!{"%-10f", 5.82}, ~"5.82 ");
|
2011-06-24 16:43:06 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
fn part3() {
|
2011-06-15 13:19:50 -05:00
|
|
|
// Precision
|
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"%.d", 0}, ~"");
|
|
|
|
test(fmt!{"%.u", 0u}, ~"");
|
|
|
|
test(fmt!{"%.x", 0u}, ~"");
|
|
|
|
test(fmt!{"%.t", 0u}, ~"");
|
|
|
|
test(fmt!{"%.d", 10}, ~"10");
|
|
|
|
test(fmt!{"%.d", -10}, ~"-10");
|
|
|
|
test(fmt!{"%.u", 10u}, ~"10");
|
|
|
|
test(fmt!{"%.s", ~"test"}, ~"");
|
|
|
|
test(fmt!{"%.x", 127u}, ~"7f");
|
|
|
|
test(fmt!{"%.o", 10u}, ~"12");
|
|
|
|
test(fmt!{"%.t", 3u}, ~"11");
|
|
|
|
test(fmt!{"%.c", 'A'}, ~"A");
|
|
|
|
test(fmt!{"%.f", 5.82}, ~"6");
|
|
|
|
test(fmt!{"%.0d", 0}, ~"");
|
|
|
|
test(fmt!{"%.0u", 0u}, ~"");
|
|
|
|
test(fmt!{"%.0x", 0u}, ~"");
|
|
|
|
test(fmt!{"%.0t", 0u}, ~"");
|
|
|
|
test(fmt!{"%.0d", 10}, ~"10");
|
|
|
|
test(fmt!{"%.0d", -10}, ~"-10");
|
|
|
|
test(fmt!{"%.0u", 10u}, ~"10");
|
|
|
|
test(fmt!{"%.0s", ~"test"}, ~"");
|
|
|
|
test(fmt!{"%.0x", 127u}, ~"7f");
|
|
|
|
test(fmt!{"%.0o", 10u}, ~"12");
|
|
|
|
test(fmt!{"%.0t", 3u}, ~"11");
|
|
|
|
test(fmt!{"%.0c", 'A'}, ~"A");
|
|
|
|
test(fmt!{"%.0f", 5.892}, ~"6");
|
|
|
|
test(fmt!{"%.1d", 0}, ~"0");
|
|
|
|
test(fmt!{"%.1u", 0u}, ~"0");
|
|
|
|
test(fmt!{"%.1x", 0u}, ~"0");
|
|
|
|
test(fmt!{"%.1t", 0u}, ~"0");
|
|
|
|
test(fmt!{"%.1d", 10}, ~"10");
|
|
|
|
test(fmt!{"%.1d", -10}, ~"-10");
|
|
|
|
test(fmt!{"%.1u", 10u}, ~"10");
|
|
|
|
test(fmt!{"%.1s", ~"test"}, ~"t");
|
|
|
|
test(fmt!{"%.1x", 127u}, ~"7f");
|
|
|
|
test(fmt!{"%.1o", 10u}, ~"12");
|
|
|
|
test(fmt!{"%.1t", 3u}, ~"11");
|
|
|
|
test(fmt!{"%.1c", 'A'}, ~"A");
|
|
|
|
test(fmt!{"%.1f", 5.82}, ~"5.8");
|
2011-06-24 16:43:06 -05:00
|
|
|
}
|
|
|
|
fn part4() {
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"%.5d", 0}, ~"00000");
|
|
|
|
test(fmt!{"%.5u", 0u}, ~"00000");
|
|
|
|
test(fmt!{"%.5x", 0u}, ~"00000");
|
|
|
|
test(fmt!{"%.5t", 0u}, ~"00000");
|
|
|
|
test(fmt!{"%.5d", 10}, ~"00010");
|
|
|
|
test(fmt!{"%.5d", -10}, ~"-00010");
|
|
|
|
test(fmt!{"%.5u", 10u}, ~"00010");
|
|
|
|
test(fmt!{"%.5s", ~"test"}, ~"test");
|
|
|
|
test(fmt!{"%.5x", 127u}, ~"0007f");
|
|
|
|
test(fmt!{"%.5o", 10u}, ~"00012");
|
|
|
|
test(fmt!{"%.5t", 3u}, ~"00011");
|
|
|
|
test(fmt!{"%.5c", 'A'}, ~"A");
|
|
|
|
test(fmt!{"%.5f", 5.82}, ~"5.82000");
|
|
|
|
test(fmt!{"%.5f", 5.0}, ~"5.00000");
|
2012-08-08 19:09:24 -05:00
|
|
|
test(fmt!{"%.100f", 1.1}, ~"1.1000000000000000888178419700125232338905334472656250000000000000000000000000000000000000000000000000");
|
|
|
|
|
2011-06-15 13:19:50 -05:00
|
|
|
// Bool precision. I'm not sure if it's good or bad to have bool
|
|
|
|
// conversions support precision - it's not standard printf so we
|
|
|
|
// can do whatever. For now I'm making it behave the same as string
|
|
|
|
// conversions.
|
2011-07-13 17:44:09 -05:00
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"%.b", true}, ~"");
|
|
|
|
test(fmt!{"%.0b", true}, ~"");
|
|
|
|
test(fmt!{"%.1b", true}, ~"t");
|
2011-06-24 16:43:06 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
fn part5() {
|
2011-06-15 13:19:50 -05:00
|
|
|
// Explicit + sign. Only for signed conversions
|
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"%+d", 0}, ~"+0");
|
|
|
|
test(fmt!{"%+d", 1}, ~"+1");
|
|
|
|
test(fmt!{"%+d", -1}, ~"-1");
|
|
|
|
test(fmt!{"%+f", 0.0}, ~"+0");
|
2011-06-15 13:19:50 -05:00
|
|
|
// Leave space for sign
|
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"% d", 0}, ~" 0");
|
|
|
|
test(fmt!{"% d", 1}, ~" 1");
|
|
|
|
test(fmt!{"% d", -1}, ~"-1");
|
|
|
|
test(fmt!{"% f", 0.0}, ~" 0");
|
2011-06-15 13:19:50 -05:00
|
|
|
// Plus overrides space
|
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"% +d", 0}, ~"+0");
|
|
|
|
test(fmt!{"%+ d", 0}, ~"+0");
|
|
|
|
test(fmt!{"% +f", 0.0}, ~"+0");
|
|
|
|
test(fmt!{"%+ f", 0.0}, ~"+0");
|
2011-06-15 13:19:50 -05:00
|
|
|
// 0-padding
|
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"%05d", 0}, ~"00000");
|
|
|
|
test(fmt!{"%05d", 1}, ~"00001");
|
|
|
|
test(fmt!{"%05d", -1}, ~"-0001");
|
|
|
|
test(fmt!{"%05u", 1u}, ~"00001");
|
|
|
|
test(fmt!{"%05x", 127u}, ~"0007f");
|
|
|
|
test(fmt!{"%05X", 127u}, ~"0007F");
|
|
|
|
test(fmt!{"%05o", 10u}, ~"00012");
|
|
|
|
test(fmt!{"%05t", 3u}, ~"00011");
|
|
|
|
test(fmt!{"%05f", 5.82}, ~"05.82");
|
2011-06-15 13:19:50 -05:00
|
|
|
// 0-padding a string is undefined but glibc does this:
|
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"%05s", ~"test"}, ~" test");
|
|
|
|
test(fmt!{"%05c", 'A'}, ~" A");
|
|
|
|
test(fmt!{"%05b", true}, ~" true");
|
2011-06-15 13:19:50 -05:00
|
|
|
// Left-justify overrides 0-padding
|
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"%-05d", 0}, ~"0 ");
|
|
|
|
test(fmt!{"%-05d", 1}, ~"1 ");
|
|
|
|
test(fmt!{"%-05d", -1}, ~"-1 ");
|
|
|
|
test(fmt!{"%-05u", 1u}, ~"1 ");
|
|
|
|
test(fmt!{"%-05x", 127u}, ~"7f ");
|
|
|
|
test(fmt!{"%-05X", 127u}, ~"7F ");
|
|
|
|
test(fmt!{"%-05o", 10u}, ~"12 ");
|
|
|
|
test(fmt!{"%-05t", 3u}, ~"11 ");
|
|
|
|
test(fmt!{"%-05s", ~"test"}, ~"test ");
|
|
|
|
test(fmt!{"%-05c", 'A'}, ~"A ");
|
|
|
|
test(fmt!{"%-05b", true}, ~"true ");
|
|
|
|
test(fmt!{"%-05f", 5.82}, ~"5.82 ");
|
2011-06-24 16:43:06 -05:00
|
|
|
}
|
2011-07-27 07:19:39 -05:00
|
|
|
fn part6() {
|
2011-06-15 13:19:50 -05:00
|
|
|
// Precision overrides 0-padding
|
2012-06-01 18:10:22 -05:00
|
|
|
// FIXME #2481: Recent gcc's report some of these as warnings
|
2011-06-15 13:19:50 -05:00
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"%06.5d", 0}, ~" 00000");
|
|
|
|
test(fmt!{"%06.5u", 0u}, ~" 00000");
|
|
|
|
test(fmt!{"%06.5x", 0u}, ~" 00000");
|
|
|
|
test(fmt!{"%06.5d", 10}, ~" 00010");
|
|
|
|
test(fmt!{"%06.5d", -10}, ~"-00010");
|
|
|
|
test(fmt!{"%06.5u", 10u}, ~" 00010");
|
|
|
|
test(fmt!{"%06.5s", ~"test"}, ~" test");
|
|
|
|
test(fmt!{"%06.5c", 'A'}, ~" A");
|
|
|
|
test(fmt!{"%06.5x", 127u}, ~" 0007f");
|
|
|
|
test(fmt!{"%06.5X", 127u}, ~" 0007F");
|
|
|
|
test(fmt!{"%06.5o", 10u}, ~" 00012");
|
2012-06-01 18:10:22 -05:00
|
|
|
|
|
|
|
// Precision does not override zero-padding for floats
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"%08.5f", 5.82}, ~"05.82000");
|
2012-06-01 18:10:22 -05:00
|
|
|
|
2011-06-15 13:19:50 -05:00
|
|
|
// Signed combinations
|
|
|
|
|
2012-07-30 18:01:07 -05:00
|
|
|
test(fmt!{"% 5d", 1}, ~" 1");
|
|
|
|
test(fmt!{"% 5d", -1}, ~" -1");
|
|
|
|
test(fmt!{"%+5d", 1}, ~" +1");
|
|
|
|
test(fmt!{"%+5d", -1}, ~" -1");
|
|
|
|
test(fmt!{"% 05d", 1}, ~" 0001");
|
|
|
|
test(fmt!{"% 05d", -1}, ~"-0001");
|
|
|
|
test(fmt!{"%+05d", 1}, ~"+0001");
|
|
|
|
test(fmt!{"%+05d", -1}, ~"-0001");
|
|
|
|
test(fmt!{"%- 5d", 1}, ~" 1 ");
|
|
|
|
test(fmt!{"%- 5d", -1}, ~"-1 ");
|
|
|
|
test(fmt!{"%-+5d", 1}, ~"+1 ");
|
|
|
|
test(fmt!{"%-+5d", -1}, ~"-1 ");
|
|
|
|
test(fmt!{"%- 05d", 1}, ~" 1 ");
|
|
|
|
test(fmt!{"%- 05d", -1}, ~"-1 ");
|
|
|
|
test(fmt!{"%-+05d", 1}, ~"+1 ");
|
|
|
|
test(fmt!{"%-+05d", -1}, ~"-1 ");
|
2011-08-19 17:16:48 -05:00
|
|
|
}
|
2012-01-21 15:20:03 -06:00
|
|
|
|
|
|
|
fn percent() {
|
2012-07-30 18:01:07 -05:00
|
|
|
let s = fmt!{"ab%%cd"};
|
2012-07-14 00:57:48 -05:00
|
|
|
assert(s == ~"ab%cd");
|
2012-01-21 15:20:03 -06:00
|
|
|
}
|
2012-06-02 18:45:20 -05:00
|
|
|
|
|
|
|
fn more_floats() {
|
2012-07-30 18:01:07 -05:00
|
|
|
assert ~"3.1416" == fmt!{"%.4f", 3.14159};
|
|
|
|
assert ~"3" == fmt!{"%.0f", 3.14159};
|
|
|
|
assert ~"99" == fmt!{"%.0f", 98.5};
|
|
|
|
assert ~"7.0000" == fmt!{"%.4f", 6.999999999};
|
|
|
|
assert ~"3.141590000" == fmt!{"%.9f", 3.14159};
|
2012-06-02 18:45:20 -05:00
|
|
|
}
|