use quote::quote;
use rust_test_core::test_params_source;
use std::sync::Mutex;
static ENV_MUTEX: Mutex<()> = Mutex::new(());
#[test]
fn test_test_params_source_errors() {
let _lock = ENV_MUTEX.lock().unwrap_or_else(|e| e.into_inner());
let attr = quote! { InvalidSource("path") };
let item = quote! { fn my_test(v: u32) {} };
let result = test_params_source(attr, item);
assert!(result.is_err());
assert!(
result
.unwrap_err()
.to_string()
.contains("Expected [`rust_test::SourceType`] variant")
);
let attr = quote! { JsonFile("tests/test_data/test_ddt_data.json") };
let item = quote! { fn my_test() {} };
let result = test_params_source(attr, item);
assert!(result.is_err());
assert!(
result
.unwrap_err()
.to_string()
.contains("test generation from source requires at least one parameter")
);
let attr = quote! { JsonFile("tests/test_data/test_ddt_data.json") };
let item = quote! { fn my_test(a: u32, b: u32) {} };
let result = test_params_source(attr, item);
assert!(result.is_ok());
let attr = quote! { JsonFile("non_existent.json") };
let item = quote! { fn my_test(v: u32) {} };
let result = test_params_source(attr, item);
assert!(result.is_err());
assert!(
result
.unwrap_err()
.to_string()
.contains("Could not read file")
);
let attr = quote! { JsonFile("tests/test_data/test_ddt_data.json", User) };
let item = quote! { fn my_test(v: User) {} };
let result = test_params_source(attr, item);
assert!(result.is_ok());
let attr = quote! { JsonFile::<User>("tests/test_data/test_ddt_data.json") };
let item = quote! { fn my_test(v: User) {} };
let result = test_params_source(attr, item);
assert!(result.is_ok());
}
#[test]
fn test_more_errors() {
let _lock = ENV_MUTEX.lock().unwrap_or_else(|e| e.into_inner());
let item = quote! { fn my_test(self) {} };
let attr = quote! { JsonFile("tests/test_data/test_ddt_data.json") };
let result = test_params_source(attr, item);
assert!(result.is_err());
assert!(result.unwrap_err().to_string().contains("Could not infer type"));
let item = quote! { fn my_test(v: [u32; 1]) {} };
let attr = quote! { JsonFile("tests/test_data/test_ddt_data.json") };
let result = test_params_source(attr, item);
assert!(result.is_ok()); }
#[test]
fn test_invalid_json() {
let _lock = ENV_MUTEX.lock().unwrap_or_else(|e| e.into_inner());
let attr = quote! { JsonFile("tests/test_data/invalid.json") };
let item = quote! { fn my_test(v: u32) {} };
let result = test_params_source(attr, item);
assert!(result.is_err());
assert!(
result
.unwrap_err()
.to_string()
.contains("Could not parse JSON file")
);
}
#[test]
fn test_value_variants_coverage() {
let _lock = ENV_MUTEX.lock().unwrap_or_else(|e| e.into_inner());
let attr = quote! { JsonFile("tests/test_data/test_null.json") };
let item = quote! { fn my_test(v: Option<u32>) {} };
let result = test_params_source(attr, item);
assert!(result.is_ok());
assert!(result.unwrap().to_string().contains("my_test__null"));
let attr = quote! { JsonFile("tests/test_data/test_bool.json") };
let item = quote! { fn my_test(v: bool) {} };
let result = test_params_source(attr, item);
assert!(result.is_ok());
let res_str = result.unwrap().to_string();
assert!(res_str.contains("my_test__true"));
assert!(res_str.contains("my_test__false"));
let attr = quote! { JsonFile("tests/test_data/test_single_bool.json") };
let item = quote! { fn my_test(v: bool) {} };
let result = test_params_source(attr, item);
assert!(result.is_ok());
let res_str = result.unwrap().to_string();
assert!(res_str.contains("fn my_test__true"));
}
#[test]
fn test_empty_suffix_variants() {
let _lock = ENV_MUTEX.lock().unwrap_or_else(|e| e.into_inner());
let attr = quote! { JsonFile("tests/test_data/test_empty_suffix.json") };
let item = quote! { fn my_test(v: String) {} };
let result = test_params_source(attr, item);
assert!(result.is_ok());
let res_str = result.unwrap().to_string();
assert!(res_str.contains("my_test___"));
assert!(res_str.contains("my_test____"));
assert!(res_str.contains("my_test_2"));
}
#[test]
fn test_source_type_parsing_errors() {
let _lock = ENV_MUTEX.lock().unwrap_or_else(|e| e.into_inner());
let item = quote! { fn my_test(v: User) {} };
let attr =
quote! { JsonFile::<User, Another>("tests/test_data/test_ddt_data.json") };
let result = test_params_source(attr, item.clone());
assert!(result.is_err());
assert!(
result
.unwrap_err()
.to_string()
.contains("Expected exactly one type argument")
);
let attr = quote! { JsonFile::<>("tests/test_data/test_ddt_data.json") };
let result = test_params_source(attr, item.clone());
assert!(result.is_err());
assert!(
result
.unwrap_err()
.to_string()
.contains("Expected exactly one type argument")
);
let attr = quote! { JsonFile::<10>("tests/test_data/test_ddt_data.json") };
let result = test_params_source(attr, item.clone());
assert!(result.is_err());
assert!(
result
.unwrap_err()
.to_string()
.contains("Expected a type argument")
);
let attr = quote! { UnknownVariant("path") };
let result = test_params_source(attr, item);
assert!(result.is_err());
assert!(result.unwrap_err().to_string().contains("Unknown variant"));
}
#[test]
fn test_is_vec_cases() {
let _lock = ENV_MUTEX.lock().unwrap_or_else(|e| e.into_inner());
let attr = quote! { JsonFile("tests/test_data/test_vec_of_vec.json") };
let item = quote! { fn my_test(v: Vec<u32>) {} };
let result = test_params_source(attr, item);
assert!(result.is_ok());
let attr = quote! { JsonFile("tests/test_data/test_single_vec.json") };
let item = quote! { fn my_test(v: Vec<u32>) {} };
let result = test_params_source(attr, item);
assert!(result.is_ok());
}
#[test]
fn test_comprehensive_coverage() {
let _lock = ENV_MUTEX.lock().unwrap_or_else(|e| e.into_inner());
let attr = quote! { JsonFile("tests/test_data/test_all_variants.json") };
let item = quote! { fn my_test(v: serde_json::Value) {} };
let result = test_params_source(attr, item);
assert!(result.is_ok());
let res_str = result.unwrap().to_string();
assert!(res_str.contains("my_test__1_2_true_a_b"));
}
#[test]
fn test_single_empty_suffix() {
let _lock = ENV_MUTEX.lock().unwrap_or_else(|e| e.into_inner());
let attr = quote! { JsonFile("tests/test_data/test_single_empty.json") };
let item = quote! { fn my_test(v: String) {} };
let result = test_params_source(attr, item);
assert!(result.is_ok());
let res_str = result.unwrap().to_string();
assert!(res_str.contains("fn my_test ()"));
}
#[test]
fn test_invalid_function_error() {
let _lock = ENV_MUTEX.lock().unwrap_or_else(|e| e.into_inner());
let attr = quote! { JsonFile("tests/test_data/test_ddt_data.json") };
let item = quote! { struct NotAFunction; };
let result = test_params_source(attr, item);
assert!(result.is_err());
assert!(result.unwrap_err().to_string().contains("Expected a function"));
}
#[test]
fn test_cargo_manifest_dir_not_set() {
let _lock = ENV_MUTEX.lock().unwrap_or_else(|e| e.into_inner());
let attr = quote! { JsonFile("some.json") };
let item = quote! { fn my_test(v: u32) {} };
let original_manifest_dir = std::env::var_os("CARGO_MANIFEST_DIR");
unsafe {
std::env::remove_var("CARGO_MANIFEST_DIR");
}
let result = test_params_source(attr, item);
if let Some(val) = original_manifest_dir {
unsafe {
std::env::set_var("CARGO_MANIFEST_DIR", val);
}
}
assert!(result.is_err());
assert!(result.unwrap_err().to_string().contains("CARGO_MANIFEST_DIR not set"));
}
#[test]
fn test_invalid_utf8_path() {
let _lock = ENV_MUTEX.lock().unwrap_or_else(|e| e.into_inner());
use std::ffi::OsString;
use std::os::unix::ffi::OsStringExt;
let attr = quote! { JsonFile("some.json") };
let item = quote! { fn my_test(v: u32) {} };
let original_manifest_dir = std::env::var_os("CARGO_MANIFEST_DIR");
let invalid_utf8 = OsString::from_vec(vec![0xff, 0xfe, 0xfd]);
unsafe {
std::env::set_var("CARGO_MANIFEST_DIR", &invalid_utf8);
}
let result = test_params_source(attr, item);
if let Some(val) = original_manifest_dir {
unsafe {
std::env::set_var("CARGO_MANIFEST_DIR", &val);
}
}
assert!(result.is_err());
assert!(result.unwrap_err().to_string().contains("Path contains invalid UTF-8"));
}