Object type mix: INTF, TABL, STRU, MSAG, exception tasks (harness G2, mutants, generator notes), balanced generator, kind-deficit job order, dashboard mix card

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 18:52:29 +02:00
parent 454db6626c
commit b119f1afac
39 changed files with 2329 additions and 24 deletions

View File

@@ -0,0 +1,51 @@
INTERFACE {{p}}if_parcel_fee PUBLIC.
TYPES ty_weight_g TYPE i.
TYPES ty_cents TYPE i.
TYPES ty_zone TYPE c LENGTH 1.
TYPES ty_reason TYPE c LENGTH 10.
CONSTANTS:
BEGIN OF c_zone,
home TYPE ty_zone VALUE '1',
national TYPE ty_zone VALUE '2',
europe TYPE ty_zone VALUE '3',
END OF c_zone.
CONSTANTS:
BEGIN OF c_reason,
ok TYPE ty_reason VALUE 'OK',
weight TYPE ty_reason VALUE 'WEIGHT',
zone TYPE ty_reason VALUE 'ZONE',
END OF c_reason.
CONSTANTS:
BEGIN OF c_limit,
min_weight TYPE ty_weight_g VALUE 1,
max_weight TYPE ty_weight_g VALUE 31500,
END OF c_limit.
CONSTANTS:
BEGIN OF c_surcharge,
per_step TYPE ty_cents VALUE 90,
express TYPE ty_cents VALUE 750,
END OF c_surcharge.
METHODS check_input
IMPORTING iv_weight_g TYPE ty_weight_g
iv_zone TYPE ty_zone
RETURNING VALUE(rv_reason) TYPE ty_reason.
METHODS base_fee
IMPORTING iv_zone TYPE ty_zone
RETURNING VALUE(rv_cents) TYPE ty_cents.
METHODS weight_surcharge
IMPORTING iv_weight_g TYPE ty_weight_g
RETURNING VALUE(rv_cents) TYPE ty_cents.
METHODS total_fee
IMPORTING iv_weight_g TYPE ty_weight_g
iv_zone TYPE ty_zone
iv_express TYPE abap_bool
RETURNING VALUE(rv_cents) TYPE ty_cents.
ENDINTERFACE.

View File

@@ -0,0 +1,180 @@
CLASS {{p}}parcel_fee_test 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 valid_input FOR TESTING.
METHODS weight_out_of_range FOR TESTING.
METHODS unknown_zone FOR TESTING.
METHODS base_fee_by_zone FOR TESTING.
METHODS surcharge_steps FOR TESTING.
METHODS total_fee_with_express FOR TESTING.
METHODS total_fee_invalid FOR TESTING.
ENDCLASS.
CLASS {{p}}parcel_fee_test 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 valid_input.
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 = 1 iv_zone = '1' ) ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_parcel_fee=>c_reason-ok
act = lo_cut->check_input( iv_weight_g = 31500 iv_zone = '3' ) ).
ENDMETHOD.
METHOD weight_out_of_range.
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-weight
act = lo_cut->check_input( iv_weight_g = 0 iv_zone = '1' ) ).
cl_abap_unit_assert=>assert_equals( exp = {{p}}if_parcel_fee=>c_reason-weight
act = lo_cut->check_input( iv_weight_g = 31501 iv_zone = '1' ) ).
ENDMETHOD.
METHOD unknown_zone.
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-zone
act = lo_cut->check_input( iv_weight_g = 500 iv_zone = '9' ) ).
ENDMETHOD.
METHOD base_fee_by_zone.
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 = '1' ) ).
cl_abap_unit_assert=>assert_equals( exp = 620 act = lo_cut->base_fee( iv_zone = '2' ) ).
cl_abap_unit_assert=>assert_equals( exp = 990 act = lo_cut->base_fee( iv_zone = '3' ) ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lo_cut->base_fee( iv_zone = '9' ) ).
ENDMETHOD.
METHOD surcharge_steps.
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 = 90
act = lo_cut->weight_surcharge( iv_weight_g = 2000 ) ).
cl_abap_unit_assert=>assert_equals( exp = 180
act = lo_cut->weight_surcharge( iv_weight_g = 2001 ) ).
ENDMETHOD.
METHOD total_fee_with_express.
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 ) ).
ENDMETHOD.
METHOD total_fee_invalid.
DATA lo_cut TYPE REF TO {{p}}if_parcel_fee.
lo_cut = me.
cl_abap_unit_assert=>assert_equals( exp = 0
act = lo_cut->total_fee( iv_weight_g = 0 iv_zone = '1' iv_express = abap_true ) ).
cl_abap_unit_assert=>assert_equals( exp = 0
act = lo_cut->total_fee( iv_weight_g = 500 iv_zone = '9' iv_express = abap_false ) ).
ENDMETHOD.
ENDCLASS.