diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index a2036ab0..3a707a32 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -3,6 +3,7 @@ import lotto.domain.*; import lotto.view.LottoView; +import java.util.ArrayList; import java.util.List; public class LottoApplication { @@ -11,17 +12,32 @@ public static void main(String[] args) { LottoView lottoView = new LottoView(); Money money = new Money(lottoView.inputMoney()); - Lottos lottos = lottoSystem.buyLottos(money); + + int numberOfManualLotto = lottoView.inputNumberOfManualLotto(); + lottoSystem.validateNumberOfManualLotto(numberOfManualLotto); + money.buyLotto(numberOfManualLotto); + + List allLottos = new ArrayList<>(); + + lottoView.printManualLottosDescription(); + for (int i = 0; i < numberOfManualLotto; i++) { + List manualNumbers = lottoView.inputManualLottos(); + Lotto lotto = lottoSystem.convertNumbersToLotto(manualNumbers); + allLottos.add(lotto); + } + + List autoLottos = lottoSystem.buyAutoLotto(money); + allLottos.addAll(autoLottos); + + Lottos lottos = new Lottos(allLottos); lottoView.printLottos(lottos); - List answerAndBonusNumber = lottoView.inputAnswer(); - WinningNumber winningNumber = lottoSystem.convertToAnswer(answerAndBonusNumber); - lottoSystem.scoreLottos(lottos, winningNumber); + WinningNumber winningNumber = lottoView.inputAnswer(); + Result result = lottoSystem.scoreLottos(lottos, winningNumber); - Result result = lottoSystem.getResult(); lottoView.printResult(result); - Profit profit = lottoSystem.calculateProfit(); + Profit profit = lottoSystem.calculateProfit(result, lottos); lottoView.printProfit(profit); } } diff --git a/src/main/java/lotto/LottoSystem.java b/src/main/java/lotto/LottoSystem.java deleted file mode 100644 index c0d5fe05..00000000 --- a/src/main/java/lotto/LottoSystem.java +++ /dev/null @@ -1,65 +0,0 @@ -package lotto; - -import lotto.domain.*; -import lotto.generator.RandomLottoGenerator; - -import java.util.List; -import java.util.stream.Collectors; - -public class LottoSystem { - private static final Money LOTTO_PRICE = new Money(1000); - private final RandomLottoGenerator numberGenerator; - private final Result result; - private long lottoCount; - - public LottoSystem() { - this.numberGenerator = new RandomLottoGenerator(); - this.result = new Result(); - this.lottoCount = 0; - } - - private long calculateLottoCount(Money money) { - return money.divide(LOTTO_PRICE); - } - - public Lottos buyLottos(Money money) { - lottoCount = calculateLottoCount(money); - return generateLottos(); - } - - public WinningNumber convertToAnswer(List answerAndBonusNumber) { - List answerBalls = answerAndBonusNumber.subList(0, 6) - .stream() - .map(Ball::new) - .collect(Collectors.toList()); - Ball bonusBall = new Ball(answerAndBonusNumber.get(6)); - - Lotto lotto = new Lotto(answerBalls); - return new WinningNumber(lotto, bonusBall); - } - - private Lottos generateLottos() { - return numberGenerator.generateLottos(lottoCount); - } - - public void scoreLottos(Lottos lottos, WinningNumber winningNumber) { - for (int i = 0; i < lottoCount; i++) { - scoreLotto(lottos.get(i), winningNumber); - } - } - - public Result getResult() { - return result; - } - - public void scoreLotto(Lotto lotto, WinningNumber winningNumber) { - result.scoreLotto(lotto, winningNumber); - } - - public Profit calculateProfit() { - long reward = result.calculateReward(); - long seed = lottoCount * LOTTO_PRICE.getValue(); - - return new Profit(reward, seed); - } -} diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 276e131b..e9ff39df 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -27,7 +27,7 @@ private void validateBalls(List balls) { private void validateNumberOfBalls(List balls) { if (balls.size() != LOTTO_SIZE) { - throw new RuntimeException(); + throw new IllegalStateException("로또 볼의 개수는 6개여야합니다!"); } } @@ -49,6 +49,10 @@ public List getBalls() { return this.balls; } + public long countCorrectNumbers(Lotto other) { + return balls.stream().filter(other::contain).count(); + } + @Override public String toString() { List numbers = balls.stream() diff --git a/src/main/java/lotto/domain/LottoSystem.java b/src/main/java/lotto/domain/LottoSystem.java new file mode 100644 index 00000000..bc4614e5 --- /dev/null +++ b/src/main/java/lotto/domain/LottoSystem.java @@ -0,0 +1,48 @@ +package lotto.domain; + +import lotto.generator.ManualLottoGenerator; +import lotto.generator.RandomLottoGenerator; + +import java.util.List; + +public class LottoSystem { + private static final Money LOTTO_PRICE = new Money(1000); + + public List buyAutoLotto(Money money) { + return generateAutoLottos(money.canBuyCount()); + } + + public void validateNumberOfManualLotto(int numberOfManualLotto) { + if (numberOfManualLotto < 0) { + throw new IllegalArgumentException("유효하지 않은 수동 구매 개수입니다!"); + } + } + + public WinningNumber convertToAnswer(List answerAndBonusNumber) { + Lotto lotto = convertNumbersToLotto(answerAndBonusNumber.subList(0, 6)); + Ball bonusBall = new Ball(answerAndBonusNumber.get(6)); + + return new WinningNumber(lotto, bonusBall); + } + + public Lotto convertNumbersToLotto(List numbers) { + ManualLottoGenerator generator = new ManualLottoGenerator(numbers); + return generator.generateLotto(); + } + + private List generateAutoLottos(long count) { + RandomLottoGenerator generator = RandomLottoGenerator.getInstance(); + return generator.generateAutoLottos(count); + } + + public Result scoreLottos(Lottos lottos, WinningNumber winningNumber) { + return lottos.scoreLottos(winningNumber); + } + + public Profit calculateProfit(Result result, Lottos lottos) { + long reward = result.calculateReward(); + long seed = lottos.getSeed(); + + return new Profit(reward, seed); + } +} diff --git a/src/main/java/lotto/domain/Lottos.java b/src/main/java/lotto/domain/Lottos.java index 9470eb81..6fc6abc6 100644 --- a/src/main/java/lotto/domain/Lottos.java +++ b/src/main/java/lotto/domain/Lottos.java @@ -1,10 +1,9 @@ package lotto.domain; -import lotto.domain.Lotto; - import java.util.List; public class Lottos { + private static final Money LOTTO_PRICE = new Money(1000); private final List values; public Lottos(List values) { @@ -18,4 +17,16 @@ public int getSize() { public Lotto get(int ix) { return values.get(ix); } + + public Result scoreLottos(WinningNumber winningNumber) { + Result result = new Result(); + for (Lotto lotto : values) { + result.scoreLotto(lotto, winningNumber); + } + return result; + } + + public long getSeed() { + return values.size() * LOTTO_PRICE.getValue(); + } } diff --git a/src/main/java/lotto/domain/Money.java b/src/main/java/lotto/domain/Money.java index af2dae5b..d5cef585 100644 --- a/src/main/java/lotto/domain/Money.java +++ b/src/main/java/lotto/domain/Money.java @@ -3,6 +3,7 @@ import java.util.Objects; public class Money { + private static final long LOTTO_PRICE = 1000; private final long value; public Money(long value) { @@ -13,10 +14,22 @@ public long getValue() { return this.value; } - public long divide (Money money) { + public long divide(Money money) { return this.value / money.getValue(); } + public Money buyLotto(int count) { + long need = count * LOTTO_PRICE; + if (need > value) { + throw new IllegalArgumentException("돈이 부족합니다."); + } + return new Money(value - need); + } + + public long canBuyCount() { + return value / LOTTO_PRICE; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/lotto/domain/Result.java b/src/main/java/lotto/domain/Result.java index 3dbfa855..f7116794 100644 --- a/src/main/java/lotto/domain/Result.java +++ b/src/main/java/lotto/domain/Result.java @@ -16,10 +16,7 @@ public Result() { } public void scoreLotto(Lotto lotto, WinningNumber winningNumber) { - long answerCount = winningNumber.getWinningNumbers().getBalls().stream().filter(lotto::contain).count(); - boolean isCorrectBonusBall = lotto.contain(winningNumber.getBonusNumber()); - - Ranking rank = getRank(answerCount, isCorrectBonusBall); + Ranking rank = winningNumber.match(lotto); addScore(rank); } @@ -32,38 +29,13 @@ private void addScore(Ranking rank) { score.put(rank, rankScore + 1); } - - private Ranking getRank(long answerCount, boolean isCorrectBonusBall) { - if (answerCount == 6) { - return Ranking.FIRST; - } - - if (answerCount == 5 && isCorrectBonusBall) { - return Ranking.SECOND; - } - - if (answerCount == 5) { - return Ranking.THIRD; - } - - if (answerCount == 4) { - return Ranking.FOURTH; - } - - if (answerCount == 3) { - return Ranking.FIFTH; - } - - return Ranking.FAIL; - } - public long calculateReward() { reward = 0L; - for (Entry entry: score.entrySet()) { + for (Entry entry : score.entrySet()) { Ranking rank = entry.getKey(); int count = entry.getValue(); - reward += rank.getReward() * count; + reward += rank.getValue() * count; } return reward; diff --git a/src/main/java/lotto/domain/WinningNumber.java b/src/main/java/lotto/domain/WinningNumber.java index a06d236f..97ea701e 100644 --- a/src/main/java/lotto/domain/WinningNumber.java +++ b/src/main/java/lotto/domain/WinningNumber.java @@ -1,5 +1,7 @@ package lotto.domain; +import lotto.enums.Ranking; + public class WinningNumber { private final Lotto winningNumbers; private final Ball bonusNumber; @@ -10,18 +12,25 @@ public WinningNumber(Lotto winningNumbers, Ball bonusNumber) { this.bonusNumber = bonusNumber; } - private void validateBonusNumberNotInWinningNumbers(Lotto winningNumbers, Ball bonusNumber){ + private void validateBonusNumberNotInWinningNumbers(Lotto winningNumbers, Ball bonusNumber) { boolean isContain = winningNumbers.contain(bonusNumber); if (isContain) { throw new IllegalStateException("중복된 숫자가 존재합니다!"); } } - public Lotto getWinningNumbers() { - return this.winningNumbers; + public long countCorrectNumbers(Lotto lotto) { + return winningNumbers.countCorrectNumbers(lotto); + } + + public Ranking match(Lotto lotto) { + long answerCount = countCorrectNumbers(lotto); + boolean isCorrectBonusBall = hasBonusNumber(lotto); + + return Ranking.getRank(answerCount, isCorrectBonusBall); } - public Ball getBonusNumber() { - return this.bonusNumber; + public boolean hasBonusNumber(Lotto lotto) { + return lotto.contain(bonusNumber); } } diff --git a/src/main/java/lotto/enums/Ranking.java b/src/main/java/lotto/enums/Ranking.java index 6db1fa92..3f1bf91b 100644 --- a/src/main/java/lotto/enums/Ranking.java +++ b/src/main/java/lotto/enums/Ranking.java @@ -1,35 +1,41 @@ package lotto.enums; public enum Ranking { - FAIL(0), FIFTH(1), FOURTH(2), THIRD(3), SECOND(4), FIRST(5); + FAIL(0, 0), FIFTH(1, 5000), FOURTH(2, 50000), THIRD(3, 1500000), SECOND(4, 30000000), FIRST(5, 2000000000); - final int value; + private final int ix; + private final long value; - Ranking(int value) { + Ranking(int ix, long value) { + this.ix = ix; this.value = value; } - public long getReward() { - if (value == Ranking.FIRST.value) { - return 2000000000; + public static Ranking getRank(long answerCount, boolean isCorrectBonusBall) { + if (answerCount == 6) { + return Ranking.FIRST; } - if (value == Ranking.SECOND.value) { - return 30000000; + if (answerCount == 5 && isCorrectBonusBall) { + return Ranking.SECOND; } - if (value == Ranking.THIRD.value) { - return 1500000; + if (answerCount == 5) { + return Ranking.THIRD; } - if (value == Ranking.FOURTH.value) { - return 50000; + if (answerCount == 4) { + return Ranking.FOURTH; } - if (value == Ranking.FIFTH.value) { - return 5000; + if (answerCount == 3) { + return Ranking.FIFTH; } - return 0; + return Ranking.FAIL; + } + + public long getValue() { + return value; } } diff --git a/src/main/java/lotto/generator/LottoGenerator.java b/src/main/java/lotto/generator/LottoGenerator.java new file mode 100644 index 00000000..3e630c1d --- /dev/null +++ b/src/main/java/lotto/generator/LottoGenerator.java @@ -0,0 +1,7 @@ +package lotto.generator; + +import lotto.domain.Lotto; + +public interface LottoGenerator { + Lotto generateLotto(); +} diff --git a/src/main/java/lotto/generator/ManualLottoGenerator.java b/src/main/java/lotto/generator/ManualLottoGenerator.java new file mode 100644 index 00000000..2bd0041f --- /dev/null +++ b/src/main/java/lotto/generator/ManualLottoGenerator.java @@ -0,0 +1,22 @@ +package lotto.generator; + +import lotto.domain.Ball; +import lotto.domain.Lotto; + +import java.util.*; +import java.util.stream.Collectors; + +public class ManualLottoGenerator implements LottoGenerator { + private final List numbers; + public ManualLottoGenerator(List numbers) { + this.numbers = numbers; + } + + @Override + public Lotto generateLotto() { + List balls = numbers.stream() + .map(Ball::new) + .collect(Collectors.toList()); + return new Lotto(balls); + } +} diff --git a/src/main/java/lotto/generator/RandomLottoGenerator.java b/src/main/java/lotto/generator/RandomLottoGenerator.java index f94b408f..679ae55e 100644 --- a/src/main/java/lotto/generator/RandomLottoGenerator.java +++ b/src/main/java/lotto/generator/RandomLottoGenerator.java @@ -2,51 +2,55 @@ import lotto.domain.Ball; import lotto.domain.Lotto; -import lotto.domain.Lottos; -import lotto.domain.WinningNumber; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import java.util.stream.IntStream; -public class RandomLottoGenerator { +public class RandomLottoGenerator implements LottoGenerator { private static final int MIN_NUMBER = 1; private static final int MAX_NUMBER = 45; private static final int LENGTH = 6; - private final List ballPool; - public RandomLottoGenerator() { - this.ballPool = new ArrayList<>(); - IntStream.rangeClosed(MIN_NUMBER, MAX_NUMBER) - .forEach(number -> ballPool.add(new Ball(number))); + private static RandomLottoGenerator instance; + private final List ballPool = IntStream.rangeClosed(MIN_NUMBER, MAX_NUMBER) + .mapToObj(Ball::new) + .collect(Collectors.toList()); + + private RandomLottoGenerator() { + } + + public static RandomLottoGenerator getInstance() { + if (instance == null) { + synchronized (RandomLottoGenerator.class) { + if (instance == null) { + instance = new RandomLottoGenerator(); + } + } + } + return instance; } - private List generateNumbers(int length) { + private List generateNumbers() { Collections.shuffle(ballPool); - return new ArrayList<>(ballPool.subList(0, length)); + return new ArrayList<>(ballPool.subList(0, RandomLottoGenerator.LENGTH)); } - public Lottos generateLottos(long lottoCount) { + public List generateAutoLottos(long lottoCount) { List lottos = new ArrayList<>(); for (int i = 0; i < lottoCount; i++) { Lotto lotto = generateLotto(); lottos.add(lotto); } - return new Lottos(lottos); + return lottos; } + @Override public Lotto generateLotto() { - List balls = generateNumbers(LENGTH); + List balls = generateNumbers(); return new Lotto(balls); } - - public WinningNumber generateWinningNumber() { - List balls = generateNumbers(LENGTH + 1); - Lotto lotto = new Lotto(balls.subList(0, LENGTH)); - Ball bonusBall = balls.get(LENGTH); - - return new WinningNumber(lotto, bonusBall); - } } diff --git a/src/main/java/lotto/view/LottoView.java b/src/main/java/lotto/view/LottoView.java index 74ac7ec7..7e1226ab 100644 --- a/src/main/java/lotto/view/LottoView.java +++ b/src/main/java/lotto/view/LottoView.java @@ -1,9 +1,7 @@ package lotto.view; -import lotto.domain.Lottos; -import lotto.domain.Profit; +import lotto.domain.*; import lotto.enums.Ranking; -import lotto.domain.Result; import java.util.Arrays; import java.util.List; @@ -19,6 +17,12 @@ public long inputMoney() { return Long.parseLong(money); } + public int inputNumberOfManualLotto() { + System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); + String count = scan.nextLine(); + return Integer.parseInt(count); + } + public void printLottos(Lottos lottos) { int size = lottos.getSize(); System.out.printf("%d개를 구매했습니다.\n", size); @@ -30,19 +34,33 @@ public void printLottos(Lottos lottos) { System.out.println(); } - public List inputAnswer() { - System.out.println("지난 주 당첨 번호를 입력해 주세요."); - String answerLotto = scan.nextLine(); - List answerAndBonusBall = Arrays.stream(answerLotto.split(", ")) + private List stringToNumbers(String numbers) { + return Arrays.stream(numbers.split(", ")) .map(Integer::parseInt) .collect(Collectors.toList()); + } + + public WinningNumber inputAnswer() { + System.out.println("지난 주 당첨 번호를 입력해 주세요."); + String answerLotto = scan.nextLine(); + List answerNumbers = stringToNumbers(answerLotto); System.out.println("보너스 볼을 입력해 주세요."); - String bonusBallNumber = scan.nextLine(); - answerAndBonusBall.add(Integer.parseInt(bonusBallNumber)); + String bonusBallNumberInput = scan.nextLine(); + int bonusBallNumber = Integer.parseInt(bonusBallNumberInput); System.out.println(); - return answerAndBonusBall; + + return createLotto(answerNumbers, bonusBallNumber); + } + + private WinningNumber createLotto(List answerNumbers, int bonusBallNumber) { + List answerBalls = answerNumbers.stream() + .map(Ball::new) + .collect(Collectors.toList()); + Ball bonusBall = new Ball(bonusBallNumber); + Lotto answer = new Lotto(answerBalls); + return new WinningNumber(answer, bonusBall); } public void printResult(Result result) { @@ -54,13 +72,22 @@ public void printResult(Result result) { .collect(Collectors.toList()); for (Ranking rank : winRanks) { String desc = getIndividualRankingDesc(rank); - long price = rank.getReward(); + long price = rank.getValue(); int count = result.getScore(rank); System.out.println(desc + String.format("(%d원)- %d개", price, count)); } } + public void printManualLottosDescription() { + System.out.println("수동으로 구매할 번호를 입력해 주세요."); + } + + public List inputManualLottos() { + + String lottoNumbers = scan.nextLine(); + return stringToNumbers(lottoNumbers); + } private String getGainOrLoss(Profit profit) { long integerPart = profit.getIntegerPart(); diff --git a/src/test/java/lotto/LottoSystemTest.java b/src/test/java/lotto/LottoSystemTest.java index 6a0ab69b..5bc9566b 100644 --- a/src/test/java/lotto/LottoSystemTest.java +++ b/src/test/java/lotto/LottoSystemTest.java @@ -19,7 +19,8 @@ public class LottoSystemTest { void 돈_2500원으로_로또_구매_테스트() { LottoSystem lottoSystem = new LottoSystem(); Money money = new Money(2500); - Lottos lottos = lottoSystem.buyLottos(money); + + Lottos lottos = new Lottos(lottoSystem.buyAutoLotto(money)); assertThat(lottos.getSize()).isEqualTo(2); } @@ -27,8 +28,6 @@ public class LottoSystemTest { @Test void 수익률_계산_테스트() { LottoSystem lottoSystem = new LottoSystem(); - Money money = new Money(2000); - lottoSystem.buyLottos(money); Lotto lotto1 = new Lotto(Arrays.asList( new Ball(1), @@ -46,6 +45,8 @@ public class LottoSystemTest { new Ball(5), new Ball(7) )); + + Lottos lottos = new Lottos(Arrays.asList(lotto1, lotto2)); WinningNumber winningNumber = new WinningNumber( new Lotto(Arrays.asList( new Ball(1), @@ -56,10 +57,9 @@ public class LottoSystemTest { new Ball(6) )), new Ball(7)); - lottoSystem.scoreLotto(lotto1, winningNumber); - lottoSystem.scoreLotto(lotto2, winningNumber); + Result result = lottoSystem.scoreLottos(lottos, winningNumber); - Profit profit = lottoSystem.calculateProfit(); + Profit profit = lottoSystem.calculateProfit(result, lottos); assertThat(profit.toString()).isEqualTo(String.format("%d.%d", (2000000000+30000000) / 2000, 0)); } diff --git a/src/test/java/lotto/generator/RandomLottoGeneratorTest.java b/src/test/java/lotto/generator/RandomLottoGeneratorTest.java index 795b19b7..f59cdd56 100644 --- a/src/test/java/lotto/generator/RandomLottoGeneratorTest.java +++ b/src/test/java/lotto/generator/RandomLottoGeneratorTest.java @@ -1,71 +1,44 @@ package lotto.generator; -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.HashSet; -import java.util.List; -import java.util.stream.Collectors; import lotto.domain.Ball; import lotto.domain.Lotto; -import lotto.domain.WinningNumber; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class RandomLottoGeneratorTest { - - @Test - void 랜덤_숫자_생성_생성자_테스트() { - RandomLottoGenerator RandomLottoGenerator = new RandomLottoGenerator(); - assertThat(RandomLottoGenerator).isNotNull(); - } - - @Test - void 랜덤_로또_생성_테스트() { - RandomLottoGenerator RandomLottoGenerator = new RandomLottoGenerator(); - Lotto lotto = RandomLottoGenerator.generateLotto(); - - List balls = lotto.getBalls(); - - List numbers = balls - .stream() - .map(Ball::getNumber) - .collect(Collectors.toList()); - - int uniqueNumbers = new HashSet<>(numbers).size(); - - Assertions.assertAll(() -> { - assertThat(numbers.size()).isEqualTo(6); - for (int i = 0; i < 6; i++) { - assertThat(numbers.get(i)).isBetween(1, 45); - } - assertThat(uniqueNumbers).isEqualTo(6); - }); - } - - @Test - void 랜덤_정답_생성_테스트() { - RandomLottoGenerator randomLottoGenerator = new RandomLottoGenerator(); - WinningNumber winningNumber = randomLottoGenerator.generateWinningNumber(); - Lotto lotto = winningNumber.getWinningNumbers(); - Ball bonusBall = winningNumber.getBonusNumber(); - int bonusNumber = bonusBall.getNumber(); - - List balls = lotto.getBalls(); +import java.util.HashSet; +import java.util.List; +import java.util.stream.Collectors; - List numbers = balls - .stream() - .map(Ball::getNumber) - .collect(Collectors.toList()); +import static org.assertj.core.api.Assertions.assertThat; - int uniqueNumbers = new HashSet<>(numbers).size(); +public class RandomLottoGeneratorTest { - Assertions.assertAll(() -> { - assertThat(numbers.size()).isEqualTo(6); - for (int i = 0; i < 6; i++) { - assertThat(numbers.get(i)).isBetween(1, 45); - } - assertThat(uniqueNumbers).isEqualTo(6); - assertThat(bonusNumber).isBetween(1, 45); - }); - } + @Test + void 랜덤_숫자_생성_생성자_테스트() { + RandomLottoGenerator RandomLottoGenerator = lotto.generator.RandomLottoGenerator.getInstance(); + assertThat(RandomLottoGenerator).isNotNull(); + } + + @Test + void 랜덤_로또_생성_테스트() { + RandomLottoGenerator RandomLottoGenerator = lotto.generator.RandomLottoGenerator.getInstance(); + Lotto lotto = RandomLottoGenerator.generateLotto(); + + List balls = lotto.getBalls(); + + List numbers = balls + .stream() + .map(Ball::getNumber) + .collect(Collectors.toList()); + + int uniqueNumbers = new HashSet<>(numbers).size(); + + Assertions.assertAll(() -> { + assertThat(numbers.size()).isEqualTo(6); + for (int i = 0; i < 6; i++) { + assertThat(numbers.get(i)).isBetween(1, 45); + } + assertThat(uniqueNumbers).isEqualTo(6); + }); + } }