Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 준비준비와 파코님과의 과제입니다 #2

Open
wants to merge 64 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
5d8479e
doc: 기능 명세서 추가
SGKIM94 Apr 12, 2022
eb31a9d
feat: Word에 대한 기능명세서의 테스트 코드 추가 및 클래스 추가
SGKIM94 Apr 12, 2022
f2afbd3
refactor: 불필요한 gitkeep 파일 제거
SGKIM94 Apr 12, 2022
5bab906
doc: 구현한 기능에 대한 체크 추가
SGKIM94 Apr 12, 2022
58b435b
refactor: klint에 대한 컨벤션 적용
SGKIM94 Apr 12, 2022
35852c3
feat: 타일에 대한 기능 명세서 구현 및 테스트 코드 추가
SGKIM94 Apr 12, 2022
6fde073
doc: 구현한 기능에 대한 체크 추가
SGKIM94 Apr 12, 2022
3bb8164
refactor: klint 에 대한 컨벤션 적용
SGKIM94 Apr 12, 2022
6fc2288
refactor: 단어를 비교하여 타일을 전달하는 WordMatcher 추가 및 테스트코드 추가
SGKIM94 Apr 12, 2022
991380a
refactor: Word 내 인덱스 위치에 단어가 존재하는지 찾는 foundAlphabet 함수 및 테스트코드 추가
SGKIM94 Apr 12, 2022
7369f19
refactor: 매직넘버에 대한 상수 추출
SGKIM94 Apr 12, 2022
51876df
doc: 기능 명세를 새로 추가함에 따른 수정
SGKIM94 Apr 13, 2022
7bba0b9
feat: 매칭에 대한 노란색과 회색이 되는 케이스에 대한 로직 및 테스트코드 추가
SGKIM94 Apr 13, 2022
3d994bf
feat: Word 에 알파벳이 포함되는 지에 대한 함수 및 테스트코드 추가
SGKIM94 Apr 13, 2022
050f619
doc: 매칭에 대해 구현한 기능 체크리스트 추가
SGKIM94 Apr 13, 2022
de730f8
feat: 게임을 승리하는 규칙과 실패하는 규칙에 대한 기능 및 테스트코드 추가
SGKIM94 Apr 14, 2022
d9546f3
feat: 시도횟수에 대한 value object 추출 진행
SGKIM94 Apr 14, 2022
3bb172b
refactor: 불필요한 예외 명시 제거 및 private 접근제어자 추가
SGKIM94 Apr 14, 2022
ced063d
doc: 구현된 기능에 대한 명세서 체크리스트 추가
SGKIM94 Apr 14, 2022
759013e
refactor: foundAlphabet -> findAlphabet 변경 및 메서드 추출 진행
SGKIM94 Apr 14, 2022
1d39fa9
refactor: private 접근제어자 추가
SGKIM94 Apr 14, 2022
eb71087
refactor: 가독성을 위한 until로 변경
SGKIM94 Apr 14, 2022
cbf8f74
feat: junit test import 추가
SGKIM94 Apr 14, 2022
8e52fd5
refactor: answer 에 대한 중복된 파라미터로 인해 멤버변수로 전환
SGKIM94 Apr 14, 2022
0a32d12
refactor: 게임 결과에 대해서 타일들을 전달하기 위한 요구사항 구현 및 테스트 코드 추가
SGKIM94 Apr 14, 2022
b06d616
feat: Tiles value object 추가 및 테스트코드 추가
SGKIM94 Apr 14, 2022
79f9e49
refactor: Tiles 추가에 따른 수정
SGKIM94 Apr 14, 2022
c4263dd
refactor: 불필요한 tryCount 제거
SGKIM94 Apr 14, 2022
21a5791
feat: words.txt 의 정답들을 가지는 Answers 추가
SGKIM94 Apr 14, 2022
1d526cd
feat: 입력을 받기 위한 InputView 추가
SGKIM94 Apr 14, 2022
1f4a332
refactor: 결과를 출력하기 위한 resultView 추가
SGKIM94 Apr 14, 2022
ad3d1b5
feat: 게임을 플레이하기 위한 기능 구현
SGKIM94 Apr 14, 2022
6783141
doc: 구현된 기능에 대한 체크리스트 추가
SGKIM94 Apr 14, 2022
5319a1a
refactor: 불필요한 함수 제거
SGKIM94 Apr 14, 2022
6d6d054
refactor: data 를 value class 로 변경
SGKIM94 Apr 14, 2022
e4dfdf0
refactor: 불필요한 선언 제거
SGKIM94 Apr 14, 2022
4ee303d
refactor: MAX_TRY_COUNT 에 대한 상수 추출
SGKIM94 Apr 14, 2022
6cc86be
refactor: List 로 사용할 수 있도록 선언
SGKIM94 Apr 14, 2022
beb1b18
refactor: 타일을 뷰와 분리하기 위한 viewTiles 추가
SGKIM94 Apr 14, 2022
2494155
refactor: 결과에 대한 멘트 수저
SGKIM94 Apr 14, 2022
605b476
refactor: Words 일급 컬렉션 추가
SGKIM94 Apr 14, 2022
dd9930b
refactor: 코틀린 함수 사용하도록 수정
SGKIM94 Apr 14, 2022
828fb34
refactor: 조건문을 간결하게 하도록 수정 및 불필요한 delicate 제거
SGKIM94 Apr 15, 2022
155f16a
refactor: delicate 제거에 따른 수정
SGKIM94 Apr 15, 2022
72ebdb8
feat: 결과물을 만들어내기 위한 Results 클래스 추가 및 테스트 코드 추가
SGKIM94 Apr 15, 2022
f57b1e5
refactor: word 를 매번 생성가능하도록 수정 및 2021.6.19에 대한 상수 추출
SGKIM94 Apr 15, 2022
64f24a9
refactor: klint
SGKIM94 Apr 15, 2022
5bce301
refactor: readlin() 으로 변경
SGKIM94 Apr 15, 2022
e544c0f
refactor: results를 ResultView 에서 가져다 사용하도록 수정
SGKIM94 Apr 15, 2022
c0633eb
refactor: mutableList 제거하기 위한 불변형태로 수정
SGKIM94 Apr 15, 2022
7e67435
refactor: Words 일급컬렉션 추가에 따른 수정 및 테스트코드 추가
SGKIM94 Apr 15, 2022
842c92e
refactor: kotlin extension 함수로 변겨
SGKIM94 Apr 15, 2022
0fcd81e
refactor: 불필요한 println 제거
SGKIM94 Apr 15, 2022
293c4b6
refactor: 코드 리뷰 반영 및 변경 필요한 부분 추가
SGKIM94 Apr 15, 2022
00b8968
feat: Words를 생성하기 위한 WordsCreate 와 MockingCreator 추가하여 테스트할 수 있도록 전략패…
SGKIM94 Apr 17, 2022
8bdfa9d
refactor: require 사용하도록 변경
SGKIM94 Apr 17, 2022
dd25c18
feat: Creator 인터페이스 추가
SGKIM94 Apr 17, 2022
1f0c1bc
refactor: Answers -> Answer 로 이름 변경
SGKIM94 Apr 17, 2022
e4a4a08
refactor: MockingCreator 로 테스트하도록 수정
SGKIM94 Apr 17, 2022
aad4899
refactor: WordsCreator 추가에 따른 수정
SGKIM94 Apr 17, 2022
1f1a3af
refactor: 불필요한 import 제거
SGKIM94 Apr 17, 2022
6ecead7
refactor: klint 적용
SGKIM94 Apr 17, 2022
7305a6a
feat: 위치 값을 저장하는 Position 객체 추가 및 테스트코드 추가
SGKIM94 Apr 17, 2022
d13c866
refactor: Position 추가에 따른 수정
SGKIM94 Apr 17, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,43 @@
- 정답과 답안은 `words.txt`에 존재하는 단어여야 한다.
- 정답은 매일 바뀌며 ((현재 날짜 - 2021년 6월 19일) % 배열의 크기) 번째의 단어이다.


