CLASS {{p}}t02_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. DATA mo_cut TYPE REF TO {{p}}rack_billing. METHODS setup. METHODS assert_amount IMPORTING iv_expected TYPE {{p}}rack_billing=>ty_fee iv_actual TYPE {{p}}rack_billing=>ty_fee. METHODS one_rack FOR TESTING. METHODS sums_per_customer FOR TESTING. METHODS sorted_by_customer FOR TESTING. METHODS ten_racks_discount FOR TESTING. METHODS twenty_racks_discount FOR TESTING. METHODS nine_racks_no_discount FOR TESTING. METHODS ignores_unknown_size FOR TESTING. METHODS ignores_unknown_power FOR TESTING. METHODS ignores_second_rack_id FOR TESTING. METHODS empty_input FOR TESTING. METHODS all_classes FOR TESTING. ENDCLASS. CLASS {{p}}t02_hidden IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}rack_billing( ). ENDMETHOD. METHOD assert_amount. cl_abap_unit_assert=>assert_equals( exp = iv_expected act = iv_actual ). ENDMETHOD. METHOD one_rack. DATA(lt_bills) = mo_cut->calculate( VALUE #( ( rack_id = 'R001' customer = 'ALPHA' size_class = 'M' power_class = 'B' ) ) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_bills ) ). cl_abap_unit_assert=>assert_equals( exp = 'ALPHA' act = lt_bills[ 1 ]-customer ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_bills[ 1 ]-rack_count ). assert_amount( iv_expected = '150.00' iv_actual = lt_bills[ 1 ]-total_fee ). ENDMETHOD. METHOD sums_per_customer. DATA lt_racks TYPE {{p}}rack_billing=>tt_racks. lt_racks = VALUE #( ( rack_id = 'R001' customer = 'ALPHA' size_class = 'S' power_class = 'A' ) ( rack_id = 'R002' customer = 'ALPHA' size_class = 'S' power_class = 'B' ) ( rack_id = 'R003' customer = 'ALPHA' size_class = 'M' power_class = 'A' ) ( rack_id = 'R004' customer = 'BETA' size_class = 'L' power_class = 'C' ) ). DATA(lt_bills) = mo_cut->calculate( lt_racks ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_bills ) ). cl_abap_unit_assert=>assert_equals( exp = 'ALPHA' act = lt_bills[ 1 ]-customer ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lt_bills[ 1 ]-rack_count ). assert_amount( iv_expected = '250.00' iv_actual = lt_bills[ 1 ]-total_fee ). cl_abap_unit_assert=>assert_equals( exp = 'BETA' act = lt_bills[ 2 ]-customer ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_bills[ 2 ]-rack_count ). assert_amount( iv_expected = '320.00' iv_actual = lt_bills[ 2 ]-total_fee ). ENDMETHOD. METHOD sorted_by_customer. DATA lt_racks TYPE {{p}}rack_billing=>tt_racks. lt_racks = VALUE #( ( rack_id = 'R001' customer = 'ZULU' size_class = 'S' power_class = 'A' ) ( rack_id = 'R002' customer = 'ALPHA' size_class = 'S' power_class = 'A' ) ( rack_id = 'R003' customer = 'MIKE' size_class = 'S' power_class = 'A' ) ). DATA(lt_bills) = mo_cut->calculate( lt_racks ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lines( lt_bills ) ). cl_abap_unit_assert=>assert_equals( exp = 'ALPHA' act = lt_bills[ 1 ]-customer ). cl_abap_unit_assert=>assert_equals( exp = 'MIKE' act = lt_bills[ 2 ]-customer ). cl_abap_unit_assert=>assert_equals( exp = 'ZULU' act = lt_bills[ 3 ]-customer ). ENDMETHOD. METHOD ten_racks_discount. DATA lt_racks TYPE {{p}}rack_billing=>tt_racks. DO 10 TIMES. INSERT VALUE #( rack_id = |R{ sy-index }| customer = 'ALPHA' size_class = 'S' power_class = 'A' ) INTO TABLE lt_racks. ENDDO. DATA(lt_bills) = mo_cut->calculate( lt_racks ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_bills ) ). cl_abap_unit_assert=>assert_equals( exp = 10 act = lt_bills[ 1 ]-rack_count ). assert_amount( iv_expected = '450.00' iv_actual = lt_bills[ 1 ]-total_fee ). ENDMETHOD. METHOD twenty_racks_discount. DATA lt_racks TYPE {{p}}rack_billing=>tt_racks. DO 20 TIMES. INSERT VALUE #( rack_id = |R{ sy-index }| customer = 'ALPHA' size_class = 'S' power_class = 'A' ) INTO TABLE lt_racks. ENDDO. DATA(lt_bills) = mo_cut->calculate( lt_racks ). cl_abap_unit_assert=>assert_equals( exp = 20 act = lt_bills[ 1 ]-rack_count ). assert_amount( iv_expected = '800.00' iv_actual = lt_bills[ 1 ]-total_fee ). ENDMETHOD. METHOD nine_racks_no_discount. DATA lt_racks TYPE {{p}}rack_billing=>tt_racks. DO 9 TIMES. INSERT VALUE #( rack_id = |R{ sy-index }| customer = 'ALPHA' size_class = 'S' power_class = 'A' ) INTO TABLE lt_racks. ENDDO. DATA(lt_bills) = mo_cut->calculate( lt_racks ). cl_abap_unit_assert=>assert_equals( exp = 9 act = lt_bills[ 1 ]-rack_count ). assert_amount( iv_expected = '450.00' iv_actual = lt_bills[ 1 ]-total_fee ). ENDMETHOD. METHOD ignores_unknown_size. DATA lt_racks TYPE {{p}}rack_billing=>tt_racks. lt_racks = VALUE #( ( rack_id = 'R001' customer = 'ALPHA' size_class = 'X' power_class = 'A' ) ( rack_id = 'R002' customer = 'ALPHA' size_class = 'S' power_class = 'A' ) ). DATA(lt_bills) = mo_cut->calculate( lt_racks ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_bills ) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_bills[ 1 ]-rack_count ). assert_amount( iv_expected = '50.00' iv_actual = lt_bills[ 1 ]-total_fee ). ENDMETHOD. METHOD ignores_unknown_power. DATA lt_racks TYPE {{p}}rack_billing=>tt_racks. lt_racks = VALUE #( ( rack_id = 'R001' customer = 'ALPHA' size_class = 'L' power_class = 'Z' ) ( rack_id = 'R002' customer = 'ALPHA' size_class = 'L' power_class = 'B' ) ). DATA(lt_bills) = mo_cut->calculate( lt_racks ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_bills ) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_bills[ 1 ]-rack_count ). assert_amount( iv_expected = '280.00' iv_actual = lt_bills[ 1 ]-total_fee ). ENDMETHOD. METHOD ignores_second_rack_id. DATA lt_racks TYPE {{p}}rack_billing=>tt_racks. lt_racks = VALUE #( ( rack_id = 'R001' customer = 'ALPHA' size_class = 'M' power_class = 'A' ) ( rack_id = 'R001' customer = 'BETA' size_class = 'L' power_class = 'C' ) ). DATA(lt_bills) = mo_cut->calculate( lt_racks ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_bills ) ). cl_abap_unit_assert=>assert_equals( exp = 'ALPHA' act = lt_bills[ 1 ]-customer ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_bills[ 1 ]-rack_count ). assert_amount( iv_expected = '120.00' iv_actual = lt_bills[ 1 ]-total_fee ). ENDMETHOD. METHOD empty_input. DATA lt_racks TYPE {{p}}rack_billing=>tt_racks. DATA(lt_bills) = mo_cut->calculate( lt_racks ). cl_abap_unit_assert=>assert_initial( lt_bills ). ENDMETHOD. METHOD all_classes. DATA lt_racks TYPE {{p}}rack_billing=>tt_racks. lt_racks = VALUE #( ( rack_id = 'R001' customer = 'ALPHA' size_class = 'S' power_class = 'C' ) ( rack_id = 'R002' customer = 'ALPHA' size_class = 'M' power_class = 'C' ) ( rack_id = 'R003' customer = 'ALPHA' size_class = 'L' power_class = 'C' ) ). DATA(lt_bills) = mo_cut->calculate( lt_racks ). cl_abap_unit_assert=>assert_equals( exp = 3 act = lt_bills[ 1 ]-rack_count ). assert_amount( iv_expected = '630.00' iv_actual = lt_bills[ 1 ]-total_fee ). ENDMETHOD. ENDCLASS.