diff --git a/README.md b/README.md index c31ca54c..ee01d0fd 100644 --- a/README.md +++ b/README.md @@ -1 +1,69 @@ -# java-chicken-2019 \ No newline at end of file +# ๐Ÿš€ ๋ฏธ์…˜ - ์น˜ํ‚จ์ง‘ POS + +์น˜ํ‚จ์ง‘ ์‚ฌ์žฅ๋‹˜์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํฌ์Šค(POS) ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•œ๋‹ค. +์ฃผ๋ฌธ ๋“ฑ๋ก, ๊ฒฐ์ œํ•˜๊ธฐ, ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„๋‹ค. + +# ๐Ÿ“ˆ ๊ธฐ๋Šฅ ๋ชฉ๋ก + +## ๊ตฌํ˜„ ๊ธฐ๋Šฅ ๋ชฉ๋ก + +### โœ… ์ž…๋ ฅ + +- [x] ๋ฉ”์ธํ™”๋ฉด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ž…๋ ฅ(1 - ์ฃผ๋ฌธ๋“ฑ๋ก 2 - ๊ฒฐ์ œํ•˜๊ธฐ 3 - ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ) +- [x] ํ…Œ์ด๋ธ” ์ž…๋ ฅ +- [x] ์ฃผ๋ฌธํ•  ๋ฉ”๋‰ด ์ž…๋ ฅ +- [x] ๋ฉ”๋‰ด์˜ ์ˆ˜๋Ÿ‰ ์ž…๋ ฅ +- [x] ๊ฒฐ์ œ ๋ฐฉ์‹ ์ž…๋ ฅ(์‹ ์šฉ ์นด๋“œ๋Š” 1๋ฒˆ, ํ˜„๊ธˆ์€ 2๋ฒˆ) + +### โœ… ์ฃผ๋ฌธ๋“ฑ๋ก ๊ธฐ๋Šฅ + +- [x] ํ…Œ์ด๋ธ” ์„ ํƒ + - [x] [์˜ˆ์™ธ] ํ…Œ์ด๋ธ” ๋ ˆํฌ ์•ˆ ์ˆซ์ž์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ + - [x] ์ฃผ๋ฌธ๋ฉ”๋‰ด ๋ฐ›๊ธฐ + - [x] [์˜ˆ์™ธ] ๋ฉ”๋‰ด ๋ ˆํฌ ์ˆซ์ž ์ค‘์— ์—†๋Š” ๊ฒฝ์šฐ + - [x] ๋ฉ”๋‰ด ์ˆ˜๋Ÿ‰ ๋ฐ›๊ธฐ + - [x] [์˜ˆ์™ธ] 0 ์ดํ•˜ ์ˆซ์ž์ธ ๊ฒฝ์šฐ + - [x] [์˜ˆ์™ธ] 100 ์ด์ƒ ์ˆซ์ž์ธ ๊ฒฝ์šฐ + - [x] ์„ ํƒ๋œ ํ…Œ์ด๋ธ”์ด ๋น„์—ˆ์„ ๊ฒฝ์šฐ : ์œ ์ € ์ƒ์„ฑ, ๋ฉ”๋‰ด ์ •๋ณด ๋„ฃ๊ธฐ + - [x] ์„ ํƒ๋œ ํ…Œ์ด๋ธ”์ด ๋น„์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ : ํ•ด๋‹น์œ ์ € ๋ฉ”๋‰ด ์ •๋ณด ์ถ”๊ฐ€ + +### โœ… ๊ฒฐ์ œํ•˜๊ธฐ ๊ธฐ๋Šฅ + +- [x] ํ…Œ์ด๋ธ” ์„ ํƒ + - [x] [์˜ˆ์™ธ] ์„ ํƒ๋œ ํ…Œ์ด๋ธ”์ด ์ฐจ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ + - [x] ๊ธˆ์•ก๊ณ„์‚ฐ + - [x] ๋ฉ”๋‰ด๋งˆ๋‹ค ์ˆ˜๋Ÿ‰ 10๊ฐœ ๋‹จ์œ„๋งˆ๋‹ค ๋งŒ์› ํ• ์ธ + - [x] ๊ฒฐ์ œ๋ฐฉ์‹ ์ €์žฅ + - [x] [์˜ˆ์™ธ] ํ•ด๋‹น ์ˆซ์ž์ค‘์— ์—†๋Š” ๊ฒฝ์šฐ + - [x] ํ˜„๊ธˆ๊ฒฐ์ œ 5% ํ• ์ธ +- [x] ์ตœ์ข… ๊ฒฐ์ œ๊ธˆ์•ก ์ถœ๋ ฅ +- [x] ํ•ด๋‹น ํ…Œ์ด๋ธ” ์œ ์ € ์ œ๊ฑฐ + +### โœ… ์ถœ๋ ฅ + +- [x] ๋ฉ”์ธํ™”๋ฉด ์ถœ๋ ฅ +- [x] ํ…Œ์ด๋ธ”๋ชฉ๋ก ์ถœ๋ ฅ +- [x] ๋ฉ”๋‰ด ์ถœ๋ ฅ +- [x] ๊ฒฐ์ œ๋ฐฉ์‹ ์ถœ๋ ฅ + +### โœ… ๊ณผ์ • + +- [x] ๋ฐ˜๋ณต + - [x] ๋ฉ”์ธํ™”๋ฉด ์ž…๋ ฅ ๋ฐ›๊ธฐ + - [x] [์˜ˆ์™ธ] ํ•ด๋‹น ์ˆซ์ž ์ค‘์— ์—†๋Š” ๊ฒฝ์šฐ + - [x] ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ์ž…๋ ฅ ์‹œ ์ข…๋ฃŒ + - [x] ์ด์™ธ : ์ฃผ๋ฌธ๋“ฑ๋ก/๊ฒฐ์ œํ•˜๊ธฐ ์ˆ˜ํ–‰ + +--- + +## ๐Ÿ”๊ตฌํ˜„ ๋กœ์ง + +- ### Main diagram + + +- ### Util diagram + + +- ### View diagram + +--- \ No newline at end of file diff --git a/src/main/java/Application.java b/src/main/java/Application.java index ea0d34fd..60d648a2 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,21 +1,7 @@ -import domain.Menu; -import domain.MenuRepository; -import domain.Table; -import domain.TableRepository; -import view.InputView; -import view.OutputView; - -import java.util.List; +import controller.SystemController; 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) { + new SystemController(); + } } diff --git a/src/main/java/controller/SystemController.java b/src/main/java/controller/SystemController.java new file mode 100644 index 00000000..fc31a04f --- /dev/null +++ b/src/main/java/controller/SystemController.java @@ -0,0 +1,32 @@ +package controller; + +import controller.run.OrderController; +import controller.run.PaymentController; +import controller.view.InputController; +import domain.repository.TableRepository; +import view.OutputView; + +public class SystemController { + public static final int ORDER_NUM = 1; + public static final int PAY_NUM = 2; + public static final int QUIT_NUM = 3; + + public SystemController() { + run(); + } + + private void run() { + OutputView.printMainList(); + int mainNumber = InputController.getMainNumber(); + if (mainNumber == ORDER_NUM) { + new OrderController().run(); + } + if (mainNumber == PAY_NUM) { + new PaymentController().run(); + } + if (mainNumber == QUIT_NUM) { + return; + } + run(); + } +} diff --git a/src/main/java/controller/run/CalculateController.java b/src/main/java/controller/run/CalculateController.java new file mode 100644 index 00000000..7f0ec738 --- /dev/null +++ b/src/main/java/controller/run/CalculateController.java @@ -0,0 +1,15 @@ +package controller.run; + +import domain.repository.TableRepository; + +public class CalculateController { + public static final double DISCOUNT_RATE = 0.95; + + public static int getDiscountPay(int tableNum) { + return TableRepository.getUser(tableNum).getNoDiscountPay(); + } + + public static int getCashPay(int tableNum) { + return (int)(getDiscountPay(tableNum) * DISCOUNT_RATE); + } +} diff --git a/src/main/java/controller/run/OrderController.java b/src/main/java/controller/run/OrderController.java new file mode 100644 index 00000000..fd5ced32 --- /dev/null +++ b/src/main/java/controller/run/OrderController.java @@ -0,0 +1,40 @@ +package controller.run; + +import controller.view.InputController; +import domain.User; +import domain.repository.MenuRepository; +import domain.repository.TableRepository; +import view.OutputView; + +public class OrderController { + public void run() { + try { + setTable(getTableNumber(), getMenuNumber(), getMenuCount()); + } catch (IllegalArgumentException e) { + OutputView.printError(e.getMessage()); + run(); + } + } + + private void setTable(int tableNumber, int menuNumber, int menuCount) { + if (TableRepository.isUserEmpty(tableNumber)) { + TableRepository.initiateTableUser(tableNumber, new User(menuNumber, menuCount)); + return; + } + TableRepository.getUser(tableNumber).addMenu(menuNumber, menuCount); + } + + private int getTableNumber() { + OutputView.printTables(TableRepository.tables()); + return InputController.getTableNumber(); + } + + private int getMenuNumber() { + OutputView.printMenus(MenuRepository.menus()); + return InputController.getMenuNumber(); + } + + private int getMenuCount() { + return InputController.getMenuCount(); + } +} diff --git a/src/main/java/controller/run/PaymentController.java b/src/main/java/controller/run/PaymentController.java new file mode 100644 index 00000000..4dd75b2b --- /dev/null +++ b/src/main/java/controller/run/PaymentController.java @@ -0,0 +1,35 @@ +package controller.run; + +import java.util.Arrays; + +import controller.view.InputController; +import domain.repository.TableRepository; +import utils.Constants; +import view.OutputView; + +public class PaymentController { + public void run() { + if (Arrays.stream(TableRepository.TABLE_NUMS).allMatch(TableRepository::isUserEmpty)) { + OutputView.printError(Constants.ERROR_NO_USER); + return; + } + int tableNumber = getPayTableNumber(); + OutputView.printTableMenus(tableNumber); + printPay(tableNumber, InputController.getPayNumber()); + TableRepository.deleteTableState(tableNumber); + } + + private int getPayTableNumber() { + OutputView.printTables(TableRepository.tables()); + return InputController.getPayTableNumber(); + } + + private void printPay(int tableNumber, int payNumber) { + if (payNumber == Constants.PAY_CARD) { + OutputView.printPayMoney(CalculateController.getDiscountPay(tableNumber)); + } + if (payNumber == Constants.PAY_CASH) { + OutputView.printPayMoney(CalculateController.getCashPay(tableNumber)); + } + } +} diff --git a/src/main/java/controller/view/InputController.java b/src/main/java/controller/view/InputController.java new file mode 100644 index 00000000..8a5042de --- /dev/null +++ b/src/main/java/controller/view/InputController.java @@ -0,0 +1,79 @@ +package controller.view; + +import utils.Converter; +import utils.validator.MainNumberValidator; +import utils.validator.MenuCountValidator; +import utils.validator.MenuNumberValidator; +import utils.validator.PayNumberValidator; +import utils.validator.TableNumberValidator; +import utils.validator.TablePayNumberValidator; +import view.InputView; +import view.OutputView; + +public class InputController { + public static int getMainNumber() { + try { + String numString = InputView.inputMainNumber(); + new MainNumberValidator(numString); + return Converter.getInt(numString); + } catch (IllegalArgumentException e) { + OutputView.printError(e.getMessage()); + return getMainNumber(); + } + } + + public static int getPayNumber() { + try { + String numString = InputView.inputPayNumber(); + new PayNumberValidator(numString); + return Converter.getInt(numString); + } catch (IllegalArgumentException e) { + OutputView.printError(e.getMessage()); + return getPayNumber(); + } + } + + public static int getTableNumber() { + try { + String numString = InputView.inputTableNumber(); + new TableNumberValidator(numString); + return Converter.getInt(numString); + } catch (IllegalArgumentException e) { + OutputView.printError(e.getMessage()); + return getTableNumber(); + } + } + + public static int getPayTableNumber() { + try { + String numString = InputView.inputTableNumber(); + new TablePayNumberValidator(numString); + return Converter.getInt(numString); + } catch (IllegalArgumentException e) { + OutputView.printError(e.getMessage()); + return getPayTableNumber(); + } + } + + public static int getMenuNumber() { + try { + String numString = InputView.inputMenuNumber(); + new MenuNumberValidator(numString); + return Converter.getInt(numString); + } catch (IllegalArgumentException e) { + OutputView.printError(e.getMessage()); + return getMenuNumber(); + } + } + + public static int getMenuCount() { + try { + String numString = InputView.inputMenuCountNumber(); + new MenuCountValidator(numString); + return Converter.getInt(numString); + } catch (IllegalArgumentException e) { + OutputView.printError(e.getMessage()); + return getMenuCount(); + } + } +} diff --git a/src/main/java/domain/Category.java b/src/main/java/domain/Category.java index 2e2c07ae..7327472b 100644 --- a/src/main/java/domain/Category.java +++ b/src/main/java/domain/Category.java @@ -1,17 +1,17 @@ package domain; public enum Category { - CHICKEN("์น˜ํ‚จ"), - BEVERAGE("์Œ๋ฃŒ"); + CHICKEN("์น˜ํ‚จ"), + BEVERAGE("์Œ๋ฃŒ"); - private final String name; + private final String name; - Category(final String name) { - this.name = name; - } + Category(final String name) { + this.name = name; + } - @Override - public String toString() { - return "[" + name + "]"; - } + @Override + public String toString() { + return "[" + name + "]"; + } } diff --git a/src/main/java/domain/Menu.java b/src/main/java/domain/Menu.java index 9f5a078e..2146507a 100644 --- a/src/main/java/domain/Menu.java +++ b/src/main/java/domain/Menu.java @@ -1,20 +1,36 @@ package domain; public class Menu { - private final int number; - private final String name; - private final Category category; - private final int price; + 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; - } + 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 + "์›"; - } + public int getNumber() { + return number; + } + + public int getPrice() { + return price; + } + + public String getName() { + return name; + } + + public Category getCategory() { + return category; + } + + @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/MenuState.java b/src/main/java/domain/MenuState.java new file mode 100644 index 00000000..cce04fbc --- /dev/null +++ b/src/main/java/domain/MenuState.java @@ -0,0 +1,28 @@ +package domain; + +import utils.validator.MenuCountValidator; + +public class MenuState { + public Menu menu; + private int count; + + public MenuState(Menu menu, int count) { + this.menu = menu; + addCount(count); + this.count = count; + } + + public int getCount() { + return count; + } + + public void addCount(int count) { + new MenuCountValidator(this.count + count); + this.count += count; + } + + @Override + public String toString() { + return menu.getName() + " " + count + " " + menu.getPrice() * count; + } +} diff --git a/src/main/java/domain/Table.java b/src/main/java/domain/Table.java index 500c517e..1fa4dfbe 100644 --- a/src/main/java/domain/Table.java +++ b/src/main/java/domain/Table.java @@ -1,14 +1,18 @@ package domain; public class Table { - private final int number; + private final int number; - public Table(final int number) { - this.number = number; - } + public Table(final int number) { + this.number = number; + } - @Override - public String toString() { - return Integer.toString(number); - } + public int getNumber() { + return number; + } + + @Override + public String toString() { + return Integer.toString(number); + } } 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/User.java b/src/main/java/domain/User.java new file mode 100644 index 00000000..1bc62f1c --- /dev/null +++ b/src/main/java/domain/User.java @@ -0,0 +1,43 @@ +package domain; + +import java.util.ArrayList; + +import domain.repository.MenuRepository; +import utils.Constants; + +public class User { + private final ArrayList menus = new ArrayList<>(); + + public User(int menuNum, int menuCount) { + this.menus.add(new MenuState(MenuRepository.getMenuByNum(menuNum), menuCount)); + } + + public void addMenu(int menuNum, int menuCount) { + if (menus.stream().noneMatch(menuState -> menuState.menu.getNumber() == menuNum)) { + menus.add(new MenuState(MenuRepository.getMenuByNum(menuNum), menuCount)); + return; + } + MenuState state = menus.stream() + .filter(menuState -> menuState.menu.getNumber() == menuNum) + .findFirst() + .orElse(null); + assert state != null; + state.addCount(menuCount); + } + + public String[] getMenus() { + return menus.stream().map(MenuState::toString).toArray(String[]::new); + } + + public int getNoDiscountPay() { + return menus.stream() + .filter(menuState -> menuState.menu.getCategory().equals(Category.CHICKEN)) + .mapToInt(menuState -> menuState.menu.getPrice() * menuState.getCount() + - (menuState.getCount() / Constants.DIVIDER) * Constants.DISCOUNT_MONEY_UNIT) + .sum() + + menus.stream() + .filter(menuState -> menuState.menu.getCategory().equals(Category.BEVERAGE)) + .mapToInt(menuState -> menuState.menu.getPrice() * menuState.getCount()) + .sum(); + } +} diff --git a/src/main/java/domain/repository/MenuRepository.java b/src/main/java/domain/repository/MenuRepository.java new file mode 100644 index 00000000..c6cf52d2 --- /dev/null +++ b/src/main/java/domain/repository/MenuRepository.java @@ -0,0 +1,36 @@ +package domain.repository; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import domain.Category; +import domain.Menu; + +public class MenuRepository { + private static final List menus = new ArrayList<>(); + public static final String NO_THIS_MENU = "ํ•ด๋‹น ์ˆซ์ž์˜ ๋ฉ”๋‰ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."; + + 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); + } + + public static Menu getMenuByNum(int num) { + return menus.stream().filter(menu -> menu.getNumber() == num) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(NO_THIS_MENU)); + } + + public static final int[] MENU_NUMS = menus.stream().mapToInt(Menu::getNumber).toArray(); +} diff --git a/src/main/java/domain/repository/TableRepository.java b/src/main/java/domain/repository/TableRepository.java new file mode 100644 index 00000000..53f4f5b5 --- /dev/null +++ b/src/main/java/domain/repository/TableRepository.java @@ -0,0 +1,46 @@ +package domain.repository; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; + +import domain.Table; +import domain.User; + +public class TableRepository { + private static final List
tables = new ArrayList<>(); + public static final LinkedHashMap tableStates = new LinkedHashMap<>(); + + 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 final int[] TABLE_NUMS = tables.stream().mapToInt(Table::getNumber).toArray(); + + public static List
tables() { + return Collections.unmodifiableList(tables); + } + + public static boolean isUserEmpty(int tableNum) { + return !tableStates.containsKey(tableNum); + } + + public static void initiateTableUser(int tableNum, User user) { + tableStates.put(tableNum, user); + } + + public static void deleteTableState(int tableNum) { + tableStates.remove(tableNum); + } + + public static User getUser(int tableNum) { + return tableStates.get(tableNum); + } +} + diff --git a/src/main/java/utils/Constants.java b/src/main/java/utils/Constants.java new file mode 100644 index 00000000..5e49b910 --- /dev/null +++ b/src/main/java/utils/Constants.java @@ -0,0 +1,30 @@ +package utils; + +import java.util.Arrays; +import java.util.regex.Pattern; + +import domain.repository.MenuRepository; +import domain.repository.TableRepository; + +public class Constants { + // ์ •๊ทœ์‹ + public static final Pattern PATTERN_MAIN_NUM = Pattern.compile("^[123]$"); + public static final Pattern PATTERN_COUNT_NUM = Pattern.compile("^[1-9][0-9]?$"); + public static final Pattern PATTERN_PAY_NUM = Pattern.compile("^[12]$"); + + // ์˜ค๋ฅ˜๋ฉ”์„ธ์ง€ ๊ด€๋ จ ์ƒ์ˆ˜ + public static final String ERROR_MAIN_NUMBER_PATTERN = "์ˆซ์ž 1,2,3 ์ค‘ ํ•˜๋‚˜๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค."; + public static final String ERROR_TABLE_NUMBER_PATTERN = "์ˆซ์ž" + + Arrays.toString(TableRepository.TABLE_NUMS) + " ์ค‘ ํ•˜๋‚˜๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค."; + public static final String ERROR_MENU_NUMBER_PATTERN = + Arrays.toString(MenuRepository.MENU_NUMS) + " ์ค‘ ํ•˜๋‚˜๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค."; + public static final String ERROR_MENU_COUNT_PATTERN = "ํ•œ ๋ฉ”๋‰ด ๋‹น 99๊ฐœ ์ด์ƒ ์ฃผ๋ฌธํ•  ์ˆ˜ ์—†๋‹ค."; + public static final String TABLE_IS_NOT_IN = "์œ ์ €๊ฐ€ ์—†๋Š” ํ…Œ์ด๋ธ”์„ ์„ ํƒํ–ˆ๋‹ค."; + public static final String ERROR_PAY_NUMBER_PATTERN = "์ˆซ์ž 1,2 ์ค‘ ํ•˜๋‚˜๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค."; + + public static final int DIVIDER = 10; + public static final int DISCOUNT_MONEY_UNIT = 10000; + public static final int PAY_CARD = 1; + public static final int PAY_CASH = 2; + public static final String ERROR_NO_USER = "๊ฒฐ์ œ ๊ฐ€๋Šฅํ•œ ํ…Œ์ด๋ธ”์ด ์—†๋‹ค."; +} diff --git a/src/main/java/utils/Converter.java b/src/main/java/utils/Converter.java new file mode 100644 index 00000000..dab7ce26 --- /dev/null +++ b/src/main/java/utils/Converter.java @@ -0,0 +1,13 @@ +package utils; + +import java.util.ArrayList; + +public class Converter { + public static int getInt(String moneyString) { + return Integer.parseInt(moneyString); + } + + public static String getString(int count) { + return Integer.toString(count); + } +} diff --git a/src/main/java/utils/validator/MainNumberValidator.java b/src/main/java/utils/validator/MainNumberValidator.java new file mode 100644 index 00000000..bcb950cb --- /dev/null +++ b/src/main/java/utils/validator/MainNumberValidator.java @@ -0,0 +1,22 @@ +package utils.validator; + +import utils.Constants; + +public class MainNumberValidator { + private final String numberString; + + public MainNumberValidator(String numberString) { + this.numberString = numberString; + validate(); + } + + private void validate() { + isRightString(); + } + + private void isRightString() { + if (!Constants.PATTERN_MAIN_NUM.matcher(numberString).matches()) { + throw new IllegalArgumentException(Constants.ERROR_MAIN_NUMBER_PATTERN); + } + } +} diff --git a/src/main/java/utils/validator/MenuCountValidator.java b/src/main/java/utils/validator/MenuCountValidator.java new file mode 100644 index 00000000..c847c258 --- /dev/null +++ b/src/main/java/utils/validator/MenuCountValidator.java @@ -0,0 +1,28 @@ +package utils.validator; + +import utils.Constants; +import utils.Converter; + +public class MenuCountValidator { + private final String countString; + + public MenuCountValidator(String countString) { + this.countString = countString; + validate(); + } + + public MenuCountValidator(int count) { + this.countString = Converter.getString(count); + validate(); + } + + private void validate() { + isRightString(); + } + + private void isRightString() { + if (!Constants.PATTERN_COUNT_NUM.matcher(countString).matches()) { + throw new IllegalArgumentException(Constants.ERROR_MENU_COUNT_PATTERN); + } + } +} diff --git a/src/main/java/utils/validator/MenuNumberValidator.java b/src/main/java/utils/validator/MenuNumberValidator.java new file mode 100644 index 00000000..ec7a4d14 --- /dev/null +++ b/src/main/java/utils/validator/MenuNumberValidator.java @@ -0,0 +1,26 @@ +package utils.validator; + +import java.util.Arrays; + +import domain.repository.MenuRepository; +import utils.Constants; +import utils.Converter; + +public class MenuNumberValidator { + private final String menuNumber; + + public MenuNumberValidator(String menuNumber) { + this.menuNumber = menuNumber; + validate(); + } + + private void validate() { + isRightString(); + } + + private void isRightString() { + if (Arrays.stream(MenuRepository.MENU_NUMS).noneMatch(num -> num == Converter.getInt(menuNumber))) { + throw new IllegalArgumentException(Constants.ERROR_MENU_NUMBER_PATTERN); + } + } +} diff --git a/src/main/java/utils/validator/PayNumberValidator.java b/src/main/java/utils/validator/PayNumberValidator.java new file mode 100644 index 00000000..efa09702 --- /dev/null +++ b/src/main/java/utils/validator/PayNumberValidator.java @@ -0,0 +1,22 @@ +package utils.validator; + +import utils.Constants; + +public class PayNumberValidator { + private final String numberString; + + public PayNumberValidator(String numberString) { + this.numberString = numberString; + validate(); + } + + private void validate() { + isRightString(); + } + + private void isRightString() { + if (!Constants.PATTERN_PAY_NUM.matcher(numberString).matches()) { + throw new IllegalArgumentException(Constants.ERROR_PAY_NUMBER_PATTERN); + } + } +} diff --git a/src/main/java/utils/validator/TableNumberValidator.java b/src/main/java/utils/validator/TableNumberValidator.java new file mode 100644 index 00000000..6756323b --- /dev/null +++ b/src/main/java/utils/validator/TableNumberValidator.java @@ -0,0 +1,26 @@ +package utils.validator; + +import java.util.Arrays; + +import domain.repository.TableRepository; +import utils.Constants; +import utils.Converter; + +public class TableNumberValidator { + protected final String tableNumber; + + public TableNumberValidator(String tableNumber) { + this.tableNumber = tableNumber; + validate(); + } + + protected void validate() { + isRightString(); + } + + protected void isRightString() { + if (Arrays.stream(TableRepository.TABLE_NUMS).noneMatch(num -> num == Converter.getInt(tableNumber))) { + throw new IllegalArgumentException(Constants.ERROR_TABLE_NUMBER_PATTERN); + } + } +} diff --git a/src/main/java/utils/validator/TablePayNumberValidator.java b/src/main/java/utils/validator/TablePayNumberValidator.java new file mode 100644 index 00000000..1de95091 --- /dev/null +++ b/src/main/java/utils/validator/TablePayNumberValidator.java @@ -0,0 +1,23 @@ +package utils.validator; + +import domain.repository.TableRepository; +import utils.Constants; +import utils.Converter; + +public class TablePayNumberValidator extends TableNumberValidator { + public TablePayNumberValidator(String tableNumberString) { + super(tableNumberString); + } + + @Override + protected void validate() { + isRightString(); + isIn(); + } + + protected void isIn() { + if (TableRepository.isUserEmpty(Converter.getInt(tableNumber))) { + throw new IllegalArgumentException(Constants.TABLE_IS_NOT_IN); + } + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index d5db24e2..2001f9df 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -3,10 +3,46 @@ import java.util.Scanner; public class InputView { - private static final Scanner scanner = new Scanner(System.in); + private static final Scanner scanner = new Scanner(System.in); + public static final String PRINT_MAIN = "## ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์„ ํƒํ•˜์„ธ์š”."; + public static final String PRINT_TABLE = "## ํ…Œ์ด๋ธ”์„ ์„ ํƒํ•˜์„ธ์š”."; + public static final String PRINT_MENU = "## ๋“ฑ๋กํ•  ๋ฉ”๋‰ด๋ฅผ ์„ ํƒํ•˜์„ธ์š”."; + public static final String PRINT_MENU_COUNT = "## ๋ฉ”๋‰ด์˜ ์ˆ˜๋Ÿ‰์„ ์ž…๋ ฅํ•˜์„ธ์š”."; + public static final String PRINT_PAY = "## 1๋ฒˆ ํ…Œ์ด๋ธ”์˜ ๊ฒฐ์ œ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.\n" + + "## ์‹ ์šฉ ์นด๋“œ๋Š” 1๋ฒˆ, ํ˜„๊ธˆ์€ 2๋ฒˆ"; - public static int inputTableNumber() { - System.out.println("## ์ฃผ๋ฌธํ•  ํ…Œ์ด๋ธ”์„ ์„ ํƒํ•˜์„ธ์š”."); - return scanner.nextInt(); - } + public static String inputMainNumber() { + System.out.println(PRINT_MAIN); + String answer = scanner.nextLine(); + OutputView.printBreak(); + return answer; + } + + public static String inputTableNumber() { + System.out.println(PRINT_TABLE); + String answer = scanner.nextLine(); + OutputView.printBreak(); + return answer; + } + + public static String inputMenuNumber() { + System.out.println(PRINT_MENU); + String answer = scanner.nextLine(); + OutputView.printBreak(); + return answer; + } + + public static String inputMenuCountNumber() { + System.out.println(PRINT_MENU_COUNT); + String answer = scanner.nextLine(); + OutputView.printBreak(); + return answer; + } + + public static String inputPayNumber() { + System.out.println(PRINT_PAY); + String answer = scanner.nextLine(); + OutputView.printBreak(); + return answer; + } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index edb25cc4..cbe32f0c 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -2,39 +2,77 @@ import domain.Menu; import domain.Table; +import domain.repository.TableRepository; import java.util.List; 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 static void printMenus(final List menus) { - for (final Menu menu : menus) { - System.out.println(menu); - } - } - - private static void printLine(final String line, final int count) { - for (int index = 0; index < count; index++) { - System.out.print(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(); - } + private static final String TOP_LINE = "โ”Œ โ”€ โ”"; + private static final String TABLE_FORMAT = "| %s |"; + private static final String BOTTOM_LINE = "โ”” โ”€ โ”˜"; + public static final String ERROR = "[ERROR] "; + public static final String PAY = "## ์ตœ์ข… ๊ฒฐ์ œํ•  ๊ธˆ์•ก\n%d์›\n"; + public static final String TABLE_MENUS = "## ์ฃผ๋ฌธ ๋‚ด์—ญ\n" + + "๋ฉ”๋‰ด ์ˆ˜๋Ÿ‰ ๊ธˆ์•ก"; + public static final String MAIN_LIST = "## ๋ฉ”์ธํ™”๋ฉด\n" + + "1 - ์ฃผ๋ฌธ๋“ฑ๋ก\n" + + "2 - ๊ฒฐ์ œํ•˜๊ธฐ\n" + + "3 - ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ\n"; + public static final String TABLE_LIST = "## ํ…Œ์ด๋ธ” ๋ชฉ๋ก"; + + public static void printMainList() { + System.out.println(MAIN_LIST); + } + + public static void printTables(final List
tables) { + System.out.println(TABLE_LIST); + final int size = tables.size(); + printLine(TOP_LINE, size); + printTableNumbers(tables); + printLine(BOTTOM_LINE, size); + printBreak(); + } + + public static void printMenus(final List menus) { + for (final Menu menu : menus) { + System.out.println(menu); + } + printBreak(); + } + + public static void printError(String message) { + System.out.println(ERROR + message); + printBreak(); + } + + private static void printLine(final String line, final int count) { + for (int index = 0; index < count; index++) { + System.out.print(line); + } + printBreak(); + } + + private static void printTableNumbers(final List
tables) { + for (final Table table : tables) { + System.out.printf(TABLE_FORMAT, table); + } + printBreak(); + } + + public static void printPayMoney(int payMoney) { + System.out.printf(PAY, payMoney); + printBreak(); + } + + public static void printBreak() { + System.out.println(); + } + + public static void printTableMenus(int tableNumber) { + System.out.println(TABLE_MENUS); + for (String menu : TableRepository.getUser(tableNumber).getMenus()) { + System.out.println(menu); + } + printBreak(); + } } diff --git a/src/test/java/mytest/MainTest.java b/src/test/java/mytest/MainTest.java new file mode 100644 index 00000000..85d4fb00 --- /dev/null +++ b/src/test/java/mytest/MainTest.java @@ -0,0 +1,34 @@ +package mytest; + +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; + +// ์ œ๊ณต๋œ ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ฐธ์กฐ +// import camp.nextstep.edu.missionutils.test.NsTest; +// import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest; +// import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest; + +public class MainTest { + // ์ œ๊ณต๋œ ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ฐธ์กฐ + private static final String ERROR_MESSAGE = "[ERROR]"; + + // @Test + // void ์žํŒ๊ธฐ_๋ณด์œ ๋™์ „_์ถœ๋ ฅ() { + // assertRandomNumberInListTest( + // () -> { + // runException("450"); + // assertThat(output()).contains( + // "์žํŒ๊ธฐ๊ฐ€ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.", + // "์žํŒ๊ธฐ๊ฐ€ ๋ณด์œ ํ•œ ๋™์ „", + // "500์› - 0๊ฐœ", "100์› - 4๊ฐœ", "50์› - 1๊ฐœ", "10์› - 0๊ฐœ" + // ); + // }, + // 100, 100, 100, 100, 50 + // ); + // } + // + // @Override + // public void runMain() { + // Application.main(new String[] {}); + // } +} \ No newline at end of file diff --git a/src/test/java/mytest/UnitTest.java b/src/test/java/mytest/UnitTest.java new file mode 100644 index 00000000..a6f3f721 --- /dev/null +++ b/src/test/java/mytest/UnitTest.java @@ -0,0 +1,40 @@ +package mytest; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Test; + + +public class UnitTest { + private static final String ERROR_MESSAGE = "[ERROR]"; + + @Test + void noError() { + String hello = "HELLO WORLD!"; + assertThat(hello) + .doesNotContain( + ERROR_MESSAGE + ) + ; + } + + @Test + void error() { + String hello = "[ERROR] HELLO WORLD!"; + assertThat(hello) + .contains( + ERROR_MESSAGE + ) + ; + } + + @Test + void num() { + int num = 1; + assertThat(num) + .isEqualTo(1) + .isOdd() + .isNotSameAs(0) + ; + } +}