CLASS {{p}}t11_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC 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_grinder TYPE {{p}}tool_crib=>ty_tool_id VALUE 'GRINDER'. CONSTANTS c_wrench TYPE {{p}}tool_crib=>ty_tool_id VALUE 'WRENCH'. CONSTANTS c_smith TYPE {{p}}tool_crib=>ty_employee VALUE 'SMITH'. DATA mo_cut TYPE REF TO {{p}}tool_crib. METHODS setup. METHODS tool_ids IMPORTING it_loans TYPE {{p}}tool_crib=>tt_loans RETURNING VALUE(rt_ids) TYPE tt_tool_ids. METHODS first_loan IMPORTING it_loans TYPE {{p}}tool_crib=>tt_loans RETURNING VALUE(rs_loan) TYPE {{p}}tool_crib=>ty_loan. METHODS lend_new_tool_ok FOR TESTING. METHODS lend_twice_rejected FOR TESTING. METHODS return_tool_ok FOR TESTING. METHODS open_loans_due_date_order FOR TESTING. METHODS open_loans_tool_id_order FOR TESTING. METHODS overdue_only_before_today FOR TESTING. METHODS overdue_initial_today_empty FOR TESTING. METHODS empty_tool_id_rejected FOR TESTING. METHODS invalid_loan_rejected FOR TESTING. METHODS unknown_tool_rejected FOR TESTING. METHODS lower_case_and_spaces FOR TESTING. ENDCLASS. CLASS {{p}}t11_hidden IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}tool_crib( ). ENDMETHOD. METHOD tool_ids. LOOP AT it_loans INTO DATA(ls_loan). INSERT ls_loan-tool_id INTO TABLE rt_ids. ENDLOOP. ENDMETHOD. METHOD first_loan. LOOP AT it_loans INTO rs_loan. EXIT. ENDLOOP. ENDMETHOD. METHOD lend_new_tool_ok. 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 ) ). cl_abap_unit_assert=>assert_false( act = mo_cut->is_on_loan( c_saw ) ). 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 = 'JONES' iv_due_date = '20250210' ) ). DATA(lt_loans) = mo_cut->open_loans( ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_loans ) ). DATA(ls_loan) = first_loan( lt_loans ). cl_abap_unit_assert=>assert_equals( exp = c_smith act = ls_loan-employee ). ENDMETHOD. METHOD return_tool_ok. cl_abap_unit_assert=>assert_false( act = mo_cut->return_tool( c_saw ) ). 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 ) ). DATA(lt_loans) = mo_cut->open_loans( ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_loans ) ). ENDMETHOD. METHOD open_loans_due_date_order. 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' ). mo_cut->lend( iv_tool_id = c_grinder iv_employee = c_smith iv_due_date = '20250210' ). DATA(lt_loans) = mo_cut->open_loans( ). DATA(lt_ids) = tool_ids( lt_loans ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lines( lt_ids ) ). cl_abap_unit_assert=>assert_equals( exp = c_drill act = lt_ids[ 1 ] ). cl_abap_unit_assert=>assert_equals( exp = c_grinder act = lt_ids[ 2 ] ). cl_abap_unit_assert=>assert_equals( exp = c_saw act = lt_ids[ 3 ] ). ENDMETHOD. METHOD open_loans_tool_id_order. mo_cut->lend( iv_tool_id = c_wrench iv_employee = c_smith iv_due_date = '20250110' ). 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) = tool_ids( lt_loans ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_ids ) ). cl_abap_unit_assert=>assert_equals( exp = c_drill act = lt_ids[ 1 ] ). cl_abap_unit_assert=>assert_equals( exp = c_wrench act = lt_ids[ 2 ] ). ENDMETHOD. METHOD overdue_only_before_today. 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' ). mo_cut->lend( iv_tool_id = c_grinder iv_employee = c_smith iv_due_date = '20250111' ). DATA(lt_loans) = mo_cut->overdue_loans( '20250110' ). DATA(lt_ids) = tool_ids( lt_loans ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_ids ) ). cl_abap_unit_assert=>assert_equals( exp = c_drill act = lt_ids[ 1 ] ). ENDMETHOD. METHOD overdue_initial_today_empty. DATA lv_today TYPE d. mo_cut->lend( iv_tool_id = c_drill iv_employee = c_smith iv_due_date = '20250109' ). DATA(lt_loans) = mo_cut->overdue_loans( lv_today ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_loans ) ). ENDMETHOD. METHOD empty_tool_id_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->is_on_loan( ' ' ) ). cl_abap_unit_assert=>assert_false( act = mo_cut->return_tool( ' ' ) ). DATA(lt_loans) = mo_cut->open_loans( ). cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_loans ) ). ENDMETHOD. METHOD invalid_loan_rejected. DATA lv_initial_date TYPE d. cl_abap_unit_assert=>assert_false( act = mo_cut->lend( iv_tool_id = c_drill iv_employee = ' ' 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 = lv_initial_date ) ). cl_abap_unit_assert=>assert_false( act = mo_cut->is_on_loan( c_drill ) ). ENDMETHOD. METHOD unknown_tool_rejected. cl_abap_unit_assert=>assert_false( act = mo_cut->lend( iv_tool_id = 'HAMMER' iv_employee = c_smith iv_due_date = '20250110' ) ). cl_abap_unit_assert=>assert_false( act = mo_cut->is_on_loan( 'HAMMER' ) ). ENDMETHOD. METHOD lower_case_and_spaces. cl_abap_unit_assert=>assert_true( act = mo_cut->lend( iv_tool_id = 'd r i l l' iv_employee = 'smith' iv_due_date = '20250110' ) ). cl_abap_unit_assert=>assert_true( act = mo_cut->is_on_loan( c_drill ) ). DATA(lt_loans) = mo_cut->open_loans( ). DATA(ls_loan) = first_loan( lt_loans ). cl_abap_unit_assert=>assert_equals( exp = c_drill act = ls_loan-tool_id ). cl_abap_unit_assert=>assert_equals( exp = c_smith act = ls_loan-employee ). ENDMETHOD. ENDCLASS.