diff --git a/src/main/java/lotto/domain/LottoTickets.java b/src/main/java/lotto/domain/LottoTickets.java new file mode 100644 index 0000000000..3540e446c0 --- /dev/null +++ b/src/main/java/lotto/domain/LottoTickets.java @@ -0,0 +1,48 @@ +package lotto.domain; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class LottoTickets { + private static final int MIN_LOTTO_COUNT = 1; + + private final List lottos; + + public LottoTickets(List lottos) { + if (Objects.isNull(lottos)) { + throw new IllegalArgumentException("[ERROR] 로또 목록이 없습니다."); + } + + if (lottos.size() < MIN_LOTTO_COUNT) { + throw new IllegalArgumentException("[ERROR] 최소 1개 이상의 로또를 구매해야 합니다."); + } + + this.lottos = lottos; + } + + /** + * 구매한 로또의 개수를 반환합니다. + */ + public int getLottoCount() { + return lottos.size(); + } + + /** + * 모든 로또를 반환합니다. + */ + public List getLottos() { + return Collections.unmodifiableList(lottos); + } + + // public LottoResult compareWithWinningLotto(WinningLotto winningLotto, int purchaseAmount) { + // // 모든 로또의 당첨 등수를 계산합니다. + // List ranks = lottos.stream() + // .map(winningLotto::match) + // .collect(Collectors.toList()); + // + // // LottoResult 객체를 생성하여 등수별 개수 및 수익률을 관리합니다. + // return new LottoResult(ranks, purchaseAmount); + // } +} \ No newline at end of file diff --git a/src/test/java/lotto/domain/LottoTicketsTest.java b/src/test/java/lotto/domain/LottoTicketsTest.java new file mode 100644 index 0000000000..119034c94a --- /dev/null +++ b/src/test/java/lotto/domain/LottoTicketsTest.java @@ -0,0 +1,79 @@ +package lotto.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class LottoTicketsTest { + + private final Lotto lotto1 = new Lotto(List.of(1, 2, 3, 4, 5, 6)); + private final Lotto lotto2 = new Lotto(List.of(7, 8, 9, 10, 11, 12)); + private final List validLottoList = List.of(lotto1, lotto2); + + @DisplayName("정상1: 여러 개의 로또를 관리하는 객체를 생성한다") + @Test + void test1() { + // When + LottoTickets lottoTickets = new LottoTickets(validLottoList); + + // Then + assertThat(lottoTickets).isNotNull(); + assertThat(lottoTickets.getLottoCount()).isEqualTo(2); + assertThat(lottoTickets.getLottos()).containsExactly(lotto1, lotto2); + } + + @DisplayName("정상2: 구매한 로또 개수를 정확히 반환한다") + @Test + void test2() { + // When + LottoTickets lottoTickets = new LottoTickets(validLottoList); + + // Then + assertThat(lottoTickets.getLottoCount()).isEqualTo(2); + } + + // @DisplayName("정상3: 당첨 번호와 비교하여 각 로또의 등수를 판별하고 LottoResult를 반환한다") + // @Test + // void test3() { + // // Given + // // lotto1: 1, 2, 3, 4, 5, 6 (당첨 번호와 6개 일치 -> 1등) + // // lotto2: 7, 8, 9, 10, 11, 12 (당첨 번호와 0개 일치 -> 꽝) + // LottoTickets lottoTickets = new LottoTickets(validLottoList); + // WinningLotto winningLotto = new WinningLotto(lotto1, 7); // 1~6 당첨, 보너스 7 + // int purchaseAmount = 2000; + // + // // When + // LottoResult result = lottoTickets.compareWithWinningLotto(winningLotto, purchaseAmount); + // + // // Then (LottoResult의 내부 구현에 따라 검증) + // // 1등 1개, 꽝 1개 예상 + // assertThat(result.getPrizeCount(Rank.FIRST)).isEqualTo(1); + // assertThat(result.getPrizeCount(Rank.NONE)).isEqualTo(1); + // + // // 주의: LottoResult 클래스가 아직 구현되지 않았으므로, + // // 이 테스트는 LottoResult 구현 후 성공적으로 빌드될 수 있습니다. + // // 현재는 LottoResult 객체가 성공적으로 생성되는지만 확인합니다. + // assertThat(result).isInstanceOf(LottoResult.class); + // } + + @DisplayName("예외1: 로또 리스트가 null이면 예외가 발생한다") + @Test + void test4() { + assertThatThrownBy(() -> new LottoTickets(null)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("[ERROR] 로또 목록이 없습니다."); + } + + @DisplayName("예외2: 로또 리스트가 비어있으면 예외가 발생한다") + @Test + void test5() { + assertThatThrownBy(() -> new LottoTickets(Collections.emptyList())) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("[ERROR] 최소 1개 이상의 로또를 구매해야 합니다."); + } +} \ No newline at end of file diff --git a/src/test/java/lotto/domain/WinningLottoTest.java b/src/test/java/lotto/domain/WinningLottoTest.java index ae043781ae..b62c32889f 100644 --- a/src/test/java/lotto/domain/WinningLottoTest.java +++ b/src/test/java/lotto/domain/WinningLottoTest.java @@ -23,7 +23,7 @@ void test1() { // When WinningLotto winningLotto = new WinningLotto(validWinningLottoNumbers, bonusNumber); - // Then (내부 필드에 대한 직접적인 getter는 없지만, 검증 로직 통과 여부로 확인) + // Then assertThat(winningLotto).isNotNull(); } @@ -108,7 +108,7 @@ void test7() { @Test void test8() { // 당첨 번호: 1, 2, 3, 4, 5, 6 - int bonusNumber = 6; // 중복 + int bonusNumber = 6; assertThatThrownBy(() -> new WinningLotto(validWinningLottoNumbers, bonusNumber)) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("[ERROR] 보너스 번호는 당첨 번호와 중복될 수 없습니다.");