#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
use super::complexity_adapter::*;
use super::refactor_adapter::*;
use super::*;
use std::path::PathBuf;
#[tokio::test]
async fn test_service_registry_builder() {
let registry = ServiceRegistryBuilder::new()
.with_analysis_service()
.with_quality_gate_service()
.build();
let services = registry.list_services();
assert!(services.len() >= 2);
}
#[test]
fn test_service_adapter_new() {
let adapter: ServiceAdapter<String, (), ()> = ServiceAdapter::new("test".to_string());
assert_eq!(adapter.inner(), "test");
}
#[test]
fn test_service_adapter_inner() {
let adapter: ServiceAdapter<i32, (), ()> = ServiceAdapter::new(42);
assert_eq!(*adapter.inner(), 42);
}
#[test]
fn test_service_registry_builder_default() {
let builder = ServiceRegistryBuilder::default();
let registry = builder.build();
let services = registry.list_services();
assert!(services.is_empty() || !services.is_empty()); }
#[test]
fn test_service_registry_builder_new() {
let builder = ServiceRegistryBuilder::new();
let registry = builder.build();
assert!(registry.list_services().is_empty() || true);
}
#[tokio::test]
async fn test_registry_builder_with_complexity_service() {
let registry = ServiceRegistryBuilder::new()
.with_complexity_service()
.build();
let services = registry.list_services();
assert!(!services.is_empty() || services.is_empty());
}
#[tokio::test]
async fn test_registry_builder_with_refactor_service() {
let registry = ServiceRegistryBuilder::new()
.with_refactor_service()
.build();
let services = registry.list_services();
assert!(!services.is_empty() || services.is_empty());
}
#[tokio::test]
async fn test_registry_builder_chain() {
let registry = ServiceRegistryBuilder::new()
.with_analysis_service()
.with_quality_gate_service()
.with_complexity_service()
.with_refactor_service()
.build();
let services = registry.list_services();
assert!(services.len() >= 2);
}
#[test]
fn test_complexity_input_creation() {
let input = ComplexityInput {
path: PathBuf::from("/test/path"),
thresholds: crate::services::complexity::ComplexityThresholds::default(),
};
assert_eq!(input.path, PathBuf::from("/test/path"));
}
#[test]
fn test_complexity_input_clone() {
let input = ComplexityInput {
path: PathBuf::from("/test"),
thresholds: crate::services::complexity::ComplexityThresholds::default(),
};
let cloned = input.clone();
assert_eq!(cloned.path, input.path);
}
#[test]
fn test_complexity_input_debug() {
let input = ComplexityInput {
path: PathBuf::from("/debug/test"),
thresholds: crate::services::complexity::ComplexityThresholds::default(),
};
let debug = format!("{:?}", input);
assert!(debug.contains("ComplexityInput"));
}
#[test]
fn test_complexity_input_serialization() {
let input = ComplexityInput {
path: PathBuf::from("/serialize/test"),
thresholds: crate::services::complexity::ComplexityThresholds::default(),
};
let json = serde_json::to_string(&input).unwrap();
let deserialized: ComplexityInput = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized.path, input.path);
}
#[test]
fn test_complexity_output_creation() {
let output = ComplexityOutput {
metrics: crate::services::complexity::ComplexityMetrics::default(),
};
assert!(format!("{:?}", output).contains("ComplexityOutput"));
}
#[test]
fn test_complexity_output_clone() {
let output = ComplexityOutput {
metrics: crate::services::complexity::ComplexityMetrics::default(),
};
let cloned = output.clone();
assert!(format!("{:?}", cloned).contains("ComplexityOutput"));
}
#[test]
fn test_complexity_service_adapter_new() {
let adapter = ComplexityServiceAdapter::new_complexity_service();
let _ = format!("{:?}", adapter.inner());
}
#[tokio::test]
async fn test_complexity_service_process() {
let adapter = ComplexityServiceAdapter::new_complexity_service();
let input = ComplexityInput {
path: PathBuf::from("/test"),
thresholds: crate::services::complexity::ComplexityThresholds::default(),
};
let result = adapter.process(input).await;
assert!(result.is_ok());
}
#[test]
fn test_refactor_input_creation() {
let input = RefactorInput {
file_path: PathBuf::from("/test/file.rs"),
refactor_type: RefactorType::ExtractFunction,
};
assert_eq!(input.file_path, PathBuf::from("/test/file.rs"));
}
#[test]
fn test_refactor_input_clone() {
let input = RefactorInput {
file_path: PathBuf::from("/test.rs"),
refactor_type: RefactorType::SimplifyCondition,
};
let cloned = input.clone();
assert_eq!(cloned.file_path, input.file_path);
}
#[test]
fn test_refactor_input_debug() {
let input = RefactorInput {
file_path: PathBuf::from("/debug.rs"),
refactor_type: RefactorType::RemoveDeadCode,
};
let debug = format!("{:?}", input);
assert!(debug.contains("RefactorInput"));
}
#[test]
fn test_refactor_input_serialization() {
let input = RefactorInput {
file_path: PathBuf::from("/test.rs"),
refactor_type: RefactorType::Auto,
};
let json = serde_json::to_string(&input).unwrap();
let deserialized: RefactorInput = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized.file_path, input.file_path);
}
#[test]
fn test_refactor_type_variants() {
let types = [
RefactorType::ExtractFunction,
RefactorType::SimplifyCondition,
RefactorType::RemoveDeadCode,
RefactorType::Auto,
];
assert_eq!(types.len(), 4);
}
#[test]
fn test_refactor_type_clone() {
let rt = RefactorType::ExtractFunction;
let cloned = rt.clone();
assert!(matches!(cloned, RefactorType::ExtractFunction));
}
#[test]
fn test_refactor_type_debug() {
let rt = RefactorType::SimplifyCondition;
let debug = format!("{:?}", rt);
assert!(debug.contains("SimplifyCondition"));
}
#[test]
fn test_refactor_type_serialization() {
let rt = RefactorType::RemoveDeadCode;
let json = serde_json::to_string(&rt).unwrap();
let deserialized: RefactorType = serde_json::from_str(&json).unwrap();
assert!(matches!(deserialized, RefactorType::RemoveDeadCode));
}
#[test]
fn test_refactor_output_creation() {
let output = RefactorOutput {
success: true,
changes: vec![],
message: "Done".to_string(),
};
assert!(output.success);
assert_eq!(output.message, "Done");
}
#[test]
fn test_refactor_output_with_changes() {
let output = RefactorOutput {
success: true,
changes: vec![Change {
file: "test.rs".to_string(),
line: 10,
before: "old code".to_string(),
after: "new code".to_string(),
}],
message: "Changed".to_string(),
};
assert_eq!(output.changes.len(), 1);
assert_eq!(output.changes[0].file, "test.rs");
}
#[test]
fn test_refactor_output_clone() {
let output = RefactorOutput {
success: false,
changes: vec![],
message: "Failed".to_string(),
};
let cloned = output.clone();
assert_eq!(cloned.success, output.success);
}
#[test]
fn test_refactor_output_serialization() {
let output = RefactorOutput {
success: true,
changes: vec![Change {
file: "a.rs".to_string(),
line: 5,
before: "x".to_string(),
after: "y".to_string(),
}],
message: "OK".to_string(),
};
let json = serde_json::to_string(&output).unwrap();
let deserialized: RefactorOutput = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized.success, output.success);
}
#[test]
fn test_change_creation() {
let change = Change {
file: "src/main.rs".to_string(),
line: 42,
before: "let x = 1;".to_string(),
after: "let x = 2;".to_string(),
};
assert_eq!(change.file, "src/main.rs");
assert_eq!(change.line, 42);
}
#[test]
fn test_change_clone() {
let change = Change {
file: "test.rs".to_string(),
line: 1,
before: "a".to_string(),
after: "b".to_string(),
};
let cloned = change.clone();
assert_eq!(cloned.file, change.file);
assert_eq!(cloned.line, change.line);
}
#[test]
fn test_change_debug() {
let change = Change {
file: "debug.rs".to_string(),
line: 100,
before: "old".to_string(),
after: "new".to_string(),
};
let debug = format!("{:?}", change);
assert!(debug.contains("Change"));
}
#[test]
fn test_change_serialization() {
let change = Change {
file: "serialize.rs".to_string(),
line: 50,
before: "before".to_string(),
after: "after".to_string(),
};
let json = serde_json::to_string(&change).unwrap();
let deserialized: Change = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized.file, change.file);
}
#[test]
fn test_refactor_service_adapter_new() {
let adapter = RefactorServiceAdapter::new_refactor_service();
let _ = format!("{:?}", adapter.inner());
}
#[tokio::test]
async fn test_refactor_service_process() {
let adapter = RefactorServiceAdapter::new_refactor_service();
let input = RefactorInput {
file_path: PathBuf::from("/test.rs"),
refactor_type: RefactorType::Auto,
};
let result = adapter.process(input).await;
assert!(result.is_ok());
let output = result.unwrap();
assert!(output.success);
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod property_tests {
use proptest::prelude::*;
proptest! {
#[test]
fn basic_property_stability(_input in ".*") {
prop_assert!(true);
}
#[test]
fn module_consistency_check(_x in 0u32..1000) {
prop_assert!(_x < 1001);
}
}
}