diff --git a/docs/Readme.md b/docs/Readme.md new file mode 100644 index 00000000..68371269 --- /dev/null +++ b/docs/Readme.md @@ -0,0 +1,36 @@ +## 기능 목록 +- inputView + - 원하는 기능을 선택한다. + 1. 주문 등록 + 2. 결제하기 + 3. 프로그램 종료 + - 주문등록 시 테이블을 선택한다. + - 테이블 선택 후 등록할 메뉴를 선택한다. + - 메뉴의 수량을 선택한다. + - 결제하기 + 1. 신용카드 + 2. 현금 + +- OutputView + - 테이블 목록 출력 + - 주문이 등록된 테이블은 **결제가 이루어지기 전까지 테이블 목록에 별도로 표시**한다. + - 메뉴 목록 출력 + - 최종 결제할 금액 출력 + +- Menu + - 메뉴 번호 + - 종류 + - 이름 + - 가격 + +- Table + - 테이블 번호 + - 테이블에 주문할 수 있는 한 메뉴의 최대 수량은 99개이다. + +## 에러 처리 + +- 메뉴 숫자의 범위는 1부터 3이다. +- 한 테이블에서 주문할 수 있는 한 메뉴의 최대 수량은 99개이다. +- 테이블 번호는 1,2,3,5,6,8 +- 메뉴 번호는 1,2,3,4,5,6,21,22 +- 카드는 1,2 중 선택 \ No newline at end of file diff --git a/src/main/java/Application.java b/src/main/java/Application.java index ea0d34fd..5cdeaf34 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,21 +1,8 @@ -import domain.Menu; -import domain.MenuRepository; -import domain.Table; -import domain.TableRepository; -import view.InputView; -import view.OutputView; - -import java.util.List; +import controller.PosController; 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); + PosController posController = new PosController(); + posController.startProgram(); } } diff --git a/src/main/java/DTO/TableDTO.java b/src/main/java/DTO/TableDTO.java new file mode 100644 index 00000000..ec846c28 --- /dev/null +++ b/src/main/java/DTO/TableDTO.java @@ -0,0 +1,22 @@ +package DTO; + +import domain.TableList; +import domain.TableStatus; + +public class TableDTO { + private final TableList tableList; + private final TableStatus tableStatus; + + public TableDTO() { + this.tableList = new TableList(); + this.tableStatus = new TableStatus(tableList); + } + + public TableList getTableList() { + return tableList; + } + + public TableStatus getTableStatus() { + return tableStatus; + } +} diff --git a/src/main/java/constants/ErrorMessage.java b/src/main/java/constants/ErrorMessage.java new file mode 100644 index 00000000..9b00f0c2 --- /dev/null +++ b/src/main/java/constants/ErrorMessage.java @@ -0,0 +1,21 @@ +package constants; + +public enum ErrorMessage { + INPUT_MAIN_NUMBER_ERROR("기능 번호는 %s 부터 %s 입니다."), + INPUT_TABLE_NUMBER_ERROR("옳지 않는 테이블 번호입니다."), + INPUT_MENU_NUMBER_ERROR("옳지 않는 메뉴 번호입니다."), + INPUT_MENU_QUANTITY_ERROR("한 테이블에서 주문할 수 있는 한 메뉴의 최대 수량은 %s 개입니다."), + INPUT_PAYMENT_NUMBER_ERROR("신용 카드는 %s번, 현금은 %s번 입니다."); + + private static final String ERROR = "[ERROR]"; + private final String message; + + ErrorMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return ERROR + message; + } +} diff --git a/src/main/java/constants/FunctionScreen.java b/src/main/java/constants/FunctionScreen.java new file mode 100644 index 00000000..fd9c19f9 --- /dev/null +++ b/src/main/java/constants/FunctionScreen.java @@ -0,0 +1,48 @@ +package constants; + +public enum FunctionScreen { + REGISTER_ORDER(1, "주문등록"), + MAKE_PAYMENT(2, "결제하기"), + PROGRAM_EXIT(3, "프로그램 종료"); + + private final int number; + private final String function; + + FunctionScreen(int number, String function) { + this.number = number; + this.function = function; + } + + public static void validateMainListNumber(Integer number) { + if (number < REGISTER_ORDER.number || number > PROGRAM_EXIT.number) { + throw new IllegalArgumentException(String.format(ErrorMessage.INPUT_MAIN_NUMBER_ERROR.toString() + , REGISTER_ORDER.number, PROGRAM_EXIT.number)); + } + } + + public static String showMainFunction() { + StringBuilder stringBuilder = new StringBuilder(); + for (FunctionScreen main : FunctionScreen.values()) { + stringBuilder.append(String.format("%d - %s\n", main.number, main.function)); + } + return stringBuilder.toString(); + } + + public static boolean isRegisterOrder(int number) { + return number == REGISTER_ORDER.number; + } + + public static boolean isNotProgramExit(int number) { + return number != PROGRAM_EXIT.number; + } + + public static boolean isMakePayment(int number) { + return number == MAKE_PAYMENT.getNumber(); + } + + public int getNumber() { + return number; + } + + +} diff --git a/src/main/java/constants/Menu.java b/src/main/java/constants/Menu.java new file mode 100644 index 00000000..11c25345 --- /dev/null +++ b/src/main/java/constants/Menu.java @@ -0,0 +1,62 @@ +package constants; + +import java.util.Arrays; + +public enum Menu { + + MENU1("치킨", 1, "후라이드", 16000), + MENU2("치킨", 2, "양념치킨", 16000), + MENU3("치킨", 3, "반반치킨", 16000), + MENU4("치킨", 4, "통구이", 16000), + MENU5("치킨", 5, "간장치킨", 17000), + MENU6("치킨", 6, "순살치킨", 17000), + MENU21("음료", 21, "콜라", 1000), + MENU22("음료", 22, "사이다", 1000); + + + private final String type; + private final int number; + private final String name; + private final int price; + + Menu(String type, int number, String name, int price) { + this.type = type; + this.number = number; + this.name = name; + this.price = price; + } + + public static String showMenu() { + StringBuilder menuString = new StringBuilder(); + for (Menu menu : values()) { + menuString.append(String.format("[%s] %d - %s : %d원\n", menu.type, menu.number, menu.name, menu.price)); + } + return menuString.toString(); + } + + public static Menu getMenu(Integer number) { + return Arrays.stream(Menu.values()) + .filter(menu -> menu.number == number) + .findFirst() + .orElse(null); + } + + public static void validateMenuNumber(Integer number) { + if (Arrays.stream(Menu.values()).noneMatch(menu -> menu.number == number)) { + throw new IllegalArgumentException(ErrorMessage.INPUT_MENU_NUMBER_ERROR.toString()); + } + } + + public String getName() { + return name; + } + + public int getPrice() { + return price; + } + + public String getType() { + return type; + } +} + diff --git a/src/main/java/constants/PaymentMethod.java b/src/main/java/constants/PaymentMethod.java new file mode 100644 index 00000000..d099d717 --- /dev/null +++ b/src/main/java/constants/PaymentMethod.java @@ -0,0 +1,36 @@ +package constants; + +public enum PaymentMethod { + CREDIT_CARD(1, "신용 카드"), + CASH(2, "현금"); + + private static final int LAST_CHAR = 1; + private final int number; + private final String method; + + PaymentMethod(int number, String method) { + this.number = number; + this.method = method; + } + + public static void validatePaymentNumber(int number) { + if (number < CREDIT_CARD.number || number > CASH.number) { + throw new IllegalArgumentException(String.format(ErrorMessage.INPUT_PAYMENT_NUMBER_ERROR.toString() + , CREDIT_CARD.number, CASH.number)); + } + } + + public static String showPaymentMethod() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("##"); + for (PaymentMethod paymentMethod : PaymentMethod.values()) { + stringBuilder.append(String.format(" %s는 %s번,", paymentMethod.method, paymentMethod.number)); + } + stringBuilder.deleteCharAt(stringBuilder.length() - LAST_CHAR); + return stringBuilder.toString(); + } + + public static boolean isCashType(int number) { + return number == CASH.number; + } +} diff --git a/src/main/java/constants/ProgressMessage.java b/src/main/java/constants/ProgressMessage.java new file mode 100644 index 00000000..c6386016 --- /dev/null +++ b/src/main/java/constants/ProgressMessage.java @@ -0,0 +1,25 @@ +package constants; + +public enum ProgressMessage { + MAIN_MESSAGE("## 메인화면"), + SELECT_NUMBER("## 원하는 기능을 선택하세요."), + TABLE_LIST("## 테이블 목록"), + SELECT_TABLE("## 테이블을 선택하세요."), + SELECT_MENU("## 등록할 메뉴를 선택하세요."), + INPUT_MENU_QUANTITY("## 메뉴의 수량을 입력하세요."), + ORDER_HISTORY("## 주문 내역"), + HISTORY_ELEMENT("메뉴 수량 금액"), + PAYMENT_PROGRESS("## %s번 테이블의 결제를 진행합니다."), + PAYMENT_AMOUNT("## 최종 결제할 금액"); + + private final String message; + + ProgressMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return message; + } +} diff --git a/src/main/java/controller/PosController.java b/src/main/java/controller/PosController.java new file mode 100644 index 00000000..fe540a3e --- /dev/null +++ b/src/main/java/controller/PosController.java @@ -0,0 +1,72 @@ +package controller; + +import constants.FunctionScreen; +import constants.Menu; +import domain.Payment; +import domain.Table; +import service.PosService; +import view.InputView; +import view.OutputView; + +public class PosController { + private static final int INIT_NUMBER = 0; + private final PosService posService; + private final InputView inputView; + private final OutputView outputView; + + public PosController() { + this.posService = new PosService(); + this.inputView = new InputView(); + this.outputView = new OutputView(); + } + + public void startProgram() { + int number = INIT_NUMBER; + while (FunctionScreen.isNotProgramExit(number)) { + number = selectMain(); + executeFunction(number); + } + } + + private int selectMain() { + outputView.printMainProgram(); + outputView.printMainFunction(); + return inputView.readMainNumber(); + } + + private void executeFunction(int number) { + registerOrder(number); + makePayment(number); + } + + public void registerOrder(int number) { + if (FunctionScreen.isRegisterOrder(number)) { + outputView.printTableStatus(posService.getTableStatus()); + Table table = inputView.readTableNumber(posService.getTableList()); + + outputView.printMenuList(); + Menu menu = inputView.readMenuNumber(); + + int quantity = inputView.readMenuQuantity(table.getOrderList(), menu); + + posService.saveOrderList(table, menu, quantity); + posService.updateTableOrderStatus(table); + } + } + + public void makePayment(int number) { + if (FunctionScreen.isMakePayment(number)) { + outputView.printTableStatus(posService.getTableStatus()); + Table table = inputView.readTableNumber(posService.getTableList()); + + outputView.printOrderHistory(table.getOrderList()); + int paymentNumber = inputView.readPaymentNumber(table.getNumber()); + + outputView.printPaymentAmount(); + Payment payment = posService.applyDiscount(table, paymentNumber); + + outputView.printPaymentPrice(payment); + posService.updateTablePaymentStatus(table); + } + } +} diff --git a/src/main/java/domain/Category.java b/src/main/java/domain/Category.java deleted file mode 100644 index 2e2c07ae..00000000 --- a/src/main/java/domain/Category.java +++ /dev/null @@ -1,17 +0,0 @@ -package domain; - -public enum Category { - CHICKEN("치킨"), - BEVERAGE("음료"); - - private final String name; - - Category(final String name) { - this.name = name; - } - - @Override - public String toString() { - return "[" + name + "]"; - } -} diff --git a/src/main/java/domain/Menu.java b/src/main/java/domain/Menu.java deleted file mode 100644 index 9f5a078e..00000000 --- a/src/main/java/domain/Menu.java +++ /dev/null @@ -1,20 +0,0 @@ -package domain; - -public class Menu { - private final int number; - private final String name; - private final Category category; - private final int price; - - public Menu(final int number, final String name, final Category category, final int price) { - this.number = number; - this.name = name; - this.category = category; - this.price = 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 deleted file mode 100644 index fd3fe537..00000000 --- a/src/main/java/domain/MenuRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package domain; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class MenuRepository { - private static final List menus = new ArrayList<>(); - - static { - menus.add(new Menu(1, "후라이드", Category.CHICKEN, 16_000)); - menus.add(new Menu(2, "양념치킨", Category.CHICKEN, 16_000)); - menus.add(new Menu(3, "반반치킨", Category.CHICKEN, 16_000)); - menus.add(new Menu(4, "통구이", Category.CHICKEN, 16_000)); - menus.add(new Menu(5, "간장치킨", Category.CHICKEN, 17_000)); - menus.add(new Menu(6, "순살치킨", Category.CHICKEN, 17_000)); - menus.add(new Menu(21, "콜라", Category.BEVERAGE, 1_000)); - menus.add(new Menu(22, "사이다", Category.BEVERAGE, 1_000)); - } - - public static List menus() { - return Collections.unmodifiableList(menus); - } -} diff --git a/src/main/java/domain/OrderList.java b/src/main/java/domain/OrderList.java new file mode 100644 index 00000000..04d42d8e --- /dev/null +++ b/src/main/java/domain/OrderList.java @@ -0,0 +1,57 @@ +package domain; + +import constants.ErrorMessage; +import constants.Menu; +import constants.ProgressMessage; + +import java.util.EnumMap; +import java.util.Map; + +public class OrderList { + private static final int MAX_QUANTITY = 99; + private static final int MIN_QUANTITY = 1; + private static final int DEFAULT_QUANTITY = 0; + private final EnumMap menus = new EnumMap<>(Menu.class); + + public void saveOrder(Menu menu, int quantity) { + menus.put(menu, getTotalQuantity(menu, quantity)); + } + + public void validateMenuQuantity(Menu menu, int quantity) { + if (quantity < MIN_QUANTITY || getTotalQuantity(menu, quantity) > MAX_QUANTITY) { + throw new IllegalArgumentException(String.format(ErrorMessage.INPUT_MENU_QUANTITY_ERROR.toString(), MAX_QUANTITY)); + } + } + + private int getTotalQuantity(Menu menu, int quantity) { + return quantity + menus.getOrDefault(menu, DEFAULT_QUANTITY); + } + + public void completePayment() { + menus.clear(); + } + + public Map getMenus() { + return menus; + } + + @Override + public String toString() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(ProgressMessage.ORDER_HISTORY).append("\n") + .append(ProgressMessage.HISTORY_ELEMENT).append("\n"); + + for (Map.Entry entry : menus.entrySet()) { + Menu menu = entry.getKey(); + int quantity = entry.getValue(); + int price = menu.getPrice(); + stringBuilder.append(menu.getName()) + .append(" ") + .append(quantity) + .append(" ") + .append(price) + .append("\n"); + } + return stringBuilder.toString(); + } +} diff --git a/src/main/java/domain/Payment.java b/src/main/java/domain/Payment.java new file mode 100644 index 00000000..af4d2fbc --- /dev/null +++ b/src/main/java/domain/Payment.java @@ -0,0 +1,69 @@ +package domain; + +import constants.Menu; +import constants.PaymentMethod; + +import java.util.Map; +import java.util.Set; + +public class Payment { + + private static final String DISCOUNT_MENU = "치킨"; + private static final String CURRENCY_UNIT = "원"; + private static final int INIT_VALUE = 0; + private static final double DISCOUNT_CHICKEN_AMOUNT = 10.0; + private static final int TEN_THOUSAND = 10000; + private static final double DISCOUNT_RATE = 0.05; + private final OrderList orderList; + private int chickenQuantitySum = 0; + private double paymentPrice; + + public Payment(OrderList orderList) { + this.orderList = orderList; + this.paymentPrice = initPaymentPrice(); + } + + private int initPaymentPrice() { + int price, quantity, sum = INIT_VALUE; + for (Map.Entry entry : orderList.getMenus().entrySet()) { + price = entry.getKey().getPrice(); + quantity = entry.getValue(); + sum += price * quantity; + } + return sum; + } + + public void applyDiscount(int paymentNumber) { + countChickenQuantity(); + defaultDisCount(); + cashDisCount(paymentNumber); + orderList.completePayment(); + } + + private void countChickenQuantity() { + Set menus = orderList.getMenus().keySet(); + for (Menu menu : menus) { + if (menu.getType().equals(DISCOUNT_MENU)) { + chickenQuantitySum++; + } + } + } + + private void defaultDisCount() { + if (chickenQuantitySum > DISCOUNT_CHICKEN_AMOUNT) { + double discount = (chickenQuantitySum / DISCOUNT_CHICKEN_AMOUNT) * TEN_THOUSAND; + paymentPrice -= discount; + } + } + + private void cashDisCount(int paymentNumber) { + if (PaymentMethod.isCashType(paymentNumber)) { + paymentPrice -= paymentPrice * DISCOUNT_RATE; + } + } + + @Override + public String toString() { + return (int) paymentPrice + CURRENCY_UNIT; + } +} diff --git a/src/main/java/domain/Table.java b/src/main/java/domain/Table.java index 500c517e..6ab57272 100644 --- a/src/main/java/domain/Table.java +++ b/src/main/java/domain/Table.java @@ -1,14 +1,20 @@ package domain; public class Table { + private final int number; + private final OrderList orderList; - public Table(final int number) { + public Table(int number) { this.number = number; + this.orderList = new OrderList(); + } + + public int getNumber() { + return number; } - @Override - public String toString() { - return Integer.toString(number); + public OrderList getOrderList() { + return orderList; } } diff --git a/src/main/java/domain/TableList.java b/src/main/java/domain/TableList.java new file mode 100644 index 00000000..6d2cee30 --- /dev/null +++ b/src/main/java/domain/TableList.java @@ -0,0 +1,43 @@ +package domain; + +import constants.ErrorMessage; + +import java.util.ArrayList; +import java.util.List; + +public class TableList { + private final List
tables; + + public TableList() { + this.tables = new ArrayList<>(); + addTableWithNumber(1); + addTableWithNumber(2); + addTableWithNumber(3); + addTableWithNumber(5); + addTableWithNumber(6); + addTableWithNumber(8); + } + + private void addTableWithNumber(int number) { + Table table = new Table(number); + tables.add(table); + } + + public void validateTableNumber(Integer number) { + if (tables.stream().noneMatch(table -> table.getNumber() == number)) { + throw new IllegalArgumentException(ErrorMessage.INPUT_TABLE_NUMBER_ERROR.toString()); + } + } + + public Table getTable(Integer number) { + return tables.stream() + .filter(table -> table.getNumber() == number) + .findFirst() + .orElse(null); + } + + public List
getTables() { + return tables; + } + +} diff --git a/src/main/java/domain/TableRepository.java b/src/main/java/domain/TableRepository.java deleted file mode 100644 index c9c791e2..00000000 --- a/src/main/java/domain/TableRepository.java +++ /dev/null @@ -1,22 +0,0 @@ -package domain; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class TableRepository { - private static final List
tables = new ArrayList<>(); - - static { - tables.add(new Table(1)); - tables.add(new Table(2)); - tables.add(new Table(3)); - tables.add(new Table(5)); - tables.add(new Table(6)); - tables.add(new Table(8)); - } - - public static List
tables() { - return Collections.unmodifiableList(tables); - } -} diff --git a/src/main/java/domain/TableStatus.java b/src/main/java/domain/TableStatus.java new file mode 100644 index 00000000..ff972d20 --- /dev/null +++ b/src/main/java/domain/TableStatus.java @@ -0,0 +1,60 @@ +package domain; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TableStatus { + + private static final List upElement = List.of("┏", "-", "┓"); + private static final List downElement = List.of("┗", "-", "┛"); + private static final List downElementOrder = List.of("┗", "#", "┛"); + private final TableList tableList; + private final Map> downSide = new HashMap<>(6); + + public TableStatus(TableList tableList) { + this.tableList = tableList; + initDownSide(); + } + + private void initDownSide() { + List
tables = tableList.getTables(); + for (Table table : tables) { + downSide.put(table, downElement); + } + } + + + public void changeTableOrderStatus(Table table) { + downSide.put(table, downElementOrder); + } + + public void changeTablePaymentStatus(Table table) { + downSide.put(table, downElement); + } + + @Override + public String toString() { + List
tables = tableList.getTables(); + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < tables.size(); i++) { + for (String upside : upElement) { + stringBuilder.append(upside).append(" "); + } + } + stringBuilder.append("\n"); + + for (Table table : tables) { + stringBuilder.append("| ").append(table.getNumber()).append(" | "); + } + stringBuilder.append("\n"); + + for (Table table : tables) { + for (String downSide : downSide.get(table)) { + stringBuilder.append(downSide).append(" "); + } + } + stringBuilder.append("\n"); + return stringBuilder.toString(); + } +} diff --git a/src/main/java/service/PosService.java b/src/main/java/service/PosService.java new file mode 100644 index 00000000..dd3886b3 --- /dev/null +++ b/src/main/java/service/PosService.java @@ -0,0 +1,43 @@ +package service; + +import DTO.TableDTO; +import constants.Menu; +import domain.*; + +public class PosService { + + private final TableDTO tableDTO; + + public PosService() { + this.tableDTO = new TableDTO(); + } + + public void saveOrderList(Table table, Menu menu, int quantity) { + OrderList orderList = table.getOrderList(); + orderList.saveOrder(menu, quantity); + } + + public void updateTableOrderStatus(Table table) { + TableStatus tableStatus = tableDTO.getTableStatus(); + tableStatus.changeTableOrderStatus(table); + } + + public void updateTablePaymentStatus(Table table) { + TableStatus tableStatus = tableDTO.getTableStatus(); + tableStatus.changeTablePaymentStatus(table); + } + + public Payment applyDiscount(Table table, int paymentNumber) { + Payment payment = new Payment(table.getOrderList()); + payment.applyDiscount(paymentNumber); + return payment; + } + + public TableList getTableList() { + return tableDTO.getTableList(); + } + + public TableStatus getTableStatus() { + return tableDTO.getTableStatus(); + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index d5db24e2..edf63836 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,12 +1,128 @@ package view; +import constants.FunctionScreen; +import constants.Menu; +import constants.PaymentMethod; +import domain.OrderList; +import domain.Table; +import domain.TableList; + import java.util.Scanner; public class InputView { - private static final Scanner scanner = new Scanner(System.in); - public static int inputTableNumber() { - System.out.println("## 주문할 테이블을 선택하세요."); - return scanner.nextInt(); + OutputView outputView = new OutputView(); + + public Integer readMainNumber() { + Integer input; + do { + input = inputMainNumber(); + } while (input == null); + return input; + } + + public Integer inputMainNumber() { + outputView.printSelectMainNumber(); + Scanner scanner = new Scanner(System.in); + Integer number = scanner.nextInt(); + outputView.printEnter(); + try { + FunctionScreen.validateMainListNumber(number); + return number; + } catch (IllegalArgumentException e) { + outputView.printErrorMessage(e.getMessage()); + return null; + } + } + + public Table readTableNumber(TableList tableList) { + Table table; + do { + table = inputTableNumber(tableList); + } while (table == null); + return table; + } + + private Table inputTableNumber(TableList tableList) { + outputView.printSelectTableNumber(); + Scanner scanner = new Scanner(System.in); + Integer number = scanner.nextInt(); + outputView.printEnter(); + try { + tableList.validateTableNumber(number); + return tableList.getTable(number); + } catch (IllegalArgumentException e) { + outputView.printErrorMessage(e.getMessage()); + return null; + } + } + + public Menu readMenuNumber() { + Menu menu; + do { + menu = inputMenuNumber(); + } while (menu == null); + return menu; + } + + private Menu inputMenuNumber() { + outputView.printSelectMenu(); + Scanner scanner = new Scanner(System.in); + Integer number = scanner.nextInt(); + outputView.printEnter(); + try { + Menu.validateMenuNumber(number); + return Menu.getMenu(number); + } catch (IllegalArgumentException e) { + outputView.printErrorMessage(e.getMessage()); + return null; + } + } + + public Integer readMenuQuantity(OrderList orderList, Menu menu) { + Integer quantity; + do { + quantity = inputMenuQuantity(orderList, menu); + } while (quantity == null); + return quantity; } + + private Integer inputMenuQuantity(OrderList orderList, Menu menu) { + outputView.printMenuQuantity(); + Scanner scanner = new Scanner(System.in); + int quantity = scanner.nextInt(); + outputView.printEnter(); + try { + orderList.validateMenuQuantity(menu, quantity); + return quantity; + } catch (IllegalArgumentException e) { + outputView.printErrorMessage(e.getMessage()); + return null; + } + } + + public Integer readPaymentNumber(int tableNum) { + Integer number; + do { + number = inputPaymentNumber(tableNum); + } while (number == null); + return number; + } + + private Integer inputPaymentNumber(int tableNum) { + outputView.printProgressPayment(tableNum); + outputView.printPaymentMethod(); + Scanner scanner = new Scanner(System.in); + int number = scanner.nextInt(); + outputView.printEnter(); + try { + PaymentMethod.validatePaymentNumber(number); + return number; + } catch (IllegalArgumentException e) { + outputView.printErrorMessage(e.getMessage()); + return null; + } + } + + } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index edb25cc4..d4ee506d 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,40 +1,74 @@ package view; -import domain.Menu; -import domain.Table; - -import java.util.List; +import constants.FunctionScreen; +import constants.Menu; +import constants.PaymentMethod; +import constants.ProgressMessage; +import domain.OrderList; +import domain.Payment; +import domain.TableStatus; public class OutputView { - private static final String TOP_LINE = "┌ ─ ┐"; - private static final String TABLE_FORMAT = "| %s |"; - private static final String BOTTOM_LINE = "└ ─ ┘"; - 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); + public void printMainProgram() { + System.out.println(ProgressMessage.MAIN_MESSAGE); } - public static void printMenus(final List menus) { - for (final Menu menu : menus) { - System.out.println(menu); - } + public void printSelectMainNumber() { + System.out.println(ProgressMessage.SELECT_NUMBER); } - private static void printLine(final String line, final int count) { - for (int index = 0; index < count; index++) { - System.out.print(line); - } - System.out.println(); + public void printMainFunction() { + System.out.println(FunctionScreen.showMainFunction()); + } + + public void printTableStatus(TableStatus tableStatus) { + System.out.println(ProgressMessage.TABLE_LIST); + System.out.println(tableStatus); + } + + public void printSelectTableNumber() { + System.out.println(ProgressMessage.SELECT_TABLE); + } + + public void printMenuList() { + System.out.println(Menu.showMenu()); + } + + public void printSelectMenu() { + System.out.println(ProgressMessage.SELECT_MENU); + } + + public void printMenuQuantity() { + System.out.println(ProgressMessage.INPUT_MENU_QUANTITY); + } + + public void printErrorMessage(String message) { + System.out.println(message); + } + + public void printOrderHistory(OrderList orderList) { + System.out.println(orderList); + } + + public void printProgressPayment(int tableNum) { + System.out.printf(ProgressMessage.PAYMENT_PROGRESS + "%n", tableNum); + } + + public void printPaymentMethod() { + System.out.println(PaymentMethod.showPaymentMethod()); + } + + public void printPaymentAmount() { + System.out.println(ProgressMessage.PAYMENT_AMOUNT); + } + + public void printPaymentPrice(Payment payment) { + System.out.println(payment); + printEnter(); } - private static void printTableNumbers(final List
tables) { - for (final Table table : tables) { - System.out.printf(TABLE_FORMAT, table); - } + public void printEnter() { System.out.println(); } } diff --git a/src/test/java/FunctionScreenTest.java b/src/test/java/FunctionScreenTest.java new file mode 100644 index 00000000..44676153 --- /dev/null +++ b/src/test/java/FunctionScreenTest.java @@ -0,0 +1,36 @@ +import constants.FunctionScreen; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; + +class FunctionScreenTest { + @Test + @DisplayName("화면에 기능 목록이 출력이 되는지 확인한다.") + void showFunctionScreen(){ + String screen = FunctionScreen.showMainFunction(); + assertThat(screen).contains("1 - 주문등록\n" + + "2 - 결제하기\n" + + "3 - 프로그램 종료"); + } + + @Test + @DisplayName("1번을 눌렀을 때 주문 등록 기능을 요청했는지 확인한다.") + void requestRegisterOrder(){ + boolean isRegisterOrder = FunctionScreen.isRegisterOrder(1); + assertThat(isRegisterOrder).isTrue(); + } + + @Test + @DisplayName("2번을 눌렀을 때 결제 하기 기능을 요청했는지 확인한다.") + void requestMakePayment(){ + boolean isMakePayment = FunctionScreen.isMakePayment(2); + assertThat(isMakePayment).isTrue(); + } + + @Test + @DisplayName("3번을 눌렀을 때 프로그램 종료 기능을 요청했는지 확인한다.") + void requestProgramExit(){ + boolean isMakePayment = FunctionScreen.isNotProgramExit(3); + assertThat(isMakePayment).isFalse(); + } +} diff --git a/src/test/java/InputValidTest.java b/src/test/java/InputValidTest.java new file mode 100644 index 00000000..9571c593 --- /dev/null +++ b/src/test/java/InputValidTest.java @@ -0,0 +1,56 @@ +import constants.FunctionScreen; +import constants.Menu; +import constants.PaymentMethod; +import domain.OrderList; +import domain.TableList; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; + +class InputValidTest { + + private static final String ERROR = "[ERROR]"; + + @Test + @DisplayName("메인 기능의 숫자가 1~3 사이의 숫자가 아니면 오류가 발생한다.") + void validateMainListNumber(){ + assertThatThrownBy(() -> FunctionScreen.validateMainListNumber(5)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR); + } + + @Test + @DisplayName("옳지 않은 테이블 숫자를 입력하면 오류가 발생한다.") + void validateTableListNumber(){ + TableList tableList = new TableList(); + + assertThatThrownBy(() -> tableList.validateTableNumber(7)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR); + } + + @Test + @DisplayName("옳지 않은 메뉴 숫자를 입력하면 오류가 발생한다.") + void validateMenuNumber(){ + assertThatThrownBy(() -> Menu.validateMenuNumber(7)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR); + } + + @Test + @DisplayName("옳지 않은 메뉴 양을 입력하면 오류가 발생한다.") + void validateMenuQuantity(){ + OrderList orderList = new OrderList(); + assertThatThrownBy(() -> orderList.validateMenuQuantity(Menu.MENU1, 100)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR); + } + + @Test + @DisplayName("옳지 않는 결제 번호를 입력하면 오류가 발생한다.") + void validatePaymentNumber(){ + assertThatThrownBy(() -> PaymentMethod.validatePaymentNumber(3)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR); + } +} diff --git a/src/test/java/MenuTest.java b/src/test/java/MenuTest.java new file mode 100644 index 00000000..dad3e360 --- /dev/null +++ b/src/test/java/MenuTest.java @@ -0,0 +1,29 @@ +import constants.Menu; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; + +class MenuTest { + + @Test + @DisplayName("메뉴 화면을 보여주는지 확인한다.") + void showMenuScreen(){ + String screen = Menu.showMenu(); + assertThat(screen).contains("[치킨] 1 - 후라이드 : 16000원\n" + + "[치킨] 2 - 양념치킨 : 16000원\n" + + "[치킨] 3 - 반반치킨 : 16000원\n" + + "[치킨] 4 - 통구이 : 16000원\n" + + "[치킨] 5 - 간장치킨 : 17000원\n" + + "[치킨] 6 - 순살치킨 : 17000원\n" + + "[음료] 21 - 콜라 : 1000원\n" + + "[음료] 22 - 사이다 : 1000원"); + } + + @Test + @DisplayName("번호에 맞는 메뉴를 반환하는지 확인한다.") + void getMenuByMenuId(){ + Menu menu = Menu.getMenu(1); + assertThat(menu).isEqualTo(Menu.MENU1); + } + +} diff --git a/src/test/java/OrderListTest.java b/src/test/java/OrderListTest.java new file mode 100644 index 00000000..ce61dbb4 --- /dev/null +++ b/src/test/java/OrderListTest.java @@ -0,0 +1,22 @@ +import constants.Menu; +import domain.OrderList; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static org.assertj.core.api.Assertions.*; + +class OrderListTest { + @Test + @DisplayName("치킨을 1마리 시켰을 때 주문이 등록되는지 확인한다.") + void RegisterOrder(){ + OrderList orderList = new OrderList(); + orderList.saveOrder(Menu.MENU1, 1); + + Map menus = orderList.getMenus(); + int quantity = menus.get(Menu.MENU1); + + assertThat(quantity).isEqualTo(1); + } +} diff --git a/src/test/java/PaymentTest.java b/src/test/java/PaymentTest.java new file mode 100644 index 00000000..04132899 --- /dev/null +++ b/src/test/java/PaymentTest.java @@ -0,0 +1,30 @@ +import constants.Menu; +import constants.PaymentMethod; +import domain.OrderList; +import domain.Payment; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; + +class PaymentTest { + @Test + @DisplayName("신용카드로 결제를 진행했을 때 금액을 확인한다.") + void applyDiscountPayment(){ + OrderList orderList = new OrderList(); + orderList.saveOrder(Menu.MENU1, 1); + + Payment payment = new Payment(orderList); + + payment.applyDiscount(1); + + assertThat(payment.toString()).isEqualTo("16000원"); + } + + @Test + @DisplayName("결제 수단이 화면에 보여지는지 확인한다.") + void showPaymentScreen(){ + String screen = PaymentMethod.showPaymentMethod(); + assertThat(screen).isEqualTo("## 신용 카드는 1번, 현금는 2번"); + } + +} diff --git a/src/test/java/TableDtoTest.java b/src/test/java/TableDtoTest.java new file mode 100644 index 00000000..810cc57a --- /dev/null +++ b/src/test/java/TableDtoTest.java @@ -0,0 +1,54 @@ +import domain.Table; +import domain.TableList; +import domain.TableStatus; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + +class TableDtoTest { + TableList tableList = new TableList(); + TableStatus tableStatus = new TableStatus(tableList); + List
tables = tableList.getTables(); + Table table = tables.get(0); + + @Test + @DisplayName("초기화된 테이블들이 저장되는지 확인한다.") + void saveInitTables(){ + List
tables = tableList.getTables(); + + List tableNumbersToCheck = List.of(1,2,3,5,6,8); + for (int i = 0; i < tableNumbersToCheck.size(); i++){ + Table table = tables.get(i); + assertThat(table.getNumber()).isEqualTo(tableNumbersToCheck.get(i)); + } + } + + @Test + @DisplayName("테이블 번호와 일치하는 테이블을 반환한다.") + void getTableByTableId(){ + Table table = tableList.getTable(1); + assertThat(table.getNumber()).isEqualTo(1); + } + + @Test + @DisplayName("1번 테이블이 결제 되었을 때 세팅이 되는지 확인한다.") + void paymentTableSetting(){ + tableStatus.changeTablePaymentStatus(table); + assertThat(tableStatus.toString()).contains("┏ - ┓ ┏ - ┓ ┏ - ┓ ┏ - ┓ ┏ - ┓ ┏ - ┓ \n" + + "| 1 | | 2 | | 3 | | 5 | | 6 | | 8 | \n" + + "┗ - ┛ ┗ - ┛ ┗ - ┛ ┗ - ┛ ┗ - ┛ ┗ - ┛ "); + } + + @Test + @DisplayName("1번 테이블이 주문 되었을 때 세팅이 되는지 확인한다.") + void orderTableSetting(){ + tableStatus.changeTableOrderStatus(table); + assertThat(tableStatus.toString()).contains("┏ - ┓ ┏ - ┓ ┏ - ┓ ┏ - ┓ ┏ - ┓ ┏ - ┓ \n" + + "| 1 | | 2 | | 3 | | 5 | | 6 | | 8 | \n" + + "┗ # ┛ ┗ - ┛ ┗ - ┛ ┗ - ┛ ┗ - ┛ ┗ - ┛ "); + } +} + diff --git a/src/test/java/empty.txt b/src/test/java/empty.txt deleted file mode 100644 index e69de29b..00000000