@@ -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