diff --git a/README.md b/README.md index fcf3f057..eb98ec53 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,100 @@ -# 숫자 야구 게임 -## 진행 방법 -* 숫자 야구 게임 요구사항을 파악한다. -* 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 과제를 제출한다. +# 숫자 야구 게임 - 어떻게 구현할 것인가? +## dataobject package +### NumBalls interface +숫자야구에서 숫자를 담을 객체들을 위한 인터페이스이다. +문제의 조건에서는 1~9만을 허용하나, 확장에 자유롭기 위하여(0 허용, 중복 허용 등의 가능성) 인터페이스를 구현하였다. + +#### 메서드 +* public int getNum(int index) - index번째에 해당하는 공 출력(0~size-1) +* public int getSize(); - 공이 몇 개 있는지 알 수 있는 메서드(이번 요구사항에서는 3) +* public TrialResult compare(NumBalls trial) - trial(예상 시도)를 했을 때 몇 스트라이크 몇 볼인지 출력 + + +### NumBallsNBalls class implements NumBalls +숫자야구에서 숫자 공 n개를 저장할 data object이다. +숫자 n개가 1-9 사이의 값을 가지며, 중복되지 않음을 보장한다. +(중복되거나 1-9 사이의 값을 가지지 않는 경우 WrongNumbersException 예외를 발생시킨다) + +#### 인스턴스 변수 +* private final ArrayList nums - 숫자야구에서 사용할 공 n개(1~9 사이의 숫자)를 나타낸다. +* private final int size; + +#### 메서드 +* private int randomlyChoose(Set numSet) - numSet에 들어있는 값 중 랜덤한 값을 return한다. +* private void isValidNumber(ArrayList nums) - nums가 숫자야구 조건에 맞는지 확인한다(1~9 사이의 값, 중복되지 않음), 조건에 맞지 않으면 WrongNumberException 발생. +* public NumBalls(int size) - 숫자야구 조건에 맞는 랜덤한 숫자 n개를 nums에 저장한다. +* public NumBalls(ArrayList nums) - 지정한 nums대로 저장한다. size는 nums의 크기로 저장된다. 조건에 맞지 않으면 WrongNumberException을 발생시킨다. +* public int getNum(int index) - index번째에 해당하는 숫자 출력 +* public int getSize() - size를 return +* private void compareOne(int thisIndex, int trialIndex, TrialResult result) - trial의 trialIndex번째 수가 thisIndex(없으면 -1)에 있을 때 스트라이크/볼/낫싱을 result에 갱신 +* public TrialResult compare(NumBalls trial) - trial이 NumBallsNBalls의 객체인지 확인 후(같지 않으면 예외 발생), 결과를 반환 + +### TrialResult class +Trial을 한 결과로 나오는 a스트라이크 b볼에 대한 정보를 저장하는 data object이다. + +#### 인스턴스 변수 +* private int strike = 0 - 스트라이크 개수를 저장 +* private int ball = 0 - 볼 개수를 저장 +* private final int size - 총 공의 개수를 저장 + +#### 메서드 +* public TrialResult(int size) - size 초기화 후, (strike,ball) = (0,0)으로 초기화하는 생성자 +* public TrialResult(int strike, int ball, int size) - 매개변수대로 strike, ball, size을 초기화하는 생성자 +* private chkValidNumber(int strike, int ball) - strike, ball이 가능한 경우인지(각각 0 이상의 값, 0<=strike+ball<=size, (size-1) strike 1 ball 불가능) +* getter - strike, ball, size 변수에 대해서. +* public setStrikeBall(int strike, int ball) - strike, ball을 따로 결정하는 경우 예외발생을 적절히 확인하지 못함. +*** + +## manager package +### ProcessManager Class +게임 전체의 lifecycle을 담당하는 클래스 +ProcessManager Class와는 Aggregation 연관을 가진다. + +#### 인스턴스 객체 +* private GameUserInterface gameUserInterface - 입출력을 담당하는 ui객체 +* private GameManager gameManager - 한 게임이 시작될 때 그 게임의 설정을 가지는 객체 + +#### 인스턴스 메소드 +* setter - (gameManager, gameUserInterface에 대해) +* public ProcessManager(GameUserInterface gameUserInterface) - gameUserInterface를 주입 +* public void execute() - 프로그램을 실행 + +### GameManager Class +한 게임의 시작(숫자 size개를 랜덤하게 정함)부터 끝(사용자가 size개를 다 맞춤)까지의 한 사이클을 담당하는 클래스 +gameUserInterface, numBalls를 initialize하며 다 맞출 때 까지 계속 묻고 결과를 출력해준다. + +#### 인스턴스 객체 +* private GameUserInterface gameUserInterface - 입출력을 담당하는 ui객체 +* private final NumBalls answer; - 정답을 담을 객체 +* private final int size - 숫자야구 공의 개수 + +#### 인스턴스 메소드 +* public GameManager(GameUserInterface gameUserInterface, NumBalls numBalls, int size) - 각각의 객체를 주입 및 size, answer 초기화 +* public void execute() - 게임 실행 전반을 책임질 메소드 +* private boolean executeOneCycle() - 게임 중 한 사이클(숫자 입력 후 출력까지)를 담당. 게임이 끝나는 경우 true 반환 + +*** +## exception package +### WrongNumberException class extends RunTimeException +* NumBalls, TrialResult 등에서 조건에 맞지 않는 값이 입력되는 경우에 대한 예외. +### WrongTypeException class extends RunTimeException +* NumBallsNBalls.compare(NumBalls trial)에서 trial이 원래 비교대상과 형식이 같지 않는 경우 발생시킴. + +*** + + +## ui package +### GameUserInterface Interface +사용자와 어떤 입력을 받으며, 어떤 출력을 하는지에 대한 함수가 정의되어 있다. +* ArrayList inputNumbers() - 입력을 받아 ArrayList형태로 저장하여 return +* void printResult(TrialResult res) - TrialResult 객체를 받아 strike, ball을 출력 +* void printError(Exception e) - Exception e에 따라 여러 가지의 에러 문구 표시 +* void printGameClear() - 게임을 통과하였을 시에 출력 +* boolean printRetry() - 다시 하시겠습니까? 출력 + +### GameUserInterfaceKorean Class implements GameUserInterface +UI를 구현할 클래스. 한국어로 prompt되기 때문에 GameUserInterface**Korean**으로 하였다. + +### GameUserInterfaceTestStub Class implements GameUserInterface +단위 Test시 입출력을 거치지 않고 테스트하기 위한 TestStub -## 과제 제출 과정 -* [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) diff --git a/src/main/java/num3baseball/dataobject/NumBalls.java b/src/main/java/num3baseball/dataobject/NumBalls.java new file mode 100644 index 00000000..802332b6 --- /dev/null +++ b/src/main/java/num3baseball/dataobject/NumBalls.java @@ -0,0 +1,8 @@ +package num3baseball.dataobject; + +public interface NumBalls { + public int getNum(int index); + public int getSize(); + + public TrialResult compare(NumBalls trial); +} diff --git a/src/main/java/num3baseball/dataobject/NumBallsNBalls.java b/src/main/java/num3baseball/dataobject/NumBallsNBalls.java new file mode 100644 index 00000000..d484466f --- /dev/null +++ b/src/main/java/num3baseball/dataobject/NumBallsNBalls.java @@ -0,0 +1,84 @@ +package num3baseball.dataobject; + +import num3baseball.exception.WrongNumberException; +import num3baseball.exception.WrongTypeException; + +import java.util.*; + +public class NumBallsNBalls implements NumBalls{ + + private final ArrayList nums = new ArrayList<>(); + private final int size; + + private int randomlyChoose(Set numSet){ + Iterator iter = numSet.iterator(); + int randomChoose = (int)(numSet.size() * Math.random()); + for (int i=1;i<=randomChoose;i++){ + iter.next(); + } + return (int)iter.next(); + } + + private void isValidNumber(ArrayList num) throws WrongNumberException{ + Set numSet = new HashSet(Arrays.asList(1,2,3,4,5,6,7,8,9)); + int initialSize = numSet.size(); + for (int i:num){ + numSet.remove(i); + } + int endSize = numSet.size(); + if (initialSize - endSize != num.size()){ // 모든 번호가 한번씩 빠짐 = 중복되지 않고 + throw new WrongNumberException(); + } + } + + public NumBallsNBalls(int size) throws WrongNumberException{ + this.size=size; + if (size>9 || size<1){ + throw new WrongNumberException(); + } + Set numSet = new HashSet(Arrays.asList(1,2,3,4,5,6,7,8,9)); + for (int i=1;i<=this.size;i++){ + nums.add(randomlyChoose(numSet)); + numSet.remove(nums.get(i-1)); + } + isValidNumber(nums); + } + + public NumBallsNBalls(ArrayList nums) throws WrongNumberException{ + this.size = nums.size(); + isValidNumber(nums); + this.nums.addAll(nums); + } + @Override + public int getNum(int index) { + return nums.get(index); + } + + @Override + public int getSize() { + return size; + } + + private void compareOne(int thisIndex, int trialIndex, TrialResult result){ + if (trialIndex==-1){ + return; + } + if (thisIndex == trialIndex){ + result.setStrikeBall(result.getStrike()+1, result.getBall()); + } + if (thisIndex != trialIndex){ + result.setStrikeBall(result.getStrike(), result.getBall()+1); + } + } + @Override + public TrialResult compare(NumBalls trial) { + if (!(trial instanceof NumBallsNBalls) || trial.getSize()!=size){ + throw new WrongTypeException(); + } + TrialResult result = new TrialResult(size); + for (int i=0;i size || (strike==size-1 && ball==1)){ + throw new WrongNumberException(); + } + } + + public void setStrikeBall(int strike, int ball){ + chkValidNumber(strike, ball); + this.strike = strike; + this.ball = ball; + } +} diff --git a/src/main/java/num3baseball/exception/WrongNumberException.java b/src/main/java/num3baseball/exception/WrongNumberException.java new file mode 100644 index 00000000..4de92626 --- /dev/null +++ b/src/main/java/num3baseball/exception/WrongNumberException.java @@ -0,0 +1,4 @@ +package num3baseball.exception; + +public class WrongNumberException extends RuntimeException{ +} diff --git a/src/main/java/num3baseball/exception/WrongTypeException.java b/src/main/java/num3baseball/exception/WrongTypeException.java new file mode 100644 index 00000000..a542269d --- /dev/null +++ b/src/main/java/num3baseball/exception/WrongTypeException.java @@ -0,0 +1,4 @@ +package num3baseball.exception; + +public class WrongTypeException extends RuntimeException{ +} diff --git a/src/main/java/num3baseball/main/Main.java b/src/main/java/num3baseball/main/Main.java new file mode 100644 index 00000000..fa65066d --- /dev/null +++ b/src/main/java/num3baseball/main/Main.java @@ -0,0 +1,12 @@ +package num3baseball.main; + +import num3baseball.manager.ProcessManager; +import num3baseball.ui.GameUserInterfaceKorean; +import num3baseball.ui.GameUserInterfaceTestStub; + +public class Main { + public static void main(String[] args){ + ProcessManager processManager = new ProcessManager(new GameUserInterfaceKorean()); + processManager.execute(); + } +} diff --git a/src/main/java/num3baseball/manager/GameManager.java b/src/main/java/num3baseball/manager/GameManager.java new file mode 100644 index 00000000..5b020757 --- /dev/null +++ b/src/main/java/num3baseball/manager/GameManager.java @@ -0,0 +1,40 @@ +package num3baseball.manager; + +import num3baseball.dataobject.NumBalls; +import num3baseball.dataobject.NumBallsNBalls; +import num3baseball.dataobject.TrialResult; +import num3baseball.exception.WrongNumberException; +import num3baseball.ui.GameUserInterface; + +import java.sql.Array; +import java.util.ArrayList; + +public class GameManager { + private GameUserInterface gameUserInterface; + private final NumBalls answer; + + private final int size; + + public GameManager(GameUserInterface gameUserInterface, NumBalls numBalls, int size){ + this.gameUserInterface = gameUserInterface; + answer = numBalls; + this.size=size; + } + + public boolean executeOneCycle(){ + try{ + TrialResult result = answer.compare(new NumBallsNBalls(gameUserInterface.inputNumbers())); + gameUserInterface.printResult(result); + return result.getStrike() == result.getSize(); + } + catch(Exception e){ + gameUserInterface.printError(e); + } + return false; + } + public void execute(){ + while(!executeOneCycle()) { + } + gameUserInterface.printGameClear(size); + } +} diff --git a/src/main/java/num3baseball/manager/ProcessManager.java b/src/main/java/num3baseball/manager/ProcessManager.java new file mode 100644 index 00000000..62c6ed61 --- /dev/null +++ b/src/main/java/num3baseball/manager/ProcessManager.java @@ -0,0 +1,28 @@ +package num3baseball.manager; + +import num3baseball.dataobject.NumBallsNBalls; +import num3baseball.ui.GameUserInterface; + +public class ProcessManager { + private GameUserInterface gameUserInterface; + private GameManager gameManager; + + public ProcessManager(GameUserInterface gameUserInterface){ + this.gameUserInterface = gameUserInterface; + } + + public void setGameUserInterface(GameUserInterface gameUserInterface) { + this.gameUserInterface = gameUserInterface; + } + + public void setGameManager(GameManager gameManager) { + this.gameManager = gameManager; + } + + public void execute(){ + do{ + setGameManager(new GameManager(gameUserInterface, new NumBallsNBalls(3), 3)); + gameManager.execute(); + }while(gameUserInterface.printRetry()); + } +} diff --git a/src/main/java/num3baseball/ui/GameUserInterface.java b/src/main/java/num3baseball/ui/GameUserInterface.java new file mode 100644 index 00000000..421a8494 --- /dev/null +++ b/src/main/java/num3baseball/ui/GameUserInterface.java @@ -0,0 +1,13 @@ +package num3baseball.ui; + +import num3baseball.dataobject.TrialResult; + +import java.util.ArrayList; + +public interface GameUserInterface { + public ArrayList inputNumbers(); // input을 받아 ArrayList로 반환 + public void printResult(TrialResult res); // TrialResult 객체를 받아 strike, ball을 출력 + public void printError(Exception e); // Exception e에 따라 여러 가지의 에러 문구 표시 + public void printGameClear(int size); // 게임을 통과하였을 시에 출력 + public boolean printRetry(); // 다시 하시겠습니까? 출력 +} diff --git a/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java b/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java new file mode 100644 index 00000000..ac0c066b --- /dev/null +++ b/src/main/java/num3baseball/ui/GameUserInterfaceKorean.java @@ -0,0 +1,75 @@ +package num3baseball.ui; + +import num3baseball.dataobject.TrialResult; +import num3baseball.exception.WrongNumberException; +import num3baseball.exception.WrongTypeException; + +import java.util.ArrayList; +import java.util.Scanner; + +public class GameUserInterfaceKorean implements GameUserInterface{ + private final Scanner sc = new Scanner(System.in); + + private int inputNum(String promptStr){ + try { + System.out.print(promptStr); + return Integer.parseInt(sc.next()); + } catch (Exception e) { + printError(e); + return -1; + } + } + @Override + public ArrayList inputNumbers() { + ArrayList res = new ArrayList<>(); + int getNum=0; + do { + getNum = inputNum("숫자를 입력해주세요 : "); + }while(getNum<=0); + while(getNum>0){ + res.add(0,getNum%10); + getNum/=10; + } + return res; + } + @Override + public void printResult(TrialResult res) { + if (res.getStrike() > 0){ + System.out.print(res.getStrike()+" 스트라이크 "); + } + if (res.getBall() > 0){ + System.out.print(res.getBall()+" 볼"); + } + if (res.getStrike() == 0 && res.getBall() == 0){ + System.out.print("낫싱"); + } + System.out.println(); + } + + @Override + public void printError(Exception e) { + if (e instanceof WrongNumberException || e instanceof WrongTypeException){ + System.out.println("올바른 숫자를 입력해주시기 바랍니다."); + return; + } + if (e instanceof NumberFormatException){ + System.out.println("숫자를 입력해주시기 바랍니다."); + return; + } + System.out.println("알 수 없는 오류가 발생하였습니다"); + } + + @Override + public void printGameClear(int size) { + System.out.println(size+"개의 숫자를 모두 맞히셨습니다. 게임 종료"); + } + + @Override + public boolean printRetry() { + int code; + do{ + code = inputNum("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.\n"); + }while(code!=1 && code!=2); + return code==1; + } +} diff --git a/src/main/java/num3baseball/ui/GameUserInterfaceTestStub.java b/src/main/java/num3baseball/ui/GameUserInterfaceTestStub.java new file mode 100644 index 00000000..88ab221f --- /dev/null +++ b/src/main/java/num3baseball/ui/GameUserInterfaceTestStub.java @@ -0,0 +1,53 @@ +package num3baseball.ui; + +import num3baseball.dataobject.TrialResult; +import num3baseball.exception.WrongNumberException; + +import java.util.ArrayList; + +public class GameUserInterfaceTestStub implements GameUserInterface{ + + private ArrayList input; + @Override + public ArrayList inputNumbers() { + return input; + } + + public GameUserInterface inputNumbers(ArrayList input){ + this.input = input; + return this; + } + + public TrialResult res; + @Override + public void printResult(TrialResult res) { + this.res = res; + } + + @Override + public void printError(Exception e){ + if (e instanceof WrongNumberException) { + throw (WrongNumberException)e; + } + if (e instanceof NumberFormatException) { + throw (NumberFormatException)e; + } + } + + @Override + public void printGameClear(int size) { + + } + + private boolean retry; + @Override + public boolean printRetry() { + return retry; + } + + public GameUserInterface printRetry(boolean retry){ + this.retry=retry; + return this; + } +} + diff --git a/src/test/java/study/GameManagerTest.java b/src/test/java/study/GameManagerTest.java new file mode 100644 index 00000000..4e2f9683 --- /dev/null +++ b/src/test/java/study/GameManagerTest.java @@ -0,0 +1,45 @@ +package study; + +import num3baseball.dataobject.NumBallsNBalls; +import num3baseball.manager.GameManager; +import num3baseball.ui.GameUserInterface; +import num3baseball.ui.GameUserInterfaceTestStub; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GameManagerTest { + + private ArrayList numToArrayList(int num){ + ArrayList res = new ArrayList<>(); + while(num>0){ + res.add(0,num%10); + num /= 10; + } + return res; + } + @Test + @DisplayName("WholeGameProcess") + public void test1() { + int startNum = 123; + GameUserInterfaceTestStub gameUIStub = new GameUserInterfaceTestStub(); + GameManager gameManager = new GameManager(gameUIStub, + new NumBallsNBalls(numToArrayList(startNum)), 3); + + int[] trial = {147, 258, 369, 159, 138, 132, 123}; + int[] sb = {10, 1, 1, 10, 11, 12, 30}; + + int size = trial.length; + for (int i = 0; i < size; i++) { + gameUIStub.inputNumbers(numToArrayList(trial[i])); + boolean isEnd = gameManager.executeOneCycle(); + assertThat(gameUIStub.res.getStrike()).isEqualTo(sb[i] / 10); + assertThat(gameUIStub.res.getBall()).isEqualTo(sb[i] % 10); + assertThat(isEnd).isEqualTo(gameUIStub.res.getStrike()==3); + } + } +} diff --git a/src/test/java/study/NumBallsNBallsTest.java b/src/test/java/study/NumBallsNBallsTest.java new file mode 100644 index 00000000..3d5d4c6b --- /dev/null +++ b/src/test/java/study/NumBallsNBallsTest.java @@ -0,0 +1,89 @@ +package study; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +import num3baseball.dataobject.NumBallsNBalls; +import num3baseball.dataobject.TrialResult; +import num3baseball.exception.WrongNumberException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class NumBallsNBallsTest { + @Test + @DisplayName("Constructor(int size) - does not raise exception") + void NumBallsNBallsTest1() { + int iter = 10; + for (int i=1;i<=iter;i++){ + assertThatCode(()->{ + NumBallsNBalls t = new NumBallsNBalls(3); + }).doesNotThrowAnyException(); + } + } + @Test + @DisplayName("Constructor(int size) - does not make duplicated one") + void NumBallsNBallsTest2() { + int iter = 10; + int dupCount = 0; + for (int i=1;i<=iter;i++){ + NumBallsNBalls t1 = new NumBallsNBalls(3); + NumBallsNBalls t2 = new NumBallsNBalls(3); + if (t1.getNum(0) == t2.getNum(0) && t1.getNum(1) == t2.getNum(1) && t1.getNum(2) == t2.getNum(2)){ + dupCount++; + } + } + assertThat(dupCount<(iter*3/10)).isTrue(); + } + + @ParameterizedTest + @CsvSource(value = {"123:false", "121:true", "320:true", "335:true", "948:false", "191:true"}, delimiter = ':') + @DisplayName("Constructor(ArrayList) - raises exception(or not) appropriately") + void NumBallsNBallsTest3(int num, boolean isThrown){ + if (isThrown){ + ArrayList nums = new ArrayList<>(); + nums.add(num/100); + nums.add(num/10%10); + nums.add(num%10); + assertThatThrownBy(()->{ + NumBallsNBalls t = new NumBallsNBalls(nums); + }).isInstanceOf(WrongNumberException.class); + } + else{ + ArrayList nums = new ArrayList<>(); + nums.add(num/100); + nums.add(num/10%10); + nums.add(num%10); + assertThatCode(()->{ + NumBallsNBalls t = new NumBallsNBalls(nums); + }).doesNotThrowAnyException(); + } + } + + + private ArrayList numToList(int num){ + ArrayList res = new ArrayList<>(); + while(num>0){ + res.add(0, num%10); + num/=10; + } + return res; + } + @ParameterizedTest + @CsvSource(value={"475:0", "492:1", "912:2", "231:3", "983:10", "192:11", "321:12", "923:20", "123:30"}, delimiter=':') + void NumBallsNBallsTest4(int trials, int sb){ + int answer = 123; + + NumBallsNBalls ans = new NumBallsNBalls(numToList(answer)); + TrialResult res = ans.compare(new NumBallsNBalls(numToList(trials))); + assertThat(res.getStrike()).isEqualTo(sb/10); + assertThat(res.getBall()).isEqualTo(sb%10); + } +} diff --git a/src/test/java/study/StringTest.java b/src/test/java/study/StringTest.java deleted file mode 100644 index 43e47d90..00000000 --- a/src/test/java/study/StringTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package study; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class StringTest { - @Test - void replace() { - String actual = "abc".replace("b", "d"); - assertThat(actual).isEqualTo("adc"); - } -} diff --git a/src/test/java/study/TrialResultTest.java b/src/test/java/study/TrialResultTest.java new file mode 100644 index 00000000..36256d8a --- /dev/null +++ b/src/test/java/study/TrialResultTest.java @@ -0,0 +1,39 @@ +package study; + +import num3baseball.dataobject.TrialResult; +import num3baseball.exception.WrongNumberException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +public class TrialResultTest { + @ParameterizedTest + @CsvSource(value = {"12:false", "30:false", "21:true", "22:true", "00:false", "11:false", "01:false"}, delimiter = ':') + @DisplayName("Check appropriately throw exception when strike and ball values are not valid") + void TrialResultTest(int sb, boolean isthrown){ + final int size=3; + int strike = sb/10; + int ball = sb%10; + if (isthrown){ + assertThatThrownBy(()->{ + TrialResult t = new TrialResult(strike, ball, size); + }).isInstanceOf(WrongNumberException.class); + assertThatThrownBy(()->{ + TrialResult t = new TrialResult(size); + t.setStrikeBall(strike, ball); + }).isInstanceOf(WrongNumberException.class); + } + else{ + assertThatCode(()->{ + TrialResult t = new TrialResult(strike, ball, size); + }).doesNotThrowAnyException(); + assertThatCode(()->{ + TrialResult t = new TrialResult(size); + t.setStrikeBall(strike, ball); + }).doesNotThrowAnyException(); + } + } +}