use lazy_static::lazy_static;
use temp_testdir::TempDir;
use rstest::rstest;
use rstest_test::*;
lazy_static! {
static ref ROOT_DIR: TempDir = TempDir::default().permanent();
static ref ROOT_PROJECT: Project = Project::new(ROOT_DIR.as_ref());
}
fn prj() -> Project {
let prj_name = sanitize_name(utils::testname());
ROOT_PROJECT.subproject(&prj_name)
}
#[rstest]
#[case::default_conf(TestResults::new())]
#[case::contains(TestResults::new().with_contains(true))]
fn one_success(#[case] results: TestResults<&str>) {
let project = prj();
project.append_code(
r#"
#[test]
fn success() {
assert!(true);
}
"#,
);
let output = project.run_tests().unwrap();
results.ok("success").assert(output);
}
#[rstest]
#[case::default_conf(TestResults::new())]
#[case::contains(TestResults::new().with_contains(true))]
fn one_fail(#[case] results: TestResults<&str>) {
let project = prj();
project.append_code(
r#"
#[test]
fn fail() {
assert!(false);
}
"#,
);
let output = project.run_tests().unwrap();
results.fail("fail").assert(output);
}
#[rstest]
#[case::default_conf(TestResults::new())]
#[case::contains(TestResults::new().with_contains(true))]
fn more_tests(#[case] results: TestResults<&str>) {
let project = prj();
project.append_code(
r#"
#[test]
fn success() {
assert!(true);
}
#[test]
fn fail() {
assert!(false);
}
#[test]
fn eq() {
assert_eq!(1, 1);
}
#[test]
fn no_eq() {
assert_eq!(1, 2);
}
"#,
);
let output = project.run_tests().unwrap();
results
.ok("success")
.ok("eq")
.fail("fail")
.fail("no_eq")
.assert(output);
}
#[rstest]
#[case::default_conf(TestResults::new())]
#[case::contains(TestResults::new().with_contains(true))]
fn tests_with_should_panic(#[case] results: TestResults<&str>) {
let project = prj();
project.append_code(
r#"
#[test]
#[should_panic]
fn success() {
assert!(false);
}
#[test]
#[should_panic]
fn fail() {
assert!(true);
}
"#,
);
let output = project.run_tests().unwrap();
results.ok("success").fail("fail").assert(output);
}
#[test]
fn should_check_just_contains_conf() {
let project = prj();
project.append_code(
r#"
#[test]
fn success() {
assert!(true);
}
#[test]
fn fail() {
assert!(false);
}
#[test]
fn eq() {
assert_eq!(1, 1);
}
#[test]
fn two_eq() {
assert_eq!(2, 2);
}
#[test]
fn enq() {
assert_eq!(1, 2);
}
#[test]
fn two_enq() {
assert_eq!(1, 3);
}
"#,
);
let output = project.run_tests().unwrap();
let results = TestResults::new().with_contains(true);
results
.ok("suc")
.ok_times("eq", 2)
.fail("fai")
.fail_times("enq", 2)
.assert(output);
}
#[test]
fn should_check_just_contains_on_some_test() {
let project = prj();
project.append_code(
r#"
#[test]
fn success() {
assert!(true);
}
#[test]
fn fail() {
assert!(false);
}
#[test]
fn eq() {
assert_eq!(1, 1);
}
#[test]
fn two_eq() {
assert_eq!(2, 2);
}
#[test]
fn enq() {
assert_eq!(1, 2);
}
#[test]
fn two_enq() {
assert_eq!(1, 3);
}
"#,
);
let output = project.run_tests().unwrap();
let results = TestResults::new();
results
.ok("success")
.ok_with("eq", false, 2)
.fail("fail")
.fail("enq")
.fail("two_enq")
.assert(output);
}
#[test]
fn should_check_some_tests_as_contains() {
let project = prj();
project.append_code(
r#"
#[test]
fn case_1() {
assert!(true);
}
#[test]
fn case_2_aa() {
assert!(true);
}
#[test]
fn case_3_b() {
assert!(false);
}
"#,
);
let output = project.run_tests().unwrap();
let results = TestResults::new();
results
.ok("case_1")
.ok_in("case_2")
.fail_in("case_3")
.assert(output);
}
#[test]
#[should_panic]
fn should_dont_wrongly_check_contains() {
let project = prj();
project.append_code(
r#"
#[test]
fn case_1_aa() {
assert!(true);
}
"#,
);
let output = project.run_tests().unwrap();
let results = TestResults::new();
results.ok("case_1").assert(output);
}
#[test]
#[should_panic(expected = "but wrong count")]
fn should_detect_wrong_contains() {
let project = prj();
project.append_code(
r#"
#[test]
fn case_1() {
assert!(true);
}
#[test]
fn case_2() {
assert!(true);
}
#[test]
fn case_3() {
assert!(true);
}
"#,
);
let output = project.run_tests().unwrap();
let results = TestResults::new();
results
.ok("case_3")
.ok_with("case", false, 2)
.assert(output);
}
#[test]
fn nocapture_in_tests() {
let project = prj().with_nocapture();
project.append_code(
r#"
#[test]
fn success() {
println!("Some output");
}
"#,
);
let output = project.run_tests().unwrap();
assert_in!(output.stdout.str(), "Some output")
}
#[test]
fn add_local_dependency() {
let project = prj();
project.add_local_dependency("rstest_test");
project.append_code(
r#"
use rstest_test::assert_in;
#[test]
fn success() {
assert_in!("foo bar baz", "bar");
}
"#,
);
let output = project.run_tests().unwrap();
TestResults::new().ok("success").assert(output);
}