def test_parse_supervision_termination_reason_single_has_mapping(self):
        # Status meanings and mappings, in relative order:
        #   - Suicide-Institution -> DEATH
        input_statuses = '99O9020'

        reason = supervision_period_termination_reason_mapper(input_statuses)
        self.assertEqual(StateSupervisionPeriodTerminationReason.DEATH, reason)
    def test_parse_supervision_termination_reason_empty(self):
        input_statuses = ''

        reason = supervision_period_termination_reason_mapper(input_statuses)
        self.assertEqual(
            StateSupervisionPeriodTerminationReason.TRANSFER_WITHIN_STATE,
            reason)
    def test_parse_supervision_termination_reason_single_has_no_mapping(self):
        # Status meanings and mappings, in relative order:
        #   - unknown, unmapped
        input_statuses = '40I0000'

        reason = supervision_period_termination_reason_mapper(input_statuses)
        self.assertEqual(
            StateSupervisionPeriodTerminationReason.INTERNAL_UNKNOWN, reason)
    def test_parse_supervision_termination_reason_multiple_all_unmapped(self):
        # Status meanings and mappings, in relative order:
        #   - unknown, unmapped
        #   - unknown, unmapped
        input_statuses = '12O3456 56I7890'

        reason = supervision_period_termination_reason_mapper(input_statuses)
        self.assertEqual(
            StateSupervisionPeriodTerminationReason.INTERNAL_UNKNOWN, reason)
    def test_parse_supervision_termination_reason_multiple_one_is_mapped(self):
        # Status meanings and mappings, in relative order:
        #   - unknown, unmapped
        #   - Field Commutation -> DISCHARGE
        input_statuses = '40I0000 99O1025'

        reason = supervision_period_termination_reason_mapper(input_statuses)
        self.assertEqual(StateSupervisionPeriodTerminationReason.DISCHARGE,
                         reason)
 def test_parse_supervision_termination_reason_transfer_within_state(
         self) -> None:
     input_statuses = normalize(
         StateSupervisionPeriodTerminationReason.TRANSFER_WITHIN_STATE.
         value,
         remove_punctuation=True,
     )
     reason = supervision_period_termination_reason_mapper(input_statuses)
     self.assertEqual(
         StateSupervisionPeriodTerminationReason.TRANSFER_WITHIN_STATE,
         reason)
    def test_parse_supervision_termination_reason_rank_statuses(self) -> None:
        # Status meanings and mappings, in relative order:
        #   -  Offender re-engaged -> RETURN_FROM_ABSCONSCION
        #   -  Parole discharge -> DISCHARGE (highest rank)
        #   - unknown, unmapped
        input_statuses = "65N9500 99O2010 40O1010"

        reason = supervision_period_termination_reason_mapper(input_statuses)

        # 99O statuses ranked higher than the others
        self.assertEqual(StateSupervisionPeriodTerminationReason.DISCHARGE,
                         reason)
    def test_parse_supervision_termination_reason_two_statuses_same_rank(self):
        # Status meanings and mappings, in relative order:
        #   -  Parole Ret-No Violation -> REVOCATION
        #   -  Offender declared absconder -> ABSCONSION
        input_statuses = '40I1021 65L9100'

        reason = supervision_period_termination_reason_mapper(input_statuses)

        # REVOCATION is chosen as the termination reason because statuses are evaluated alphabetically when they tie in
        # rank
        self.assertEqual(StateSupervisionPeriodTerminationReason.REVOCATION,
                         reason)
 def test_parse_supervision_termination_reason_empty(self) -> None:
     input_statuses = ""
     with self.assertRaises(ValueError):
         _ = supervision_period_termination_reason_mapper(input_statuses)