CLASS ltc_workload_planner DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. TYPES: ty_mechanic TYPE c LENGTH 8, ty_date TYPE c LENGTH 8. DATA mo_cut TYPE REF TO {{p}}workload_planner. METHODS setup. METHODS empty_input FOR TESTING. METHODS one_mechanic FOR TESTING. METHODS sorted_by_mechanic FOR TESTING. METHODS ignores_invalid_jobs FOR TESTING. METHODS keeps_earliest_date FOR TESTING. METHODS add_job IMPORTING iv_mechanic TYPE ty_mechanic iv_hours TYPE i iv_date TYPE ty_date CHANGING ct_jobs TYPE {{p}}workload_planner=>tt_job. ENDCLASS. CLASS ltc_workload_planner IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}workload_planner( ). ENDMETHOD. METHOD add_job. INSERT VALUE #( job_id = 'JOB' mechanic = iv_mechanic work_hours = iv_hours start_date = iv_date ) INTO TABLE ct_jobs. ENDMETHOD. METHOD empty_input. DATA lt_jobs TYPE {{p}}workload_planner=>tt_job. cl_abap_unit_assert=>assert_initial( act = mo_cut->summarize( it_jobs = lt_jobs ) ). ENDMETHOD. METHOD one_mechanic. DATA lt_jobs TYPE {{p}}workload_planner=>tt_job. add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 4 iv_date = '20250110' CHANGING ct_jobs = lt_jobs ). add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 6 iv_date = '20250112' CHANGING ct_jobs = lt_jobs ). DATA(lt_result) = mo_cut->summarize( it_jobs = lt_jobs ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_result[ 1 ]-job_count ). cl_abap_unit_assert=>assert_equals( exp = 10 act = lt_result[ 1 ]-total_hours ). cl_abap_unit_assert=>assert_equals( exp = '20250110' act = lt_result[ 1 ]-first_date ). ENDMETHOD. METHOD sorted_by_mechanic. DATA lt_jobs TYPE {{p}}workload_planner=>tt_job. add_job( EXPORTING iv_mechanic = 'M2' iv_hours = 1 iv_date = '20250110' CHANGING ct_jobs = lt_jobs ). add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 1 iv_date = '20250110' CHANGING ct_jobs = lt_jobs ). DATA(lt_result) = mo_cut->summarize( it_jobs = lt_jobs ). cl_abap_unit_assert=>assert_equals( exp = 'M1' act = lt_result[ 1 ]-mechanic ). cl_abap_unit_assert=>assert_equals( exp = 'M2' act = lt_result[ 2 ]-mechanic ). ENDMETHOD. METHOD ignores_invalid_jobs. DATA lt_jobs TYPE {{p}}workload_planner=>tt_job. DATA lv_empty TYPE ty_mechanic. add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 0 iv_date = '20250110' CHANGING ct_jobs = lt_jobs ). add_job( EXPORTING iv_mechanic = lv_empty iv_hours = 5 iv_date = '20250110' CHANGING ct_jobs = lt_jobs ). cl_abap_unit_assert=>assert_initial( act = mo_cut->summarize( it_jobs = lt_jobs ) ). ENDMETHOD. METHOD keeps_earliest_date. DATA lt_jobs TYPE {{p}}workload_planner=>tt_job. add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 1 iv_date = '20250201' CHANGING ct_jobs = lt_jobs ). add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 1 iv_date = '20250101' CHANGING ct_jobs = lt_jobs ). DATA(lt_result) = mo_cut->summarize( it_jobs = lt_jobs ). cl_abap_unit_assert=>assert_equals( exp = '20250101' act = lt_result[ 1 ]-first_date ). ENDMETHOD. ENDCLASS.