Skip to content

Commit c4f228d

Browse files
committed
refactor: Merge janitor branch with rationale tests
Resolve conflicts in src/priority/formatter/mod.rs by adopting the more modular test helper functions from the janitor branch. The merged code uses make_test_god_analysis and make_test_file_item helper functions for cleaner test data creation.
2 parents 3b13a7c + 49e32be commit c4f228d

File tree

1 file changed

+104
-101
lines changed

1 file changed

+104
-101
lines changed

src/priority/formatter/mod.rs

Lines changed: 104 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -391,144 +391,147 @@ mod tests {
391391

392392
// === Tests for format_file_rationale (spec 205) ===
393393

394-
fn create_test_file_debt_item(
394+
fn make_test_god_analysis(
395395
is_god_object: bool,
396-
responsibilities: usize,
397-
methods: usize,
398-
god_score: f64,
396+
method_count: usize,
397+
responsibility_count: usize,
398+
god_object_score: f64,
399+
) -> crate::organization::GodObjectAnalysis {
400+
crate::organization::GodObjectAnalysis {
401+
is_god_object,
402+
method_count,
403+
weighted_method_count: None,
404+
field_count: 10,
405+
responsibility_count,
406+
lines_of_code: 500,
407+
complexity_sum: 200,
408+
god_object_score,
409+
recommended_splits: Vec::new(),
410+
confidence: crate::organization::GodObjectConfidence::Definite,
411+
responsibilities: Vec::new(),
412+
responsibility_method_counts: Default::default(),
413+
purity_distribution: None,
414+
module_structure: None,
415+
detection_type: crate::organization::DetectionType::GodClass,
416+
struct_name: None,
417+
struct_line: None,
418+
struct_location: None,
419+
visibility_breakdown: None,
420+
domain_count: 0,
421+
domain_diversity: 0.0,
422+
struct_ratio: 0.0,
423+
analysis_method: crate::organization::SplitAnalysisMethod::default(),
424+
cross_domain_severity: None,
425+
domain_diversity_metrics: None,
426+
aggregated_entropy: None,
427+
aggregated_error_swallowing_count: None,
428+
aggregated_error_swallowing_patterns: None,
429+
layering_impact: None,
430+
anti_pattern_report: None,
431+
complexity_metrics: None,
432+
trait_method_summary: None,
433+
}
434+
}
435+
436+
fn make_test_file_item(
437+
god_analysis: Option<crate::organization::GodObjectAnalysis>,
399438
total_complexity: u32,
400439
total_lines: usize,
440+
function_count: usize,
441+
avg_complexity: f64,
401442
) -> crate::priority::FileDebtItem {
402-
use crate::organization::{DetectionType, GodObjectAnalysis, GodObjectConfidence};
403-
use crate::priority::{FileDebtItem, FileDebtMetrics, FileImpact};
404-
use std::path::PathBuf;
405-
406-
let god_object_analysis = if is_god_object {
407-
Some(GodObjectAnalysis {
408-
is_god_object: true,
409-
method_count: methods,
410-
field_count: 10,
411-
responsibility_count: responsibilities,
412-
lines_of_code: total_lines,
413-
complexity_sum: total_complexity,
414-
god_object_score: god_score,
415-
confidence: GodObjectConfidence::Definite,
416-
detection_type: DetectionType::GodClass,
417-
struct_name: None,
418-
struct_line: None,
419-
struct_location: None,
420-
responsibilities: Vec::new(),
421-
responsibility_method_counts: Default::default(),
422-
recommended_splits: Vec::new(),
423-
purity_distribution: None,
424-
module_structure: None,
425-
visibility_breakdown: None,
426-
domain_count: 0,
427-
domain_diversity: 0.0,
428-
struct_ratio: 0.0,
429-
analysis_method: Default::default(),
430-
cross_domain_severity: None,
431-
domain_diversity_metrics: None,
432-
aggregated_entropy: None,
433-
aggregated_error_swallowing_count: None,
434-
aggregated_error_swallowing_patterns: None,
435-
layering_impact: None,
436-
anti_pattern_report: None,
437-
complexity_metrics: None,
438-
trait_method_summary: None,
439-
weighted_method_count: None,
440-
})
441-
} else {
442-
None
443-
};
444-
445-
FileDebtItem {
446-
metrics: FileDebtMetrics {
447-
path: PathBuf::from("test.rs"),
448-
total_lines,
449-
function_count: methods,
450-
class_count: 0,
451-
avg_complexity: if methods > 0 {
452-
total_complexity as f64 / methods as f64
453-
} else {
454-
0.0
455-
},
456-
max_complexity: 20,
443+
crate::priority::FileDebtItem {
444+
metrics: crate::priority::FileDebtMetrics {
445+
god_object_analysis: god_analysis,
457446
total_complexity,
458-
coverage_percent: 0.5,
459-
uncovered_lines: total_lines / 2,
460-
god_object_analysis,
461-
function_scores: Vec::new(),
462-
god_object_type: None,
463-
file_type: None,
464-
afferent_coupling: 0,
465-
efferent_coupling: 0,
466-
instability: 0.0,
467-
dependents: Vec::new(),
468-
dependencies_list: Vec::new(),
447+
total_lines,
448+
function_count,
449+
avg_complexity,
450+
..Default::default()
469451
},
470452
score: 50.0,
471453
priority_rank: 1,
472454
recommendation: "Test recommendation".to_string(),
473-
impact: FileImpact::default(),
455+
impact: Default::default(),
474456
}
475457
}
476458

477459
#[test]
478-
fn test_format_file_rationale_god_object_many_responsibilities() {
479-
let item = create_test_file_debt_item(true, 8, 40, 75.0, 200, 500);
480-
let rationale = format_file_rationale(&item);
460+
fn test_format_file_rationale_god_object_high_responsibilities() {
461+
let god_analysis = make_test_god_analysis(true, 30, 8, 75.0);
462+
let item = make_test_file_item(Some(god_analysis), 100, 500, 30, 3.3);
481463

482-
assert!(rationale.contains("8 distinct responsibilities"));
483-
assert!(rationale.contains("40 methods"));
484-
assert!(rationale.contains("Splitting by responsibility"));
464+
let result = format_file_rationale(&item);
465+
466+
assert!(result.contains("8 distinct responsibilities"));
467+
assert!(result.contains("30 methods"));
468+
assert!(result.contains("Splitting by responsibility"));
485469
}
486470

487471
#[test]
488472
fn test_format_file_rationale_god_object_many_methods() {
489-
let item = create_test_file_debt_item(true, 3, 60, 65.0, 300, 800);
490-
let rationale = format_file_rationale(&item);
473+
let god_analysis = make_test_god_analysis(true, 60, 3, 80.0);
474+
let item = make_test_file_item(Some(god_analysis), 200, 800, 60, 3.3);
475+
476+
let result = format_file_rationale(&item);
477+
478+
assert!(result.contains("60 methods"));
479+
assert!(result.contains("3 responsibilities"));
480+
assert!(result.contains("Extracting cohesive modules"));
481+
}
491482

492-
assert!(rationale.contains("60 methods"));
493-
assert!(rationale.contains("3 responsibilities"));
494-
assert!(rationale.contains("Extracting cohesive modules"));
483+
#[test]
484+
fn test_format_file_rationale_god_object_generic() {
485+
let god_analysis = make_test_god_analysis(true, 20, 4, 65.5);
486+
let item = make_test_file_item(Some(god_analysis), 100, 400, 20, 5.0);
487+
488+
let result = format_file_rationale(&item);
489+
490+
assert!(result.contains("god object characteristics"));
491+
assert!(result.contains("score: 65.5"));
495492
}
496493

497494
#[test]
498-
fn test_format_file_rationale_god_object_default() {
499-
let item = create_test_file_debt_item(true, 3, 30, 55.0, 150, 400);
500-
let rationale = format_file_rationale(&item);
495+
fn test_format_file_rationale_not_god_object_skipped() {
496+
let god_analysis = make_test_god_analysis(false, 10, 2, 20.0);
497+
let item = make_test_file_item(Some(god_analysis), 100, 400, 10, 10.0);
501498

502-
assert!(rationale.contains("god object characteristics"));
503-
assert!(rationale.contains("score: 55.0"));
499+
let result = format_file_rationale(&item);
500+
501+
// Should fall through to default since is_god_object is false
502+
assert!(result.contains("File-level refactoring"));
504503
}
505504

506505
#[test]
507506
fn test_format_file_rationale_high_complexity() {
508-
let item = create_test_file_debt_item(false, 0, 25, 0.0, 550, 600);
509-
let rationale = format_file_rationale(&item);
507+
let item = make_test_file_item(None, 600, 800, 50, 12.0);
508+
509+
let result = format_file_rationale(&item);
510510

511-
assert!(rationale.contains("High total complexity"));
512-
assert!(rationale.contains("550"));
513-
assert!(rationale.contains("25 functions"));
511+
assert!(result.contains("High total complexity (600)"));
512+
assert!(result.contains("50 functions"));
513+
assert!(result.contains("avg: 12.0"));
514514
}
515515

516516
#[test]
517517
fn test_format_file_rationale_large_file() {
518-
let item = create_test_file_debt_item(false, 0, 20, 0.0, 100, 1200);
519-
let rationale = format_file_rationale(&item);
518+
let item = make_test_file_item(None, 300, 1500, 40, 7.5);
520519

521-
assert!(rationale.contains("Large file"));
522-
assert!(rationale.contains("1200 lines"));
523-
assert!(rationale.contains("20 functions"));
520+
let result = format_file_rationale(&item);
521+
522+
assert!(result.contains("Large file (1500 lines)"));
523+
assert!(result.contains("40 functions"));
524524
}
525525

526526
#[test]
527527
fn test_format_file_rationale_default() {
528-
let item = create_test_file_debt_item(false, 0, 10, 0.0, 50, 200);
529-
let rationale = format_file_rationale(&item);
528+
let item = make_test_file_item(None, 100, 500, 20, 5.0);
529+
530+
let result = format_file_rationale(&item);
530531

531-
assert!(rationale.contains("File-level refactoring"));
532-
assert!(rationale.contains("maintainability"));
532+
assert_eq!(
533+
result,
534+
"File-level refactoring will improve overall code organization and maintainability."
535+
);
533536
}
534537
}

0 commit comments

Comments
 (0)