use decrust_promac_runtime::syntax::{FixTemplate, SyntaxGenerator, TemplateRegistry};
use decrust_promac_runtime::types::{ErrorCategory, ExtractedParameters};
use std::collections::HashMap;
#[test]
fn test_fix_template_creation_and_application() {
let template = FixTemplate::new(
"missing_file_template",
"Template for missing file errors",
"Missing file at path '{path}'. Consider creating it.",
);
let mut params = ExtractedParameters::new();
params.add_parameter("path", "/tmp/config.json");
params.set_confidence(0.9);
let correction = template.apply(¶ms.values);
assert_eq!(
correction,
"Missing file at path '/tmp/config.json'. Consider creating it."
);
}
#[test]
fn test_fix_template_with_command_templates() {
let template = FixTemplate::new(
"missing_dir_template",
"Template for missing directory errors",
"Missing directory '{dir}'. Create it?",
);
let mut params = ExtractedParameters::new();
params.add_parameter("dir", "/tmp/logs");
params.set_confidence(0.8);
let correction = template.apply(¶ms.values);
assert_eq!(correction, "Missing directory '/tmp/logs'. Create it?");
}
#[test]
fn test_fix_template_with_multiple_parameters() {
let template = FixTemplate::new(
"error_template",
"Template for error messages with file, line and message",
"Error in file '{file}' at line {line}: {message}",
);
let mut params = ExtractedParameters::new();
params.add_parameter("file", "src/main.rs");
params.add_parameter("line", "42");
params.add_parameter("message", "Missing semicolon");
params.set_confidence(0.9);
let correction = template.apply(¶ms.values);
assert_eq!(
correction,
"Error in file 'src/main.rs' at line 42: Missing semicolon"
);
}
#[test]
fn test_fix_template_with_missing_parameters() {
let template = FixTemplate::new(
"error_with_message_template",
"Template for error messages with file and message",
"Error in file '{file}': {message}",
);
let mut params = ExtractedParameters::new();
params.add_parameter("file", "config.json");
params.set_confidence(0.8);
let correction = template.apply(¶ms.values);
assert_eq!(correction, "Error in file 'config.json': {message}");
}
#[test]
fn test_template_registry_operations() {
let mut registry = TemplateRegistry::new();
let template1 = FixTemplate::new(
"missing_file_template",
"Template for missing file errors",
"Missing file '{file}'",
)
.add_category(ErrorCategory::NotFound);
let template2 = FixTemplate::new(
"permission_denied_template",
"Template for permission denied errors",
"Permission denied for '{file}'",
)
.add_category(ErrorCategory::Io);
registry.register_template(template1);
registry.register_template(template2);
let not_found_templates = registry.get_templates_for_category(ErrorCategory::NotFound);
let io_templates = registry.get_templates_for_category(ErrorCategory::Io);
let validation_templates = registry.get_templates_for_category(ErrorCategory::Validation);
assert_eq!(not_found_templates.len(), 1);
assert_eq!(io_templates.len(), 1);
assert_eq!(validation_templates.len(), 0);
assert_eq!(not_found_templates[0].template, "Missing file '{file}'");
assert_eq!(io_templates[0].template, "Permission denied for '{file}'");
}
#[test]
fn test_syntax_generator_code_generation() {
let generator = SyntaxGenerator::new();
let mut params = HashMap::new();
params.insert("line".to_string(), "42".to_string());
let code = generator.generate_function(
"add_semicolon",
params,
Some("()"),
"// Add semicolon at the end of line",
);
assert!(!code.is_empty());
assert!(code.contains("add_semicolon"));
assert!(code.contains("// Add semicolon"));
}
#[test]
fn test_syntax_generator_with_parameters() {
let generator = SyntaxGenerator::new();
let mut params = HashMap::new();
params.insert("file".to_string(), "src/main.rs".to_string());
params.insert("line".to_string(), "42".to_string());
let code = generator.generate_function(
"fix_error",
params,
Some("()"),
"// Fix error in src/main.rs at line 42",
);
assert!(!code.is_empty());
assert!(code.contains("src/main.rs"));
assert!(code.contains("42"));
}
#[test]
fn test_syntax_generator_for_different_fix_types() {
let generator = SyntaxGenerator::new();
let mut text_params = HashMap::new();
text_params.insert("old".to_string(), "foo".to_string());
text_params.insert("new".to_string(), "bar".to_string());
let text_replacement_code = generator.generate_function(
"replace_text",
text_params,
Some("()"),
"// Replace 'foo' with 'bar'",
);
let mut cmd_params = HashMap::new();
cmd_params.insert("dir".to_string(), "/tmp/logs".to_string());
let execute_command_code = generator.generate_function(
"create_directory",
cmd_params,
Some("()"),
"// Create directory /tmp/logs",
);
let manual_code = generator.generate_function(
"manual_fix",
HashMap::new(),
Some("()"),
"// Manual fix required",
);
assert!(!text_replacement_code.is_empty());
assert!(!execute_command_code.is_empty());
assert!(!manual_code.is_empty());
assert!(text_replacement_code.contains("Replace"));
assert!(execute_command_code.contains("Create directory"));
assert!(manual_code.contains("Manual fix"));
}
#[test]
fn test_syntax_integration() {
let mut registry = TemplateRegistry::new();
let template = FixTemplate::new(
"missing_file_template",
"Template for missing file errors",
"Missing file '{file}'",
)
.add_category(ErrorCategory::NotFound);
registry.register_template(template);
let generator = SyntaxGenerator::new();
let mut params = HashMap::new();
params.insert("file".to_string(), "config.json".to_string());
let templates = registry.get_templates_for_category(ErrorCategory::NotFound);
assert!(!templates.is_empty());
let correction = templates[0].apply(¶ms);
let code = generator.generate_function(
"fix_missing_file",
params.clone(),
Some("()"),
&format!("// {}", correction),
);
assert!(!code.is_empty());
assert!(code.contains("config.json"));
}
#[test]
fn test_fix_template_application_with_details() {
let template = FixTemplate::new(
"text_replacement_template",
"Template for text replacement",
"Replace text in file '{file}'",
);
let mut params = HashMap::new();
params.insert("file".to_string(), "src/main.rs".to_string());
params.insert("old_text".to_string(), "let x = 5".to_string());
params.insert("new_text".to_string(), "let x = 5;".to_string());
params.insert("line".to_string(), "42".to_string());
let correction = template.apply(¶ms);
assert_eq!(correction, "Replace text in file 'src/main.rs'");
let details = format!(
"Replace '{}' with '{}' at line {}",
params["old_text"], params["new_text"], params["line"]
);
assert!(details.contains("let x = 5"));
assert!(details.contains("let x = 5;"));
assert!(details.contains("42"));
}