CLASS {{p}}overdraft_test DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. CONSTANTS c_zero TYPE {{p}}if_overdraft=>ty_amount VALUE '0.00'. DATA mo_cut TYPE REF TO {{p}}if_overdraft. METHODS setup. METHODS non_positive_amount FOR TESTING. METHODS zero_days FOR TESTING. METHODS grace_days_free FOR TESTING. METHODS tier_one_rate FOR TESTING. METHODS tier_two_boundary FOR TESTING. METHODS tier_three_boundary FOR TESTING. METHODS tier_four_boundary FOR TESTING. METHODS business_discount FOR TESTING. METHODS business_rate_floor FOR TESTING. METHODS minimum_interest FOR TESTING. METHODS rounding_half_up FOR TESTING. ENDCLASS. CLASS {{p}}overdraft_test IMPLEMENTATION. METHOD setup. CREATE OBJECT mo_cut TYPE {{p}}overdraft_calc. ENDMETHOD. METHOD non_positive_amount. DATA lv_act TYPE {{p}}if_overdraft=>ty_amount. CALL METHOD mo_cut->calculate EXPORTING iv_amount = '0.00' iv_days = 30 iv_segment = {{p}}if_overdraft=>c_segment_private RECEIVING rv_interest = lv_act. cl_abap_unit_assert=>assert_equals( exp = c_zero act = lv_act msg = 'zero amount' ). CALL METHOD mo_cut->calculate EXPORTING iv_amount = '-250.00' iv_days = 30 iv_segment = {{p}}if_overdraft=>c_segment_private RECEIVING rv_interest = lv_act. cl_abap_unit_assert=>assert_equals( exp = c_zero act = lv_act msg = 'negative amount' ). ENDMETHOD. METHOD zero_days. DATA lv_act TYPE {{p}}if_overdraft=>ty_amount. CALL METHOD mo_cut->calculate EXPORTING iv_amount = '1000.00' iv_days = 0 iv_segment = {{p}}if_overdraft=>c_segment_private RECEIVING rv_interest = lv_act. cl_abap_unit_assert=>assert_equals( exp = c_zero act = lv_act ). ENDMETHOD. METHOD grace_days_free. DATA lv_act TYPE {{p}}if_overdraft=>ty_amount. CALL METHOD mo_cut->calculate EXPORTING iv_amount = '30000.00' iv_days = 3 iv_segment = {{p}}if_overdraft=>c_segment_private RECEIVING rv_interest = lv_act. cl_abap_unit_assert=>assert_equals( exp = c_zero act = lv_act ). ENDMETHOD. METHOD tier_one_rate. DATA lv_act TYPE {{p}}if_overdraft=>ty_amount. DATA lv_exp TYPE {{p}}if_overdraft=>ty_amount. lv_exp = '120.00'. CALL METHOD mo_cut->calculate EXPORTING iv_amount = '1000.00' iv_days = 363 iv_segment = {{p}}if_overdraft=>c_segment_private RECEIVING rv_interest = lv_act. cl_abap_unit_assert=>assert_equals( exp = lv_exp act = lv_act ). ENDMETHOD. METHOD tier_two_boundary. DATA lv_act TYPE {{p}}if_overdraft=>ty_amount. DATA lv_exp TYPE {{p}}if_overdraft=>ty_amount. lv_exp = '100.00'. CALL METHOD mo_cut->calculate EXPORTING iv_amount = '1000.01' iv_days = 363 iv_segment = {{p}}if_overdraft=>c_segment_private RECEIVING rv_interest = lv_act. cl_abap_unit_assert=>assert_equals( exp = lv_exp act = lv_act msg = 'amount above 1000' ). ENDMETHOD. METHOD tier_three_boundary. DATA lv_act TYPE {{p}}if_overdraft=>ty_amount. DATA lv_exp TYPE {{p}}if_overdraft=>ty_amount. lv_exp = '400.00'. CALL METHOD mo_cut->calculate EXPORTING iv_amount = '5000.01' iv_days = 363 iv_segment = {{p}}if_overdraft=>c_segment_private RECEIVING rv_interest = lv_act. cl_abap_unit_assert=>assert_equals( exp = lv_exp act = lv_act msg = 'amount above 5000' ). lv_exp = '1600.00'. CALL METHOD mo_cut->calculate EXPORTING iv_amount = '20000.00' iv_days = 363 iv_segment = {{p}}if_overdraft=>c_segment_private RECEIVING rv_interest = lv_act. cl_abap_unit_assert=>assert_equals( exp = lv_exp act = lv_act msg = 'amount 20000' ). ENDMETHOD. METHOD tier_four_boundary. DATA lv_act TYPE {{p}}if_overdraft=>ty_amount. DATA lv_exp TYPE {{p}}if_overdraft=>ty_amount. lv_exp = '1300.00'. CALL METHOD mo_cut->calculate EXPORTING iv_amount = '20000.01' iv_days = 363 iv_segment = {{p}}if_overdraft=>c_segment_private RECEIVING rv_interest = lv_act. cl_abap_unit_assert=>assert_equals( exp = lv_exp act = lv_act ). ENDMETHOD. METHOD business_discount. DATA lv_act TYPE {{p}}if_overdraft=>ty_amount. DATA lv_exp TYPE {{p}}if_overdraft=>ty_amount. lv_exp = '13.33'. CALL METHOD mo_cut->calculate EXPORTING iv_amount = '2000.00' iv_days = 33 iv_segment = {{p}}if_overdraft=>c_segment_business RECEIVING rv_interest = lv_act. cl_abap_unit_assert=>assert_equals( exp = lv_exp act = lv_act ). ENDMETHOD. METHOD business_rate_floor. DATA lv_act TYPE {{p}}if_overdraft=>ty_amount. DATA lv_exp TYPE {{p}}if_overdraft=>ty_amount. lv_exp = '1500.00'. CALL METHOD mo_cut->calculate EXPORTING iv_amount = '30000.00' iv_days = 363 iv_segment = {{p}}if_overdraft=>c_segment_business RECEIVING rv_interest = lv_act. cl_abap_unit_assert=>assert_equals( exp = lv_exp act = lv_act ). ENDMETHOD. METHOD minimum_interest. DATA lv_act TYPE {{p}}if_overdraft=>ty_amount. DATA lv_exp TYPE {{p}}if_overdraft=>ty_amount. lv_exp = '5.00'. CALL METHOD mo_cut->calculate EXPORTING iv_amount = '500.00' iv_days = 10 iv_segment = {{p}}if_overdraft=>c_segment_private RECEIVING rv_interest = lv_act. cl_abap_unit_assert=>assert_equals( exp = lv_exp act = lv_act ). ENDMETHOD. METHOD rounding_half_up. DATA lv_act TYPE {{p}}if_overdraft=>ty_amount. DATA lv_exp TYPE {{p}}if_overdraft=>ty_amount. lv_exp = '5.01'. CALL METHOD mo_cut->calculate EXPORTING iv_amount = '715.00' iv_days = 24 iv_segment = {{p}}if_overdraft=>c_segment_private RECEIVING rv_interest = lv_act. cl_abap_unit_assert=>assert_equals( exp = lv_exp act = lv_act msg = 'exact half cent' ). lv_exp = '67.56'. CALL METHOD mo_cut->calculate EXPORTING iv_amount = '1234.56' iv_days = 200 iv_segment = {{p}}if_overdraft=>c_segment_private RECEIVING rv_interest = lv_act. cl_abap_unit_assert=>assert_equals( exp = lv_exp act = lv_act msg = 'round up' ). ENDMETHOD. ENDCLASS.