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);
|
2011-09-01 19:27:58 -05:00
|
|
|
assert (str::eq(actual, expected));
|
2011-02-23 22:48:01 -06:00
|
|
|
}
|
|
|
|
|
2010-10-01 16:54:40 -05:00
|
|
|
fn main() {
|
2012-07-14 00:57:48 -05:00
|
|
|
test(#fmt["hello %d friends and %s things", 10, ~"formatted"],
|
|
|
|
~"hello 10 friends and formatted things");
|
2011-06-21 09:49:40 -05:00
|
|
|
|
2012-07-14 00:57:48 -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-14 00:57:48 -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-14 00:57:48 -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-14 00:57:48 -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-14 00:57:48 -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-14 00:57:48 -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-14 00:57:48 -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");
|
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-14 00:57:48 -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-14 00:57:48 -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-14 00:57:48 -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-14 00:57:48 -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-14 00:57:48 -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-14 00:57:48 -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-14 00:57:48 -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-14 00:57:48 -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-14 00:57:48 -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-14 00:57:48 -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() {
|
|
|
|
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-14 00:57:48 -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
|
|
|
}
|