### 기능 명세서
- [X] 단어
- [X] 단어를 만들 수 있다
- [X] 단어는 5글자가 아닌 경우 예외를 던진다
- [X] 단어는 알파벳이어야한다
- [X] 정답은 매일 바뀌며 ((현재 날짜 - 2021년 6월 19일) % 배열의 크기) 번째의 단어이다
- [X] 타일
- [X] 타일은 노란색, 초록색, 회색을 가진다
- [X] 회색 타일은 ⬜, 초록색 타일은 🟩, 노란색 타일은 🟨 값을 가진다
- [ ] 매칭
- [X] 답안과 정답의 한 단어가 위치와 스펠이 같은 경우 초록색이 된다
- [X] 답안과 정답의 한 단어가 위치는 같지만 스펠이 다른 경우 노란색이 된다
- [X] 답안과 정답의 한 단어가 위치도 다르고 스펠도 다른 경우 회색이 된다
- [ ] 답안과 정답의 단어 중 앞서 한 단어가 판별이 난 경우 뒤에 있는 동일한 단어는 판별되지 않는다
- (예 - 정답이 ROYAL인 경우 MOONY를 입력하면 회초회회노 가 결과로 나온다)
- hello가 답이고 llloo 라고 입력하면 GRAY, YELLO, GREEN, GRAY, GREEN 로 나와야한다
- 우선순위가 GREEN -> YELLO -> GRAY 순
Comment on lines +37 to +40

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

