#![cfg(any(
not(any(
feature = "parser_tests",
feature = "analyzer_tests",
feature = "codegen_tests",
feature = "interpreter_tests",
feature = "conformance_tests",
feature = "integration_tests",
)),
feature = "analyzer_tests",
))]
#[path = "common/test_utils.rs"]
mod test_utils;
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_unit_struct_simple() {
let code = r#"
pub struct Marker;
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
generated.contains("pub struct Marker;"),
"Unit struct should end with semicolon. Generated:\n{}",
generated
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_unit_struct_with_impl() {
let code = r#"
pub struct Logger;
impl Logger {
pub fn log(self, message: string) -> int {
return message.len() as int
}
}
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
generated.contains("pub struct Logger;"),
"Unit struct should be generated. Generated:\n{}",
generated
);
assert!(
generated.contains("impl Logger {"),
"Impl block should be generated. Generated:\n{}",
generated
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_unit_struct_multiple() {
let code = r#"
pub struct TypeA;
pub struct TypeB;
pub struct TypeC;
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
generated.contains("pub struct TypeA;"),
"TypeA should be generated. Generated:\n{}",
generated
);
assert!(
generated.contains("pub struct TypeB;"),
"TypeB should be generated. Generated:\n{}",
generated
);
assert!(
generated.contains("pub struct TypeC;"),
"TypeC should be generated. Generated:\n{}",
generated
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_unit_struct_with_trait_impl() {
let code = r#"
pub trait Processor {
fn process(self) -> int;
}
pub struct SimpleProcessor;
impl Processor for SimpleProcessor {
fn process(self) -> int {
return 42
}
}
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
generated.contains("pub struct SimpleProcessor;"),
"Unit struct should be generated. Generated:\n{}",
generated
);
assert!(
generated.contains("impl Processor for SimpleProcessor"),
"Trait impl should be generated. Generated:\n{}",
generated
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_unit_struct_instantiation() {
let code = r#"
pub struct Token;
pub fn create_token() -> Token {
return Token
}
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
generated.contains("pub struct Token;"),
"Unit struct should be generated. Generated:\n{}",
generated
);
assert!(
generated.contains("Token\n}") || generated.contains("return Token;"),
"Unit struct instantiation should be simple name. Generated:\n{}",
generated
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_unit_struct_with_visibility() {
let code = r#"
pub struct Public;
struct Private;
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
generated.contains("pub struct Public;"),
"Public unit struct should have pub. Generated:\n{}",
generated
);
assert!(
generated.contains("struct Private;") || generated.contains("pub(crate) struct Private;"),
"Private unit struct should be generated. Generated:\n{}",
generated
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_unit_struct_with_decorators() {
let code = r#"
@derive(Debug, Clone, Copy)
pub struct Marker;
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
generated.contains("pub struct Marker;"),
"Unit struct should be generated. Generated:\n{}",
generated
);
assert!(
generated.contains("Debug, Clone, Copy"),
"@derive(Debug, Clone, Copy) must appear in merged #[derive(...)]. Generated:\n{}",
generated
);
}