use super::{make_test, TestOptions};
use rustc_span::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));
}
