CLASS ltc_overdue_fine DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. DATA mo_cut TYPE REF TO {{p}}overdue_fine. METHODS setup. METHODS not_late_no_fine FOR TESTING. METHODS book_in_grace FOR TESTING. METHODS book_over_grace FOR TESTING. METHODS dvd_over_grace FOR TESTING. METHODS game_no_grace FOR TESTING. METHODS reminder_fee FOR TESTING. METHODS fine_is_capped FOR TESTING. METHODS unknown_media FOR TESTING. ENDCLASS. CLASS ltc_overdue_fine IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}overdue_fine( ). ENDMETHOD. METHOD not_late_no_fine. DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250110' iv_return_date = '20250109' iv_media = 'BOOK' ). cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}overdue_fine=>ty_amount( '0.00' ) act = ls_result-fine ). ENDMETHOD. METHOD book_in_grace. DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250101' iv_return_date = '20250108' iv_media = 'BOOK' ). cl_abap_unit_assert=>assert_equals( exp = 0 act = ls_result-chargeable_days ). ENDMETHOD. METHOD book_over_grace. DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250101' iv_return_date = '20250109' iv_media = 'BOOK' ). cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}overdue_fine=>ty_amount( '0.30' ) act = ls_result-fine ). ENDMETHOD. METHOD dvd_over_grace. DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250101' iv_return_date = '20250104' iv_media = 'DVD' ). cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}overdue_fine=>ty_amount( '1.50' ) act = ls_result-fine ). ENDMETHOD. METHOD game_no_grace. DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250101' iv_return_date = '20250102' iv_media = 'GAME' ). cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}overdue_fine=>ty_amount( '2.50' ) act = ls_result-fine ). ENDMETHOD. METHOD reminder_fee. DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250101' iv_return_date = '20250215' iv_media = 'BOOK' ). cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}overdue_fine=>ty_amount( '16.40' ) act = ls_result-fine ). ENDMETHOD. METHOD fine_is_capped. DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250101' iv_return_date = '20250113' iv_media = 'GAME' ). cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}overdue_fine=>ty_amount( '25.00' ) act = ls_result-fine ). ENDMETHOD. METHOD unknown_media. DATA(ls_result) = mo_cut->calculate( iv_due_date = '20250101' iv_return_date = '20250105' iv_media = 'TAPE' ). cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_result-days_overdue ). cl_abap_unit_assert=>assert_equals( exp = 0 act = ls_result-chargeable_days ). ENDMETHOD. ENDCLASS.