CLASS {{p}}t02_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}}return_checker. DATA mo_env TYPE REF TO if_osql_test_environment. METHODS setup. METHODS teardown. METHODS valid_return RETURNING VALUE(rs_return) TYPE {{p}}return_checker=>ty_return_data. METHODS expect_reason IMPORTING is_data TYPE {{p}}return_checker=>ty_return_data iv_reason TYPE ty_reason. METHODS ok_return FOR TESTING. METHODS rejects_no_data FOR TESTING. METHODS rejects_empty_date FOR TESTING. METHODS rejects_date_order FOR TESTING. METHODS rejects_mileage FOR TESTING. METHODS rejects_fuel FOR TESTING. METHODS rejects_damage FOR TESTING. METHODS rejects_unknown FOR TESTING. METHODS rejects_too_long FOR TESTING. METHODS accepts_max_duration FOR TESTING. METHODS checks_data_before_master FOR TESTING. ENDCLASS. CLASS {{p}}t02_hidden IMPLEMENTATION. METHOD setup. mo_env = cl_osql_test_environment=>create( VALUE #( ( '{{P}}VEHICLE' ) ) ). DATA lt_vehicle TYPE STANDARD TABLE OF {{p}}vehicle WITH EMPTY KEY. lt_vehicle = VALUE #( ( mandt = sy-mandt vehicle_id = 'V-1001' max_days = 5 ) ( mandt = sy-mandt vehicle_id = 'V-1002' max_days = 30 ) ). mo_env->insert_test_data( lt_vehicle ). mo_cut = NEW {{p}}return_checker( ). ENDMETHOD. METHOD teardown. mo_env->destroy( ). ENDMETHOD. METHOD valid_return. rs_return = VALUE #( rental_id = 'R-4711' vehicle_id = 'V-1001' start_date = '20240101' return_date = '20240103' start_mileage = 10000 end_mileage = 10250 fuel_percent = 80 damage_code = '' is_damaged = abap_false ). ENDMETHOD. METHOD expect_reason. TRY. mo_cut->check( is_data ). cl_abap_unit_assert=>fail( msg = |no exception, expected { iv_reason }| ). CATCH {{p}}cx_return_error INTO DATA(lo_error). cl_abap_unit_assert=>assert_equals( exp = iv_reason act = lo_error->mv_reason ). ENDTRY. ENDMETHOD. METHOD ok_return. TRY. mo_cut->check( valid_return( ) ). CATCH {{p}}cx_return_error INTO DATA(lo_error). cl_abap_unit_assert=>fail( msg = |unexpected reason { lo_error->mv_reason }| ). ENDTRY. ENDMETHOD. METHOD rejects_no_data. DATA(ls_return) = valid_return( ). CLEAR ls_return-rental_id. expect_reason( is_data = ls_return iv_reason = 'NO_DATA' ). ENDMETHOD. METHOD rejects_empty_date. DATA(ls_return) = valid_return( ). CLEAR ls_return-start_date. expect_reason( is_data = ls_return iv_reason = 'NO_DATA' ). ENDMETHOD. METHOD rejects_date_order. DATA(ls_return) = valid_return( ). ls_return-return_date = '20231231'. expect_reason( is_data = ls_return iv_reason = 'DATE_ORDER' ). ENDMETHOD. METHOD rejects_mileage. DATA(ls_return) = valid_return( ). ls_return-end_mileage = ls_return-start_mileage - 1. expect_reason( is_data = ls_return iv_reason = 'MILEAGE' ). ENDMETHOD. METHOD rejects_fuel. DATA(ls_return) = valid_return( ). ls_return-fuel_percent = 101. expect_reason( is_data = ls_return iv_reason = 'FUEL' ). ENDMETHOD. METHOD rejects_damage. DATA(ls_return) = valid_return( ). ls_return-is_damaged = abap_true. CLEAR ls_return-damage_code. expect_reason( is_data = ls_return iv_reason = 'DAMAGE' ). ENDMETHOD. METHOD rejects_unknown. DATA(ls_return) = valid_return( ). ls_return-vehicle_id = 'V-9999'. expect_reason( is_data = ls_return iv_reason = 'UNKNOWN' ). ENDMETHOD. METHOD rejects_too_long. DATA(ls_return) = valid_return( ). ls_return-return_date = '20240110'. expect_reason( is_data = ls_return iv_reason = 'TOO_LONG' ). ENDMETHOD. METHOD accepts_max_duration. DATA(ls_return) = valid_return( ). ls_return-return_date = '20240105'. TRY. mo_cut->check( ls_return ). CATCH {{p}}cx_return_error INTO DATA(lo_error). cl_abap_unit_assert=>fail( msg = |unexpected reason { lo_error->mv_reason }| ). ENDTRY. ENDMETHOD. METHOD checks_data_before_master. DATA(ls_return) = valid_return( ). ls_return-vehicle_id = 'V-9999'. ls_return-fuel_percent = 150. expect_reason( is_data = ls_return iv_reason = 'FUEL' ). ENDMETHOD. ENDCLASS.