diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..456f5469 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,39 @@ +## 출력 + +- [x] 메인 화면 +- [x] 테이블 목록 +- [x] 치킨 메뉴 목록 +- [x] 주문 목록 +- [x] 최종 결제 금액 + +## 입력 + +- [x] 기능 선택 +- [x] 테이블 선택 입력 +- [x] 선택할 메뉴 번호 +- [x] 구매할 수량 입력 +- [x] 카드, 현금 선택 입력 + +## 테이블들을 생성 + +- [x] 숫자를 입력하면 테이블을 만든다. +- [x] 테이블의 정보를 가져온다. + +## 테이블의 주문을 관리 + +- [x] 주문이 들어올 경우 해당 테이블에 주문을 추가한다. +- [x] 결제를 할 경우 총 금액을 계산한다. +- [x] 결제가 완료되면 초기화 한다. +- [x] 주문 목록을 확인한다. + +## 결제 + +- [x] 카드와 현금 중 하나로 최종 금액을 결제한다. +- [x] 할인률 계산 + +## 예외 +- [x] 메인 기능 선택 시 1, 2, 3 이외 다른 숫자 입력 +- [x] 존재하지 않는 테이블 입력 +- [x] 존재하지 않는 메뉴 입력 +- [x] 똑같은 치킨을 100마리 이상 시킬 경우 +- [x] 존재하지 않는 결제 선택지 선택 \ No newline at end of file diff --git a/src/main/java/Application.java b/src/main/java/Application.java index ea0d34fd..a6a25882 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,21 +1,9 @@ -import domain.Menu; -import domain.MenuRepository; -import domain.Table; -import domain.TableRepository; -import view.InputView; -import view.OutputView; - -import java.util.List; +import controller.ChickenController; public class Application { - // TODO 구현 진행 - public static void main(String[] args) { - final List tables = TableRepository.tables(); - OutputView.printTables(tables); - final int tableNumber = InputView.inputTableNumber(); - - final List menus = MenuRepository.menus(); - OutputView.printMenus(menus); + public static void main(String[] args) { + ChickenController controller = new ChickenController(); + controller.run(); } } diff --git a/src/main/java/constant/ExceptionMessage.java b/src/main/java/constant/ExceptionMessage.java new file mode 100644 index 00000000..2c261ba6 --- /dev/null +++ b/src/main/java/constant/ExceptionMessage.java @@ -0,0 +1,23 @@ +package constant; + +public enum ExceptionMessage { + + INCORRECT_MAIN_OPTION("존재하지 않는 기능입니다."), + NOT_EXIST_MENU("존재하지 않는 메뉴입니다."), + NOT_EXIST_TABLE("존재하지 않는 테이블입니다."), + ORDER_QUANTITY_EXCEEDED("주문 수량을 초과하였습니다."), + NOT_NUMBER("숫자만 입력 가능합니다."), + NOT_EXIST_PAYMENT_TYPE("존재하지 않는 테이블입니다."),; + + private static final String PREFIX = "[ERROR] "; + private final String message; + + ExceptionMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return PREFIX + message; + } +} diff --git a/src/main/java/constant/OutputMessage.java b/src/main/java/constant/OutputMessage.java new file mode 100644 index 00000000..0e15b55e --- /dev/null +++ b/src/main/java/constant/OutputMessage.java @@ -0,0 +1,26 @@ +package constant; + +public enum OutputMessage { + + MAIN_OPTION("메인화면"), + OPTION_SELECT("원하는 기능을 선택하세요."), + TABLE_SELECT("테이블을 선택하세요."), + MENU("등록할 메뉴를 선택하세요."), + QUANTITY("메뉴의 수량을 입력하세요."), + ORDER_HISTORY("주문 내역"), + PAYMENT_START("%s번 테이블의 결제를 진행합니다"), + PAYMENT_METHOD("신용 카드는 1번, 현금은 2번"), + TOTAL_PRICE("최종 결제할 금액"); + + private static final String PREFIX = "## "; + private final String message; + + OutputMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return PREFIX + this.message; + } +} diff --git a/src/main/java/constant/PaymentType.java b/src/main/java/constant/PaymentType.java new file mode 100644 index 00000000..4152b90d --- /dev/null +++ b/src/main/java/constant/PaymentType.java @@ -0,0 +1,28 @@ +package constant; + +import java.util.Arrays; + +public enum PaymentType { + + CARD(1, 1), + CASH(2, 0.95); + + private final int number; + private final double discountRate; + + PaymentType(int number, double discountRate) { + this.number = number; + this.discountRate = discountRate; + } + + public static PaymentType getPaymentType(int number) { + return Arrays.stream(PaymentType.values()) + .filter(paymentType -> paymentType.number == number) + .findAny() + .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.NOT_EXIST_PAYMENT_TYPE.toString())); + } + + public double getDiscountRate() { + return discountRate; + } +} diff --git a/src/main/java/constant/PrintElement.java b/src/main/java/constant/PrintElement.java new file mode 100644 index 00000000..7e4eecba --- /dev/null +++ b/src/main/java/constant/PrintElement.java @@ -0,0 +1,21 @@ +package constant; + +public enum PrintElement { + + HYPHEN(" - "), + NEW_LINE("\n"), + HISTORY_CONFIG("메뉴 수량 금액"), + BLANK(" "), + TOTAL_PRICE("%d원\n"); + + private final String message; + + PrintElement(String message) { + this.message = message; + } + + @Override + public String toString() { + return this.message; + } +} diff --git a/src/main/java/controller/ChickenController.java b/src/main/java/controller/ChickenController.java new file mode 100644 index 00000000..3c7c644e --- /dev/null +++ b/src/main/java/controller/ChickenController.java @@ -0,0 +1,55 @@ +package controller; + +import domain.*; +import service.ChickenService; +import view.InputView; +import view.OutputView; + +public class ChickenController { + + private final ChickenService service = new ChickenService(); + + public void run() { + try { + startSelling(); + } catch (IllegalArgumentException exception) { + OutputView.printExceptionMessage(exception.getMessage()); + } + } + + private void startSelling() { + while (true) { + OutputView.printMainOption(); + MainOptions option = InputView.inputMainOption(); + if (option.isTermination()) { + break; + } + orderMenu(option); + payment(option); + } + } + + private void orderMenu(MainOptions options) { + if (options.isOrder()) { + int tableNumber = findTable(); + OutputView.printMenus(MenuRepository.menus()); + Menu menu = InputView.inputMenu(); + int quantity = InputView.inputQuantity(); + service.order(tableNumber, menu, quantity); + } + } + + private void payment(MainOptions options) { + if (options.isPayment()) { + Table table = service.findByTableNumber(findTable()); + OutputView.printOrderHistory(table); + OutputView.printPayment(table); + OutputView.printTotalPrice(service.payment(table, InputView.inputPayment())); + } + } + + private int findTable() { + OutputView.printTables(TableRepository.tables()); + return InputView.inputTableNumber(); + } +} diff --git a/src/main/java/domain/Category.java b/src/main/java/domain/Category.java index 2e2c07ae..e9779b81 100644 --- a/src/main/java/domain/Category.java +++ b/src/main/java/domain/Category.java @@ -10,6 +10,10 @@ public enum Category { this.name = name; } + public boolean isChicken() { + return this == CHICKEN; + } + @Override public String toString() { return "[" + name + "]"; diff --git a/src/main/java/domain/MainOptions.java b/src/main/java/domain/MainOptions.java new file mode 100644 index 00000000..501d3de7 --- /dev/null +++ b/src/main/java/domain/MainOptions.java @@ -0,0 +1,52 @@ +package domain; + +import constant.ExceptionMessage; +import constant.PrintElement; + +import java.util.Arrays; + +public enum MainOptions { + + ORDER_REGISTRATION(1, "주문등록"), + PAYMENT(2, "결제하기"), + TERMINATION(3, "프로그램 종료"); + + private final int choice; + private final String title; + + MainOptions(int choice, String title) { + this.choice = choice; + this.title = title; + } + + public static MainOptions getMainOptions(int input) { + return Arrays.stream(MainOptions.values()) + .filter(option -> input == option.choice) + .findAny() + .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INCORRECT_MAIN_OPTION.toString())); + } + + public boolean isTermination() { + return this == TERMINATION; + } + + public boolean isOrder() { + return this == ORDER_REGISTRATION; + } + + public boolean isPayment() { + return this == PAYMENT; + } + + public static String printValues() { + StringBuilder stringBuilder = new StringBuilder(); + Arrays.stream(MainOptions.values()) + .forEach((value) -> + stringBuilder.append(value.choice) + .append(PrintElement.HYPHEN) + .append(value.title) + .append(PrintElement.NEW_LINE) + ); + return stringBuilder.toString(); + } +} diff --git a/src/main/java/domain/Menu.java b/src/main/java/domain/Menu.java index 9f5a078e..d5cb08f3 100644 --- a/src/main/java/domain/Menu.java +++ b/src/main/java/domain/Menu.java @@ -13,6 +13,22 @@ public Menu(final int number, final String name, final Category category, final this.price = price; } + public boolean isExist(int number) { + return number == this.number; + } + + public boolean isChicken() { + return category.isChicken(); + } + + public String getName() { + return name; + } + + public int getPrice() { + return price; + } + @Override public String toString() { return category + " " + number + " - " + name + " : " + price + "원"; diff --git a/src/main/java/domain/MenuRepository.java b/src/main/java/domain/MenuRepository.java index fd3fe537..c75e3ad2 100644 --- a/src/main/java/domain/MenuRepository.java +++ b/src/main/java/domain/MenuRepository.java @@ -1,5 +1,7 @@ package domain; +import constant.ExceptionMessage; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -18,6 +20,13 @@ public class MenuRepository { menus.add(new Menu(22, "사이다", Category.BEVERAGE, 1_000)); } + public static Menu findMenuByNumber(int number) { + return menus.stream() + .filter((menu) -> menu.isExist(number)) + .findAny() + .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.NOT_EXIST_MENU.toString())); + } + public static List menus() { return Collections.unmodifiableList(menus); } diff --git a/src/main/java/domain/Order.java b/src/main/java/domain/Order.java new file mode 100644 index 00000000..e692fe45 --- /dev/null +++ b/src/main/java/domain/Order.java @@ -0,0 +1,83 @@ +package domain; + +import constant.ExceptionMessage; +import constant.PrintElement; + +import java.util.HashMap; +import java.util.Map; + +public class Order { + + private static final int DEFAULT = 0; + private static final int MAX_ORDER_QUANTITY = 100; + + private Map order; + + public Order() { + this.order = new HashMap<>(); + MenuRepository.menus() + .forEach(menu -> order.put(menu, DEFAULT)); + } + + public void addMenu(Menu menu, int quantity) { + int newQuantity = order.get(menu) + quantity; + validateQuantity(newQuantity); + order.put(menu, newQuantity); + } + + private void validateQuantity(int quantity) { + if (quantity >= MAX_ORDER_QUANTITY) { + throw new IllegalArgumentException(ExceptionMessage.ORDER_QUANTITY_EXCEEDED.toString()); + } + } + + public int totalPrice() { + return order.keySet() + .stream() + .filter(menu -> order.get(menu) != DEFAULT) + .mapToInt(menu -> order.get(menu) * menu.getPrice()) + .sum(); + } + + public boolean hasOrder() { + return order.keySet() + .stream() + .anyMatch(menu -> order.get(menu) != DEFAULT); + } + + public int chickenNumber() { + return order.keySet() + .stream() + .filter(Menu::isChicken) + .mapToInt(order::get) + .sum(); + } + + public void payment() { + order = new HashMap<>(); + MenuRepository.menus() + .forEach(menu -> order.put(menu, DEFAULT)); + } + + @Override + public String toString() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(PrintElement.HISTORY_CONFIG).append(PrintElement.NEW_LINE); + appendMenu(stringBuilder); + return stringBuilder.toString(); + } + + private void appendMenu(StringBuilder stringBuilder) { + order.keySet() + .stream() + .filter(key -> order.get(key) != DEFAULT) + .forEach(menu -> + stringBuilder.append(menu.getName()) + .append(PrintElement.BLANK) + .append(order.get(menu)) + .append(PrintElement.BLANK) + .append(menu.getPrice()) + .append(PrintElement.NEW_LINE) + ); + } +} diff --git a/src/main/java/domain/Table.java b/src/main/java/domain/Table.java index 500c517e..389eae56 100644 --- a/src/main/java/domain/Table.java +++ b/src/main/java/domain/Table.java @@ -1,10 +1,57 @@ package domain; +import constant.PaymentType; + public class Table { + + private static final int DISCOUNT_PRICE = 10000; + private static final int DISCOUNT_UNIT = 10; + private final int number; + private final Order order; public Table(final int number) { this.number = number; + this.order = new Order(); + } + + public boolean isExist(int number) { + return number == this.number; + } + + public void addMenu(Menu menu, int quantity) { + order.addMenu(menu, quantity); + } + + public boolean hasOrder() { + return order.hasOrder(); + } + + + public int payment(PaymentType type) { + int totalPrice = calculateTotalPrice(type); + order.payment(); + return totalPrice; + } + + private int calculateTotalPrice(PaymentType type) { + return (int) ((totalPrice() - chickenDiscount()) * type.getDiscountRate()); + } + + private int totalPrice() { + return order.totalPrice(); + } + + private int chickenDiscount() { + return discountChicken() / DISCOUNT_UNIT * DISCOUNT_PRICE; + } + + private int discountChicken() { + return order.chickenNumber(); + } + + public String getOrderHistory() { + return order.toString(); } @Override diff --git a/src/main/java/domain/TableRepository.java b/src/main/java/domain/TableRepository.java index c9c791e2..f64674da 100644 --- a/src/main/java/domain/TableRepository.java +++ b/src/main/java/domain/TableRepository.java @@ -1,5 +1,7 @@ package domain; +import constant.ExceptionMessage; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -16,6 +18,18 @@ public class TableRepository { tables.add(new Table(8)); } + public static Table findByTableNumber(int number) { + return tables.stream() + .filter((table) -> table.isExist(number)) + .findAny() + .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.NOT_EXIST_TABLE.toString())); + } + + public void addMenu(int number, Menu menu, int quantity) { + Table table = findByTableNumber(number); + table.addMenu(menu, quantity); + } + public static List
tables() { return Collections.unmodifiableList(tables); } diff --git a/src/main/java/service/ChickenService.java b/src/main/java/service/ChickenService.java new file mode 100644 index 00000000..e5804d09 --- /dev/null +++ b/src/main/java/service/ChickenService.java @@ -0,0 +1,23 @@ +package service; + +import constant.PaymentType; +import domain.Menu; +import domain.Table; +import domain.TableRepository; + +public class ChickenService { + + TableRepository tableRepository = new TableRepository(); + + public void order(int tableNumber, Menu menu, int quantity) { + tableRepository.addMenu(tableNumber, menu, quantity); + } + + public int payment(Table table, PaymentType type) { + return table.payment(type); + } + + public Table findByTableNumber(int tableNumber) { + return TableRepository.findByTableNumber(tableNumber); + } +} \ No newline at end of file diff --git a/src/main/java/validator/InputValidator.java b/src/main/java/validator/InputValidator.java new file mode 100644 index 00000000..97765ee6 --- /dev/null +++ b/src/main/java/validator/InputValidator.java @@ -0,0 +1,19 @@ +package validator; + +import constant.ExceptionMessage; + +import java.util.regex.Pattern; + +public class InputValidator { + + + + public static void validateNumber(String userInput) { + String NUMBER_REGEXP = "^\\d*$"; + + if (!Pattern.matches(NUMBER_REGEXP, userInput)) { + ExceptionMessage exceptionMessage = ExceptionMessage.NOT_NUMBER; + throw new IllegalArgumentException(exceptionMessage.toString()); + } + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index d5db24e2..bd105ceb 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,12 +1,72 @@ package view; +import constant.OutputMessage; +import constant.PaymentType; +import domain.*; +import validator.InputValidator; + import java.util.Scanner; +import java.util.function.Supplier; public class InputView { private static final Scanner scanner = new Scanner(System.in); + public static MainOptions inputMainOption() { + return attemptedInput(() -> { + System.out.println(OutputMessage.OPTION_SELECT); + String input = scanner.nextLine(); + InputValidator.validateNumber(input); + System.out.println(); + return MainOptions.getMainOptions(Integer.parseInt(input)); + }); + } + public static int inputTableNumber() { - System.out.println("## 주문할 테이블을 선택하세요."); - return scanner.nextInt(); + return attemptedInput(() -> { + System.out.println("## 주문할 테이블을 선택하세요."); + String tableNumber = scanner.nextLine(); + InputValidator.validateNumber(tableNumber); + System.out.println(); + return Integer.parseInt(tableNumber); + }); + } + + public static Menu inputMenu() { + return attemptedInput(() -> { + System.out.println(OutputMessage.MENU); + String input = scanner.nextLine(); + InputValidator.validateNumber(input); + System.out.println(); + return MenuRepository.findMenuByNumber(Integer.parseInt(input)); + }); + } + + public static int inputQuantity() { + return attemptedInput(() -> { + System.out.println(OutputMessage.QUANTITY); + String input = scanner.nextLine(); + InputValidator.validateNumber(input); + System.out.println(); + return Integer.parseInt(input); + }); + + } + + public static PaymentType inputPayment() { + return attemptedInput(() -> { + String input = scanner.nextLine(); + InputValidator.validateNumber(input); + System.out.println(); + return PaymentType.getPaymentType(Integer.parseInt(input)); + }); + } + + private static T attemptedInput(Supplier supplier) { + try { + return supplier.get(); + } catch (IllegalArgumentException exception) { + System.out.println(exception.getMessage()); + return supplier.get(); + } } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index edb25cc4..7533eb2e 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,5 +1,8 @@ package view; +import constant.OutputMessage; +import constant.PrintElement; +import domain.MainOptions; import domain.Menu; import domain.Table; @@ -9,19 +12,27 @@ public class OutputView { private static final String TOP_LINE = "┌ ─ ┐"; private static final String TABLE_FORMAT = "| %s |"; private static final String BOTTOM_LINE = "└ ─ ┘"; + private static final String MARK_BOTTOM_LINE = "└ # ┘"; + + public static void printMainOption() { + System.out.println(OutputMessage.MAIN_OPTION); + System.out.println(MainOptions.printValues()); + } public static void printTables(final List
tables) { System.out.println("## 테이블 목록"); final int size = tables.size(); printLine(TOP_LINE, size); printTableNumbers(tables); - printLine(BOTTOM_LINE, size); + printBottomLine(tables); + System.out.println(); } public static void printMenus(final List menus) { for (final Menu menu : menus) { System.out.println(menu); } + System.out.println(); } private static void printLine(final String line, final int count) { @@ -31,10 +42,43 @@ private static void printLine(final String line, final int count) { System.out.println(); } + private static void printBottomLine(final List
tables) { + for (Table table: tables) { + if(table.hasOrder()) { + System.out.print(MARK_BOTTOM_LINE); + continue; + } + System.out.print(BOTTOM_LINE); + } + System.out.println(); + } + private static void printTableNumbers(final List
tables) { for (final Table table : tables) { System.out.printf(TABLE_FORMAT, table); } System.out.println(); } + + public static void printOrderHistory(final Table table) { + System.out.println(OutputMessage.ORDER_HISTORY); + System.out.println(table.getOrderHistory()); + System.out.println(); + } + + public static void printPayment(final Table table) { + System.out.printf(OutputMessage.PAYMENT_START.toString(), table); + System.out.println(); + System.out.println(OutputMessage.PAYMENT_METHOD); + } + + public static void printTotalPrice(int price) { + System.out.println(OutputMessage.TOTAL_PRICE); + System.out.printf(PrintElement.TOTAL_PRICE.toString(), price); + System.out.println(); + } + + public static void printExceptionMessage(String exceptionMessage) { + System.out.println(exceptionMessage); + } } diff --git a/src/test/java/CategoryTest.java b/src/test/java/CategoryTest.java new file mode 100644 index 00000000..89a9075f --- /dev/null +++ b/src/test/java/CategoryTest.java @@ -0,0 +1,15 @@ +import domain.Category; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CategoryTest { + + @DisplayName("카테고리가 Chicken일 경우 true를 반환한다.") + @Test + void isChicken() { + Category category = Category.CHICKEN; + assertThat(category.isChicken()).isTrue(); + } +} \ No newline at end of file diff --git a/src/test/java/ChickenServiceTest.java b/src/test/java/ChickenServiceTest.java new file mode 100644 index 00000000..0a4e78d7 --- /dev/null +++ b/src/test/java/ChickenServiceTest.java @@ -0,0 +1,50 @@ +import constant.PaymentType; +import domain.Menu; +import domain.MenuRepository; +import domain.Table; +import domain.TableRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import service.ChickenService; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ChickenServiceTest { + + ChickenService service = new ChickenService(); + + @DisplayName("테이블번호, 메뉴, 수량을 입력할 경우 주문 요청이 들어간다.") + @Test + void addMenu() { + int tableNumber = 1; + Menu menu = MenuRepository.findMenuByNumber(1); + int quantity = 1; + + service.order(tableNumber, menu, quantity); + + assertThat(TableRepository.tables().get(0).hasOrder()).isTrue(); + } + + @DisplayName("테이블에 메뉴와 수량을 입력할 경우 주문 요청이 들어간다.") + @Test + void pay() { + int tableNumber = 1; + Menu menu = MenuRepository.findMenuByNumber(1); + int quantity = 1; + service.order(tableNumber, menu, quantity); + + service.payment(TableRepository.findByTableNumber(tableNumber), PaymentType.CARD); + + assertThat(TableRepository.findByTableNumber(tableNumber).hasOrder()).isFalse(); + } + + @DisplayName("테이블 번호를 입력하면 해당 번호를 가진 테이블을 반환한다.") + @Test + void findByTableNumber() { + int tableNumber = 1; + + Table table = service.findByTableNumber(tableNumber); + + assertThat(table).isEqualTo(TableRepository.findByTableNumber(tableNumber)); + } +} diff --git a/src/test/java/InputValidatorTest.java b/src/test/java/InputValidatorTest.java new file mode 100644 index 00000000..439ec7a9 --- /dev/null +++ b/src/test/java/InputValidatorTest.java @@ -0,0 +1,17 @@ +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import validator.InputValidator; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class InputValidatorTest { + + @DisplayName("문자를 입력할 경우 예외를 발생시킨다.") + @Test + void isExist() { + String input = "hi"; + + assertThatThrownBy(() -> InputValidator.validateNumber(input)) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/MainOptionTest.java b/src/test/java/MainOptionTest.java new file mode 100644 index 00000000..5e8741af --- /dev/null +++ b/src/test/java/MainOptionTest.java @@ -0,0 +1,58 @@ +import domain.MainOptions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class MainOptionTest { + + @DisplayName("1을 입력할 경우 ORDER_REGISTRATION을 반환한다.") + @Test + void getOrderRegistration() { + int input = 1; + + MainOptions option = MainOptions.getMainOptions(input); + + assertThat(option).isEqualTo(MainOptions.ORDER_REGISTRATION); + } + + @DisplayName("1을 입력할 경우 ORDER_REGISTRATION을 반환한다.") + @Test + void isOrder() { + int input = 1; + + MainOptions option = MainOptions.getMainOptions(input); + + assertThat(option.isOrder()).isTrue(); + } + + @DisplayName("1을 입력할 경우 PAYMENT을 반환한다.") + @Test + void isPayment() { + int input = 2; + + MainOptions option = MainOptions.getMainOptions(input); + + assertThat(option.isPayment()).isTrue(); + } + + @DisplayName("3을 입력할 경우 TERMINATION을 반환한다.") + @Test + void isTermination() { + int input = 3; + + MainOptions option = MainOptions.getMainOptions(input); + + assertThat(option.isTermination()).isTrue(); + } + + @DisplayName("1, 2, 3 이외의 입력이 들어올 경우 예외가 발생한다.") + @Test + void exception() { + int input = 4; + + assertThatThrownBy(() -> MainOptions.getMainOptions(input)) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/MenuRepositoryTest.java b/src/test/java/MenuRepositoryTest.java new file mode 100644 index 00000000..bb17ebee --- /dev/null +++ b/src/test/java/MenuRepositoryTest.java @@ -0,0 +1,27 @@ +import domain.MainOptions; +import domain.MenuRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class MenuRepositoryTest { + + @DisplayName("존재하는 메뉴일 경우 true를 반환한다.") + @Test + void isExist() { + int input = 1; + + assertThat(MenuRepository.findMenuByNumber(input).getName()).isEqualTo("후라이드"); + } + + @DisplayName("존재하지 않는 메뉴일 경우 예외를 발생시킨다.") + @Test + void menuException() { + int input = 12; + + assertThatThrownBy(() -> MainOptions.getMainOptions(input)) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/OrderTest.java b/src/test/java/OrderTest.java new file mode 100644 index 00000000..a5d35469 --- /dev/null +++ b/src/test/java/OrderTest.java @@ -0,0 +1,68 @@ +import domain.Menu; +import domain.MenuRepository; +import domain.Order; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class OrderTest { + + @DisplayName("메뉴와 수량을 입력해 주문한다.") + @Test + void addMenu() { + Order order = new Order(); + Menu menu = MenuRepository.findMenuByNumber(1); + int quantity = 3; + + order.addMenu(menu, quantity); + + assertThat(order.chickenNumber()).isEqualTo(3); + } + + @DisplayName("주문이 없는 경우 false를 반환한다.") + @Test + void hasOrder() { + Order order = new Order(); + + assertThat(order.hasOrder()).isFalse(); + } + + @DisplayName("결제가 완료된 경우 초기화 한다.") + @Test + void payment() { + Order order = new Order(); + Menu menu = MenuRepository.findMenuByNumber(1); + int quantity = 3; + order.addMenu(menu, quantity); + + order.payment(); + + assertThat(order.hasOrder()).isFalse(); + } + + @DisplayName("현재 주문된 메뉴들의 총 금액을 반환한다.") + @Test + void getTotalPrice() { + Order order = new Order(); + Menu menu = MenuRepository.findMenuByNumber(1); + int quantity = 3; + order.addMenu(menu, quantity); + + int price = order.totalPrice(); + + assertThat(price).isEqualTo(48000); + } + + @DisplayName("같은 메뉴를 100개 이상 주문할 경우 예외 발생") + @Test + void orderException() { + Order order = new Order(); + Menu menu = MenuRepository.findMenuByNumber(1); + int quantity = 100; + + assertThatThrownBy(() -> order.addMenu(menu, quantity)) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/TableRepositoryTest.java b/src/test/java/TableRepositoryTest.java new file mode 100644 index 00000000..474806f1 --- /dev/null +++ b/src/test/java/TableRepositoryTest.java @@ -0,0 +1,32 @@ +import domain.Menu; +import domain.MenuRepository; +import domain.TableRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class TableRepositoryTest { + + @DisplayName("존재하지 않는 테이블을 입력할 경우 예외가 발생한다.") + @Test + void orderException() { + int input = 100; + + assertThatThrownBy(() -> TableRepository.findByTableNumber(input)) + .isInstanceOf(IllegalArgumentException.class); + } + + @DisplayName("테이블에 메뉴와 수량을 입력할 경우 주문 요청이 들어간다.") + @Test + void addMenu() { + TableRepository tableRepository = new TableRepository(); + Menu menu = MenuRepository.findMenuByNumber(1); + int quantity = 1; + + tableRepository.addMenu(1, menu, quantity); + + assertThat(TableRepository.tables().get(0).hasOrder()).isTrue(); + } +} diff --git a/src/test/java/TableTest.java b/src/test/java/TableTest.java new file mode 100644 index 00000000..0854c196 --- /dev/null +++ b/src/test/java/TableTest.java @@ -0,0 +1,75 @@ +import constant.PaymentType; +import domain.Menu; +import domain.MenuRepository; +import domain.Table; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TableTest { + + @DisplayName("테이블에 메뉴와 수량을 입력할 경우 주문 요청이 들어간다.") + @Test + void addMenu() { + Table table = new Table(10); + Menu menu = MenuRepository.findMenuByNumber(1); + int quantity = 1; + + table.addMenu(menu, quantity); + + assertThat(table.hasOrder()).isTrue(); + } + + @DisplayName("결제를 요청할 경우 할인가를 반영한 총 금액을 반환한다.") + @Test + void payment() { + Table table = new Table(10); + Menu menu = MenuRepository.findMenuByNumber(1); + int quantity = 3; + table.addMenu(menu, quantity); + + int price = table.payment(PaymentType.getPaymentType(1)); + + assertThat(price).isEqualTo(48000); + } + + @DisplayName("현금으로 결제할 경우 5%가 할인된다.") + @Test + void paymentCash() { + Table table = new Table(10); + Menu menu = MenuRepository.findMenuByNumber(1); + int quantity = 3; + table.addMenu(menu, quantity); + + int price = table.payment(PaymentType.CASH); + + assertThat(price).isEqualTo(45600); + } + + @DisplayName("치킨 10마리당 10,000씩 할인한다.") + @Test + void paymentChicken() { + Table table = new Table(10); + Menu menu = MenuRepository.findMenuByNumber(1); + int quantity = 10; + table.addMenu(menu, quantity); + + int price = table.payment(PaymentType.CARD); + + assertThat(price).isEqualTo(150000); + } + + @DisplayName("치킨 10마리를 시키고 현금결제를 할 경우 중첩 할인이 가능하다.") + @Test + void overlappingDiscount() { + Table table = new Table(10); + Menu menu = MenuRepository.findMenuByNumber(1); + int quantity = 10; + table.addMenu(menu, quantity); + + int price = table.payment(PaymentType.CASH); + + assertThat(price).isEqualTo(142500); + } +}