가장 중요한 로직에 대한 부분이 아직 구현이 안되었군요! 해당 로직에 대해서 구현해보세요 😊

- [X] 게임
- [X] 5글자의 모든 위치와 스펠을 6번안에 맞추는 경우 게임에 승리한다
- [X] 6번의 기회안에 5글자를 모두 맞추면 성공한다.
- [X] 6번의 기회동안 맞추지 못하면 패배한다
- [X] 5글자의 모든 위치와 스펠이 같지 않은 경우 시도 횟수가 더해진다
- [X] 정답과 답안을 비교하여 결과 타일을 담아 전달한다
- [X] 답안을 입력받는다
- [X] 정답과 답안(단어)는 words.txt 안에 있는 것이어야 한다
- [X] 정답이 words.txt 에 없는 것인 경우 재입력을 받는다
- [X] 정답은 매일 바뀌며 ((현재 날짜 - 2021년 6월 19일) % 배열의 크기) 번째의 단어이다
- [X] 결과를 출력한다
- [X] 결과를 누적해서 보여준다
- [X] 종료 시 시도한 횟수와 총 횟수를 출력한다.

### 입출력 요구 사항

#### 실행 결과 예시


```
WORDLE을 6번 만에 맞춰 보세요.
시도의 결과는 타일의 색 변화로 나타납니다.
Expand Down
Empty file removed src/main/kotlin/.gitkeep
Empty file.
40 changes: 40 additions & 0 deletions src/main/kotlin/wordle/controller/Application.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package wordle.controller

import wordle.domain.Answer
import wordle.domain.Game
import wordle.domain.ResultTiles
import wordle.domain.Position
import wordle.domain.Word
import wordle.utils.WordsCreator
import wordle.view.InputView
import wordle.view.ResultView

private const val LAST_PLAY_COUNT = 6

fun main() {
val game = Game(Answer(WordsCreator(), Position(Answer.ANSWER_POSITION)).answer)

Comment on lines +14 to +16

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Game객체에 Answer의 answer를 주는 게 아닌, Answer만 주도록 변경해 보세요.

ResultView.printInit()

playGame(game)
}

private fun playGame(game: Game) {
val results = ResultTiles()

var tryCount = 0

while (tryCount < LAST_PLAY_COUNT) {
val inputWord = InputView.askWord(WordsCreator.WORDS)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

입력한 글자가 존재하는가에 대한 부분은 뷰에 대한 기능이 아닌, Wordle이라는 게임의 규칙이라고 봅니다. 글자가 존재하는가에 대한 기능을 도메인 로직으로 변경해 보세요.

val resultTiles = game.play(Word(inputWord))
val combined = results.combine(resultTiles)
ResultView.printAllResults(combined.resultTiles)

tryCount++

if (game.isWinner(resultTiles)) {
ResultView.printGamePlayCount(tryCount)
break
}
}
}
19 changes: 19 additions & 0 deletions src/main/kotlin/wordle/domain/Answer.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package wordle.domain

import wordle.utils.Creator
import java.time.LocalDate
import java.time.temporal.ChronoUnit

class Answer(private val creator: Creator, private val position: Position) {
val answer: Word
get() = createAnswer()

fun createAnswer(): Word {
return creator.createWords().findAnswer(position)
}

companion object {
private val SUBTRACT_DATE_FOR_ANSWER = LocalDate.of(2021, 6, 19)
val ANSWER_POSITION = ChronoUnit.DAYS.between(SUBTRACT_DATE_FOR_ANSWER, LocalDate.now()).toInt()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

만약, wordle 게임을 다시 시작할 수 있도록 만들게 될 때, 23시 50분에 게임을 맞히고, 다음날 00시를 지나서 새로운 게임을 시작하게 된다면, ANSWER_POSITION 변경은 언제 이루어질까요? 🤔

}
}
19 changes: 19 additions & 0 deletions src/main/kotlin/wordle/domain/Game.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package wordle.domain

class Game(private val answer: Word) {

fun play(input: Word): Tiles {
val inputChars = input.value.toCharArray()
val wordMatcher = WordMatcher(answer)

return createResultTiles(inputChars, wordMatcher)
}

private fun createResultTiles(inputChars: CharArray, wordMatcher: WordMatcher): Tiles {
return Tiles(inputChars.mapIndexed { index, it -> wordMatcher.match(it.toString(), index) })
}

Comment on lines +11 to +15

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

글자 하나의 비교를 String으로 비교하는 것이 아닌, Char로 비교해 보는 건 어떠실까요?

fun isWinner(resultTiles: Tiles): Boolean {
return resultTiles.isWinner()
}
}
8 changes: 8 additions & 0 deletions src/main/kotlin/wordle/domain/Position.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package wordle.domain

class Position(private val position: Int) {

fun percent(value: Int): Int {
return position % value
}
Comment on lines +5 to +7

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
fun percent(value: Int): Int {
return position % value
}
fun percent(value: Int): Int = position % value

해당 부분도 문(statement) 보다 식(expression)을 사용하면 코드가 간결해집니다.

}
8 changes: 8 additions & 0 deletions src/main/kotlin/wordle/domain/ResultTiles.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package wordle.domain

class ResultTiles(val resultTiles: List<Tiles>) {

constructor(): this(listOf())

Comment on lines +2 to +6

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

기본 값을 설정하는 것만으로도, constructor()를 삭제할 수 있지 않을까요? resultTiles에 대해 기본 값을 설정하도록 변경해 보세요.

fun combine(newResults: Tiles): ResultTiles = ResultTiles(resultTiles + newResults)
}
7 changes: 7 additions & 0 deletions src/main/kotlin/wordle/domain/Tile.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package wordle.domain

enum class Tile {
YELLOW,
GREEN,
GRAY
}
15 changes: 15 additions & 0 deletions src/main/kotlin/wordle/domain/Tiles.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package wordle.domain

@JvmInline
value class Tiles(val tiles: List<Tile>) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ResultTiles와 Words는 일반 class로 이루어져 있는데, 해당 클래스를 value class로 만들어준 이유를 알 수 있을까요?
  • Wordle의 Tiles는 5개로 이루어져 있습니다. Tiles를 만들 때 사이즈가 5개인지 체크하는 로직이 필요해 보입니다. ☺️


fun isWinner(): Boolean {
val count = tiles.count { it == Tile.GREEN }

return count == TOTAL_TILE_COUNT
}
Comment on lines +6 to +10

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kotlin List API를 사용하여 해당 코드를 더 간결하게 만들 수 있지 않을까요?


companion object {
private const val TOTAL_TILE_COUNT = 5
}
}
31 changes: 31 additions & 0 deletions src/main/kotlin/wordle/domain/Word.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package wordle.domain

@JvmInline
value class Word(val value: String) {

Comment on lines +2 to +5
Copy link

@Flamme1004K Flamme1004K Apr 17, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

value class 사용 매우 좋습니다! 👍

init {
require(isWordSizeAndAlphabet()) {
WRONG_WORD_SIZE_MESSAGE
}
}

private fun isWordSizeAndAlphabet() = value.length == WORD_SIZE && ALPHABET_REGEX.matches(value)

Comment on lines +11 to +13

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
private fun isWordSizeAndAlphabet() = value.length == WORD_SIZE && ALPHABET_REGEX.matches(value)
private fun isWordSizeAndAlphabet() :Boolean = (value.length == WORD_SIZE) && ALPHABET_REGEX.matches(value)
  • 함수에다가 리턴 타입을 정하지 않고, 타입 추론을 통해서 자동으로 타입을 추론하게 되면 장단점이 무엇이 있을까요?
  • 비교에 대한 부분은 그룹을 지어서 표현하는 것이 좋습니다.

fun findAlphabet(index: Int): String {
require(index >= FIRST_INDEX && index <= value.length) { INDEX_OUT_RANGE_MESSAGE }

return value[index].toString()
}

fun contains(compareValue: String): Boolean {
return value.contains(compareValue)
}

companion object {
private const val FIRST_INDEX = 0
private const val WORD_SIZE = 5
private const val WRONG_WORD_SIZE_MESSAGE = "5글자여야합니다"
private const val INDEX_OUT_RANGE_MESSAGE = "인덱스 범위를 초과했습니다."
private val ALPHABET_REGEX = Regex("^[a-zA-Z]*$")
}
}
16 changes: 16 additions & 0 deletions src/main/kotlin/wordle/domain/WordMatcher.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package wordle.domain

class WordMatcher(private val answer: Word) {

fun match(alphabet: String, index: Int): Tile {
if (alphabet == answer.findAlphabet(index)) {
return Tile.GREEN
}

if (answer.contains(alphabet)) {
return Tile.YELLOW
}

return Tile.GRAY
}
}
12 changes: 12 additions & 0 deletions src/main/kotlin/wordle/domain/Words.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package wordle.domain

class Words(private val words: List<Word>) {

Comment on lines +2 to +4
Copy link

@Flamme1004K Flamme1004K Apr 17, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

일급 컬렉션을 사용하셨군요! 👍👍

fun findAnswer(position: Position): Word {
return words[position.percent(words.size)]
}

fun contains(value: String): Boolean {
return words.contains(Word(value))
}
Comment on lines +5 to +11
Copy link

@Flamme1004K Flamme1004K Apr 17, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
fun findAnswer(position: Position): Word {
return words[position.percent(words.size)]
}
fun contains(value: String): Boolean {
return words.contains(Word(value))
}
fun findAnswer(position: Position): Word = words[position.percent(words.size)]
fun contains(value: String): Boolean = words.contains(Word(value))

해당 경우에는 문(statement) 보다 간결성을 위하여 식(expression)으로 변경하는 게 좋지 않을까요?

}
8 changes: 8 additions & 0 deletions src/main/kotlin/wordle/utils/Creator.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package wordle.utils

import wordle.domain.Words

interface Creator {

fun createWords(): Words
}
22 changes: 22 additions & 0 deletions src/main/kotlin/wordle/utils/WordsCreator.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package wordle.utils

import wordle.domain.Word
import wordle.domain.Words
import java.io.File

class WordsCreator : Creator {

override fun createWords(): Words {
val wordsFile = read().readLines()
return Words(wordsFile.map { Word(it) })
}

private fun read(): File {
return File(ClassLoader.getSystemResource(ANSWERS_TEXT_PATH).file)
}

companion object {
private const val ANSWERS_TEXT_PATH = "words.txt"
val WORDS = WordsCreator().createWords()
}
Comment on lines +7 to +21

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WordsCreator를 통해서 words 리스트를 가지고 오게 된다면, words에 있는 단어를 가지고 오는 로직과, 답안 및 정답에 대해 체크할 수 있는 로직이 다른 객체에 책임을 가지게 된다고 생각합니다.
WordsCreator가 Words만 만드는 것뿐이 아닌, Word를 가지고 오거나, 답안 및 정답에 대해 있는지 체크할 수 있는 저장소로 만들어보세요.😊

}
22 changes: 22 additions & 0 deletions src/main/kotlin/wordle/view/InputView.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package wordle.view

import wordle.domain.Words

object InputView {

Comment on lines +4 to +6

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

object 클래스를 사용한 view 구현 좋습니다!

fun askWord(words: Words): String {
while (true) {
val input = question()
if (words.contains(input)) {
return input
}

println("올바르지 않은 단어입니다.")
}
}

private fun question(): String {
println("정답을 입력해 주세요.")
return readln()
}
}
39 changes: 39 additions & 0 deletions src/main/kotlin/wordle/view/ResultView.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package wordle.view

import wordle.domain.Tile
import wordle.domain.Tiles

private const val MAX_TRY_COUNT = 6

Comment on lines +5 to +7

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MAX_TRY_COUNT를 object 속이 아닌, 파일 내에 전역으로 선언해놓으신 이유가 있을까요?

object ResultView {

fun printInit() {
println("WORDLE을 ${MAX_TRY_COUNT}번 만에 맞춰 보세요.\n시도의 결과는 타일의 색 변화로 나타납니다.")
}

fun printGamePlayCount(index: Int) {
println("$index /$MAX_TRY_COUNT")
}

fun printAllResults(results: List<Tiles>) {
results.forEach {
printAllTiles(it.tiles)
println()
}
}

private fun printAllTiles(tiles: List<Tile>) {
tiles.forEach { tile ->
print(tile.viewTile())
}
}

private val Tile.viewTile: () -> String
get() = {
when (this) {
Tile.GREEN -> "\uD83D\uDFE9"
Tile.YELLOW -> "\uD83D\uDFE8"
Tile.GRAY -> "⬜"
}
}
Comment on lines +31 to +38

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

viewTile을 일급 함수로 만든 이유를 알 수 있을까요? 제 생각으로는 충분히 함수로도 표현이 가능하다고 생각합니다.

}
Empty file removed src/test/kotlin/.gitkeep
Empty file.
19 changes: 19 additions & 0 deletions src/test/kotlin/wordle/domain/GameTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package wordle.domain

import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test

class GameTest {

@Test
fun `6번의 기회안에 5글자를 모두 맞추면 성공한다`() {
val givenAnswer = Word("words")
Comment on lines +8 to +10

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'6번의 기회안에 5글자를 모두 맞추면 성공한다' 라는 것보다는 '정답과 답안이 일치하면 게임이 끝난다'가 좋을 것 같습니다!

추가로, 7번 이상 입력했을 때의 테스트 케이스도 만들어 보시는 게 어떠신가요?

val game = Game(givenAnswer)
val givenInput = Word("words")

val result = game.play(givenInput)
val isWinner = game.isWinner(result)

assertThat(isWinner).isTrue
}
}
10 changes: 10 additions & 0 deletions src/test/kotlin/wordle/domain/MockingCreator.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package wordle.domain

import wordle.utils.Creator

class MockingCreator : Creator {

override fun createWords(): Words {
return Words(listOf(Word("queen"), Word("chunk"), Word("awake")))
}
}
Comment on lines +5 to +10

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Words.txt를 읽어들여서 테스트를 하는 게 아닌, 목 데이터를 이용하여 테스트를 하셨군요! 👍👍👍

16 changes: 16 additions & 0 deletions src/test/kotlin/wordle/domain/PositionTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package wordle.domain

import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.CsvSource

class PositionTest {

@ParameterizedTest
@CsvSource("10, 20, 10", "2, 5, 2", "0, 5, 0")
fun `위치 값과 전달받은 분모값을 나눈다`(positionValue: Int, denominator: Int, expected: Int) {
val position = Position(positionValue)

assertThat(position.percent(denominator)).isEqualTo(expected)
}
}
20 changes: 20 additions & 0 deletions src/test/kotlin/wordle/domain/ResultsTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package wordle.domain

import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test

class ResultsTest {

@Test
fun `기존에_존재하는_결과타일에_타일결과를_추가한다`() {
val results = ResultTiles()

val firstCombined = results.combine(Tiles(listOf(Tile.YELLOW, Tile.YELLOW, Tile.YELLOW, Tile.GRAY, Tile.YELLOW)))
val secondCombined = firstCombined.combine(Tiles(listOf(Tile.GREEN, Tile.GRAY, Tile.GREEN, Tile.GRAY, Tile.YELLOW)))

assertThat(secondCombined.resultTiles).containsExactly(
Tiles(listOf(Tile.YELLOW, Tile.YELLOW, Tile.YELLOW, Tile.GRAY, Tile.YELLOW)),
Tiles(listOf(Tile.GREEN, Tile.GRAY, Tile.GREEN, Tile.GRAY, Tile.YELLOW))
)
}
}
Loading