use crate::error::Result;
use crate::types::analysis::CliAnalysis;
use crate::types::test_case::TestCategory;
pub trait TestGenerator {
fn generate(&self, analysis: &CliAnalysis, category: TestCategory) -> Result<String>;
fn generate_all(&self, analysis: &CliAnalysis) -> Result<Vec<(TestCategory, String)>> {
let categories = TestCategory::standard_categories();
let mut results = Vec::new();
for category in categories {
let test_code = self.generate(analysis, category)?;
results.push((category, test_code));
}
Ok(results)
}
fn file_extension(&self) -> &str;
fn name(&self) -> &str;
}
pub fn create_generator(format: &str) -> Result<Box<dyn TestGenerator>> {
match format.to_lowercase().as_str() {
"bats" => {
Err(crate::error::CliTestError::InvalidFormat(
"BATS generator not yet refactored to use TestGenerator trait".to_string(),
))
}
"assert_cmd" | "assert-cmd" => {
Err(crate::error::CliTestError::InvalidFormat(
"AssertCmdGenerator not yet implemented".to_string(),
))
}
"snapbox" => {
Err(crate::error::CliTestError::InvalidFormat(
"Snapbox generator not yet implemented".to_string(),
))
}
_ => Err(crate::error::CliTestError::InvalidFormat(format!(
"Unknown generator format: {}",
format
))),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_generator_invalid_format() {
let result = create_generator("invalid");
assert!(result.is_err());
}
#[test]
fn test_create_generator_not_implemented() {
assert!(create_generator("bats").is_err());
assert!(create_generator("assert_cmd").is_err());
assert!(create_generator("snapbox").is_err());
}
}