CLASS {{p}}t02_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC 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 single_job FOR TESTING. METHODS same_mechanic_aggregated FOR TESTING. METHODS different_mechanics_sorted FOR TESTING. METHODS non_positive_hours_ignored FOR TESTING. METHODS empty_mechanic_ignored FOR TESTING. METHODS empty_job_id_ignored FOR TESTING. METHODS earliest_date_wins FOR TESTING. METHODS unset_dates_ignored FOR TESTING. METHODS all_dates_unset FOR TESTING. METHODS all_jobs_invalid 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 {{p}}t02_hidden IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}workload_planner( ). ENDMETHOD. METHOD add_job. DATA lv_id TYPE c LENGTH 10. lv_id = lines( ct_jobs ) + 1. INSERT VALUE #( job_id = lv_id 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 single_job. 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 ). 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 = 'M1' act = lt_result[ 1 ]-mechanic ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_result[ 1 ]-job_count ). cl_abap_unit_assert=>assert_equals( exp = 4 act = lt_result[ 1 ]-total_hours ). cl_abap_unit_assert=>assert_equals( exp = '20250110' act = lt_result[ 1 ]-first_date ). ENDMETHOD. METHOD same_mechanic_aggregated. 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 different_mechanics_sorted. DATA lt_jobs TYPE {{p}}workload_planner=>tt_job. add_job( EXPORTING iv_mechanic = 'M3' iv_hours = 2 iv_date = '20250110' CHANGING ct_jobs = lt_jobs ). add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 3 iv_date = '20250110' CHANGING ct_jobs = lt_jobs ). add_job( EXPORTING iv_mechanic = 'M2' iv_hours = 5 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 = 3 act = lines( lt_result ) ). 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 ). cl_abap_unit_assert=>assert_equals( exp = 'M3' act = lt_result[ 3 ]-mechanic ). ENDMETHOD. METHOD non_positive_hours_ignored. 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 = 0 iv_date = '20250111' CHANGING ct_jobs = lt_jobs ). add_job( EXPORTING iv_mechanic = 'M1' iv_hours = -3 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 = 1 act = lt_result[ 1 ]-job_count ). cl_abap_unit_assert=>assert_equals( exp = 4 act = lt_result[ 1 ]-total_hours ). ENDMETHOD. METHOD empty_mechanic_ignored. DATA lt_jobs TYPE {{p}}workload_planner=>tt_job. DATA lv_empty TYPE ty_mechanic. add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 4 iv_date = '20250110' CHANGING ct_jobs = lt_jobs ). add_job( EXPORTING iv_mechanic = lv_empty iv_hours = 7 iv_date = '20250111' 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 = 4 act = lt_result[ 1 ]-total_hours ). ENDMETHOD. METHOD empty_job_id_ignored. 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 ). INSERT VALUE #( mechanic = 'M1' work_hours = 7 start_date = '20250111' ) INTO TABLE 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 = 4 act = lt_result[ 1 ]-total_hours ). ENDMETHOD. METHOD earliest_date_wins. DATA lt_jobs TYPE {{p}}workload_planner=>tt_job. add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 1 iv_date = '20250120' CHANGING ct_jobs = lt_jobs ). add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 1 iv_date = '20250105' CHANGING ct_jobs = lt_jobs ). add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 1 iv_date = '20250115' CHANGING ct_jobs = lt_jobs ). DATA(lt_result) = mo_cut->summarize( it_jobs = lt_jobs ). cl_abap_unit_assert=>assert_equals( exp = '20250105' act = lt_result[ 1 ]-first_date ). ENDMETHOD. METHOD unset_dates_ignored. DATA lt_jobs TYPE {{p}}workload_planner=>tt_job. DATA lv_unset TYPE ty_date. add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 1 iv_date = lv_unset CHANGING ct_jobs = lt_jobs ). add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 1 iv_date = '00000000' CHANGING ct_jobs = lt_jobs ). add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 1 iv_date = '20250115' CHANGING ct_jobs = lt_jobs ). DATA(lt_result) = mo_cut->summarize( it_jobs = lt_jobs ). cl_abap_unit_assert=>assert_equals( exp = '20250115' act = lt_result[ 1 ]-first_date ). ENDMETHOD. METHOD all_dates_unset. DATA lt_jobs TYPE {{p}}workload_planner=>tt_job. add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 1 iv_date = '00000000' CHANGING ct_jobs = lt_jobs ). add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 2 iv_date = '00000000' 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_initial( act = lt_result[ 1 ]-first_date ). ENDMETHOD. METHOD all_jobs_invalid. DATA lt_jobs TYPE {{p}}workload_planner=>tt_job. DATA lv_empty TYPE ty_mechanic. add_job( EXPORTING iv_mechanic = lv_empty iv_hours = 4 iv_date = '20250110' CHANGING ct_jobs = lt_jobs ). add_job( EXPORTING iv_mechanic = 'M1' iv_hours = 0 iv_date = '20250110' CHANGING ct_jobs = lt_jobs ). cl_abap_unit_assert=>assert_initial( act = mo_cut->summarize( it_jobs = lt_jobs ) ). ENDMETHOD. ENDCLASS.