/src/librustdoc/doctest/tests.rs

https://gitlab.com/rust-lang/rust · Rust · 300 lines · 254 code · 24 blank · 22 comment · 0 complexity · 3ef067d7f30ff992fcd31dde08c3c538 MD5 · raw file

  1. use super::{make_test, GlobalTestOptions};
  2. use rustc_span::edition::DEFAULT_EDITION;
  3. #[test]
  4. fn make_test_basic() {
  5. //basic use: wraps with `fn main`, adds `#![allow(unused)]`
  6. let opts = GlobalTestOptions::default();
  7. let input = "assert_eq!(2+2, 4);";
  8. let expected = "#![allow(unused)]
  9. fn main() {
  10. assert_eq!(2+2, 4);
  11. }"
  12. .to_string();
  13. let (output, len, _) = make_test(input, None, false, &opts, DEFAULT_EDITION, None);
  14. assert_eq!((output, len), (expected, 2));
  15. }
  16. #[test]
  17. fn make_test_crate_name_no_use() {
  18. // If you give a crate name but *don't* use it within the test, it won't bother inserting
  19. // the `extern crate` statement.
  20. let opts = GlobalTestOptions::default();
  21. let input = "assert_eq!(2+2, 4);";
  22. let expected = "#![allow(unused)]
  23. fn main() {
  24. assert_eq!(2+2, 4);
  25. }"
  26. .to_string();
  27. let (output, len, _) = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION, None);
  28. assert_eq!((output, len), (expected, 2));
  29. }
  30. #[test]
  31. fn make_test_crate_name() {
  32. // If you give a crate name and use it within the test, it will insert an `extern crate`
  33. // statement before `fn main`.
  34. let opts = GlobalTestOptions::default();
  35. let input = "use asdf::qwop;
  36. assert_eq!(2+2, 4);";
  37. let expected = "#![allow(unused)]
  38. extern crate r#asdf;
  39. fn main() {
  40. use asdf::qwop;
  41. assert_eq!(2+2, 4);
  42. }"
  43. .to_string();
  44. let (output, len, _) = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION, None);
  45. assert_eq!((output, len), (expected, 3));
  46. }
  47. #[test]
  48. fn make_test_no_crate_inject() {
  49. // Even if you do use the crate within the test, setting `opts.no_crate_inject` will skip
  50. // adding it anyway.
  51. let opts = GlobalTestOptions { no_crate_inject: true, attrs: vec![] };
  52. let input = "use asdf::qwop;
  53. assert_eq!(2+2, 4);";
  54. let expected = "#![allow(unused)]
  55. fn main() {
  56. use asdf::qwop;
  57. assert_eq!(2+2, 4);
  58. }"
  59. .to_string();
  60. let (output, len, _) = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION, None);
  61. assert_eq!((output, len), (expected, 2));
  62. }
  63. #[test]
  64. fn make_test_ignore_std() {
  65. // Even if you include a crate name, and use it in the doctest, we still won't include an
  66. // `extern crate` statement if the crate is "std" -- that's included already by the
  67. // compiler!
  68. let opts = GlobalTestOptions::default();
  69. let input = "use std::*;
  70. assert_eq!(2+2, 4);";
  71. let expected = "#![allow(unused)]
  72. fn main() {
  73. use std::*;
  74. assert_eq!(2+2, 4);
  75. }"
  76. .to_string();
  77. let (output, len, _) = make_test(input, Some("std"), false, &opts, DEFAULT_EDITION, None);
  78. assert_eq!((output, len), (expected, 2));
  79. }
  80. #[test]
  81. fn make_test_manual_extern_crate() {
  82. // When you manually include an `extern crate` statement in your doctest, `make_test`
  83. // assumes you've included one for your own crate too.
  84. let opts = GlobalTestOptions::default();
  85. let input = "extern crate asdf;
  86. use asdf::qwop;
  87. assert_eq!(2+2, 4);";
  88. let expected = "#![allow(unused)]
  89. extern crate asdf;
  90. fn main() {
  91. use asdf::qwop;
  92. assert_eq!(2+2, 4);
  93. }"
  94. .to_string();
  95. let (output, len, _) = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION, None);
  96. assert_eq!((output, len), (expected, 2));
  97. }
  98. #[test]
  99. fn make_test_manual_extern_crate_with_macro_use() {
  100. let opts = GlobalTestOptions::default();
  101. let input = "#[macro_use] extern crate asdf;
  102. use asdf::qwop;
  103. assert_eq!(2+2, 4);";
  104. let expected = "#![allow(unused)]
  105. #[macro_use] extern crate asdf;
  106. fn main() {
  107. use asdf::qwop;
  108. assert_eq!(2+2, 4);
  109. }"
  110. .to_string();
  111. let (output, len, _) = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION, None);
  112. assert_eq!((output, len), (expected, 2));
  113. }
  114. #[test]
  115. fn make_test_opts_attrs() {
  116. // If you supplied some doctest attributes with `#![doc(test(attr(...)))]`, it will use
  117. // those instead of the stock `#![allow(unused)]`.
  118. let mut opts = GlobalTestOptions::default();
  119. opts.attrs.push("feature(sick_rad)".to_string());
  120. let input = "use asdf::qwop;
  121. assert_eq!(2+2, 4);";
  122. let expected = "#![feature(sick_rad)]
  123. extern crate r#asdf;
  124. fn main() {
  125. use asdf::qwop;
  126. assert_eq!(2+2, 4);
  127. }"
  128. .to_string();
  129. let (output, len, _) = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION, None);
  130. assert_eq!((output, len), (expected, 3));
  131. // Adding more will also bump the returned line offset.
  132. opts.attrs.push("feature(hella_dope)".to_string());
  133. let expected = "#![feature(sick_rad)]
  134. #![feature(hella_dope)]
  135. extern crate r#asdf;
  136. fn main() {
  137. use asdf::qwop;
  138. assert_eq!(2+2, 4);
  139. }"
  140. .to_string();
  141. let (output, len, _) = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION, None);
  142. assert_eq!((output, len), (expected, 4));
  143. }
  144. #[test]
  145. fn make_test_crate_attrs() {
  146. // Including inner attributes in your doctest will apply them to the whole "crate", pasting
  147. // them outside the generated main function.
  148. let opts = GlobalTestOptions::default();
  149. let input = "#![feature(sick_rad)]
  150. assert_eq!(2+2, 4);";
  151. let expected = "#![allow(unused)]
  152. #![feature(sick_rad)]
  153. fn main() {
  154. assert_eq!(2+2, 4);
  155. }"
  156. .to_string();
  157. let (output, len, _) = make_test(input, None, false, &opts, DEFAULT_EDITION, None);
  158. assert_eq!((output, len), (expected, 2));
  159. }
  160. #[test]
  161. fn make_test_with_main() {
  162. // Including your own `fn main` wrapper lets the test use it verbatim.
  163. let opts = GlobalTestOptions::default();
  164. let input = "fn main() {
  165. assert_eq!(2+2, 4);
  166. }";
  167. let expected = "#![allow(unused)]
  168. fn main() {
  169. assert_eq!(2+2, 4);
  170. }"
  171. .to_string();
  172. let (output, len, _) = make_test(input, None, false, &opts, DEFAULT_EDITION, None);
  173. assert_eq!((output, len), (expected, 1));
  174. }
  175. #[test]
  176. fn make_test_fake_main() {
  177. // ... but putting it in a comment will still provide a wrapper.
  178. let opts = GlobalTestOptions::default();
  179. let input = "//Ceci n'est pas une `fn main`
  180. assert_eq!(2+2, 4);";
  181. let expected = "#![allow(unused)]
  182. //Ceci n'est pas une `fn main`
  183. fn main() {
  184. assert_eq!(2+2, 4);
  185. }"
  186. .to_string();
  187. let (output, len, _) = make_test(input, None, false, &opts, DEFAULT_EDITION, None);
  188. assert_eq!((output, len), (expected, 2));
  189. }
  190. #[test]
  191. fn make_test_dont_insert_main() {
  192. // Even with that, if you set `dont_insert_main`, it won't create the `fn main` wrapper.
  193. let opts = GlobalTestOptions::default();
  194. let input = "//Ceci n'est pas une `fn main`
  195. assert_eq!(2+2, 4);";
  196. let expected = "#![allow(unused)]
  197. //Ceci n'est pas une `fn main`
  198. assert_eq!(2+2, 4);"
  199. .to_string();
  200. let (output, len, _) = make_test(input, None, true, &opts, DEFAULT_EDITION, None);
  201. assert_eq!((output, len), (expected, 1));
  202. }
  203. #[test]
  204. fn make_test_issues_21299_33731() {
  205. let opts = GlobalTestOptions::default();
  206. let input = "// fn main
  207. assert_eq!(2+2, 4);";
  208. let expected = "#![allow(unused)]
  209. // fn main
  210. fn main() {
  211. assert_eq!(2+2, 4);
  212. }"
  213. .to_string();
  214. let (output, len, _) = make_test(input, None, false, &opts, DEFAULT_EDITION, None);
  215. assert_eq!((output, len), (expected, 2));
  216. let input = "extern crate hella_qwop;
  217. assert_eq!(asdf::foo, 4);";
  218. let expected = "#![allow(unused)]
  219. extern crate hella_qwop;
  220. extern crate r#asdf;
  221. fn main() {
  222. assert_eq!(asdf::foo, 4);
  223. }"
  224. .to_string();
  225. let (output, len, _) = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION, None);
  226. assert_eq!((output, len), (expected, 3));
  227. }
  228. #[test]
  229. fn make_test_main_in_macro() {
  230. let opts = GlobalTestOptions::default();
  231. let input = "#[macro_use] extern crate my_crate;
  232. test_wrapper! {
  233. fn main() {}
  234. }";
  235. let expected = "#![allow(unused)]
  236. #[macro_use] extern crate my_crate;
  237. test_wrapper! {
  238. fn main() {}
  239. }"
  240. .to_string();
  241. let (output, len, _) = make_test(input, Some("my_crate"), false, &opts, DEFAULT_EDITION, None);
  242. assert_eq!((output, len), (expected, 1));
  243. }
  244. #[test]
  245. fn make_test_returns_result() {
  246. // creates an inner function and unwraps it
  247. let opts = GlobalTestOptions::default();
  248. let input = "use std::io;
  249. let mut input = String::new();
  250. io::stdin().read_line(&mut input)?;
  251. Ok::<(), io:Error>(())";
  252. let expected = "#![allow(unused)]
  253. fn main() { fn _inner() -> Result<(), impl core::fmt::Debug> {
  254. use std::io;
  255. let mut input = String::new();
  256. io::stdin().read_line(&mut input)?;
  257. Ok::<(), io:Error>(())
  258. } _inner().unwrap() }"
  259. .to_string();
  260. let (output, len, _) = make_test(input, None, false, &opts, DEFAULT_EDITION, None);
  261. assert_eq!((output, len), (expected, 2));
  262. }
  263. #[test]
  264. fn make_test_named_wrapper() {
  265. // creates an inner function with a specific name
  266. let opts = GlobalTestOptions::default();
  267. let input = "assert_eq!(2+2, 4);";
  268. let expected = "#![allow(unused)]
  269. fn main() { #[allow(non_snake_case)] fn _doctest_main__some_unique_name() {
  270. assert_eq!(2+2, 4);
  271. } _doctest_main__some_unique_name() }"
  272. .to_string();
  273. let (output, len, _) =
  274. make_test(input, None, false, &opts, DEFAULT_EDITION, Some("_some_unique_name"));
  275. assert_eq!((output, len), (expected, 2));
  276. }