Stage 2 summary at 50 accepted trajectories
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
108
tasks_gen/train/G1074/reference/pallet_allocator.clas.abap
Normal file
108
tasks_gen/train/G1074/reference/pallet_allocator.clas.abap
Normal file
@@ -0,0 +1,108 @@
|
||||
CLASS {{p}}pallet_allocator DEFINITION
|
||||
PUBLIC
|
||||
FINAL
|
||||
CREATE PUBLIC.
|
||||
|
||||
PUBLIC SECTION.
|
||||
TYPES ty_category TYPE c LENGTH 2.
|
||||
TYPES ty_weight TYPE i.
|
||||
TYPES ty_height TYPE i.
|
||||
TYPES:
|
||||
BEGIN OF ty_slot,
|
||||
aisle TYPE c LENGTH 2,
|
||||
rack TYPE i,
|
||||
temp_zone TYPE c LENGTH 2,
|
||||
is_valid TYPE abap_bool,
|
||||
END OF ty_slot.
|
||||
|
||||
METHODS constructor.
|
||||
METHODS allocate
|
||||
IMPORTING
|
||||
iv_category TYPE ty_category
|
||||
iv_weight_kg TYPE ty_weight
|
||||
iv_height_cm TYPE ty_height
|
||||
RETURNING
|
||||
VALUE(rs_slot) TYPE ty_slot.
|
||||
|
||||
PRIVATE SECTION.
|
||||
TYPES:
|
||||
BEGIN OF ty_zone,
|
||||
category TYPE ty_category,
|
||||
aisle TYPE c LENGTH 2,
|
||||
temp TYPE c LENGTH 2,
|
||||
END OF ty_zone,
|
||||
tt_zone TYPE HASHED TABLE OF ty_zone WITH UNIQUE KEY category.
|
||||
|
||||
CONSTANTS:
|
||||
c_min_weight TYPE ty_weight VALUE 20,
|
||||
c_max_weight TYPE ty_weight VALUE 800,
|
||||
c_min_height TYPE ty_height VALUE 40,
|
||||
c_base_height TYPE ty_height VALUE 120,
|
||||
c_height_step TYPE ty_height VALUE 40,
|
||||
c_max_rack TYPE i VALUE 4.
|
||||
|
||||
METHODS zones
|
||||
RETURNING VALUE(rt_zone) TYPE tt_zone.
|
||||
METHODS normalized_category
|
||||
IMPORTING iv_category TYPE ty_category
|
||||
RETURNING VALUE(rv_category) TYPE ty_category.
|
||||
METHODS rack_for_height
|
||||
IMPORTING iv_height_cm TYPE ty_height
|
||||
RETURNING VALUE(rv_rack) TYPE i.
|
||||
METHODS is_weight_valid
|
||||
IMPORTING iv_weight_kg TYPE ty_weight
|
||||
RETURNING VALUE(rv_valid) TYPE abap_bool.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}pallet_allocator IMPLEMENTATION.
|
||||
|
||||
METHOD constructor.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD allocate.
|
||||
DATA(lv_category) = normalized_category( iv_category ).
|
||||
DATA(lt_zone) = zones( ).
|
||||
|
||||
IF NOT line_exists( lt_zone[ category = lv_category ] )
|
||||
OR is_weight_valid( iv_weight_kg ) = abap_false
|
||||
OR iv_height_cm < c_min_height.
|
||||
rs_slot = VALUE #( is_valid = abap_false ).
|
||||
RETURN.
|
||||
ENDIF.
|
||||
|
||||
DATA(lv_rack) = rack_for_height( iv_height_cm ).
|
||||
IF lv_rack > c_max_rack.
|
||||
rs_slot = VALUE #( is_valid = abap_false ).
|
||||
RETURN.
|
||||
ENDIF.
|
||||
|
||||
DATA(ls_zone) = lt_zone[ category = lv_category ].
|
||||
rs_slot = VALUE #( aisle = ls_zone-aisle
|
||||
rack = lv_rack
|
||||
temp_zone = ls_zone-temp
|
||||
is_valid = abap_true ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD zones.
|
||||
rt_zone = VALUE #( ( category = 'F' aisle = 'A1' temp = 'FZ' )
|
||||
( category = 'C' aisle = 'B2' temp = 'CZ' )
|
||||
( category = 'D' aisle = 'D4' temp = 'DZ' ) ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD normalized_category.
|
||||
rv_category = to_upper( replace( val = iv_category sub = ` ` with = `` occ = 0 ) ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rack_for_height.
|
||||
IF iv_height_cm <= c_base_height.
|
||||
rv_rack = 1.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
rv_rack = 1 + ( iv_height_cm - c_base_height + c_height_step - 1 ) DIV c_height_step.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD is_weight_valid.
|
||||
rv_valid = xsdbool( iv_weight_kg >= c_min_weight AND iv_weight_kg <= c_max_weight ).
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
@@ -0,0 +1,67 @@
|
||||
CLASS ltc_pallet_allocator DEFINITION FINAL FOR TESTING
|
||||
DURATION SHORT RISK LEVEL HARMLESS.
|
||||
|
||||
PRIVATE SECTION.
|
||||
DATA mo_cut TYPE REF TO {{p}}pallet_allocator.
|
||||
|
||||
METHODS setup.
|
||||
METHODS frozen_pallet FOR TESTING.
|
||||
METHODS chilled_pallet FOR TESTING.
|
||||
METHODS dry_pallet FOR TESTING.
|
||||
METHODS unknown_category FOR TESTING.
|
||||
METHODS weight_out_of_range FOR TESTING.
|
||||
METHODS height_out_of_range FOR TESTING.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS ltc_pallet_allocator IMPLEMENTATION.
|
||||
|
||||
METHOD setup.
|
||||
mo_cut = NEW {{p}}pallet_allocator( ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD frozen_pallet.
|
||||
DATA(ls_slot) = mo_cut->allocate( iv_category = 'F' iv_weight_kg = 100 iv_height_cm = 100 ).
|
||||
|
||||
cl_abap_unit_assert=>assert_equals( exp = abap_true act = ls_slot-is_valid ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'A1' act = ls_slot-aisle ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 1 act = ls_slot-rack ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD chilled_pallet.
|
||||
DATA(ls_slot) = mo_cut->allocate( iv_category = 'C' iv_weight_kg = 500 iv_height_cm = 200 ).
|
||||
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'B2' act = ls_slot-aisle ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'CZ' act = ls_slot-temp_zone ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 3 act = ls_slot-rack ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD dry_pallet.
|
||||
DATA(ls_slot) = mo_cut->allocate( iv_category = 'D' iv_weight_kg = 20 iv_height_cm = 40 ).
|
||||
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'D4' act = ls_slot-aisle ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 1 act = ls_slot-rack ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD unknown_category.
|
||||
DATA(ls_slot) = mo_cut->allocate( iv_category = 'X' iv_weight_kg = 100 iv_height_cm = 100 ).
|
||||
|
||||
cl_abap_unit_assert=>assert_equals( exp = abap_false act = ls_slot-is_valid ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD weight_out_of_range.
|
||||
DATA(ls_light) = mo_cut->allocate( iv_category = 'F' iv_weight_kg = 19 iv_height_cm = 100 ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = abap_false act = ls_light-is_valid ).
|
||||
|
||||
DATA(ls_heavy) = mo_cut->allocate( iv_category = 'F' iv_weight_kg = 801 iv_height_cm = 100 ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = abap_false act = ls_heavy-is_valid ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD height_out_of_range.
|
||||
DATA(ls_low) = mo_cut->allocate( iv_category = 'F' iv_weight_kg = 100 iv_height_cm = 39 ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = abap_false act = ls_low-is_valid ).
|
||||
|
||||
DATA(ls_high) = mo_cut->allocate( iv_category = 'F' iv_weight_kg = 100 iv_height_cm = 241 ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = abap_false act = ls_high-is_valid ).
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
Reference in New Issue
Block a user