package com.techelevator.view; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.math.BigDecimal; import com.techelevator.Gum; import com.techelevator.Snack; import com.techelevator.VendingMachine; import org.junit.*; import org.junit.runners.MethodSorters; import com.techelevator.view.Menu; @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class MenuTest { private ByteArrayOutputStream output; @Before public void setup() { output = new ByteArrayOutputStream(); System.setOut(new PrintStream(output)); } @Test public void testing_gum_displays_correct_message() { Snack testGum = new Gum("Bubble Gum", BigDecimal.valueOf(1.50)); testGum.snackSound(); Assert.assertEquals("Chew Chew, Pop!", output.toString().trim()); } @Test public void testing_refund_change_displays_correct_message() { VendingMachine test = new VendingMachine(); test.refundChange(BigDecimal.valueOf(1.15)); String expected = "Refunding: 4 quarter(s) 1 dime(s) 1 nickel(s)"; Assert.assertEquals(expected, output.toString().trim()); } @Test public void displays_a_list_of_menu_options_and_prompts_user_to_make_a_choice() { Object[] options = new Object[] { Integer.valueOf(3), "Blind", "Mice" }; Menu menu = getMenuForTesting(); menu.getChoiceFromOptions(options); String expected = System.lineSeparator() + "1) " + options[0].toString() + System.lineSeparator() + "2) " + options[1].toString() + System.lineSeparator() + "3) " + options[2].toString() + System.lineSeparator() + System.lineSeparator() + "Please choose an option >>> "; Assert.assertEquals(expected, output.toString()); } @Test public void returns_object_corresponding_to_user_choice() { Integer expected = Integer.valueOf(456); Integer[] options = new Integer[] { Integer.valueOf(123), expected, Integer.valueOf(789) }; Menu menu = getMenuForTestingWithUserInput("2" + System.lineSeparator()); Integer result = (Integer) menu.getChoiceFromOptions(options); Assert.assertEquals(expected, result); } @Test public void redisplays_menu_if_user_does_not_choose_valid_option() { Object[] options = new Object[] { "Larry", "Curly", "Moe" }; Menu menu = getMenuForTestingWithUserInput("4" + System.lineSeparator() + "1" + System.lineSeparator()); menu.getChoiceFromOptions(options); String menuDisplay = System.lineSeparator() + "1) " + options[0].toString() + System.lineSeparator() + "2) " + options[1].toString() + System.lineSeparator() + "3) " + options[2].toString() + System.lineSeparator() + System.lineSeparator() + "Please choose an option >>> "; String expected = menuDisplay + System.lineSeparator() + "*** 4 is not a valid option ***" + System.lineSeparator() + System.lineSeparator() + menuDisplay; Assert.assertEquals(expected, output.toString()); } @Test public void redisplays_menu_if_user_chooses_option_less_than_1() { Object[] options = new Object[] { "Larry", "Curly", "Moe" }; Menu menu = getMenuForTestingWithUserInput("0" + System.lineSeparator() + "1" + System.lineSeparator()); menu.getChoiceFromOptions(options); String menuDisplay = System.lineSeparator() + "1) " + options[0].toString() + System.lineSeparator() + "2) " + options[1].toString() + System.lineSeparator() + "3) " + options[2].toString() + System.lineSeparator() + System.lineSeparator() + "Please choose an option >>> "; String expected = menuDisplay + System.lineSeparator() + "*** 0 is not a valid option ***" + System.lineSeparator() + System.lineSeparator() + menuDisplay; Assert.assertEquals(expected, output.toString()); } @Test public void redisplays_menu_if_user_enters_garbage() { Object[] options = new Object[] { "Larry", "Curly", "Moe" }; Menu menu = getMenuForTestingWithUserInput("Mickey Mouse" + System.lineSeparator() + "1" + System.lineSeparator()); menu.getChoiceFromOptions(options); String menuDisplay = System.lineSeparator() + "1) " + options[0].toString() + System.lineSeparator() + "2) " + options[1].toString() + System.lineSeparator() + "3) " + options[2].toString() + System.lineSeparator() + System.lineSeparator() + "Please choose an option >>> "; String expected = menuDisplay + System.lineSeparator() + "*** Mickey Mouse is not a valid option ***" + System.lineSeparator() + System.lineSeparator() + menuDisplay; Assert.assertEquals(expected, output.toString()); } private Menu getMenuForTestingWithUserInput(String userInput) { ByteArrayInputStream input = new ByteArrayInputStream(String.valueOf(userInput).getBytes()); return new Menu(input, output); } private Menu getMenuForTesting() { return getMenuForTestingWithUserInput("1" + System.lineSeparator()); } @After public void tearDown() { System.setOut(System.out); } }