CLASS {{p}}t_prov_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. DATA mo_cut TYPE REF TO {{p}}provision_calc. METHODS setup. METHODS empty_order_raises FOR TESTING. METHODS too_many_lines_raises FOR TESTING. METHODS material_missing_raises FOR TESTING. METHODS quantity_invalid_raises FOR TESTING. METHODS price_negative_raises FOR TESTING. METHODS duplicate_material_raises FOR TESTING. METHODS limit_exceeded_raises FOR TESTING. METHODS limit_boundary_is_ok FOR TESTING. METHODS valid_order_is_ok FOR TESTING. METHODS value_is_sum FOR TESTING. METHODS value_rounds_total FOR TESTING. METHODS invalid_order_propagates FOR TESTING. METHODS expect_reason IMPORTING it_lines TYPE {{p}}provision_calc=>tt_lines iv_reason TYPE {{p}}provision_calc=>ty_reason. ENDCLASS. CLASS {{p}}t_prov_hidden IMPLEMENTATION. METHOD setup. mo_cut = NEW {{p}}provision_calc( ). ENDMETHOD. METHOD expect_reason. TRY. mo_cut->check_order( it_lines ). cl_abap_unit_assert=>fail( msg = |Expected reason { iv_reason }| ). CATCH {{p}}cx_prov_error INTO DATA(lx_error). cl_abap_unit_assert=>assert_equals( exp = iv_reason act = lx_error->reason ). ENDTRY. ENDMETHOD. METHOD empty_order_raises. DATA lt_lines TYPE {{p}}provision_calc=>tt_lines. expect_reason( it_lines = lt_lines iv_reason = {{p}}provision_calc=>c_empty_order ). ENDMETHOD. METHOD too_many_lines_raises. DATA lt_lines TYPE {{p}}provision_calc=>tt_lines. DATA ls_line TYPE {{p}}provision_calc=>ty_line. DO 1000 TIMES. ls_line = VALUE #( material = |M{ sy-index }| quantity = 1 price = 1 ). INSERT ls_line INTO TABLE lt_lines. ENDDO. expect_reason( it_lines = lt_lines iv_reason = {{p}}provision_calc=>c_too_many_lines ). ENDMETHOD. METHOD material_missing_raises. DATA lt_lines TYPE {{p}}provision_calc=>tt_lines. lt_lines = VALUE #( ( material = ` ` quantity = 1 price = 1 ) ). expect_reason( it_lines = lt_lines iv_reason = {{p}}provision_calc=>c_material_missing ). ENDMETHOD. METHOD quantity_invalid_raises. DATA lt_lines TYPE {{p}}provision_calc=>tt_lines. lt_lines = VALUE #( ( material = 'ROPE' quantity = 0 price = 1 ) ). expect_reason( it_lines = lt_lines iv_reason = {{p}}provision_calc=>c_quantity_invalid ). lt_lines = VALUE #( ( material = 'ROPE' quantity = -1 price = 1 ) ). expect_reason( it_lines = lt_lines iv_reason = {{p}}provision_calc=>c_quantity_invalid ). ENDMETHOD. METHOD price_negative_raises. DATA lt_lines TYPE {{p}}provision_calc=>tt_lines. lt_lines = VALUE #( ( material = 'ROPE' quantity = 1 price = -1 ) ). expect_reason( it_lines = lt_lines iv_reason = {{p}}provision_calc=>c_price_negative ). ENDMETHOD. METHOD duplicate_material_raises. DATA lt_lines TYPE {{p}}provision_calc=>tt_lines. lt_lines = VALUE #( ( material = 'ROPE' quantity = 1 price = 1 ) ( material = 'ROPE' quantity = 2 price = 1 ) ). expect_reason( it_lines = lt_lines iv_reason = {{p}}provision_calc=>c_duplicate_material ). ENDMETHOD. METHOD limit_exceeded_raises. DATA lt_lines TYPE {{p}}provision_calc=>tt_lines. lt_lines = VALUE #( ( material = 'ENGINE' quantity = 1 price = '100000.01' ) ). expect_reason( it_lines = lt_lines iv_reason = {{p}}provision_calc=>c_limit_exceeded ). ENDMETHOD. METHOD limit_boundary_is_ok. DATA lt_lines TYPE {{p}}provision_calc=>tt_lines. lt_lines = VALUE #( ( material = 'ENGINE' quantity = 1 price = '100000.00' ) ). TRY. mo_cut->check_order( lt_lines ). CATCH {{p}}cx_prov_error INTO DATA(lx_error). cl_abap_unit_assert=>fail( msg = |Unexpected reason { lx_error->reason }| ). ENDTRY. ENDMETHOD. METHOD valid_order_is_ok. DATA lt_lines TYPE {{p}}provision_calc=>tt_lines. lt_lines = VALUE #( ( material = 'ROPE' quantity = 2 price = '3.50' ) ( material = 'BOLT' quantity = 3 price = '1.25' ) ). TRY. mo_cut->check_order( lt_lines ). CATCH {{p}}cx_prov_error INTO DATA(lx_error). cl_abap_unit_assert=>fail( msg = |Unexpected reason { lx_error->reason }| ). ENDTRY. ENDMETHOD. METHOD value_is_sum. DATA lt_lines TYPE {{p}}provision_calc=>tt_lines. lt_lines = VALUE #( ( material = 'ROPE' quantity = 2 price = '3.50' ) ( material = 'BOLT' quantity = 3 price = '1.25' ) ). DATA lv_expected TYPE {{p}}provision_calc=>ty_amount VALUE '10.75'. DATA lv_value TYPE {{p}}provision_calc=>ty_amount. TRY. lv_value = mo_cut->calculate_value( lt_lines ). CATCH {{p}}cx_prov_error INTO DATA(lx_error). cl_abap_unit_assert=>fail( msg = |Unexpected reason { lx_error->reason }| ). ENDTRY. cl_abap_unit_assert=>assert_equals( exp = lv_expected act = lv_value ). ENDMETHOD. METHOD value_rounds_total. DATA lt_lines TYPE {{p}}provision_calc=>tt_lines. lt_lines = VALUE #( ( material = 'ROPE' quantity = '1.005' price = '1.00' ) ( material = 'BOLT' quantity = '1.005' price = '1.00' ) ). DATA lv_expected TYPE {{p}}provision_calc=>ty_amount VALUE '2.01'. DATA lv_value TYPE {{p}}provision_calc=>ty_amount. TRY. lv_value = mo_cut->calculate_value( lt_lines ). CATCH {{p}}cx_prov_error INTO DATA(lx_error). cl_abap_unit_assert=>fail( msg = |Unexpected reason { lx_error->reason }| ). ENDTRY. cl_abap_unit_assert=>assert_equals( exp = lv_expected act = lv_value ). ENDMETHOD. METHOD invalid_order_propagates. DATA lt_lines TYPE {{p}}provision_calc=>tt_lines. lt_lines = VALUE #( ( material = '' quantity = 1 price = 1 ) ). TRY. mo_cut->calculate_value( lt_lines ). cl_abap_unit_assert=>fail( msg = 'Expected reason MATERIAL_MISSING' ). CATCH {{p}}cx_prov_error INTO DATA(lx_error). cl_abap_unit_assert=>assert_equals( exp = {{p}}provision_calc=>c_material_missing act = lx_error->reason ). ENDTRY. ENDMETHOD. ENDCLASS.