use debtmap::extraction::UnifiedFileExtractor;
use debtmap::extraction::adapters::god_object::analyze_god_objects;
use debtmap::organization::GodObjectMetrics;
use std::path::{Path, PathBuf};
#[test]
fn test_metrics_tracking_integration() {
let mut metrics = GodObjectMetrics::new();
let god_object_code = (0..40)
.map(|i| {
let action = match i % 6 {
0 => "create",
1 => "update",
2 => "delete",
3 => "validate",
4 => "transform",
_ => "process",
};
format!(
"fn {}_item_{}(x: &mut i32) {{\n if *x > 0 {{\n if *x > 10 {{\n *x *= 2\n }} else {{\n *x += 1\n }}\n }} else {{\n *x = 0\n }}\n}}",
action, i
)
})
.collect::<Vec<_>>()
.join("\n");
let extracted = UnifiedFileExtractor::extract(Path::new("test.rs"), &god_object_code)
.expect("Failed to extract");
let analyses = analyze_god_objects(Path::new("test.rs"), &extracted);
if analyses.is_empty() {
return;
}
for analysis in analyses {
metrics.record_snapshot(PathBuf::from("test.rs"), analysis.clone());
}
assert!(!metrics.snapshots.is_empty());
assert!(metrics.summary.total_snapshots > 0);
assert_eq!(metrics.summary.files_tracked, 1);
let improved_code = r#"
fn function1() {}
fn function2() {}
fn function3() {}
fn function4() {}
fn function5() {}
fn function6() {}
fn function7() {}
fn function8() {}
fn function9() {}
fn function10() {}
"#;
let improved_extracted = UnifiedFileExtractor::extract(Path::new("test.rs"), improved_code)
.expect("Failed to extract");
let improved_analyses = analyze_god_objects(Path::new("test.rs"), &improved_extracted);
if improved_analyses.is_empty() {
return;
}
for analysis in improved_analyses {
metrics.record_snapshot(PathBuf::from("test.rs"), analysis);
}
if metrics.snapshots.len() >= 2
&& let Some(trend) = metrics.get_file_trend(&PathBuf::from("test.rs"))
{
let _ = trend.method_count_change;
let _ = trend.score_change;
let _ = trend.trend_direction;
}
}
#[test]
fn test_multi_file_metrics_tracking() {
let mut metrics = GodObjectMetrics::new();
let code1 = (0..40)
.map(|i| {
let action = match i % 6 {
0 => "create",
1 => "update",
2 => "delete",
3 => "validate",
4 => "transform",
_ => "process",
};
format!(
"fn {}_item_{}(x: &mut i32) {{\n if *x > 0 {{\n if *x > 10 {{\n *x *= 2\n }} else {{\n *x += 1\n }}\n }} else {{\n *x = 0\n }}\n}}",
action, i
)
})
.collect::<Vec<_>>()
.join("\n");
let extracted1 =
UnifiedFileExtractor::extract(Path::new("file1.rs"), &code1).expect("Failed to extract");
let analyses1 = analyze_god_objects(Path::new("file1.rs"), &extracted1);
let code2 = r#"
struct SmallStruct {
field1: i32,
}
impl SmallStruct {
fn method1(&self) {}
fn method2(&self) {}
}
"#;
let extracted2 =
UnifiedFileExtractor::extract(Path::new("file2.rs"), code2).expect("Failed to extract");
let analyses2 = analyze_god_objects(Path::new("file2.rs"), &extracted2);
let mut files_with_god_objects = 0;
for analysis in analyses1 {
metrics.record_snapshot(PathBuf::from("file1.rs"), analysis);
files_with_god_objects += 1;
}
for analysis in analyses2 {
metrics.record_snapshot(PathBuf::from("file2.rs"), analysis);
files_with_god_objects += 1;
}
if files_with_god_objects == 0 {
return;
}
assert!(metrics.summary.total_snapshots > 0);
assert!(metrics.summary.files_tracked > 0);
}
#[test]
fn test_new_god_object_detection() {
let mut metrics = GodObjectMetrics::new();
let small_code = r#"
fn func1() {}
fn func2() {}
fn func3() {}
"#;
let small_extracted = UnifiedFileExtractor::extract(Path::new("growing.rs"), small_code)
.expect("Failed to extract");
let small_analyses = analyze_god_objects(Path::new("growing.rs"), &small_extracted);
for analysis in small_analyses {
metrics.record_snapshot(PathBuf::from("growing.rs"), analysis);
}
let large_code = (0..40)
.map(|i| {
let action = match i % 6 {
0 => "create",
1 => "update",
2 => "delete",
3 => "validate",
4 => "transform",
_ => "process",
};
format!(
"fn {}_item_{}(x: &mut i32) {{\n if *x > 0 {{\n if *x > 10 {{\n *x *= 2\n }} else {{\n *x += 1\n }}\n }} else {{\n *x = 0\n }}\n}}",
action, i
)
})
.collect::<Vec<_>>()
.join("\n");
let large_extracted = UnifiedFileExtractor::extract(Path::new("growing.rs"), &large_code)
.expect("Failed to extract");
let large_analyses = analyze_god_objects(Path::new("growing.rs"), &large_extracted);
for analysis in large_analyses {
metrics.record_snapshot(PathBuf::from("growing.rs"), analysis);
}
if metrics.snapshots.is_empty() {
return;
}
if let Some(trend) = metrics.get_file_trend(&PathBuf::from("growing.rs")) {
let _ = trend.method_count_change;
let _ = trend.score_change;
let _ = trend.trend_direction;
}
}