CLASS ltc_tool_crib DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. TYPES tt_tool_ids TYPE STANDARD TABLE OF {{p}}tool_crib=>ty_tool_id WITH EMPTY KEY. CONSTANTS c_drill TYPE {{p}}tool_crib=>ty_tool_id VALUE 'DRILL'. CONSTANTS c_saw TYPE {{p}}tool_crib=>ty_tool_id VALUE 'SAW'. CONSTANTS c_smith TYPE {{p}}tool_crib=>ty_employee VALUE 'SMITH'. DATA mo_cut TYPE REF TO {{p}}tool_crib. METHODS setup. METHODS lend_records_loan FOR TESTING. METHODS lend_twice_rejected FOR TESTING. METHODS lend_unknown_tool FOR TESTING. METHODS return_removes_loan FOR TESTING. METHODS open_loans_are_sorted FOR TESTING. METHODS overdue_loans_are_filtered FOR TESTING. METHODS empty_input_rejected FOR TESTING. METHODS input_is_normalized FOR TESTING. ENDCLASS. CLASS ltc_tool_crib IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}tool_crib( ). ENDMETHOD. METHOD lend_records_loan. cl_abap_unit_assert=>assert_true( act = mo_cut->lend( iv_tool_id = c_drill iv_employee = c_smith iv_due_date = '20250110' ) ). cl_abap_unit_assert=>assert_true( act = mo_cut->is_on_loan( c_drill ) ). ENDMETHOD. METHOD lend_twice_rejected. mo_cut->lend( iv_tool_id = c_drill iv_employee = c_smith iv_due_date = '20250110' ). cl_abap_unit_assert=>assert_false( act = mo_cut->lend( iv_tool_id = c_drill iv_employee = c_smith iv_due_date = '20250111' ) ). ENDMETHOD. METHOD lend_unknown_tool. cl_abap_unit_assert=>assert_false( act = mo_cut->lend( iv_tool_id = 'HAMMER' iv_employee = c_smith iv_due_date = '20250110' ) ). ENDMETHOD. METHOD return_removes_loan. mo_cut->lend( iv_tool_id = c_drill iv_employee = c_smith iv_due_date = '20250110' ). cl_abap_unit_assert=>assert_true( act = mo_cut->return_tool( c_drill ) ). cl_abap_unit_assert=>assert_false( act = mo_cut->is_on_loan( c_drill ) ). cl_abap_unit_assert=>assert_false( act = mo_cut->return_tool( c_drill ) ). ENDMETHOD. METHOD open_loans_are_sorted. mo_cut->lend( iv_tool_id = c_saw iv_employee = c_smith iv_due_date = '20250310' ). mo_cut->lend( iv_tool_id = c_drill iv_employee = c_smith iv_due_date = '20250110' ). DATA(lt_loans) = mo_cut->open_loans( ). DATA(lt_ids) = VALUE tt_tool_ids( ). LOOP AT lt_loans INTO DATA(ls_loan). INSERT ls_loan-tool_id INTO TABLE lt_ids. ENDLOOP. cl_abap_unit_assert=>assert_equals( exp = c_drill act = lt_ids[ 1 ] ). cl_abap_unit_assert=>assert_equals( exp = c_saw act = lt_ids[ 2 ] ). ENDMETHOD. METHOD overdue_loans_are_filtered. mo_cut->lend( iv_tool_id = c_drill iv_employee = c_smith iv_due_date = '20250109' ). mo_cut->lend( iv_tool_id = c_saw iv_employee = c_smith iv_due_date = '20250110' ). DATA(lt_loans) = mo_cut->overdue_loans( '20250110' ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_loans ) ). ENDMETHOD. METHOD empty_input_rejected. cl_abap_unit_assert=>assert_false( act = mo_cut->lend( iv_tool_id = ' ' iv_employee = c_smith iv_due_date = '20250110' ) ). cl_abap_unit_assert=>assert_false( act = mo_cut->lend( iv_tool_id = c_drill iv_employee = ' ' iv_due_date = '20250110' ) ). ENDMETHOD. METHOD input_is_normalized. cl_abap_unit_assert=>assert_true( act = mo_cut->lend( iv_tool_id = 'drill' iv_employee = 'smith' iv_due_date = '20250110' ) ). cl_abap_unit_assert=>assert_true( act = mo_cut->is_on_loan( c_drill ) ). ENDMETHOD. ENDCLASS.