CLASS ltc_job_planner DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. DATA mo_cut TYPE REF TO {{p}}job_planner. METHODS setup. METHODS valid_job RETURNING VALUE(rs_job) TYPE {{p}}job_planner=>ty_job. METHODS standard_cost FOR TESTING. METHODS express_cost FOR TESTING. METHODS missing_id FOR TESTING. METHODS bad_hours FOR TESTING. METHODS bad_group FOR TESTING. ENDCLASS. CLASS ltc_job_planner IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}job_planner( ). ENDMETHOD. METHOD valid_job. rs_job = VALUE #( job_id = 'JOB-1000' calc_mode = 'S' work_hours = '10.00' part_count = 4 mat_group = 'ST' due_date = '20250601' net_value = '100.00' ). ENDMETHOD. METHOD standard_cost. DATA lv_exp TYPE {{p}}job_planner=>ty_cost. lv_exp = '750.00'. TRY. cl_abap_unit_assert=>assert_equals( exp = lv_exp act = mo_cut->calculate_cost( valid_job( ) ) ). CATCH {{p}}cx_job_error. cl_abap_unit_assert=>fail( `unexpected exception` ). ENDTRY. ENDMETHOD. METHOD express_cost. DATA ls_job TYPE {{p}}job_planner=>ty_job. DATA lv_exp TYPE {{p}}job_planner=>ty_cost. ls_job = valid_job( ). ls_job-calc_mode = 'E'. ls_job-work_hours = '2.50'. ls_job-part_count = 2. ls_job-mat_group = 'AL'. ls_job-net_value = 0. lv_exp = '241.00'. TRY. cl_abap_unit_assert=>assert_equals( exp = lv_exp act = mo_cut->calculate_cost( ls_job ) ). CATCH {{p}}cx_job_error. cl_abap_unit_assert=>fail( `unexpected exception` ). ENDTRY. ENDMETHOD. METHOD missing_id. DATA(ls_job) = valid_job( ). ls_job-job_id = ''. TRY. mo_cut->validate( ls_job ). cl_abap_unit_assert=>fail( `NO_JOB_ID expected` ). CATCH {{p}}cx_job_error INTO DATA(lx_error). cl_abap_unit_assert=>assert_equals( exp = {{p}}cx_job_error=>c_reason-no_job_id act = lx_error->get_reason( ) ). ENDTRY. ENDMETHOD. METHOD bad_hours. DATA(ls_job) = valid_job( ). ls_job-work_hours = '101.00'. TRY. mo_cut->validate( ls_job ). cl_abap_unit_assert=>fail( `BAD_HOURS expected` ). CATCH {{p}}cx_job_error INTO DATA(lx_error). cl_abap_unit_assert=>assert_equals( exp = {{p}}cx_job_error=>c_reason-bad_hours act = lx_error->get_reason( ) ). ENDTRY. ENDMETHOD. METHOD bad_group. DATA(ls_job) = valid_job( ). ls_job-mat_group = 'XY'. TRY. mo_cut->calculate_cost( ls_job ). cl_abap_unit_assert=>fail( `BAD_GROUP expected` ). CATCH {{p}}cx_job_error INTO DATA(lx_error). cl_abap_unit_assert=>assert_equals( exp = {{p}}cx_job_error=>c_reason-bad_group act = lx_error->get_reason( ) ). ENDTRY. ENDMETHOD. ENDCLASS.