diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..11bd9d2 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +## πŸ“‘ κΈ°λŠ₯ μš”κ΅¬ 사항 + +**μž…λ ₯** + +- [x] μ°Έμ„μžλ“€μ˜ 이름을 μž…λ ₯ λ°›λŠ”λ‹€ + - [x] `,` 둜 κ΅¬λΆ„ν•œλ‹€. + - [x] ν•œκΈ€μ΄ μ•„λ‹ˆλΌλ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€. + - [x] 이름은 쀑볡될 수 μ—†λ‹€. +- [x] μ΅œλŒ€ 짝(κ·Έλ£Ή) 인원 수λ₯Ό μž…λ ₯ λ°›λŠ”λ‹€. + - [x] μˆ«μžκ°€ μ•„λ‹ˆλΌλ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€. + - [x] 이름 수 < μ΅œλŒ€ 짝(κ·Έλ£Ή) 인원 수인 경우 μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€. +- [x] μž¬μΆ”μ²œ μ—¬λΆ€λ₯Ό μž…λ ₯ λ°›λŠ”λ‹€. + - [x] `y` λ˜λŠ” `n` κ°€ μ•„λ‹ˆλΌλ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€. + +**좜λ ₯** + +- [x] 짝 μΆ”μ²œ κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€ + - [x] `[ 이름1 | ... | 이름2 ]` ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. +- [x] μ˜ˆμ™ΈλŠ” `[ERROR]`와 λ©”μ‹œμ§€λ₯Ό ν•¨κ»˜ 좜λ ₯ν•œλ‹€. + +**μ‚¬λžŒ** + +- [x] 이름은 5κΈ€μž 이내이닀. + +**짝** + +- [x] μ΅œλŒ€ 짝 μˆ˜λŠ” μ‚¬λžŒ μˆ˜λ³΄λ‹€ μž‘κ±°λ‚˜ κ°™μ•„μ•Ό ν•œλ‹€. + +**λ§€μΉ­** + +- [x] 랜덀으둜 λ§€μΉ­ν•œλ‹€. \ No newline at end of file diff --git a/src/main/java/leets/leets_mate/LeetsMateApplication.java b/src/main/java/leets/leets_mate/LeetsMateApplication.java index e48ce2b..e85d0f6 100644 --- a/src/main/java/leets/leets_mate/LeetsMateApplication.java +++ b/src/main/java/leets/leets_mate/LeetsMateApplication.java @@ -1,42 +1,11 @@ package leets.leets_mate; -import java.util.*; +import leets.leets_mate.controller.Computer; public class LeetsMateApplication { - // λ™μž‘ ν•¨μˆ˜μž…λ‹ˆλ‹€. - public void run() { - } - - // λ¬Έμžμ—΄λ‘œλœ 멀버듀을 리슀트둜 λΆ„λ¦¬ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. - public List parseMembers(String members) { - return new ArrayList<>(); - } - - // 총 λ©€λ²„μˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. - public int memberNumber(List members) { - return 0; - } - - // 멀버 λ¬Έμžμ—΄μ— μ˜μ–΄κ°€ μžˆλŠ”μ§€ κ²€μ‚¬ν•©λ‹ˆλ‹€. μ˜μ–΄κ°€ μžˆλ‹€λ©΄ μ˜ˆμ™Έ 좜λ ₯ - public void checkHasNoEnglish(String members) { - } - - // λ©€λ²„μˆ˜μ™€ μ΅œλŒ€ 짝수 데이터가 μœ νš¨ν•œμ§€ κ²€μ‚¬ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. μœ νš¨ν•˜μ§€ μ•Šλ‹€λ©΄ μ˜ˆμ™Έ 좜λ ₯ - public void checkDataValidity(int memberCount, int maximumGroupSize) { - } - - // 랜덀 짝꿍 μΆ”μ²¨ν•˜λŠ” ν•¨μˆ˜ μž…λ‹ˆλ‹€. - public List> generateRandomGroups(List memberList, int maximumGroupSize) { - return new ArrayList<>(); - } - - // κ²°κ³Όλ₯Ό ν”„λ¦°νŠΈ ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. - public void printResult(List> result) { - } - public static void main(String[] args) { - LeetsMateApplication app = new LeetsMateApplication(); - app.run(); + Computer computer = new Computer(); + computer.run(); } } \ No newline at end of file diff --git a/src/main/java/leets/leets_mate/controller/Computer.java b/src/main/java/leets/leets_mate/controller/Computer.java new file mode 100644 index 0000000..dc0310b --- /dev/null +++ b/src/main/java/leets/leets_mate/controller/Computer.java @@ -0,0 +1,69 @@ +package leets.leets_mate.controller; + +import leets.leets_mate.domain.*; +import leets.leets_mate.view.InputView; +import leets.leets_mate.view.OutputView; + +import java.util.List; + +public class Computer { + + private final InputView inputView = new InputView(); + private final OutputView outputView = new OutputView(); + + public void run() { + outputView.printStartNotice(); + Names names = readNames(); + PairCount pairCount = readPairCount(names.countNames()); + + PairMatcher pairMatcher = new PairMatcher(pairCount, new RandomNumbersGenerator()); + matchPairs(pairMatcher, names); + outputView.printEndNotice(); + } + + private void matchPairs(PairMatcher pairMatcher, Names names) { + List pairs = pairMatcher.match(names); + printPairMatchResult(pairs); + + RetryOpinion retryOpinion = readRetry(); + if (retryOpinion.isContinue()) { + outputView.printBreakLine(); + matchPairs(pairMatcher, names); + } + } + + private void printPairMatchResult(List pairs) { + outputView.printPairMatchResultNotice(); + pairs.forEach(pair -> outputView.printPairMatchResult(pair.names())); + outputView.printPairMatchFinishNotice(); + } + + private Names readNames() { + List rawNames = inputView.readNames(); + try { + List names = rawNames.stream() + .map(Name::new) + .toList(); + return new Names(names); + } catch (IllegalArgumentException e) { + outputView.printError(e.getMessage()); + return readNames(); + } + } + + private PairCount readPairCount(int namesCount) { + int pairCount = inputView.readPairCount(); + try { + new PairCountValidator().validate(pairCount, namesCount); + return new PairCount(pairCount); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return readPairCount(namesCount); + } + } + + private RetryOpinion readRetry() { + String input = inputView.readRetry(); + return RetryOpinion.match(input); + } +} diff --git a/src/main/java/leets/leets_mate/domain/Name.java b/src/main/java/leets/leets_mate/domain/Name.java new file mode 100644 index 0000000..01edd9e --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/Name.java @@ -0,0 +1,39 @@ +package leets.leets_mate.domain; + +import java.util.Objects; + +public class Name { + + private static final int MAX_LENGTH = 5; + private static final String ERROR_FORMAT = "[ERROR] 이름은 %d자 μ΄ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€."; + + private final String name; + + public Name(String name) { + validate(name); + this.name = name; + } + + private void validate(String name) { + if (name.length() > MAX_LENGTH) { + throw new IllegalArgumentException(String.format(ERROR_FORMAT, MAX_LENGTH)); + } + } + + public String asString() { + return name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Name name = (Name) o; + return Objects.equals(this.name, name.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } +} diff --git a/src/main/java/leets/leets_mate/domain/Names.java b/src/main/java/leets/leets_mate/domain/Names.java new file mode 100644 index 0000000..864586d --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/Names.java @@ -0,0 +1,50 @@ +package leets.leets_mate.domain; + +import java.util.List; +import java.util.Objects; + +public class Names { + + private static final int MIN_SIZE = 2; + private static final String ERROR_FORMAT = "[ERROR] 이름은 %d개 이상이어야 ν•©λ‹ˆλ‹€."; + + private final List names; + + public Names(List names) { + validate(names); + this.names = names; + } + + private void validate(List names) { + if (names.size() < MIN_SIZE) { + throw new IllegalArgumentException(String.format(ERROR_FORMAT, MIN_SIZE)); + } + } + + public int countNames() { + return names.size(); + } + + public List findByIndexes(List indexes) { + return indexes.stream() + .map(names::get) + .toList(); + } + + public List findByIndexes(RandomNumbers randomNumbers) { + return randomNumbers.findNames(names); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Names names = (Names) o; + return Objects.equals(this.names, names.names); + } + + @Override + public int hashCode() { + return Objects.hash(names); + } +} diff --git a/src/main/java/leets/leets_mate/domain/Pair.java b/src/main/java/leets/leets_mate/domain/Pair.java new file mode 100644 index 0000000..87c2cba --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/Pair.java @@ -0,0 +1,32 @@ +package leets.leets_mate.domain; + +import java.util.List; +import java.util.Objects; + +public class Pair { + + private final List names; + + public Pair(List names) { + this.names = names; + } + + public List names() { + return names.stream() + .map(Name::asString) + .toList(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Pair pair = (Pair) o; + return Objects.equals(names, pair.names); + } + + @Override + public int hashCode() { + return Objects.hash(names); + } +} diff --git a/src/main/java/leets/leets_mate/domain/PairCount.java b/src/main/java/leets/leets_mate/domain/PairCount.java new file mode 100644 index 0000000..2d641e6 --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/PairCount.java @@ -0,0 +1,14 @@ +package leets.leets_mate.domain; + +public class PairCount { + + private final int value; + + public PairCount(int value) { + this.value = value; + } + + public int value() { + return value; + } +} diff --git a/src/main/java/leets/leets_mate/domain/PairCountValidator.java b/src/main/java/leets/leets_mate/domain/PairCountValidator.java new file mode 100644 index 0000000..f20d0b5 --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/PairCountValidator.java @@ -0,0 +1,13 @@ +package leets.leets_mate.domain; + +public class PairCountValidator { + + private static final int MIN_COUNT = 2; + private static final String ERROR_FORMAT = "[ERROR] μ΅œλŒ€ 짝 μˆ˜λŠ” %d 이상, 이름 수 μ΄ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€."; + + public void validate(int maxCount, int namesCount) { + if (maxCount < MIN_COUNT || maxCount > namesCount) { + throw new IllegalArgumentException(String.format(ERROR_FORMAT, MIN_COUNT)); + } + } +} diff --git a/src/main/java/leets/leets_mate/domain/PairMatcher.java b/src/main/java/leets/leets_mate/domain/PairMatcher.java new file mode 100644 index 0000000..fcdc32a --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/PairMatcher.java @@ -0,0 +1,23 @@ +package leets.leets_mate.domain; + +import java.util.List; + +public class PairMatcher { + + private final PairCount pairCount; + private final RandomNumbersGenerator randomNumbersGenerator; + + public PairMatcher(PairCount pairCount, RandomNumbersGenerator randomNumbersGenerator) { + this.pairCount = pairCount; + this.randomNumbersGenerator = randomNumbersGenerator; + } + + public List match(Names names) { + RandomNumbers randomNumbers = randomNumbersGenerator.randomNumbers(names.countNames()); + List splitRandomNumbers = randomNumbers.splitBySize(pairCount.value()); + return splitRandomNumbers.stream() + .map(names::findByIndexes) + .map(Pair::new) + .toList(); + } +} diff --git a/src/main/java/leets/leets_mate/domain/RandomNumbers.java b/src/main/java/leets/leets_mate/domain/RandomNumbers.java new file mode 100644 index 0000000..cfa98b4 --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/RandomNumbers.java @@ -0,0 +1,27 @@ +package leets.leets_mate.domain; + +import java.util.List; +import java.util.stream.IntStream; + +public class RandomNumbers { + + private final List values; + + public RandomNumbers(List values) { + this.values = values; + } + + public List splitBySize(int size) { + int length = values.size(); + return IntStream.iterate(0, i -> i < length, i -> i + size) + .mapToObj(i -> values.subList(i, Math.min(i + size, length))) + .map(RandomNumbers::new) + .toList(); + } + + public List findNames(List names) { + return values.stream() + .map(names::get) + .toList(); + } +} diff --git a/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java b/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java new file mode 100644 index 0000000..a3096a8 --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/RandomNumbersGenerator.java @@ -0,0 +1,17 @@ +package leets.leets_mate.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.IntStream; + +public class RandomNumbersGenerator { + + public RandomNumbers randomNumbers(int bound) { + List randomNumbers = new ArrayList<>(IntStream.range(0, bound) + .boxed() + .toList()); + Collections.shuffle(randomNumbers); + return new RandomNumbers(randomNumbers); + } +} diff --git a/src/main/java/leets/leets_mate/domain/RetryOpinion.java b/src/main/java/leets/leets_mate/domain/RetryOpinion.java new file mode 100644 index 0000000..e88ad93 --- /dev/null +++ b/src/main/java/leets/leets_mate/domain/RetryOpinion.java @@ -0,0 +1,28 @@ +package leets.leets_mate.domain; + +import java.util.Arrays; + +public enum RetryOpinion { + + CONTINUE("y", true), + STOP("n", false); + + private final String input; + private final boolean hasRetry; + + RetryOpinion(String input, boolean hasRetry) { + this.input = input; + this.hasRetry = hasRetry; + } + + public static RetryOpinion match(String input) { + return Arrays.stream(values()) + .filter(retryOpinion -> retryOpinion.input.equals(input)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("μœ νš¨ν•˜μ§€ μ•Šμ€ κ°’μž…λ‹ˆλ‹€.")); + } + + public boolean isContinue() { + return this.hasRetry; + } +} diff --git a/src/main/java/leets/leets_mate/view/InputView.java b/src/main/java/leets/leets_mate/view/InputView.java new file mode 100644 index 0000000..0e9580d --- /dev/null +++ b/src/main/java/leets/leets_mate/view/InputView.java @@ -0,0 +1,76 @@ +package leets.leets_mate.view; + +import java.util.List; +import java.util.Scanner; +import java.util.regex.Pattern; + +public class InputView { + + public static final String COMMA = ","; + public static final Pattern NAME_FORMAT = Pattern.compile("^[γ„±-γ…Ž|κ°€-힣]+$"); + public static final Pattern RETRY_FORMAT = Pattern.compile("^[y|n]$"); + public static final String ERROR_FORMAT = "[ERROR] %s"; + + private final Scanner scanner = new Scanner(System.in); + + public List readNames() { + System.out.println(); + System.out.println("λ©€λ²„μ˜ 이름을 μž…λ ₯ν•΄ μ£Όμ„Έμš”. (, 둜 ꡬ뢄)"); + + String input = scanner.nextLine(); + List rawNames = List.of(input.split(COMMA, -1)); + try { + rawNames.forEach(this::validateInput); + return rawNames; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return readNames(); + } + } + + private void validateInput(String rawName) { + if (!NAME_FORMAT.matcher(rawName).matches()) { + throw new IllegalArgumentException(String.format(ERROR_FORMAT, "ν•œκΈ€λ§Œ μž…λ ₯ν•΄ μ£Όμ„Έμš”.")); + } + } + + public int readPairCount() { + System.out.println(); + System.out.println("μ΅œλŒ€ 짝 수λ₯Ό μž…λ ₯ν•΄ μ£Όμ„Έμš”."); + + String input = scanner.nextLine(); + try { + return parseToInt(input); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return readPairCount(); + } + } + + private int parseToInt(String input) { + try { + return Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(String.format(ERROR_FORMAT, "숫자λ₯Ό μž…λ ₯ν•΄ μ£Όμ„Έμš”.")); + } + } + + public String readRetry() { + System.out.print("λ‹€μ‹œ κ΅¬μ„±ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? (y or n): "); + + String input = scanner.nextLine(); + try { + validate(input); + return input; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return readRetry(); + } + } + + private void validate(String input) { + if (!RETRY_FORMAT.matcher(input).matches()) { + throw new IllegalArgumentException("잘λͺ»λœ μž…λ ₯μž…λ‹ˆλ‹€."); + } + } +} diff --git a/src/main/java/leets/leets_mate/view/OutputView.java b/src/main/java/leets/leets_mate/view/OutputView.java new file mode 100644 index 0000000..87896dc --- /dev/null +++ b/src/main/java/leets/leets_mate/view/OutputView.java @@ -0,0 +1,41 @@ +package leets.leets_mate.view; + +import java.util.List; +import java.util.StringJoiner; + +public class OutputView { + + public void printStartNotice() { + System.out.println("[Leets 였늘의 μ§μ—κ²Œ]λ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€."); + } + + public void printPairMatchResultNotice() { + System.out.println(); + System.out.println("였늘의 짝 μΆ”μ²œ κ²°κ³Όμž…λ‹ˆλ‹€."); + } + + public void printPairMatchResult(List pairs) { + StringJoiner stringJoiner = new StringJoiner(" | ", "[ ", " ]"); + for (String pair : pairs) { + stringJoiner.add(pair); + } + System.out.println(stringJoiner); + } + + public void printPairMatchFinishNotice() { + System.out.println(); + System.out.println("μΆ”μ²œμ„ μ™„λ£Œν–ˆμŠ΅λ‹ˆλ‹€."); + } + + public void printBreakLine() { + System.out.println("--------------------------------"); + } + + public void printEndNotice() { + System.out.println("자리λ₯Ό 이동해 μ„œλ‘œμ—κ²Œ μΈμ‚¬ν•΄μ£Όμ„Έμš”."); + } + + public void printError(String message) { + System.out.println(message); + } +} diff --git a/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java b/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java index 706e295..d359a28 100644 --- a/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java +++ b/src/test/java/leets/leets_mate/LeetsMateApplicationTests.java @@ -1,47 +1,4 @@ package leets.leets_mate; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; - class LeetsMateApplicationTests { - LeetsMateApplication app; - - @BeforeEach - void setUp() { - app = new LeetsMateApplication(); - } - - @Test - void μž…λ ₯받은_λ¬Έμžμ—΄μ„_νŒŒμ‹±ν•˜μ—¬_리슀트둜_λ§Œλ“ λ‹€() { - String members = "리츠에,μ˜€μ‹ ,κ±Έ,ν™˜μ˜ν•©λ‹ˆλ‹€"; - List actual = app.parseMembers(members); - assertThat(actual).containsExactly("리츠에", "μ˜€μ‹ ", "κ±Έ", "ν™˜μ˜ν•©λ‹ˆλ‹€"); - } - - @Test - void λ©€λ²„μˆ˜λ₯Ό_λ°˜ν™˜ν•œλ‹€() { - List members = Arrays.asList("리츠에", "μ˜€μ‹ ", "κ±Έ", "ν™˜μ˜ν•©λ‹ˆλ‹€"); - int actual = app.memberNumber(members); - assertThat(actual).isEqualTo(4); - } - - @Test - void λ©€λ²„μˆ˜μ™€_μ΅œλŒ€_λ©€λ²„μˆ˜λ₯Ό_잘λͺ»_μž…λ ₯ν•œ_경우_μ˜ˆμ™Έλ₯Ό_λ°˜ν™˜ν•œλ‹€() { - assertThrows(Exception.class, () -> { - app.checkDataValidity(3, 4); - }); - } - - @Test - void 멀버_λ¬Έμžμ—΄μ—_μ˜μ–΄λ₯Ό_μž…λ ₯ν•œ_경우_μ˜ˆμ™Έλ₯Ό_λ°˜ν™˜ν•œλ‹€() { - assertThrows(Exception.class, () -> { - app.checkHasNoEnglish("welcome,to,leets"); - }); - } } \ No newline at end of file diff --git a/src/test/java/leets/leets_mate/domain/NameTest.java b/src/test/java/leets/leets_mate/domain/NameTest.java new file mode 100644 index 0000000..590e1a3 --- /dev/null +++ b/src/test/java/leets/leets_mate/domain/NameTest.java @@ -0,0 +1,16 @@ +package leets.leets_mate.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +public class NameTest { + + @Test + @DisplayName("μ΄λ¦„μ˜ 길이가 6κΈ€μž 이상이라면 μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + void name_InvalidLength_ExceptionThrown() { + assertThatIllegalArgumentException() + .isThrownBy(() -> new Name("λ‚˜μ•„μ—°μ΄λΌλŠ₯")); + } +} diff --git a/src/test/java/leets/leets_mate/domain/NamesTest.java b/src/test/java/leets/leets_mate/domain/NamesTest.java new file mode 100644 index 0000000..ff424aa --- /dev/null +++ b/src/test/java/leets/leets_mate/domain/NamesTest.java @@ -0,0 +1,32 @@ +package leets.leets_mate.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class NamesTest { + + private final Names names = new Names(List.of( + new Name("μ•„μ—°"), + new Name("λ‚˜μ•„μ—°"), + new Name("λ‚˜λ‚˜μ•„μ—°"), + new Name("λ‚˜λ‚˜λ‚˜μ•„μ—°") + )); + + @Test + @DisplayName("이름 수λ₯Ό λ°˜ν™˜ν•œλ‹€.") + void countNames() { + assertThat(names.countNames()).isEqualTo(4); + } + + @Test + @DisplayName("ν•΄λ‹Ή μœ„μΉ˜μ— μ‘΄μž¬ν•˜λŠ” 이름을 λ°˜ν™˜ν•œλ‹€.") + void findByIndexes() { + List namesByIndexes = names.findByIndexes(List.of(1, 3)); + + assertThat(namesByIndexes).containsOnly(new Name("λ‚˜μ•„μ—°"), new Name("λ‚˜λ‚˜λ‚˜μ•„μ—°")); + } +} diff --git a/src/test/java/leets/leets_mate/domain/PairMatcherTest.java b/src/test/java/leets/leets_mate/domain/PairMatcherTest.java new file mode 100644 index 0000000..a26b61d --- /dev/null +++ b/src/test/java/leets/leets_mate/domain/PairMatcherTest.java @@ -0,0 +1,64 @@ +package leets.leets_mate.domain; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class PairMatcherTest { + + private final Name name1 = new Name("μ•„μ—°"); + private final Name name2 = new Name("λ‚˜μ•„μ—°"); + private final Name name3 = new Name("λ‚˜λ‚˜μ•„μ—°"); + private final Name name4 = new Name("λ‚˜λ‚˜λ‚˜μ•„μ—°"); + private Names names; + + @BeforeEach + void setUp() { + + names = new Names( + List.of(name1, name2, name3, name4) + ); + } + + @Test + @DisplayName("λ‚˜λ¨Έμ§€ 없이 랜덀으둜 짝을 λ§€μΉ˜ν•œλ‹€.") + void pairMatcher_Multiple() { + PairMatcher pairMatcher = new PairMatcher(new PairCount(2), new RandomNumbersGenerator() { + + @Override + public RandomNumbers randomNumbers(int bound) { + return new RandomNumbers(List.of(0, 3, 1, 2)); + } + }); + + List pairs = pairMatcher.match(names); + + assertThat(pairs).containsOnly( + new Pair(List.of(name1, name4)), + new Pair(List.of(name2, name3)) + ); + } + + @Test + @DisplayName("λ‚˜λ¨Έμ§€κ°€ μžˆμ–΄λ„ 랜덀으둜 짝을 λ§€μΉ˜ν•œλ‹€.") + void pairMatcher_overNamesCount_ExceptionThrown() { + PairMatcher pairMatcher = new PairMatcher(new PairCount(3), new RandomNumbersGenerator() { + + @Override + public RandomNumbers randomNumbers(int bound) { + return new RandomNumbers(List.of(0, 3, 1, 2)); + } + }); + + List pairs = pairMatcher.match(names); + + assertThat(pairs).containsOnly( + new Pair(List.of(name1, name4, name2)), + new Pair(List.of(name3)) + ); + } +}