CLASS ltcl_beer_song DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.

  PRIVATE SECTION.
    DATA cut TYPE REF TO zcl_beer_song.

    METHODS setup.

    " single verse
    METHODS first_generic_verse FOR TESTING.
    METHODS last_generic_verse FOR TESTING.
    METHODS verse_with_2_bottles FOR TESTING.
    METHODS verse_with_1_bottle FOR TESTING.
    METHODS verse_with_0_bottles FOR TESTING.

    " multiple verses
    METHODS first_two_verses FOR TESTING.
    METHODS last_three_verses FOR TESTING.
    METHODS all_verses FOR TESTING.

ENDCLASS.

CLASS ltcl_beer_song IMPLEMENTATION.

  METHOD setup.
    cut = NEW zcl_beer_song( ).
  ENDMETHOD.

  METHOD first_generic_verse.
    DATA(exp_result) = VALUE string_table(
      ( |99 bottles of beer on the wall, 99 bottles of beer.| )
      ( |Take one down and pass it around, 98 bottles of beer on the wall.| ) ).
    cl_abap_unit_assert=>assert_equals(
      act = cut->recite( initial_bottles_count = 99 take_down_count = 1 )
      exp = exp_result ).
  ENDMETHOD.

  METHOD last_generic_verse.
    DATA(exp_result) = VALUE string_table(
      ( |3 bottles of beer on the wall, 3 bottles of beer.| )
      ( |Take one down and pass it around, 2 bottles of beer on the wall.| ) ).
    cl_abap_unit_assert=>assert_equals(
      act = cut->recite( initial_bottles_count = 3 take_down_count = 1 )
      exp = exp_result ).
  ENDMETHOD.

  METHOD verse_with_2_bottles.
    DATA(exp_result) = VALUE string_table(
      ( |2 bottles of beer on the wall, 2 bottles of beer.| )
      ( |Take one down and pass it around, 1 bottle of beer on the wall.| ) ).
    cl_abap_unit_assert=>assert_equals(
      act = cut->recite( initial_bottles_count = 2 take_down_count = 1 )
      exp = exp_result ).
  ENDMETHOD.

  METHOD verse_with_1_bottle.
    DATA(exp_result) = VALUE string_table(
      ( |1 bottle of beer on the wall, 1 bottle of beer.| )
      ( |Take it down and pass it around, no more bottles of beer on the wall.| ) ).
    cl_abap_unit_assert=>assert_equals(
      act = cut->recite( initial_bottles_count = 1 take_down_count = 1 )
      exp = exp_result ).
  ENDMETHOD.

  METHOD verse_with_0_bottles.
    DATA(exp_result) = VALUE string_table(
      ( |No more bottles of beer on the wall, no more bottles of beer.| )
      ( |Go to the store and buy some more, 99 bottles of beer on the wall.| ) ).
    cl_abap_unit_assert=>assert_equals(
      act = cut->recite( initial_bottles_count = 0 take_down_count = 1 )
      exp = exp_result ).
  ENDMETHOD.

  METHOD first_two_verses.
    DATA(exp_result) = VALUE string_table(
      ( |99 bottles of beer on the wall, 99 bottles of beer.| )
      ( |Take one down and pass it around, 98 bottles of beer on the wall.| )
      ( || )
      ( |98 bottles of beer on the wall, 98 bottles of beer.| )
      ( |Take one down and pass it around, 97 bottles of beer on the wall.| ) ).
    cl_abap_unit_assert=>assert_equals(
      act = cut->recite( initial_bottles_count = 99 take_down_count = 2 )
      exp = exp_result ).
  ENDMETHOD.

  METHOD last_three_verses.
    DATA(exp_result) = VALUE string_table(
      ( |2 bottles of beer on the wall, 2 bottles of beer.| )
      ( |Take one down and pass it around, 1 bottle of beer on the wall.| )
      ( || )
      ( |1 bottle of beer on the wall, 1 bottle of beer.| )
      ( |Take it down and pass it around, no more bottles of beer on the wall.| )
      ( || )
      ( |No more bottles of beer on the wall, no more bottles of beer.| )
      ( |Go to the store and buy some more, 99 bottles of beer on the wall.| ) ).
    cl_abap_unit_assert=>assert_equals(
      act = cut->recite( initial_bottles_count = 2 take_down_count = 3 )
      exp = exp_result ).
  ENDMETHOD.

  METHOD all_verses.
    DATA(exp_result) = VALUE string_table(
      ( |99 bottles of beer on the wall, 99 bottles of beer.| )
      ( |Take one down and pass it around, 98 bottles of beer on the wall.| )
      ( || )
      ( |98 bottles of beer on the wall, 98 bottles of beer.| )
      ( |Take one down and pass it around, 97 bottles of beer on the wall.| )
      ( || )
      ( |97 bottles of beer on the wall, 97 bottles of beer.| )
      ( |Take one down and pass it around, 96 bottles of beer on the wall.| )
      ( || )
      ( |96 bottles of beer on the wall, 96 bottles of beer.| )
      ( |Take one down and pass it around, 95 bottles of beer on the wall.| )
      ( || )
      ( |95 bottles of beer on the wall, 95 bottles of beer.| )
      ( |Take one down and pass it around, 94 bottles of beer on the wall.| )
      ( || )
      ( |94 bottles of beer on the wall, 94 bottles of beer.| )
      ( |Take one down and pass it around, 93 bottles of beer on the wall.| )
      ( || )
      ( |93 bottles of beer on the wall, 93 bottles of beer.| )
      ( |Take one down and pass it around, 92 bottles of beer on the wall.| )
      ( || )
      ( |92 bottles of beer on the wall, 92 bottles of beer.| )
      ( |Take one down and pass it around, 91 bottles of beer on the wall.| )
      ( || )
      ( |91 bottles of beer on the wall, 91 bottles of beer.| )
      ( |Take one down and pass it around, 90 bottles of beer on the wall.| )
      ( || )
      ( |90 bottles of beer on the wall, 90 bottles of beer.| )
      ( |Take one down and pass it around, 89 bottles of beer on the wall.| )
      ( || )
      ( |89 bottles of beer on the wall, 89 bottles of beer.| )
      ( |Take one down and pass it around, 88 bottles of beer on the wall.| )
      ( || )
      ( |88 bottles of beer on the wall, 88 bottles of beer.| )
      ( |Take one down and pass it around, 87 bottles of beer on the wall.| )
      ( || )
      ( |87 bottles of beer on the wall, 87 bottles of beer.| )
      ( |Take one down and pass it around, 86 bottles of beer on the wall.| )
      ( || )
      ( |86 bottles of beer on the wall, 86 bottles of beer.| )
      ( |Take one down and pass it around, 85 bottles of beer on the wall.| )
      ( || )
      ( |85 bottles of beer on the wall, 85 bottles of beer.| )
      ( |Take one down and pass it around, 84 bottles of beer on the wall.| )
      ( || )
      ( |84 bottles of beer on the wall, 84 bottles of beer.| )
      ( |Take one down and pass it around, 83 bottles of beer on the wall.| )
      ( || )
      ( |83 bottles of beer on the wall, 83 bottles of beer.| )
      ( |Take one down and pass it around, 82 bottles of beer on the wall.| )
      ( || )
      ( |82 bottles of beer on the wall, 82 bottles of beer.| )
      ( |Take one down and pass it around, 81 bottles of beer on the wall.| )
      ( || )
      ( |81 bottles of beer on the wall, 81 bottles of beer.| )
      ( |Take one down and pass it around, 80 bottles of beer on the wall.| )
      ( || )
      ( |80 bottles of beer on the wall, 80 bottles of beer.| )
      ( |Take one down and pass it around, 79 bottles of beer on the wall.| )
      ( || )
      ( |79 bottles of beer on the wall, 79 bottles of beer.| )
      ( |Take one down and pass it around, 78 bottles of beer on the wall.| )
      ( || )
      ( |78 bottles of beer on the wall, 78 bottles of beer.| )
      ( |Take one down and pass it around, 77 bottles of beer on the wall.| )
      ( || )
      ( |77 bottles of beer on the wall, 77 bottles of beer.| )
      ( |Take one down and pass it around, 76 bottles of beer on the wall.| )
      ( || )
      ( |76 bottles of beer on the wall, 76 bottles of beer.| )
      ( |Take one down and pass it around, 75 bottles of beer on the wall.| )
      ( || )
      ( |75 bottles of beer on the wall, 75 bottles of beer.| )
      ( |Take one down and pass it around, 74 bottles of beer on the wall.| )
      ( || )
      ( |74 bottles of beer on the wall, 74 bottles of beer.| )
      ( |Take one down and pass it around, 73 bottles of beer on the wall.| )
      ( || )
      ( |73 bottles of beer on the wall, 73 bottles of beer.| )
      ( |Take one down and pass it around, 72 bottles of beer on the wall.| )
      ( || )
      ( |72 bottles of beer on the wall, 72 bottles of beer.| )
      ( |Take one down and pass it around, 71 bottles of beer on the wall.| )
      ( || )
      ( |71 bottles of beer on the wall, 71 bottles of beer.| )
      ( |Take one down and pass it around, 70 bottles of beer on the wall.| )
      ( || )
      ( |70 bottles of beer on the wall, 70 bottles of beer.| )
      ( |Take one down and pass it around, 69 bottles of beer on the wall.| )
      ( || )
      ( |69 bottles of beer on the wall, 69 bottles of beer.| )
      ( |Take one down and pass it around, 68 bottles of beer on the wall.| )
      ( || )
      ( |68 bottles of beer on the wall, 68 bottles of beer.| )
      ( |Take one down and pass it around, 67 bottles of beer on the wall.| )
      ( || )
      ( |67 bottles of beer on the wall, 67 bottles of beer.| )
      ( |Take one down and pass it around, 66 bottles of beer on the wall.| )
      ( || )
      ( |66 bottles of beer on the wall, 66 bottles of beer.| )
      ( |Take one down and pass it around, 65 bottles of beer on the wall.| )
      ( || )
      ( |65 bottles of beer on the wall, 65 bottles of beer.| )
      ( |Take one down and pass it around, 64 bottles of beer on the wall.| )
      ( || )
      ( |64 bottles of beer on the wall, 64 bottles of beer.| )
      ( |Take one down and pass it around, 63 bottles of beer on the wall.| )
      ( || )
      ( |63 bottles of beer on the wall, 63 bottles of beer.| )
      ( |Take one down and pass it around, 62 bottles of beer on the wall.| )
      ( || )
      ( |62 bottles of beer on the wall, 62 bottles of beer.| )
      ( |Take one down and pass it around, 61 bottles of beer on the wall.| )
      ( || )
      ( |61 bottles of beer on the wall, 61 bottles of beer.| )
      ( |Take one down and pass it around, 60 bottles of beer on the wall.| )
      ( || )
      ( |60 bottles of beer on the wall, 60 bottles of beer.| )
      ( |Take one down and pass it around, 59 bottles of beer on the wall.| )
      ( || )
      ( |59 bottles of beer on the wall, 59 bottles of beer.| )
      ( |Take one down and pass it around, 58 bottles of beer on the wall.| )
      ( || )
      ( |58 bottles of beer on the wall, 58 bottles of beer.| )
      ( |Take one down and pass it around, 57 bottles of beer on the wall.| )
      ( || )
      ( |57 bottles of beer on the wall, 57 bottles of beer.| )
      ( |Take one down and pass it around, 56 bottles of beer on the wall.| )
      ( || )
      ( |56 bottles of beer on the wall, 56 bottles of beer.| )
      ( |Take one down and pass it around, 55 bottles of beer on the wall.| )
      ( || )
      ( |55 bottles of beer on the wall, 55 bottles of beer.| )
      ( |Take one down and pass it around, 54 bottles of beer on the wall.| )
      ( || )
      ( |54 bottles of beer on the wall, 54 bottles of beer.| )
      ( |Take one down and pass it around, 53 bottles of beer on the wall.| )
      ( || )
      ( |53 bottles of beer on the wall, 53 bottles of beer.| )
      ( |Take one down and pass it around, 52 bottles of beer on the wall.| )
      ( || )
      ( |52 bottles of beer on the wall, 52 bottles of beer.| )
      ( |Take one down and pass it around, 51 bottles of beer on the wall.| )
      ( || )
      ( |51 bottles of beer on the wall, 51 bottles of beer.| )
      ( |Take one down and pass it around, 50 bottles of beer on the wall.| )
      ( || )
      ( |50 bottles of beer on the wall, 50 bottles of beer.| )
      ( |Take one down and pass it around, 49 bottles of beer on the wall.| )
      ( || )
      ( |49 bottles of beer on the wall, 49 bottles of beer.| )
      ( |Take one down and pass it around, 48 bottles of beer on the wall.| )
      ( || )
      ( |48 bottles of beer on the wall, 48 bottles of beer.| )
      ( |Take one down and pass it around, 47 bottles of beer on the wall.| )
      ( || )
      ( |47 bottles of beer on the wall, 47 bottles of beer.| )
      ( |Take one down and pass it around, 46 bottles of beer on the wall.| )
      ( || )
      ( |46 bottles of beer on the wall, 46 bottles of beer.| )
      ( |Take one down and pass it around, 45 bottles of beer on the wall.| )
      ( || )
      ( |45 bottles of beer on the wall, 45 bottles of beer.| )
      ( |Take one down and pass it around, 44 bottles of beer on the wall.| )
      ( || )
      ( |44 bottles of beer on the wall, 44 bottles of beer.| )
      ( |Take one down and pass it around, 43 bottles of beer on the wall.| )
      ( || )
      ( |43 bottles of beer on the wall, 43 bottles of beer.| )
      ( |Take one down and pass it around, 42 bottles of beer on the wall.| )
      ( || )
      ( |42 bottles of beer on the wall, 42 bottles of beer.| )
      ( |Take one down and pass it around, 41 bottles of beer on the wall.| )
      ( || )
      ( |41 bottles of beer on the wall, 41 bottles of beer.| )
      ( |Take one down and pass it around, 40 bottles of beer on the wall.| )
      ( || )
      ( |40 bottles of beer on the wall, 40 bottles of beer.| )
      ( |Take one down and pass it around, 39 bottles of beer on the wall.| )
      ( || )
      ( |39 bottles of beer on the wall, 39 bottles of beer.| )
      ( |Take one down and pass it around, 38 bottles of beer on the wall.| )
      ( || )
      ( |38 bottles of beer on the wall, 38 bottles of beer.| )
      ( |Take one down and pass it around, 37 bottles of beer on the wall.| )
      ( || )
      ( |37 bottles of beer on the wall, 37 bottles of beer.| )
      ( |Take one down and pass it around, 36 bottles of beer on the wall.| )
      ( || )
      ( |36 bottles of beer on the wall, 36 bottles of beer.| )
      ( |Take one down and pass it around, 35 bottles of beer on the wall.| )
      ( || )
      ( |35 bottles of beer on the wall, 35 bottles of beer.| )
      ( |Take one down and pass it around, 34 bottles of beer on the wall.| )
      ( || )
      ( |34 bottles of beer on the wall, 34 bottles of beer.| )
      ( |Take one down and pass it around, 33 bottles of beer on the wall.| )
      ( || )
      ( |33 bottles of beer on the wall, 33 bottles of beer.| )
      ( |Take one down and pass it around, 32 bottles of beer on the wall.| )
      ( || )
      ( |32 bottles of beer on the wall, 32 bottles of beer.| )
      ( |Take one down and pass it around, 31 bottles of beer on the wall.| )
      ( || )
      ( |31 bottles of beer on the wall, 31 bottles of beer.| )
      ( |Take one down and pass it around, 30 bottles of beer on the wall.| )
      ( || )
      ( |30 bottles of beer on the wall, 30 bottles of beer.| )
      ( |Take one down and pass it around, 29 bottles of beer on the wall.| )
      ( || )
      ( |29 bottles of beer on the wall, 29 bottles of beer.| )
      ( |Take one down and pass it around, 28 bottles of beer on the wall.| )
      ( || )
      ( |28 bottles of beer on the wall, 28 bottles of beer.| )
      ( |Take one down and pass it around, 27 bottles of beer on the wall.| )
      ( || )
      ( |27 bottles of beer on the wall, 27 bottles of beer.| )
      ( |Take one down and pass it around, 26 bottles of beer on the wall.| )
      ( || )
      ( |26 bottles of beer on the wall, 26 bottles of beer.| )
      ( |Take one down and pass it around, 25 bottles of beer on the wall.| )
      ( || )
      ( |25 bottles of beer on the wall, 25 bottles of beer.| )
      ( |Take one down and pass it around, 24 bottles of beer on the wall.| )
      ( || )
      ( |24 bottles of beer on the wall, 24 bottles of beer.| )
      ( |Take one down and pass it around, 23 bottles of beer on the wall.| )
      ( || )
      ( |23 bottles of beer on the wall, 23 bottles of beer.| )
      ( |Take one down and pass it around, 22 bottles of beer on the wall.| )
      ( || )
      ( |22 bottles of beer on the wall, 22 bottles of beer.| )
      ( |Take one down and pass it around, 21 bottles of beer on the wall.| )
      ( || )
      ( |21 bottles of beer on the wall, 21 bottles of beer.| )
      ( |Take one down and pass it around, 20 bottles of beer on the wall.| )
      ( || )
      ( |20 bottles of beer on the wall, 20 bottles of beer.| )
      ( |Take one down and pass it around, 19 bottles of beer on the wall.| )
      ( || )
      ( |19 bottles of beer on the wall, 19 bottles of beer.| )
      ( |Take one down and pass it around, 18 bottles of beer on the wall.| )
      ( || )
      ( |18 bottles of beer on the wall, 18 bottles of beer.| )
      ( |Take one down and pass it around, 17 bottles of beer on the wall.| )
      ( || )
      ( |17 bottles of beer on the wall, 17 bottles of beer.| )
      ( |Take one down and pass it around, 16 bottles of beer on the wall.| )
      ( || )
      ( |16 bottles of beer on the wall, 16 bottles of beer.| )
      ( |Take one down and pass it around, 15 bottles of beer on the wall.| )
      ( || )
      ( |15 bottles of beer on the wall, 15 bottles of beer.| )
      ( |Take one down and pass it around, 14 bottles of beer on the wall.| )
      ( || )
      ( |14 bottles of beer on the wall, 14 bottles of beer.| )
      ( |Take one down and pass it around, 13 bottles of beer on the wall.| )
      ( || )
      ( |13 bottles of beer on the wall, 13 bottles of beer.| )
      ( |Take one down and pass it around, 12 bottles of beer on the wall.| )
      ( || )
      ( |12 bottles of beer on the wall, 12 bottles of beer.| )
      ( |Take one down and pass it around, 11 bottles of beer on the wall.| )
      ( || )
      ( |11 bottles of beer on the wall, 11 bottles of beer.| )
      ( |Take one down and pass it around, 10 bottles of beer on the wall.| )
      ( || )
      ( |10 bottles of beer on the wall, 10 bottles of beer.| )
      ( |Take one down and pass it around, 9 bottles of beer on the wall.| )
      ( || )
      ( |9 bottles of beer on the wall, 9 bottles of beer.| )
      ( |Take one down and pass it around, 8 bottles of beer on the wall.| )
      ( || )
      ( |8 bottles of beer on the wall, 8 bottles of beer.| )
      ( |Take one down and pass it around, 7 bottles of beer on the wall.| )
      ( || )
      ( |7 bottles of beer on the wall, 7 bottles of beer.| )
      ( |Take one down and pass it around, 6 bottles of beer on the wall.| )
      ( || )
      ( |6 bottles of beer on the wall, 6 bottles of beer.| )
      ( |Take one down and pass it around, 5 bottles of beer on the wall.| )
      ( || )
      ( |5 bottles of beer on the wall, 5 bottles of beer.| )
      ( |Take one down and pass it around, 4 bottles of beer on the wall.| )
      ( || )
      ( |4 bottles of beer on the wall, 4 bottles of beer.| )
      ( |Take one down and pass it around, 3 bottles of beer on the wall.| )
      ( || )
      ( |3 bottles of beer on the wall, 3 bottles of beer.| )
      ( |Take one down and pass it around, 2 bottles of beer on the wall.| )
      ( || )
      ( |2 bottles of beer on the wall, 2 bottles of beer.| )
      ( |Take one down and pass it around, 1 bottle of beer on the wall.| )
      ( || )
      ( |1 bottle of beer on the wall, 1 bottle of beer.| )
      ( |Take it down and pass it around, no more bottles of beer on the wall.| )
      ( || )
      ( |No more bottles of beer on the wall, no more bottles of beer.| )
      ( |Go to the store and buy some more, 99 bottles of beer on the wall.| ) ).
    cl_abap_unit_assert=>assert_equals(
      act = cut->recite( initial_bottles_count = 99 take_down_count = 100 )
      exp = exp_result ).
  ENDMETHOD.

ENDCLASS.
