/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

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