CLASS {{p}}t16_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. CLASS-DATA go_env TYPE REF TO if_cds_test_environment. CLASS-METHODS class_setup. CLASS-METHODS class_teardown. METHODS setup. METHODS assert_amount IMPORTING iv_exp TYPE decfloat34 iv_act TYPE decfloat34. METHODS billable_min_rounds_up FOR TESTING. METHODS billable_min_exact FOR TESTING. METHODS rate_national FOR TESTING. METHODS rate_international FOR TESTING. METHODS rate_other FOR TESTING. METHODS charge_other FOR TESTING. METHODS charge_no_discount FOR TESTING. METHODS charge_long_discount FOR TESTING. METHODS charge_rounding FOR TESTING. METHODS charge_boundary FOR TESTING. METHODS row_count FOR TESTING. ENDCLASS. CLASS {{p}}t16_hidden IMPLEMENTATION. METHOD class_setup. go_env = cl_cds_test_environment=>create( i_for_entity = '{{P}}I_CALL_CHARGE' ). ENDMETHOD. METHOD class_teardown. go_env->destroy( ). ENDMETHOD. METHOD setup. DATA lt_calls TYPE STANDARD TABLE OF {{p}}calls WITH EMPTY KEY. go_env->clear_doubles( ). lt_calls = VALUE #( ( call_id = 'C1' customer = 'ACME' call_date = '20240110' start_time = '100000' duration_sec = 125 dest_type = 'N' ) ( call_id = 'C2' customer = 'BETA' call_date = '20240110' start_time = '220000' duration_sec = 3600 dest_type = 'I' ) ( call_id = 'C3' customer = 'GAMMA' call_date = '20240110' start_time = '073000' duration_sec = 30 dest_type = 'N' ) ( call_id = 'C4' customer = 'DELTA' call_date = '20240110' start_time = '120000' duration_sec = 120 dest_type = 'X' ) ( call_id = 'C5' customer = 'EPSILON' call_date = '20240110' start_time = '120000' duration_sec = 1800 dest_type = 'N' ) ( call_id = 'C6' customer = 'ZETA' call_date = '20240110' start_time = '120000' duration_sec = 1801 dest_type = 'N' ) ). go_env->insert_test_data( lt_calls ). ENDMETHOD. METHOD assert_amount. DATA lv_diff TYPE decfloat34. lv_diff = abs( iv_exp - iv_act ). cl_abap_unit_assert=>assert_equals( exp = abap_true act = xsdbool( lv_diff < CONV decfloat34( '0.005' ) ) ). ENDMETHOD. METHOD billable_min_rounds_up. SELECT SINGLE billable_min FROM {{p}}i_call_charge WHERE call_id = 'C1' INTO @DATA(lv_min1). cl_abap_unit_assert=>assert_equals( exp = 3 act = lv_min1 ). SELECT SINGLE billable_min FROM {{p}}i_call_charge WHERE call_id = 'C2' INTO @DATA(lv_min2). cl_abap_unit_assert=>assert_equals( exp = 60 act = lv_min2 ). SELECT SINGLE billable_min FROM {{p}}i_call_charge WHERE call_id = 'C3' INTO @DATA(lv_min3). cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_min3 ). SELECT SINGLE billable_min FROM {{p}}i_call_charge WHERE call_id = 'C4' INTO @DATA(lv_min4). cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_min4 ). ENDMETHOD. METHOD billable_min_exact. SELECT SINGLE billable_min FROM {{p}}i_call_charge WHERE call_id = 'C5' INTO @DATA(lv_min). cl_abap_unit_assert=>assert_equals( exp = 30 act = lv_min ). ENDMETHOD. METHOD rate_national. SELECT SINGLE rate FROM {{p}}i_call_charge WHERE call_id = 'C1' INTO @DATA(lv_rate). assert_amount( iv_exp = CONV decfloat34( '0.09' ) iv_act = CONV decfloat34( lv_rate ) ). ENDMETHOD. METHOD rate_international. SELECT SINGLE rate FROM {{p}}i_call_charge WHERE call_id = 'C2' INTO @DATA(lv_rate). assert_amount( iv_exp = CONV decfloat34( '0.25' ) iv_act = CONV decfloat34( lv_rate ) ). ENDMETHOD. METHOD rate_other. SELECT SINGLE rate FROM {{p}}i_call_charge WHERE call_id = 'C4' INTO @DATA(lv_rate). assert_amount( iv_exp = CONV decfloat34( '0.15' ) iv_act = CONV decfloat34( lv_rate ) ). ENDMETHOD. METHOD charge_other. SELECT SINGLE charge FROM {{p}}i_call_charge WHERE call_id = 'C4' INTO @DATA(lv_charge). assert_amount( iv_exp = CONV decfloat34( '0.30' ) iv_act = CONV decfloat34( lv_charge ) ). ENDMETHOD. METHOD charge_no_discount. SELECT SINGLE charge FROM {{p}}i_call_charge WHERE call_id = 'C1' INTO @DATA(lv_charge). assert_amount( iv_exp = CONV decfloat34( '0.27' ) iv_act = CONV decfloat34( lv_charge ) ). ENDMETHOD. METHOD charge_long_discount. SELECT SINGLE charge FROM {{p}}i_call_charge WHERE call_id = 'C2' INTO @DATA(lv_charge). assert_amount( iv_exp = CONV decfloat34( '13.50' ) iv_act = CONV decfloat34( lv_charge ) ). ENDMETHOD. METHOD charge_rounding. SELECT SINGLE charge FROM {{p}}i_call_charge WHERE call_id = 'C6' INTO @DATA(lv_charge). assert_amount( iv_exp = CONV decfloat34( '2.51' ) iv_act = CONV decfloat34( lv_charge ) ). ENDMETHOD. METHOD charge_boundary. SELECT SINGLE charge FROM {{p}}i_call_charge WHERE call_id = 'C5' INTO @DATA(lv_charge). assert_amount( iv_exp = CONV decfloat34( '2.70' ) iv_act = CONV decfloat34( lv_charge ) ). ENDMETHOD. METHOD row_count. SELECT COUNT(*) FROM {{p}}i_call_charge INTO @DATA(lv_rows). cl_abap_unit_assert=>assert_equals( exp = 6 act = lv_rows ). ENDMETHOD. ENDCLASS.