CLASS {{p}}t14_test DEFINITION PUBLIC FINAL CREATE PUBLIC FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. METHODS prepare IMPORTING iv_week TYPE string it_book TYPE STANDARD TABLE OF {{P}}MEALBK. METHODS cleanup IMPORTING iv_week TYPE string. METHODS bill IMPORTING iv_week TYPE string EXPORTING ev_meals TYPE decfloat34 ev_pupils TYPE decfloat34 ev_amount TYPE decfloat34 ev_discount TYPE decfloat34. METHODS sums_two_pupils FOR TESTING. METHODS skips_cancelled FOR TESTING. METHODS discount_from_five FOR TESTING. METHODS rejects_negative_price FOR TESTING. ENDCLASS. CLASS {{p}}t14_test IMPLEMENTATION. METHOD prepare. cleanup( iv_week ). INSERT {{P}}MEALBK FROM TABLE @it_book. ENDMETHOD. METHOD cleanup. DELETE FROM {{P}}MEALBK WHERE week_key = @iv_week. ENDMETHOD. METHOD bill. CALL FUNCTION '{{P}}MEAL_BILL' EXPORTING iv_week = iv_week IMPORTING ev_meals = ev_meals ev_pupils = ev_pupils ev_amount = ev_amount ev_discount = ev_discount EXCEPTIONS invalid_price = 1 OTHERS = 2. cl_abap_unit_assert=>assert_subrc( exp = 0 ). ENDMETHOD. METHOD sums_two_pupils. DATA lv_week TYPE string VALUE 'R-SUM1'. prepare( iv_week = lv_week it_book = VALUE #( ( week_key = 'R-SUM1' pupil = 'A' meal_no = 1 meal = 'LUNCH' price = '2.50' ) ( week_key = 'R-SUM1' pupil = 'A' meal_no = 2 meal = 'LUNCH' price = '3.00' ) ( week_key = 'R-SUM1' pupil = 'B' meal_no = 1 meal = 'LUNCH' price = '4.00' ) ) ). bill( EXPORTING iv_week = lv_week IMPORTING ev_meals = DATA(lv_meals) ev_pupils = DATA(lv_pupils) ev_amount = DATA(lv_amount) ev_discount = DATA(lv_discount) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 3 ) act = lv_meals ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 2 ) act = lv_pupils ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '9.50' ) act = lv_amount ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 0 ) act = lv_discount ). cleanup( lv_week ). ENDMETHOD. METHOD skips_cancelled. DATA lv_week TYPE string VALUE 'R-CANC'. prepare( iv_week = lv_week it_book = VALUE #( ( week_key = 'R-CANC' pupil = 'A' meal_no = 1 meal = 'LUNCH' price = '2.00' ) ( week_key = 'R-CANC' pupil = 'A' meal_no = 2 meal = 'LUNCH' price = '5.00' cancelled = 'X' ) ) ). bill( EXPORTING iv_week = lv_week IMPORTING ev_meals = DATA(lv_meals) ev_pupils = DATA(lv_pupils) ev_amount = DATA(lv_amount) ev_discount = DATA(lv_discount) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 1 ) act = lv_meals ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '2.00' ) act = lv_amount ). cleanup( lv_week ). ENDMETHOD. METHOD discount_from_five. DATA lv_week TYPE string VALUE 'R-DISC'. prepare( iv_week = lv_week it_book = VALUE #( ( week_key = 'R-DISC' pupil = 'A' meal_no = 1 meal = 'LUNCH' price = '9.99' ) ( week_key = 'R-DISC' pupil = 'A' meal_no = 2 meal = 'LUNCH' price = '9.99' ) ( week_key = 'R-DISC' pupil = 'A' meal_no = 3 meal = 'LUNCH' price = '9.99' ) ( week_key = 'R-DISC' pupil = 'A' meal_no = 4 meal = 'LUNCH' price = '9.99' ) ( week_key = 'R-DISC' pupil = 'A' meal_no = 5 meal = 'LUNCH' price = '9.99' ) ) ). bill( EXPORTING iv_week = lv_week IMPORTING ev_meals = DATA(lv_meals) ev_pupils = DATA(lv_pupils) ev_amount = DATA(lv_amount) ev_discount = DATA(lv_discount) ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 5 ) act = lv_meals ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '44.96' ) act = lv_amount ). cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( '4.99' ) act = lv_discount ). cleanup( lv_week ). ENDMETHOD. METHOD rejects_negative_price. DATA lv_week TYPE string VALUE 'R-NEG'. DATA lv_amount TYPE decfloat34. prepare( iv_week = lv_week it_book = VALUE #( ( week_key = 'R-NEG' pupil = 'A' meal_no = 1 meal = 'LUNCH' price = '-1.00' ) ) ). CALL FUNCTION '{{P}}MEAL_BILL' EXPORTING iv_week = lv_week IMPORTING ev_amount = lv_amount EXCEPTIONS invalid_price = 1 OTHERS = 2. cl_abap_unit_assert=>assert_equals( exp = 1 act = sy-subrc ). cleanup( lv_week ). ENDMETHOD. ENDCLASS.