From 36e7e9bef86b6e03f89960ba16e7bfb45871aebe Mon Sep 17 00:00:00 2001 From: kjaehyeon Date: Thu, 8 Dec 2022 18:54:21 +0900 Subject: [PATCH 1/7] Create Main & getInput method --- src/main/java/Main.java | 47 ++++++++++++++++++++++++++++++++++++++ src/main/java/Message.java | 10 ++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/main/java/Main.java create mode 100644 src/main/java/Message.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..bbc9738e --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,47 @@ +import java.util.Random; +import java.util.Scanner; + +public class Main { + private static String answer; + private static boolean isFinish; + private static Scanner scanner; + public static void main(String[] args) { + String input; + + setUp(); + + while(!isFinish){ + input = getInput(); + } + } + private static void setUp(){ + Random random = new Random(); + isFinish = false; + answer = String.valueOf(random.nextInt()%1000); + scanner = new Scanner(System.in); + } + private static String getInput(){ + String input; + do{ + System.out.print(Message.INPUT_MSG); + input = scanner.nextLine(); + }while(inputCheck(input)); + + return input; + } + private static boolean inputCheck(String input){ + if(input.length() != 3){ + System.out.println(Message.INVALID_INPUT_WARNING); + return true; + } + + try{ + Integer.parseInt(input); + }catch (NumberFormatException numberFormatException){ + System.out.println(Message.INVALID_INPUT_WARNING); + return true; + } + + return false; + }; +} diff --git a/src/main/java/Message.java b/src/main/java/Message.java new file mode 100644 index 00000000..5c12b839 --- /dev/null +++ b/src/main/java/Message.java @@ -0,0 +1,10 @@ +public enum Message { + INPUT_MSG("숫자를 입력해주세요 : "), + END_MSG("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."), + INVALID_INPUT_WARNING("잘못된 입력입니다."); + + private String Message; + Message(String message){ + this.Message = message; + } +} From 64723ff0d00e507ec4aa5ffda3a25fd2d8bb6d88 Mon Sep 17 00:00:00 2001 From: jacob-hyeon Date: Wed, 21 Dec 2022 00:27:51 +0900 Subject: [PATCH 2/7] Create InputValidator & ResultEntity --- README.md | 4 ++++ build.gradle | 6 ++++++ src/main/java/InputValidator.java | 22 ++++++++++++++++++++++ src/main/java/Main.java | 23 ++++++----------------- src/main/java/Message.java | 14 +++++++++----- src/main/java/ResultEntity.java | 26 ++++++++++++++++++++++++++ 6 files changed, 73 insertions(+), 22 deletions(-) create mode 100644 src/main/java/InputValidator.java create mode 100644 src/main/java/ResultEntity.java diff --git a/README.md b/README.md index fcf3f057..295fbb93 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,7 @@ ## 과제 제출 과정 * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) + +## 기능 목록 +1. setUp & input 받아서 validation 진행 +2. \ No newline at end of file diff --git a/build.gradle b/build.gradle index d6eb8110..04b69707 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,12 @@ repositories { dependencies { testImplementation 'org.assertj:assertj-core:3.23.1' testImplementation 'org.junit.jupiter:junit-jupiter:5.9.0' + + compileOnly 'org.projectlombok:lombok:1.18.24' + annotationProcessor 'org.projectlombok:lombok:1.18.24' + + testCompileOnly 'org.projectlombok:lombok:1.18.24' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.24' } tasks.named('test') { diff --git a/src/main/java/InputValidator.java b/src/main/java/InputValidator.java new file mode 100644 index 00000000..917da4f1 --- /dev/null +++ b/src/main/java/InputValidator.java @@ -0,0 +1,22 @@ +public class InputValidator { + public boolean validate(String input){ + //input 문자열의 길이 검사 + if(input.length() != 3){ + System.out.println(Message.INVALID_INPUT_WARNING.getMsgStr()); + return false; + } + + //input 문자열에 0이 포함되어 있는지 검사 + if(input.contains("0")) return false; + + //input 문자열이 숫자로만 이루어져 있는지 검사 + try{ + Integer.parseInt(input); + }catch (NumberFormatException numberFormatException){ + System.err.println(Message.INVALID_INPUT_WARNING.getMsgStr()); + return false; + } + + return true; + }; +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java index bbc9738e..6c208672 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -5,6 +5,7 @@ public class Main { private static String answer; private static boolean isFinish; private static Scanner scanner; + private static InputValidator validator; public static void main(String[] args) { String input; @@ -12,6 +13,7 @@ public static void main(String[] args) { while(!isFinish){ input = getInput(); + } } private static void setUp(){ @@ -19,29 +21,16 @@ private static void setUp(){ isFinish = false; answer = String.valueOf(random.nextInt()%1000); scanner = new Scanner(System.in); + validator = new InputValidator(); } private static String getInput(){ String input; do{ - System.out.print(Message.INPUT_MSG); - input = scanner.nextLine(); - }while(inputCheck(input)); + System.out.print(Message.INPUT_MSG.getMsgStr()); + input = scanner.nextLine().trim(); + }while(!validator.validate(input)); return input; } - private static boolean inputCheck(String input){ - if(input.length() != 3){ - System.out.println(Message.INVALID_INPUT_WARNING); - return true; - } - - try{ - Integer.parseInt(input); - }catch (NumberFormatException numberFormatException){ - System.out.println(Message.INVALID_INPUT_WARNING); - return true; - } - return false; - }; } diff --git a/src/main/java/Message.java b/src/main/java/Message.java index 5c12b839..aa137663 100644 --- a/src/main/java/Message.java +++ b/src/main/java/Message.java @@ -1,10 +1,14 @@ +import lombok.Generated; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter public enum Message { INPUT_MSG("숫자를 입력해주세요 : "), - END_MSG("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."), + END_MSG("3개의 숫자를 모두 맞히셨습니다! 게임 종료"), + RESTART_MSG("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"), INVALID_INPUT_WARNING("잘못된 입력입니다."); - private String Message; - Message(String message){ - this.Message = message; - } + private final String msgStr; } diff --git a/src/main/java/ResultEntity.java b/src/main/java/ResultEntity.java new file mode 100644 index 00000000..21d20d74 --- /dev/null +++ b/src/main/java/ResultEntity.java @@ -0,0 +1,26 @@ +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class ResultEntity { + private Integer strike; + private Integer ball; + + public String toString(){ + StringBuilder sb = new StringBuilder(); + if(this.strike > 0) sb.append(this.strike).append(" 스트라이크 "); + if(this.ball > 0) sb.append(this.ball).append(" 볼"); + if(this.strike == 0 && this.ball == 0) sb.append("낫싱"); + + return sb.toString(); + } + + public void addStrike(){ + this.strike++; + } + public void addBall(){ + this.ball++; + } +} From 93ae68848d12d43aa9295699e8dff61d80f02a0e Mon Sep 17 00:00:00 2001 From: jacob-hyeon Date: Wed, 21 Dec 2022 00:47:57 +0900 Subject: [PATCH 3/7] InputValitor -> GameInputScanner & simplify Main class --- src/main/java/GameInputScanner.java | 42 +++++++++++++++++++++++++++++ src/main/java/InputValidator.java | 22 --------------- src/main/java/Main.java | 38 ++++++++++++-------------- 3 files changed, 59 insertions(+), 43 deletions(-) create mode 100644 src/main/java/GameInputScanner.java delete mode 100644 src/main/java/InputValidator.java diff --git a/src/main/java/GameInputScanner.java b/src/main/java/GameInputScanner.java new file mode 100644 index 00000000..df215a6d --- /dev/null +++ b/src/main/java/GameInputScanner.java @@ -0,0 +1,42 @@ +import java.util.Scanner; + +public class GameInputScanner { + public int[] getInput(){ + Scanner scanner = new Scanner(System.in); + String input; + do{ + System.out.print(Message.INPUT_MSG.getMsgStr()); + input = scanner.nextLine().trim(); + }while(validate(input)); + + return strToIntArr(input); + } + private boolean validate(String input){ + //input 문자열의 길이 & 0이 포함되어 있는지 검사 + if(input.length() != 3 || input.contains("0")){ + System.out.println(Message.INVALID_INPUT_WARNING.getMsgStr()); + return false; + } + + //input 문자열이 숫자로만 이루어져 있는지 검사 + try{ + Integer.parseInt(input); + }catch (NumberFormatException numberFormatException){ + System.err.println(Message.INVALID_INPUT_WARNING.getMsgStr()); + return false; + } + + return true; + }; + + private int[] strToIntArr(String input){ + int[] ret = new int[3]; + char[] inputCharArr = input.toCharArray(); + + for(int i = 0; i < 3; i++){ + ret[i] = inputCharArr[i] - '0'; + } + + return ret; + } +} diff --git a/src/main/java/InputValidator.java b/src/main/java/InputValidator.java deleted file mode 100644 index 917da4f1..00000000 --- a/src/main/java/InputValidator.java +++ /dev/null @@ -1,22 +0,0 @@ -public class InputValidator { - public boolean validate(String input){ - //input 문자열의 길이 검사 - if(input.length() != 3){ - System.out.println(Message.INVALID_INPUT_WARNING.getMsgStr()); - return false; - } - - //input 문자열에 0이 포함되어 있는지 검사 - if(input.contains("0")) return false; - - //input 문자열이 숫자로만 이루어져 있는지 검사 - try{ - Integer.parseInt(input); - }catch (NumberFormatException numberFormatException){ - System.err.println(Message.INVALID_INPUT_WARNING.getMsgStr()); - return false; - } - - return true; - }; -} diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 6c208672..315da535 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,36 +1,32 @@ +import java.util.Arrays; import java.util.Random; import java.util.Scanner; public class Main { - private static String answer; + private static int[] answer; + private static int[] input; private static boolean isFinish; - private static Scanner scanner; - private static InputValidator validator; - public static void main(String[] args) { - String input; + private static GameInputScanner gameInputScanner; + public static void main(String[] args) { setUp(); - - while(!isFinish){ - input = getInput(); - - } + startGame(); } private static void setUp(){ Random random = new Random(); isFinish = false; - answer = String.valueOf(random.nextInt()%1000); - scanner = new Scanner(System.in); - validator = new InputValidator(); - } - private static String getInput(){ - String input; - do{ - System.out.print(Message.INPUT_MSG.getMsgStr()); - input = scanner.nextLine().trim(); - }while(!validator.validate(input)); + answer = new int[3]; + gameInputScanner = new GameInputScanner(); - return input; + for(int i = 0; i < 3; i++){ + answer[i] = random.nextInt(9) + 1; + } + } + private static void startGame(){ + while(!isFinish){ + input = gameInputScanner.getInput(); + } } + } From 19df11533c46ab1a2ca07725b41bc6231df7b228 Mon Sep 17 00:00:00 2001 From: jacob-hyeon Date: Wed, 21 Dec 2022 02:09:29 +0900 Subject: [PATCH 4/7] Create GameService(main logic) & simplify Main class --- src/main/java/AnswerEntity.java | 34 +++++++++++++++++++++++++++ src/main/java/GameInputScanner.java | 4 ++-- src/main/java/GameService.java | 36 +++++++++++++++++++++++++++++ src/main/java/Main.java | 15 +++++------- src/main/java/Message.java | 1 - src/main/java/ResultEntity.java | 2 +- 6 files changed, 79 insertions(+), 13 deletions(-) create mode 100644 src/main/java/AnswerEntity.java create mode 100644 src/main/java/GameService.java diff --git a/src/main/java/AnswerEntity.java b/src/main/java/AnswerEntity.java new file mode 100644 index 00000000..ba92c302 --- /dev/null +++ b/src/main/java/AnswerEntity.java @@ -0,0 +1,34 @@ +import java.util.Random; + +public class AnswerEntity { + private int[] answer; + private boolean[] check; + AnswerEntity(){ + this.answer = init(); + } + public int[] init(){ + int[] ret = new int[3]; + Random random = new Random(); + check = new boolean[10]; + + for(int idx = 0; idx < 3; idx++){ + int num = random.nextInt(9) + 1; + if(checkDuplicationAndInsert(ret, num, idx)) idx--; + } + + return ret; + } + private boolean checkDuplicationAndInsert(int[] arr, int num, int idx){ + if(!check[num]){ + arr[idx] = num; + check[num] = true; + return false; + } + return true; + } + + public int[] getAnswer(){ + return this.answer; + } + +} diff --git a/src/main/java/GameInputScanner.java b/src/main/java/GameInputScanner.java index df215a6d..8c857fb9 100644 --- a/src/main/java/GameInputScanner.java +++ b/src/main/java/GameInputScanner.java @@ -4,10 +4,11 @@ public class GameInputScanner { public int[] getInput(){ Scanner scanner = new Scanner(System.in); String input; + do{ System.out.print(Message.INPUT_MSG.getMsgStr()); input = scanner.nextLine().trim(); - }while(validate(input)); + }while(!validate(input)); return strToIntArr(input); } @@ -28,7 +29,6 @@ private boolean validate(String input){ return true; }; - private int[] strToIntArr(String input){ int[] ret = new int[3]; char[] inputCharArr = input.toCharArray(); diff --git a/src/main/java/GameService.java b/src/main/java/GameService.java new file mode 100644 index 00000000..1030efdc --- /dev/null +++ b/src/main/java/GameService.java @@ -0,0 +1,36 @@ +import java.util.Arrays; + +public class GameService { + + public ResultEntity getResult(int[] answer, int[] input){ + ResultEntity result = new ResultEntity(0, 0); + int[] posArr = makePosArr(answer); + + for(int idx = 0; idx < 3; idx++){ + int pos = posArr[input[idx]]; + if(pos == idx) result.addStrike(); + if(pos != idx && pos != -1) result.addBall(); + } + + System.out.println(result); + return result; + } + private int[] makePosArr(int[] answer){ + int[] ret = new int[10]; + Arrays.fill(ret, -1); + + for(int idx = 0; idx < 3; idx++){ + ret[answer[idx]] = idx; + } + + return ret; + } + + public boolean isFinish(ResultEntity result){ + if(result.getStrike() == 3){ + System.out.println(Message.END_MSG.getMsgStr()); + return true; + } + return false; + } +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 315da535..92880380 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,30 +1,27 @@ -import java.util.Arrays; import java.util.Random; -import java.util.Scanner; public class Main { - private static int[] answer; + private static AnswerEntity answer; private static int[] input; private static boolean isFinish; private static GameInputScanner gameInputScanner; + private static GameService gameService; public static void main(String[] args) { setUp(); startGame(); } private static void setUp(){ - Random random = new Random(); isFinish = false; - answer = new int[3]; + answer = new AnswerEntity(); gameInputScanner = new GameInputScanner(); - - for(int i = 0; i < 3; i++){ - answer[i] = random.nextInt(9) + 1; - } + gameService = new GameService(); } private static void startGame(){ while(!isFinish){ input = gameInputScanner.getInput(); + ResultEntity result = gameService.getResult(answer.getAnswer(), input); + isFinish = gameService.isFinish(result); } } diff --git a/src/main/java/Message.java b/src/main/java/Message.java index aa137663..3b2abaf1 100644 --- a/src/main/java/Message.java +++ b/src/main/java/Message.java @@ -1,4 +1,3 @@ -import lombok.Generated; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/ResultEntity.java b/src/main/java/ResultEntity.java index 21d20d74..db13d611 100644 --- a/src/main/java/ResultEntity.java +++ b/src/main/java/ResultEntity.java @@ -7,7 +7,7 @@ public class ResultEntity { private Integer strike; private Integer ball; - + @Override public String toString(){ StringBuilder sb = new StringBuilder(); if(this.strike > 0) sb.append(this.strike).append(" 스트라이크 "); From 322d15b838910d7fb3ebb65c73a937d254d81325 Mon Sep 17 00:00:00 2001 From: jacob-hyeon Date: Wed, 21 Dec 2022 02:27:15 +0900 Subject: [PATCH 5/7] Add restart feature --- src/main/java/GameInputScanner.java | 17 +++++++++++++---- src/main/java/GameService.java | 13 +++++++------ src/main/java/Main.java | 18 ++++++++++++++---- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/main/java/GameInputScanner.java b/src/main/java/GameInputScanner.java index 8c857fb9..86ce761e 100644 --- a/src/main/java/GameInputScanner.java +++ b/src/main/java/GameInputScanner.java @@ -1,18 +1,22 @@ import java.util.Scanner; public class GameInputScanner { - public int[] getInput(){ - Scanner scanner = new Scanner(System.in); + private final Scanner scanner; + + GameInputScanner(){ + this.scanner = new Scanner(System.in); + } + public int[] getGameInput(){ String input; do{ System.out.print(Message.INPUT_MSG.getMsgStr()); input = scanner.nextLine().trim(); - }while(!validate(input)); + }while(!validateGameInput(input)); return strToIntArr(input); } - private boolean validate(String input){ + private boolean validateGameInput(String input){ //input 문자열의 길이 & 0이 포함되어 있는지 검사 if(input.length() != 3 || input.contains("0")){ System.out.println(Message.INVALID_INPUT_WARNING.getMsgStr()); @@ -39,4 +43,9 @@ private int[] strToIntArr(String input){ return ret; } + + public int getRestartInput(){ + int cmd = scanner.nextInt(); + return cmd; + } } diff --git a/src/main/java/GameService.java b/src/main/java/GameService.java index 1030efdc..56ab31d5 100644 --- a/src/main/java/GameService.java +++ b/src/main/java/GameService.java @@ -4,18 +4,19 @@ public class GameService { public ResultEntity getResult(int[] answer, int[] input){ ResultEntity result = new ResultEntity(0, 0); - int[] posArr = makePosArr(answer); + //answer 배열의 각 원소 위치를 저장하는 배열, 없는 원소면 -1 + int[] answerIdxArr = makeAnswerIdxArr(answer); - for(int idx = 0; idx < 3; idx++){ - int pos = posArr[input[idx]]; - if(pos == idx) result.addStrike(); - if(pos != idx && pos != -1) result.addBall(); + for(int inputIdx = 0; inputIdx < 3; inputIdx++){ + int answerIdx = answerIdxArr[input[inputIdx]]; + if(answerIdx == inputIdx) result.addStrike(); + if(answerIdx != inputIdx && answerIdx != -1) result.addBall(); } System.out.println(result); return result; } - private int[] makePosArr(int[] answer){ + private int[] makeAnswerIdxArr(int[] answer){ int[] ret = new int[10]; Arrays.fill(ret, -1); diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 92880380..2876fe66 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,4 +1,4 @@ -import java.util.Random; +import java.util.Scanner; public class Main { private static AnswerEntity answer; @@ -8,8 +8,10 @@ public class Main { private static GameService gameService; public static void main(String[] args) { - setUp(); - startGame(); + do{ + setUp(); + startGame(); + }while(restartOrNot()); } private static void setUp(){ isFinish = false; @@ -19,11 +21,19 @@ private static void setUp(){ } private static void startGame(){ while(!isFinish){ - input = gameInputScanner.getInput(); + input = gameInputScanner.getGameInput(); ResultEntity result = gameService.getResult(answer.getAnswer(), input); isFinish = gameService.isFinish(result); } } + private static boolean restartOrNot(){ + System.out.println(Message.RESTART_MSG.getMsgStr()); + int cmd = gameInputScanner.getRestartInput(); + + if(cmd == 1) return true; + + return false; + } } From 25c3dc1c797875631cd751bbd44ea73990d5a8ba Mon Sep 17 00:00:00 2001 From: jacob-hyeon Date: Wed, 21 Dec 2022 16:11:41 +0900 Subject: [PATCH 6/7] add restart feature & separating validator --- src/main/java/GameInputScanner.java | 32 +++++++--------------- src/main/java/GameInputValidator.java | 39 +++++++++++++++++++++++++++ src/main/java/Main.java | 3 +-- 3 files changed, 50 insertions(+), 24 deletions(-) create mode 100644 src/main/java/GameInputValidator.java diff --git a/src/main/java/GameInputScanner.java b/src/main/java/GameInputScanner.java index 86ce761e..f1d28935 100644 --- a/src/main/java/GameInputScanner.java +++ b/src/main/java/GameInputScanner.java @@ -2,37 +2,21 @@ public class GameInputScanner { private final Scanner scanner; + private final GameInputValidator validator; GameInputScanner(){ this.scanner = new Scanner(System.in); + this.validator = new GameInputValidator(); } public int[] getGameInput(){ String input; - do{ System.out.print(Message.INPUT_MSG.getMsgStr()); input = scanner.nextLine().trim(); - }while(!validateGameInput(input)); + }while(!validator.validateGameInput(input)); return strToIntArr(input); } - private boolean validateGameInput(String input){ - //input 문자열의 길이 & 0이 포함되어 있는지 검사 - if(input.length() != 3 || input.contains("0")){ - System.out.println(Message.INVALID_INPUT_WARNING.getMsgStr()); - return false; - } - - //input 문자열이 숫자로만 이루어져 있는지 검사 - try{ - Integer.parseInt(input); - }catch (NumberFormatException numberFormatException){ - System.err.println(Message.INVALID_INPUT_WARNING.getMsgStr()); - return false; - } - - return true; - }; private int[] strToIntArr(String input){ int[] ret = new int[3]; char[] inputCharArr = input.toCharArray(); @@ -43,9 +27,13 @@ private int[] strToIntArr(String input){ return ret; } - public int getRestartInput(){ - int cmd = scanner.nextInt(); - return cmd; + String input; + do{ + System.out.println(Message.RESTART_MSG.getMsgStr()); + input = scanner.nextLine().trim(); + }while(!validator.validateRestartInput(input)); + + return Integer.parseInt(input); } } diff --git a/src/main/java/GameInputValidator.java b/src/main/java/GameInputValidator.java new file mode 100644 index 00000000..84ea30bd --- /dev/null +++ b/src/main/java/GameInputValidator.java @@ -0,0 +1,39 @@ +public class GameInputValidator { + public boolean validateGameInput(String input){ + //input 문자열의 길이 & 0이 포함되어 있는지 검사 + if(input.length() != 3 || input.contains("0")){ + System.out.println(Message.INVALID_INPUT_WARNING.getMsgStr()); + return false; + } + + return isNumber(input); + }; + + //input 문자열이 숫자로만 이루어져 있는지 검사 + public boolean isNumber(String input){ + try{ + Integer.parseInt(input); + }catch (NumberFormatException numberFormatException){ + System.out.println(Message.INVALID_INPUT_WARNING.getMsgStr()); + return false; + } + + return true; + } + + public boolean validateRestartInput(String input) { + if(!isNumber(input)){ + System.out.println(Message.INVALID_INPUT_WARNING.getMsgStr()); + return false; + } + + int n = Integer.parseInt(input); + if(n != 1 && n != 2){ + System.out.println(Message.INVALID_INPUT_WARNING.getMsgStr()); + return false; + } + + return true; + } + +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 2876fe66..d84f3c66 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -10,6 +10,7 @@ public class Main { public static void main(String[] args) { do{ setUp(); + System.out.println(answer.getAnswer()[0] + ""+answer.getAnswer()[1] + ""+answer.getAnswer()[2]); startGame(); }while(restartOrNot()); } @@ -27,9 +28,7 @@ private static void startGame(){ } } private static boolean restartOrNot(){ - System.out.println(Message.RESTART_MSG.getMsgStr()); int cmd = gameInputScanner.getRestartInput(); - if(cmd == 1) return true; return false; From e6e5e649993fe0b1b4601e56628da54050a02f11 Mon Sep 17 00:00:00 2001 From: jacob-hyeon Date: Thu, 22 Dec 2022 00:16:08 +0900 Subject: [PATCH 7/7] test : create test code --- README.md | 7 ++- src/main/java/{ => game}/AnswerEntity.java | 21 ++++--- .../java/{ => game}/GameInputScanner.java | 2 + .../java/{ => game}/GameInputValidator.java | 4 +- src/main/java/{ => game}/GameService.java | 4 +- src/main/java/{ => game}/Main.java | 7 ++- src/main/java/{ => game}/Message.java | 2 + src/main/java/{ => game}/ResultEntity.java | 5 +- .../java/gametest/GameInputValidatorTest.java | 57 +++++++++++++++++++ src/test/java/gametest/GameServiceTest.java | 37 ++++++++++++ 10 files changed, 130 insertions(+), 16 deletions(-) rename src/main/java/{ => game}/AnswerEntity.java (57%) rename src/main/java/{ => game}/GameInputScanner.java (98%) rename src/main/java/{ => game}/GameInputValidator.java (94%) rename src/main/java/{ => game}/GameService.java (92%) rename src/main/java/{ => game}/Main.java (80%) rename src/main/java/{ => game}/Message.java (96%) rename src/main/java/{ => game}/ResultEntity.java (90%) create mode 100644 src/test/java/gametest/GameInputValidatorTest.java create mode 100644 src/test/java/gametest/GameServiceTest.java diff --git a/README.md b/README.md index 295fbb93..86471d94 100644 --- a/README.md +++ b/README.md @@ -7,5 +7,8 @@ * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) ## 기능 목록 -1. setUp & input 받아서 validation 진행 -2. \ No newline at end of file +1. 게임시작 환경 셋업 +2. Input 받아서 Validation 하기 +3. 숫자야구 규칙에 따른 핵심로직 (스트라이크, 볼 판단) +4. 재시작 기능 +5. 단위테스트 구현 \ No newline at end of file diff --git a/src/main/java/AnswerEntity.java b/src/main/java/game/AnswerEntity.java similarity index 57% rename from src/main/java/AnswerEntity.java rename to src/main/java/game/AnswerEntity.java index ba92c302..b42ee3af 100644 --- a/src/main/java/AnswerEntity.java +++ b/src/main/java/game/AnswerEntity.java @@ -1,26 +1,25 @@ +package game; + import java.util.Random; public class AnswerEntity { private int[] answer; private boolean[] check; AnswerEntity(){ - this.answer = init(); + this.answer = new int[3]; } - public int[] init(){ - int[] ret = new int[3]; + public void init(){ Random random = new Random(); check = new boolean[10]; for(int idx = 0; idx < 3; idx++){ int num = random.nextInt(9) + 1; - if(checkDuplicationAndInsert(ret, num, idx)) idx--; + if(checkDuplicationAndInsert(num, idx)) idx--; } - - return ret; } - private boolean checkDuplicationAndInsert(int[] arr, int num, int idx){ + private boolean checkDuplicationAndInsert(int num, int idx){ if(!check[num]){ - arr[idx] = num; + answer[idx] = num; check[num] = true; return false; } @@ -31,4 +30,10 @@ public int[] getAnswer(){ return this.answer; } + public void setAnswer(int n1, int n2, int n3){ + this.answer[0] = n1; + this.answer[1] = n2; + this.answer[2] = n3; + } + } diff --git a/src/main/java/GameInputScanner.java b/src/main/java/game/GameInputScanner.java similarity index 98% rename from src/main/java/GameInputScanner.java rename to src/main/java/game/GameInputScanner.java index f1d28935..bc7cca25 100644 --- a/src/main/java/GameInputScanner.java +++ b/src/main/java/game/GameInputScanner.java @@ -1,3 +1,5 @@ +package game; + import java.util.Scanner; public class GameInputScanner { diff --git a/src/main/java/GameInputValidator.java b/src/main/java/game/GameInputValidator.java similarity index 94% rename from src/main/java/GameInputValidator.java rename to src/main/java/game/GameInputValidator.java index 84ea30bd..fd6685c7 100644 --- a/src/main/java/GameInputValidator.java +++ b/src/main/java/game/GameInputValidator.java @@ -1,3 +1,5 @@ +package game; + public class GameInputValidator { public boolean validateGameInput(String input){ //input 문자열의 길이 & 0이 포함되어 있는지 검사 @@ -10,7 +12,7 @@ public boolean validateGameInput(String input){ }; //input 문자열이 숫자로만 이루어져 있는지 검사 - public boolean isNumber(String input){ + private boolean isNumber(String input){ try{ Integer.parseInt(input); }catch (NumberFormatException numberFormatException){ diff --git a/src/main/java/GameService.java b/src/main/java/game/GameService.java similarity index 92% rename from src/main/java/GameService.java rename to src/main/java/game/GameService.java index 56ab31d5..70dec240 100644 --- a/src/main/java/GameService.java +++ b/src/main/java/game/GameService.java @@ -1,8 +1,10 @@ +package game; + import java.util.Arrays; public class GameService { - public ResultEntity getResult(int[] answer, int[] input){ + public ResultEntity calcResult(int[] answer, int[] input){ ResultEntity result = new ResultEntity(0, 0); //answer 배열의 각 원소 위치를 저장하는 배열, 없는 원소면 -1 int[] answerIdxArr = makeAnswerIdxArr(answer); diff --git a/src/main/java/Main.java b/src/main/java/game/Main.java similarity index 80% rename from src/main/java/Main.java rename to src/main/java/game/Main.java index d84f3c66..dd87f902 100644 --- a/src/main/java/Main.java +++ b/src/main/java/game/Main.java @@ -1,4 +1,4 @@ -import java.util.Scanner; +package game; public class Main { private static AnswerEntity answer; @@ -10,7 +10,6 @@ public class Main { public static void main(String[] args) { do{ setUp(); - System.out.println(answer.getAnswer()[0] + ""+answer.getAnswer()[1] + ""+answer.getAnswer()[2]); startGame(); }while(restartOrNot()); } @@ -19,11 +18,13 @@ private static void setUp(){ answer = new AnswerEntity(); gameInputScanner = new GameInputScanner(); gameService = new GameService(); + + answer.init(); } private static void startGame(){ while(!isFinish){ input = gameInputScanner.getGameInput(); - ResultEntity result = gameService.getResult(answer.getAnswer(), input); + ResultEntity result = gameService.calcResult(answer.getAnswer(), input); isFinish = gameService.isFinish(result); } } diff --git a/src/main/java/Message.java b/src/main/java/game/Message.java similarity index 96% rename from src/main/java/Message.java rename to src/main/java/game/Message.java index 3b2abaf1..ad060290 100644 --- a/src/main/java/Message.java +++ b/src/main/java/game/Message.java @@ -1,3 +1,5 @@ +package game; + import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/ResultEntity.java b/src/main/java/game/ResultEntity.java similarity index 90% rename from src/main/java/ResultEntity.java rename to src/main/java/game/ResultEntity.java index db13d611..10d1a35f 100644 --- a/src/main/java/ResultEntity.java +++ b/src/main/java/game/ResultEntity.java @@ -1,9 +1,12 @@ +package game; + import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.Getter; @Getter @AllArgsConstructor +@EqualsAndHashCode public class ResultEntity { private Integer strike; private Integer ball; diff --git a/src/test/java/gametest/GameInputValidatorTest.java b/src/test/java/gametest/GameInputValidatorTest.java new file mode 100644 index 00000000..aff9255e --- /dev/null +++ b/src/test/java/gametest/GameInputValidatorTest.java @@ -0,0 +1,57 @@ +package gametest; + +import game.GameInputValidator; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GameInputValidatorTest { + private final GameInputValidator gameInputValidator = new GameInputValidator(); + + @DisplayName("[GameInputValidator] 게임 인풋 유효성 테스트") + @ParameterizedTest + @MethodSource("validateGameInputTestGenerator") + void validateGameInputTest(String input, boolean expected){ + boolean result = gameInputValidator.validateGameInput(input); + + assertThat(result).isEqualTo(expected); + } + private static Stream validateGameInputTestGenerator(){ + return Stream.of( + Arguments.of("123", true), + Arguments.of("253", true), + Arguments.of("12", false), + Arguments.of("1829", false), + Arguments.of("12a", false), + Arguments.of("12 a", false) + ); + } + + @DisplayName("[GameInputValidator] 재시작 입력값 유효성 테스트") + @ParameterizedTest + @MethodSource("validateRestartInputTestGenerator") + void validateRestartInputTest(String input, boolean expected){ + boolean result = gameInputValidator.validateRestartInput(input); + + assertThat(result).isEqualTo(expected); + } + + private static Stream validateRestartInputTestGenerator(){ + return Stream.of( + Arguments.of("1", true), + Arguments.of("2", true), + Arguments.of("3", false), + Arguments.of("0", false), + Arguments.of("", false), + Arguments.of("123", false), + Arguments.of("a", false), + Arguments.of("7h", false) + ); + } + +} diff --git a/src/test/java/gametest/GameServiceTest.java b/src/test/java/gametest/GameServiceTest.java new file mode 100644 index 00000000..4a59ec07 --- /dev/null +++ b/src/test/java/gametest/GameServiceTest.java @@ -0,0 +1,37 @@ +package gametest; + +import game.GameService; +import game.ResultEntity; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GameServiceTest { + private final GameService gameService = new GameService(); + + @DisplayName("[GameService] 결과 계산 로직 테스트") + @ParameterizedTest + @MethodSource("calcResultTestGenerator") + void calcResultTest(int[] answer, int[] input, ResultEntity expected) { + ResultEntity result = gameService.calcResult(answer, input); + + assertThat(result).isEqualTo(expected); + } + + private static Stream calcResultTestGenerator(){ + return Stream.of( + Arguments.of(new int[]{1,2,3}, new int[]{1,2,3}, new ResultEntity(3, 0)), + Arguments.of(new int[]{1,2,3}, new int[]{3,1,2}, new ResultEntity(0, 3)), + Arguments.of(new int[]{1,2,3}, new int[]{4,5,6}, new ResultEntity(0, 0)), + Arguments.of(new int[]{1,2,3}, new int[]{1,3,2}, new ResultEntity(1, 2)), + Arguments.of(new int[]{1,2,3}, new int[]{1,2,4}, new ResultEntity(2, 0)) + ); + } + + +}