CLASS {{p}}parcel_fee_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PUBLIC SECTION. INTERFACES {{p}}if_parcel_fee. PRIVATE SECTION. METHODS zone_values FOR TESTING. METHODS reason_values FOR TESTING. METHODS limit_values FOR TESTING. METHODS surcharge_values FOR TESTING. METHODS type_lengths FOR TESTING. METHODS check_input_sig FOR TESTING. METHODS base_fee_sig FOR TESTING. METHODS weight_surcharge_sig FOR TESTING. METHODS total_fee_sig FOR TESTING. ENDCLASS. CLASS {{p}}parcel_fee_hidden IMPLEMENTATION. METHOD {{p}}if_parcel_fee~check_input. IF iv_weight_g < {{p}}if_parcel_fee=>c_limit-min_weight OR iv_weight_g > {{p}}if_parcel_fee=>c_limit-max_weight. rv_reason = {{p}}if_parcel_fee=>c_reason-weight. ELSEIF iv_zone <> {{p}}if_parcel_fee=>c_zone-home AND iv_zone <> {{p}}if_parcel_fee=>c_zone-national AND iv_zone <> {{p}}if_parcel_fee=>c_zone-europe. rv_reason = {{p}}if_parcel_fee=>c_reason-zone. ELSE. rv_reason = {{p}}if_parcel_fee=>c_reason-ok. ENDIF. ENDMETHOD. METHOD {{p}}if_parcel_fee~base_fee. CASE iv_zone. WHEN {{p}}if_parcel_fee=>c_zone-home. rv_cents = 350. WHEN {{p}}if_parcel_fee=>c_zone-national. rv_cents = 620. WHEN {{p}}if_parcel_fee=>c_zone-europe. rv_cents = 990. WHEN OTHERS. rv_cents = 0. ENDCASE. ENDMETHOD. METHOD {{p}}if_parcel_fee~weight_surcharge. IF iv_weight_g > 1000. rv_cents = ( iv_weight_g - 1000 + 999 ) DIV 1000 * {{p}}if_parcel_fee=>c_surcharge-per_step. ENDIF. ENDMETHOD. METHOD {{p}}if_parcel_fee~total_fee. IF me->{{p}}if_parcel_fee~check_input( iv_weight_g = iv_weight_g iv_zone = iv_zone ) <> {{p}}if_parcel_fee=>c_reason-ok. RETURN. ENDIF. rv_cents = me->{{p}}if_parcel_fee~base_fee( iv_zone ) + me->{{p}}if_parcel_fee~weight_surcharge( iv_weight_g ). IF iv_express = abap_true. rv_cents = rv_cents + {{p}}if_parcel_fee=>c_surcharge-express. ENDIF. ENDMETHOD. METHOD zone_values. cl_abap_unit_assert=>assert_equals( exp = '1' act = {{p}}if_parcel_fee=>c_zone-home ). cl_abap_unit_assert=>assert_equals( exp = '2' act = {{p}}if_parcel_fee=>c_zone-national ). cl_abap_unit_assert=>assert_equals( exp = '3' act = {{p}}if_parcel_fee=>c_zone-europe ). ENDMETHOD. METHOD reason_values. cl_abap_unit_assert=>assert_equals( exp = 'OK' act = {{p}}if_parcel_fee=>c_reason-ok ). cl_abap_unit_assert=>assert_equals( exp = 'WEIGHT' act = {{p}}if_parcel_fee=>c_reason-weight ). cl_abap_unit_assert=>assert_equals( exp = 'ZONE' act = {{p}}if_parcel_fee=>c_reason-zone ). ENDMETHOD. METHOD limit_values. cl_abap_unit_assert=>assert_equals( exp = 1 act = {{p}}if_parcel_fee=>c_limit-min_weight ). cl_abap_unit_assert=>assert_equals( exp = 31500 act = {{p}}if_parcel_fee=>c_limit-max_weight ). ENDMETHOD. METHOD surcharge_values. cl_abap_unit_assert=>assert_equals( exp = 90 act = {{p}}if_parcel_fee=>c_surcharge-per_step ). cl_abap_unit_assert=>assert_equals( exp = 750 act = {{p}}if_parcel_fee=>c_surcharge-express ). ENDMETHOD. METHOD type_lengths. DATA lv_zone TYPE {{p}}if_parcel_fee=>ty_zone. DATA lv_reason TYPE {{p}}if_parcel_fee=>ty_reason. DATA lv_weight TYPE {{p}}if_parcel_fee=>ty_weight_g. DATA lv_cents TYPE {{p}}if_parcel_fee=>ty_cents. DATA(lv_char1) = 'A'. DATA(lv_char10) = 'ABCDEFGHIJ'. DATA(lo_zone) = cl_abap_typedescr=>describe_by_data( lv_zone ). DATA(lo_reason) = cl_abap_typedescr=>describe_by_data( lv_reason ). DATA(lo_weight) = cl_abap_typedescr=>describe_by_data( lv_weight ). DATA(lo_cents) = cl_abap_typedescr=>describe_by_data( lv_cents ). DATA(lo_char1) = cl_abap_typedescr=>describe_by_data( lv_char1 ). DATA(lo_char10) = cl_abap_typedescr=>describe_by_data( lv_char10 ). cl_abap_unit_assert=>assert_equals( exp = cl_abap_typedescr=>typekind_char act = lo_zone->type_kind ). cl_abap_unit_assert=>assert_equals( exp = lo_char1->length act = lo_zone->length ). cl_abap_unit_assert=>assert_equals( exp = cl_abap_typedescr=>typekind_char act = lo_reason->type_kind ). cl_abap_unit_assert=>assert_equals( exp = lo_char10->length act = lo_reason->length ). cl_abap_unit_assert=>assert_equals( exp = cl_abap_typedescr=>typekind_int act = lo_weight->type_kind ). cl_abap_unit_assert=>assert_equals( exp = cl_abap_typedescr=>typekind_int act = lo_cents->type_kind ). ENDMETHOD. METHOD check_input_sig. DATA lo_cut TYPE REF TO {{p}}if_parcel_fee. lo_cut = me. cl_abap_unit_assert=>assert_equals( exp = {{p}}if_parcel_fee=>c_reason-ok act = lo_cut->check_input( iv_weight_g = 500 iv_zone = {{p}}if_parcel_fee=>c_zone-home ) ). cl_abap_unit_assert=>assert_equals( exp = {{p}}if_parcel_fee=>c_reason-weight act = lo_cut->check_input( iv_weight_g = 0 iv_zone = {{p}}if_parcel_fee=>c_zone-home ) ). cl_abap_unit_assert=>assert_equals( exp = {{p}}if_parcel_fee=>c_reason-zone act = lo_cut->check_input( iv_weight_g = 500 iv_zone = '9' ) ). ENDMETHOD. METHOD base_fee_sig. DATA lo_cut TYPE REF TO {{p}}if_parcel_fee. lo_cut = me. cl_abap_unit_assert=>assert_equals( exp = 350 act = lo_cut->base_fee( iv_zone = {{p}}if_parcel_fee=>c_zone-home ) ). cl_abap_unit_assert=>assert_equals( exp = 620 act = lo_cut->base_fee( iv_zone = {{p}}if_parcel_fee=>c_zone-national ) ). cl_abap_unit_assert=>assert_equals( exp = 990 act = lo_cut->base_fee( iv_zone = {{p}}if_parcel_fee=>c_zone-europe ) ). ENDMETHOD. METHOD weight_surcharge_sig. DATA lo_cut TYPE REF TO {{p}}if_parcel_fee. lo_cut = me. cl_abap_unit_assert=>assert_equals( exp = 0 act = lo_cut->weight_surcharge( iv_weight_g = 1000 ) ). cl_abap_unit_assert=>assert_equals( exp = 90 act = lo_cut->weight_surcharge( iv_weight_g = 1001 ) ). cl_abap_unit_assert=>assert_equals( exp = 180 act = lo_cut->weight_surcharge( iv_weight_g = 2001 ) ). ENDMETHOD. METHOD total_fee_sig. DATA lo_cut TYPE REF TO {{p}}if_parcel_fee. lo_cut = me. cl_abap_unit_assert=>assert_equals( exp = 530 act = lo_cut->total_fee( iv_weight_g = 2500 iv_zone = '1' iv_express = abap_false ) ). cl_abap_unit_assert=>assert_equals( exp = 1280 act = lo_cut->total_fee( iv_weight_g = 2500 iv_zone = '1' iv_express = abap_true ) ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lo_cut->total_fee( iv_weight_g = 0 iv_zone = '1' iv_express = abap_false ) ). ENDMETHOD. ENDCLASS.