@@ -410,6 +410,148 @@ def test__given_complex_bracket_path__then_extracts_correct_scale_name(
410410 assert result == "Puerto Rico tax rate (bracket 1 rate)"
411411
412412
413+ class TestSingleLevelBreakdownParam :
414+ """Tests for single-level breakdown parameters (direct children of breakdown parent)."""
415+
416+ def test__given_single_level_breakdown_with_enum__then_generates_label_with_enum_value (
417+ self ,
418+ ):
419+ # Given: A parameter that is a direct child of a breakdown parent
420+ parent = create_mock_parent_node (
421+ name = "gov.tax.exemptions.by_status" ,
422+ label = "Tax exemption by filing status" ,
423+ breakdown = ["filing_status" ],
424+ )
425+ param = create_mock_parameter (
426+ name = "gov.tax.exemptions.by_status.MARRIED_FILING_JOINTLY" ,
427+ parent = parent ,
428+ )
429+ system = create_mock_system (
430+ variables = {"filing_status" : VARIABLE_WITH_FILING_STATUS_ENUM }
431+ )
432+ scale_lookup = {}
433+
434+ # When
435+ result = generate_label_for_parameter (param , system , scale_lookup )
436+
437+ # Then: Label uses enum display value
438+ assert result == "Tax exemption by filing status (Married filing jointly)"
439+
440+ def test__given_single_level_breakdown_without_enum__then_generates_label_with_raw_key (
441+ self ,
442+ ):
443+ # Given: A parameter whose breakdown variable has no enum
444+ parent = create_mock_parent_node (
445+ name = "gov.benefits.by_category" ,
446+ label = "Benefit by category" ,
447+ breakdown = ["benefit_category" ],
448+ )
449+ param = create_mock_parameter (
450+ name = "gov.benefits.by_category.FOOD_ASSISTANCE" ,
451+ parent = parent ,
452+ )
453+ system = create_mock_system (variables = {})
454+ scale_lookup = {}
455+
456+ # When
457+ result = generate_label_for_parameter (param , system , scale_lookup )
458+
459+ # Then: Falls back to raw key
460+ assert result == "Benefit by category (FOOD_ASSISTANCE)"
461+
462+ def test__given_single_level_range_breakdown__then_uses_raw_number (self ):
463+ # Given: A single-level breakdown with range (no breakdown_labels)
464+ parent = create_mock_parent_node (
465+ name = "gov.benefits.by_size" ,
466+ label = "Benefit by household size" ,
467+ breakdown = ["range(1, 8)" ],
468+ )
469+ param = create_mock_parameter (
470+ name = "gov.benefits.by_size.4" ,
471+ parent = parent ,
472+ )
473+ system = create_mock_system ()
474+ scale_lookup = {}
475+
476+ # When
477+ result = generate_label_for_parameter (param , system , scale_lookup )
478+
479+ # Then: Uses raw number without semantic label
480+ assert result == "Benefit by household size (4)"
481+
482+ def test__given_single_level_range_with_breakdown_label__then_includes_semantic_label (
483+ self ,
484+ ):
485+ # Given: A single-level breakdown with range and breakdown_labels
486+ parent = create_mock_parent_node (
487+ name = "gov.benefits.by_size" ,
488+ label = "Benefit by household size" ,
489+ breakdown = ["range(1, 8)" ],
490+ breakdown_labels = ["Household size" ],
491+ )
492+ param = create_mock_parameter (
493+ name = "gov.benefits.by_size.4" ,
494+ parent = parent ,
495+ )
496+ system = create_mock_system ()
497+ scale_lookup = {}
498+
499+ # When
500+ result = generate_label_for_parameter (param , system , scale_lookup )
501+
502+ # Then: Includes semantic label
503+ assert result == "Benefit by household size (Household size 4)"
504+
505+
506+ class TestSingleLevelScaleParam :
507+ """Tests confirming scale/bracket params are unaffected by breakdown changes."""
508+
509+ def test__given_single_bracket_param__then_generates_bracket_label (self ):
510+ # Given: A bracket parameter (not a breakdown)
511+ param = create_mock_parameter (name = "gov.tax.income.rates[0].rate" )
512+ scale = create_mock_scale (
513+ name = "gov.tax.income.rates" ,
514+ label = "Income tax rates" ,
515+ scale_type = "marginal_rate" ,
516+ )
517+ system = create_mock_system ()
518+ scale_lookup = {"gov.tax.income.rates" : scale }
519+
520+ # When
521+ result = generate_label_for_parameter (param , system , scale_lookup )
522+
523+ # Then: Generates bracket label, not breakdown label
524+ assert result == "Income tax rates (bracket 1 rate)"
525+
526+ def test__given_bracket_param_with_breakdown_parent__then_bracket_takes_precedence (
527+ self ,
528+ ):
529+ # Given: A bracket parameter even if it has a parent with breakdown
530+ # (This shouldn't happen in practice, but tests the precedence)
531+ parent = create_mock_parent_node (
532+ name = "gov.tax.rates" ,
533+ label = "Tax rates" ,
534+ breakdown = ["filing_status" ],
535+ )
536+ param = create_mock_parameter (
537+ name = "gov.tax.rates[0].rate" ,
538+ parent = parent ,
539+ )
540+ scale = create_mock_scale (
541+ name = "gov.tax.rates" ,
542+ label = "Tax rates" ,
543+ scale_type = "marginal_rate" ,
544+ )
545+ system = create_mock_system ()
546+ scale_lookup = {"gov.tax.rates" : scale }
547+
548+ # When
549+ result = generate_label_for_parameter (param , system , scale_lookup )
550+
551+ # Then: Bracket notation takes precedence
552+ assert result == "Tax rates (bracket 1 rate)"
553+
554+
413555class TestFindBreakdownParent :
414556 """Tests for the _find_breakdown_parent function."""
415557
@@ -605,3 +747,148 @@ def test__given_missing_breakdown_labels__then_uses_raw_values(self):
605747 # Then
606748 # Falls back to raw values when no breakdown_labels
607749 assert result == "SNAP max allotment (CONTIGUOUS_US, 1)"
750+
751+
752+ class TestMixedNestedBreakdowns :
753+ """Tests for complex mixed breakdowns with enums, ranges, and labels."""
754+
755+ def test__given_enum_range_enum_nesting__then_formats_each_correctly (self ):
756+ # Given: A complex 3-level breakdown: enum -> range -> enum
757+ # Example: state -> household_size -> filing_status
758+ breakdown_parent = create_mock_parent_node (
759+ name = "gov.tax.credits.earned_income" ,
760+ label = "Earned income credit" ,
761+ breakdown = ["state_code" , "range(1, 6)" , "filing_status" ],
762+ breakdown_labels = ["State" , "Number of children" , "Filing status" ],
763+ )
764+ level1 = create_mock_parent_node (
765+ name = "gov.tax.credits.earned_income.CA" ,
766+ parent = breakdown_parent ,
767+ )
768+ level2 = create_mock_parent_node (
769+ name = "gov.tax.credits.earned_income.CA.2" ,
770+ parent = level1 ,
771+ )
772+ param = create_mock_parameter (
773+ name = "gov.tax.credits.earned_income.CA.2.SINGLE" ,
774+ parent = level2 ,
775+ )
776+ system = create_mock_system (
777+ variables = {
778+ "state_code" : VARIABLE_WITH_STATE_CODE_ENUM ,
779+ "filing_status" : VARIABLE_WITH_FILING_STATUS_ENUM ,
780+ }
781+ )
782+ scale_lookup = {}
783+
784+ # When
785+ result = generate_label_for_parameter (param , system , scale_lookup )
786+
787+ # Then: Enum values use display names, range uses breakdown_label
788+ assert result == "Earned income credit (CA, Number of children 2, Single)"
789+
790+ def test__given_range_enum_range_nesting__then_formats_each_correctly (self ):
791+ # Given: range -> enum -> range nesting
792+ breakdown_parent = create_mock_parent_node (
793+ name = "gov.childcare.subsidy" ,
794+ label = "Childcare subsidy" ,
795+ breakdown = ["range(1, 4)" , "filing_status" , "range(1, 10)" ],
796+ breakdown_labels = ["Age group" , "Filing status" , "Household size" ],
797+ )
798+ level1 = create_mock_parent_node (
799+ name = "gov.childcare.subsidy.2" ,
800+ parent = breakdown_parent ,
801+ )
802+ level2 = create_mock_parent_node (
803+ name = "gov.childcare.subsidy.2.HEAD_OF_HOUSEHOLD" ,
804+ parent = level1 ,
805+ )
806+ param = create_mock_parameter (
807+ name = "gov.childcare.subsidy.2.HEAD_OF_HOUSEHOLD.5" ,
808+ parent = level2 ,
809+ )
810+ system = create_mock_system (
811+ variables = {"filing_status" : VARIABLE_WITH_FILING_STATUS_ENUM }
812+ )
813+ scale_lookup = {}
814+
815+ # When
816+ result = generate_label_for_parameter (param , system , scale_lookup )
817+
818+ # Then: Both ranges use breakdown_labels, enum uses display value
819+ assert (
820+ result
821+ == "Childcare subsidy (Age group 2, Head of household, Household size 5)"
822+ )
823+
824+ def test__given_partial_breakdown_labels__then_uses_labels_where_available (self ):
825+ # Given: breakdown_labels list shorter than breakdown list
826+ breakdown_parent = create_mock_parent_node (
827+ name = "gov.benefits.utility" ,
828+ label = "Utility allowance" ,
829+ breakdown = ["area_code" , "range(1, 20)" , "housing_type" ],
830+ breakdown_labels = ["Area" , "Household size" ], # Missing label for housing_type
831+ )
832+ level1 = create_mock_parent_node (
833+ name = "gov.benefits.utility.AREA_1" ,
834+ parent = breakdown_parent ,
835+ )
836+ level2 = create_mock_parent_node (
837+ name = "gov.benefits.utility.AREA_1.3" ,
838+ parent = level1 ,
839+ )
840+ param = create_mock_parameter (
841+ name = "gov.benefits.utility.AREA_1.3.RENTER" ,
842+ parent = level2 ,
843+ )
844+ system = create_mock_system (variables = {})
845+ scale_lookup = {}
846+
847+ # When
848+ result = generate_label_for_parameter (param , system , scale_lookup )
849+
850+ # Then: Uses breakdown_labels where available, raw value for missing label
851+ assert result == "Utility allowance (Area AREA_1, Household size 3, RENTER)"
852+
853+ def test__given_four_level_nesting_with_mixed_types__then_generates_all_dimensions (
854+ self ,
855+ ):
856+ # Given: A deeply nested 4-level breakdown
857+ breakdown_parent = create_mock_parent_node (
858+ name = "gov.irs.deductions.sales_tax" ,
859+ label = "State sales tax deduction" ,
860+ breakdown = ["state_code" , "filing_status" , "range(1, 7)" , "range(1, 20)" ],
861+ breakdown_labels = ["State" , "Filing status" , "Exemption count" , "Income bracket" ],
862+ )
863+ level1 = create_mock_parent_node (
864+ name = "gov.irs.deductions.sales_tax.NY" ,
865+ parent = breakdown_parent ,
866+ )
867+ level2 = create_mock_parent_node (
868+ name = "gov.irs.deductions.sales_tax.NY.JOINT" ,
869+ parent = level1 ,
870+ )
871+ level3 = create_mock_parent_node (
872+ name = "gov.irs.deductions.sales_tax.NY.JOINT.4" ,
873+ parent = level2 ,
874+ )
875+ param = create_mock_parameter (
876+ name = "gov.irs.deductions.sales_tax.NY.JOINT.4.12" ,
877+ parent = level3 ,
878+ )
879+ system = create_mock_system (
880+ variables = {
881+ "state_code" : VARIABLE_WITH_STATE_CODE_ENUM ,
882+ "filing_status" : VARIABLE_WITH_FILING_STATUS_ENUM ,
883+ }
884+ )
885+ scale_lookup = {}
886+
887+ # When
888+ result = generate_label_for_parameter (param , system , scale_lookup )
889+
890+ # Then: All 4 dimensions are formatted correctly
891+ assert (
892+ result
893+ == "State sales tax deduction (NY, Joint, Exemption count 4, Income bracket 12)"
894+ )
0 commit comments