CLASS {{p}}d02_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. TYPES ty_reason TYPE c LENGTH 10. DATA mo_cut TYPE REF TO {{p}}shift_booker. METHODS setup. METHODS valid_shift RETURNING VALUE(rs_shift) TYPE {{p}}shift_booker=>ty_shift. METHODS expect_reason IMPORTING is_shift TYPE {{p}}shift_booker=>ty_shift iv_reason TYPE ty_reason. METHODS expect_pay IMPORTING is_shift TYPE {{p}}shift_booker=>ty_shift iv_pay TYPE {{p}}shift_booker=>ty_amount. METHODS books_standard_shift FOR TESTING. METHODS books_overtime_shift FOR TESTING. METHODS books_second_overtime FOR TESTING. METHODS books_small_shift FOR TESTING. METHODS rejects_empty_order FOR TESTING. METHODS rejects_initial_date FOR TESTING. METHODS rejects_zero_hours FOR TESTING. METHODS rejects_unknown_mode FOR TESTING. METHODS rejects_unknown_group FOR TESTING. METHODS rejects_zero_pieces FOR TESTING. METHODS order_rule_wins FOR TESTING. ENDCLASS. CLASS {{p}}d02_hidden IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}shift_booker( ). ENDMETHOD. METHOD valid_shift. rs_shift = VALUE #( order_no = '4711' start_date = '20240212' work_hours = '8.00' calc_mode = 'STD' group_code = 'A' piece_count = 100 ). ENDMETHOD. METHOD expect_reason. TRY. mo_cut->evaluate( is_shift ). cl_abap_unit_assert=>fail( msg = |no exception for { iv_reason }| ). CATCH {{p}}cx_shift_error INTO DATA(lx_error). cl_abap_unit_assert=>assert_equals( exp = iv_reason act = lx_error->mv_reason ). ENDTRY. ENDMETHOD. METHOD expect_pay. TRY. cl_abap_unit_assert=>assert_equals( exp = iv_pay act = mo_cut->evaluate( is_shift ) ). CATCH {{p}}cx_shift_error. cl_abap_unit_assert=>fail( msg = 'unexpected exception' ). ENDTRY. ENDMETHOD. METHOD books_standard_shift. expect_pay( is_shift = valid_shift( ) iv_pay = '194.00' ). ENDMETHOD. METHOD books_overtime_shift. DATA(ls_shift) = valid_shift( ). ls_shift-work_hours = '7.50'. ls_shift-calc_mode = 'OT1'. ls_shift-group_code = 'B'. ls_shift-piece_count = 40. expect_pay( is_shift = ls_shift iv_pay = '267.50' ). ENDMETHOD. METHOD books_second_overtime. DATA(ls_shift) = valid_shift( ). ls_shift-work_hours = '6.00'. ls_shift-calc_mode = 'OT2'. ls_shift-group_code = 'C'. ls_shift-piece_count = 10. expect_pay( is_shift = ls_shift iv_pay = '317.00' ). ENDMETHOD. METHOD books_small_shift. DATA(ls_shift) = valid_shift( ). ls_shift-work_hours = '0.50'. ls_shift-piece_count = 1. expect_pay( is_shift = ls_shift iv_pay = '9.50' ). ENDMETHOD. METHOD rejects_empty_order. DATA(ls_shift) = valid_shift( ). ls_shift-order_no = ''. expect_reason( is_shift = ls_shift iv_reason = 'ORDER' ). ENDMETHOD. METHOD rejects_initial_date. DATA(ls_shift) = valid_shift( ). ls_shift-start_date = '00000000'. expect_reason( is_shift = ls_shift iv_reason = 'DATE' ). ENDMETHOD. METHOD rejects_zero_hours. DATA(ls_shift) = valid_shift( ). ls_shift-work_hours = '0.00'. expect_reason( is_shift = ls_shift iv_reason = 'HOURS' ). ENDMETHOD. METHOD rejects_unknown_mode. DATA(ls_shift) = valid_shift( ). ls_shift-calc_mode = 'XXX'. expect_reason( is_shift = ls_shift iv_reason = 'MODE' ). ENDMETHOD. METHOD rejects_unknown_group. DATA(ls_shift) = valid_shift( ). ls_shift-group_code = 'Z'. expect_reason( is_shift = ls_shift iv_reason = 'GROUP' ). ENDMETHOD. METHOD rejects_zero_pieces. DATA(ls_shift) = valid_shift( ). ls_shift-piece_count = 0. expect_reason( is_shift = ls_shift iv_reason = 'COUNT' ). ENDMETHOD. METHOD order_rule_wins. DATA(ls_shift) = valid_shift( ). ls_shift-order_no = ''. ls_shift-work_hours = '0.00'. expect_reason( is_shift = ls_shift iv_reason = 'ORDER' ). ENDMETHOD. ENDCLASS.