#![cfg_attr(coverage_nightly, coverage(off))]
use super::*;
mod tdd_tests {
use super::*;
use std::path::PathBuf;
#[tokio::test]
async fn test_analyze_project_phase1_discovery_isolated() {
let config = DeepContextConfig::default();
let analyzer = DeepContextAnalyzer::new(config);
let test_project = tempfile::tempdir().expect("internal error");
let project_path = test_project.path().to_path_buf();
std::fs::create_dir_all(project_path.join("src")).expect("internal error");
std::fs::write(project_path.join("src/main.rs"), "fn main() {}").expect("internal error");
let file_tree = analyzer
.discover_project_structure(&project_path)
.await
.expect("internal error");
assert!(file_tree.total_files > 0);
assert_eq!(file_tree.root.node_type, NodeType::Directory);
}
#[tokio::test]
async fn test_analyze_project_phase2_parallel_analyses_isolated() {
let config = DeepContextConfig::default();
let analyzer = DeepContextAnalyzer::new(config);
let test_project = tempfile::tempdir().expect("internal error");
let project_path = test_project.path().to_path_buf();
std::fs::create_dir_all(project_path.join("src")).expect("internal error");
std::fs::write(project_path.join("src/lib.rs"), "pub fn test() {}")
.expect("internal error");
let progress = crate::services::progress::ProgressTracker::new(false);
let analyses = analyzer
.execute_parallel_analyses_with_progress(&project_path, &progress)
.await
.expect("internal error");
assert!(analyses.ast_contexts.is_some() || analyses.complexity_report.is_some());
}
#[tokio::test]
async fn test_analyze_project_phase3_cross_references_isolated() {
let config = DeepContextConfig::default();
let analyzer = DeepContextAnalyzer::new(config);
let analyses = ParallelAnalysisResults::default();
let cross_refs = analyzer
.build_cross_language_references(&analyses)
.await
.expect("internal error");
assert!(cross_refs.is_empty() || !cross_refs.is_empty());
}
#[tokio::test]
async fn test_analyze_project_phase4_defect_correlation_isolated() {
let config = DeepContextConfig::default();
let analyzer = DeepContextAnalyzer::new(config);
let analyses = ParallelAnalysisResults::default();
let (_, hotspots) = analyzer
.correlate_defects(&analyses)
.await
.expect("internal error");
assert!(hotspots.is_empty() || !hotspots.is_empty());
}
#[tokio::test]
async fn test_analyze_project_phase5_quality_scoring_isolated() {
let config = DeepContextConfig::default();
let analyzer = DeepContextAnalyzer::new(config);
let analyses = ParallelAnalysisResults::default();
let defect_summary = DefectSummary::default();
let quality = analyzer
.calculate_quality_scorecard(&analyses, &defect_summary)
.await
.expect("internal error");
assert!(quality.overall_health >= 0.0 && quality.overall_health <= 100.0);
}
#[tokio::test]
async fn test_analyze_project_phase6_recommendations_isolated() {
let config = DeepContextConfig::default();
let analyzer = DeepContextAnalyzer::new(config);
let _deep_context = DeepContext::default();
let defect_summary = DefectSummary {
total_defects: 0,
by_severity: FxHashMap::default(),
by_type: FxHashMap::default(),
defect_density: 0.0,
};
let parallel_results = ParallelAnalysisResults {
ast_contexts: None,
complexity_report: None,
churn_analysis: None,
dependency_graph: None,
dead_code_results: None,
duplicate_code_results: None,
satd_results: None,
provability_results: None,
big_o_analysis: None,
};
let recommendations = analyzer
.generate_recommendations(¶llel_results, &defect_summary)
.await
.expect("internal error");
assert!(recommendations.is_empty() || !recommendations.is_empty());
}
#[tokio::test]
async fn test_analyze_project_phase7_metadata_analysis_isolated() {
let config = DeepContextConfig::default();
let analyzer = DeepContextAnalyzer::new(config);
let test_project = tempfile::tempdir().expect("internal error");
let project_path = test_project.path().to_path_buf();
std::fs::write(project_path.join("Makefile"), "test:\n\tcargo test")
.expect("internal error");
std::fs::write(project_path.join("README.md"), "# Test").expect("internal error");
let (build_info, overview) = analyzer
.analyze_project_metadata(&project_path)
.await
.expect("internal error");
assert!(build_info.is_some() || build_info.is_none());
assert!(overview.is_some() || overview.is_none());
}
#[tokio::test]
async fn test_analyze_project_phase8_qa_verification_isolated() {
let config = DeepContextConfig::default();
let analyzer = DeepContextAnalyzer::new(config);
let mut context = DeepContext::default();
context.metadata.project_root = PathBuf::from("/test");
let qa = analyzer
.run_qa_verification(&context)
.await
.expect("internal error");
assert!(!qa.timestamp.is_empty());
assert!(!qa.version.is_empty());
}
#[tokio::test]
async fn test_analyze_project_integration_all_phases() {
let config = DeepContextConfig::default();
let analyzer = DeepContextAnalyzer::new(config);
let test_project = tempfile::tempdir().expect("internal error");
let project_path = test_project.path().to_path_buf();
std::fs::create_dir_all(project_path.join("src")).expect("internal error");
std::fs::write(
project_path.join("src/lib.rs"),
"//! Test\npub fn add(a: i32, b: i32) -> i32 { a + b }",
)
.expect("internal error");
let result = analyzer
.analyze_project(&project_path)
.await
.expect("internal error");
assert_eq!(result.metadata.project_root, project_path);
assert!(result.file_tree.total_files > 0);
assert!(result.quality_scorecard.overall_health > 0.0);
assert!(result.qa_verification.is_some());
}
#[tokio::test]
async fn test_generate_recommendations_complexity_violations() {
let config = DeepContextConfig::default();
let analyzer = DeepContextAnalyzer::new(config);
let analyses = ParallelAnalysisResults {
complexity_report: Some(crate::services::complexity::ComplexityReport {
summary: Default::default(),
violations: vec![crate::services::complexity::Violation::Error {
rule: "complexity".to_string(),
message: "Function too complex".to_string(),
value: 30,
threshold: 20,
file: "test.rs".to_string(),
line: 10,
function: Some("complex_fn".to_string()),
}],
hotspots: vec![],
files: vec![],
}),
..Default::default()
};
let defect_summary = DefectSummary::default();
let recommendations = analyzer
.generate_recommendations(&analyses, &defect_summary)
.await
.expect("internal error");
assert_eq!(recommendations.len(), 1);
assert!(recommendations[0].title.contains("complex_fn"));
assert_eq!(recommendations[0].priority, Priority::Critical);
}
#[tokio::test]
async fn test_generate_recommendations_high_defects() {
let config = DeepContextConfig::default();
let analyzer = DeepContextAnalyzer::new(config);
let analyses = ParallelAnalysisResults::default();
let mut by_severity = FxHashMap::default();
by_severity.insert("high".to_string(), 50);
by_severity.insert("medium".to_string(), 30);
by_severity.insert("low".to_string(), 20);
let defect_summary = DefectSummary {
total_defects: 100,
by_severity,
by_type: FxHashMap::default(),
defect_density: 10.0,
};
let recommendations = analyzer
.generate_recommendations(&analyses, &defect_summary)
.await
.expect("internal error");
assert_eq!(recommendations.len(), 1);
assert!(recommendations[0].title.contains("High defect count"));
assert_eq!(recommendations[0].priority, Priority::High);
}
#[tokio::test]
async fn test_generate_recommendations_satd_detected() {
let config = DeepContextConfig::default();
let analyzer = DeepContextAnalyzer::new(config);
let analyses = ParallelAnalysisResults {
satd_results: Some(crate::services::satd_detector::SATDAnalysisResult {
items: vec![],
summary: crate::services::satd_detector::SATDSummary {
total_items: 5,
by_severity: Default::default(),
by_category: Default::default(),
files_with_satd: 3,
avg_age_days: 30.0,
},
total_files_analyzed: 10,
files_with_debt: 3,
analysis_timestamp: chrono::Utc::now(),
}),
..Default::default()
};
let defect_summary = DefectSummary::default();
let recommendations = analyzer
.generate_recommendations(&analyses, &defect_summary)
.await
.expect("internal error");
assert_eq!(recommendations.len(), 1);
assert!(recommendations[0].title.contains("Technical debt"));
assert_eq!(recommendations[0].priority, Priority::Critical);
}
#[tokio::test]
async fn test_analyze_complexity_function() {
let test_project = tempfile::tempdir().expect("internal error");
let project_path = test_project.path();
std::fs::write(
project_path.join("test.rs"),
"fn simple() { println!(\"test\"); }",
)
.expect("internal error");
let result = analyze_complexity(project_path)
.await
.expect("internal error");
assert_eq!(result.summary.total_files, 1);
}
}
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);
}
}
}