use super::{TestOptions, make_test}; use syntax::edition::DEFAULT_EDITION; #[test] fn make_test_basic() { //basic use: wraps with `fn main`, adds `#![allow(unused)]` let opts = TestOptions::default(); let input = "assert_eq!(2+2, 4);"; let expected = "#![allow(unused)] fn main() { assert_eq!(2+2, 4); }".to_string(); let output = make_test(input, None, false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } #[test] fn make_test_crate_name_no_use() { // If you give a crate name but *don't* use it within the test, it won't bother inserting // the `extern crate` statement. let opts = TestOptions::default(); let input = "assert_eq!(2+2, 4);"; let expected = "#![allow(unused)] fn main() { assert_eq!(2+2, 4); }".to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } #[test] fn make_test_crate_name() { // If you give a crate name and use it within the test, it will insert an `extern crate` // statement before `fn main`. let opts = TestOptions::default(); let input = "use asdf::qwop; assert_eq!(2+2, 4);"; let expected = "#![allow(unused)] extern crate asdf; fn main() { use asdf::qwop; assert_eq!(2+2, 4); }".to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 3)); } #[test] fn make_test_no_crate_inject() { // Even if you do use the crate within the test, setting `opts.no_crate_inject` will skip // adding it anyway. let opts = TestOptions { no_crate_inject: true, display_warnings: false, attrs: vec![], }; let input = "use asdf::qwop; assert_eq!(2+2, 4);"; let expected = "#![allow(unused)] fn main() { use asdf::qwop; assert_eq!(2+2, 4); }".to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } #[test] fn make_test_ignore_std() { // Even if you include a crate name, and use it in the doctest, we still won't include an // `extern crate` statement if the crate is "std" -- that's included already by the // compiler! let opts = TestOptions::default(); let input = "use std::*; assert_eq!(2+2, 4);"; let expected = "#![allow(unused)] fn main() { use std::*; assert_eq!(2+2, 4); }".to_string(); let output = make_test(input, Some("std"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } #[test] fn make_test_manual_extern_crate() { // When you manually include an `extern crate` statement in your doctest, `make_test` // assumes you've included one for your own crate too. let opts = TestOptions::default(); let input = "extern crate asdf; use asdf::qwop; assert_eq!(2+2, 4);"; let expected = "#![allow(unused)] extern crate asdf; fn main() { use asdf::qwop; assert_eq!(2+2, 4); }".to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } #[test] fn make_test_manual_extern_crate_with_macro_use() { let opts = TestOptions::default(); let input = "#[macro_use] extern crate asdf; use asdf::qwop; assert_eq!(2+2, 4);"; let expected = "#![allow(unused)] #[macro_use] extern crate asdf; fn main() { use asdf::qwop; assert_eq!(2+2, 4); }".to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } #[test] fn make_test_opts_attrs() { // If you supplied some doctest attributes with `#![doc(test(attr(...)))]`, it will use // those instead of the stock `#![allow(unused)]`. let mut opts = TestOptions::default(); opts.attrs.push("feature(sick_rad)".to_string()); let input = "use asdf::qwop; assert_eq!(2+2, 4);"; let expected = "#![feature(sick_rad)] extern crate asdf; fn main() { use asdf::qwop; assert_eq!(2+2, 4); }".to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 3)); // Adding more will also bump the returned line offset. opts.attrs.push("feature(hella_dope)".to_string()); let expected = "#![feature(sick_rad)] #![feature(hella_dope)] extern crate asdf; fn main() { use asdf::qwop; assert_eq!(2+2, 4); }".to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 4)); } #[test] fn make_test_crate_attrs() { // Including inner attributes in your doctest will apply them to the whole "crate", pasting // them outside the generated main function. let opts = TestOptions::default(); let input = "#![feature(sick_rad)] assert_eq!(2+2, 4);"; let expected = "#![allow(unused)] #![feature(sick_rad)] fn main() { assert_eq!(2+2, 4); }".to_string(); let output = make_test(input, None, false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } #[test] fn make_test_with_main() { // Including your own `fn main` wrapper lets the test use it verbatim. let opts = TestOptions::default(); let input = "fn main() { assert_eq!(2+2, 4); }"; let expected = "#![allow(unused)] fn main() { assert_eq!(2+2, 4); }".to_string(); let output = make_test(input, None, false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 1)); } #[test] fn make_test_fake_main() { // ... but putting it in a comment will still provide a wrapper. let opts = TestOptions::default(); let input = "//Ceci n'est pas une `fn main` assert_eq!(2+2, 4);"; let expected = "#![allow(unused)] //Ceci n'est pas une `fn main` fn main() { assert_eq!(2+2, 4); }".to_string(); let output = make_test(input, None, false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); } #[test] fn make_test_dont_insert_main() { // Even with that, if you set `dont_insert_main`, it won't create the `fn main` wrapper. let opts = TestOptions::default(); let input = "//Ceci n'est pas une `fn main` assert_eq!(2+2, 4);"; let expected = "#![allow(unused)] //Ceci n'est pas une `fn main` assert_eq!(2+2, 4);".to_string(); let output = make_test(input, None, true, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 1)); } #[test] fn make_test_display_warnings() { // If the user is asking to display doctest warnings, suppress the default `allow(unused)`. let mut opts = TestOptions::default(); opts.display_warnings = true; let input = "assert_eq!(2+2, 4);"; let expected = "fn main() { assert_eq!(2+2, 4); }".to_string(); let output = make_test(input, None, false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 1)); } #[test] fn make_test_issues_21299_33731() { let opts = TestOptions::default(); let input = "// fn main assert_eq!(2+2, 4);"; let expected = "#![allow(unused)] // fn main fn main() { assert_eq!(2+2, 4); }".to_string(); let output = make_test(input, None, false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 2)); let input = "extern crate hella_qwop; assert_eq!(asdf::foo, 4);"; let expected = "#![allow(unused)] extern crate hella_qwop; extern crate asdf; fn main() { assert_eq!(asdf::foo, 4); }".to_string(); let output = make_test(input, Some("asdf"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 3)); } #[test] fn make_test_main_in_macro() { let opts = TestOptions::default(); let input = "#[macro_use] extern crate my_crate; test_wrapper! { fn main() {} }"; let expected = "#![allow(unused)] #[macro_use] extern crate my_crate; test_wrapper! { fn main() {} }".to_string(); let output = make_test(input, Some("my_crate"), false, &opts, DEFAULT_EDITION); assert_eq!(output, (expected, 1)); }