-
Notifications
You must be signed in to change notification settings - Fork 412
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
[Step4] 자동차 경주 #1529
base: be-student
Are you sure you want to change the base?
[Step4] 자동차 경주 #1529
Changes from all commits
0dfdd49
3c8cc6a
31f5a03
cc2445e
35809a8
47f4885
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,6 @@ | ||
# kotlin-racingcar | ||
# kotlin-racingcar | ||
|
||
## 기능목록 | ||
|
||
- [x] 자동차 이름 입력받는다 | ||
- [x] 우승자를 선정한다 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
#!/bin/sh | ||
|
||
######## KTLINT-GRADLE HOOK START ######## | ||
|
||
CHANGED_FILES="$(git --no-pager diff --name-status --no-color --cached | awk '$1 != "D" && $2 ~ /\.kts|\.kt/ { print $2}')" | ||
|
||
if [ -z "$CHANGED_FILES" ]; then | ||
echo "No Kotlin staged files." | ||
exit 0 | ||
fi; | ||
|
||
echo "Running ktlint over these files:" | ||
echo "$CHANGED_FILES" | ||
|
||
./gradlew --quiet ktlintFormat -PinternalKtlintGitFilter="$CHANGED_FILES" | ||
|
||
echo "Completed ktlint run." | ||
|
||
echo "$CHANGED_FILES" | while read -r file; do | ||
if [ -f $file ]; then | ||
git add $file | ||
fi | ||
done | ||
|
||
echo "Completed ktlint hook." | ||
######## KTLINT-GRADLE HOOK END ######## |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,15 @@ | ||
package racingcar | ||
|
||
fun main() { | ||
val numberOfCars = InputView.inputNumberOfCars() | ||
val numberOfMoves = InputView.inputNumberOfMoves() | ||
val cars = initializeCars() | ||
|
||
val movedCars = moveCars(cars) | ||
val winners = RacingRule.findWinners(movedCars) | ||
OutputView.printWinners(winners) | ||
} | ||
|
||
val cars = Cars.initializeWithNumberOfCars(numberOfCars, RandomPowerGenerator) | ||
private fun moveCars(cars: Cars): Cars { | ||
val numberOfMoves = InputView.inputNumberOfMoves() | ||
|
||
OutputView.printResultTitle() | ||
|
||
|
@@ -13,4 +18,11 @@ fun main() { | |
movedCars = movedCars.move() | ||
OutputView.printResult(movedCars.cars) | ||
} | ||
return movedCars | ||
} | ||
|
||
private fun initializeCars(): Cars { | ||
val numberOfCars = InputView.inputNumberOfCars() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이번 단계에서는 자동차 대수에 대한 입력은 받지 않습니다. 따라서 현재 전체적으로 프로그램이 제대로 동작하지 않습니다. 수정 후 다시 리뷰 요청 드립니다. |
||
val namesOfCars = InputView.inputNameOfCars() | ||
return Cars.initialize(numberOfCars, namesOfCars, RandomPowerGenerator) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package racingcar | ||
|
||
object RacingRule { | ||
|
||
fun findWinners(cars: Cars): List<Car> { | ||
val maxPosition = cars.cars.maxBy { it.position }.position | ||
return cars.cars.filter { it.position == maxPosition } | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,25 +7,34 @@ import org.junit.jupiter.params.ParameterizedTest | |
import org.junit.jupiter.params.provider.ValueSource | ||
|
||
internal class CarTest { | ||
@Test | ||
fun `자동차의 이름은 1자 이상이어야 한다`() { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 결과적으로 예외 처리를 하네요. 그러면 정확한 동작을 기술하면'자동차 이름이 공백("")일 경우 예외가 발생한다.' 정도로 하면 더 명확하게 테스트 내용을 이해하는데 도움이 될 것 같다는 생각이 드네요. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 아하 글자수보다는 훨씬 더 직관적이겠네요 감사합니다! 👍 |
||
assertThrows<IllegalArgumentException> { Car("") } | ||
} | ||
|
||
@Test | ||
fun `자동차의 이름은 5자 이하여야 한다`() { | ||
assertThrows<IllegalArgumentException> { Car("123456") } | ||
} | ||
|
||
@Test | ||
fun `자동차는 4 이상이 들어오면 움직인다`() { | ||
val car = Car() | ||
val car = Car("name") | ||
val result = car.move(4) | ||
assertThat(result.position).isOne() | ||
} | ||
|
||
@Test | ||
fun `자동차는 4 미만이 들어오면 움직이지 않는다`() { | ||
val car = Car() | ||
val car = Car("name") | ||
val result = car.move(3) | ||
assertThat(result.position).isZero() | ||
} | ||
|
||
@ParameterizedTest | ||
@ValueSource(ints = [-1, 10]) | ||
fun `자동차는 0 이상 9 이하의 값만 가능하다`(power: Int) { | ||
val car = Car() | ||
val car = Car("name") | ||
|
||
assertThrows<IllegalArgumentException> { | ||
car.move(power) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package racingcar | ||
|
||
import org.assertj.core.api.Assertions.assertThat | ||
import org.junit.jupiter.api.Test | ||
|
||
internal class RacingRuleTest { | ||
|
||
@Test | ||
fun `Cars 가 들어오면 우승자를 가려낼 수 있다`() { | ||
val cars = Cars(listOf(Car("aa", 2), Car("a", 1)), FixedPowerGenerator(5)) | ||
|
||
val result = RacingRule.findWinners(cars) | ||
|
||
assertThat(result).usingRecursiveComparison().isEqualTo(listOf(Car("aa", 2))) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
View에서 바로 입력 값에 대한 가공을 하셨네요. 이건 참 사람마다 의견이 나뉠 수 있는 부분이라고 생각해요. 그런데 이런 처리까지 View에서 한다면 입력 받고 split 하면서 바로 이름에 대한 사이즈 검증도 하면 되지 않나? 라는 생각이 들기도 하네요. 어떤 부분은 View에서 직접 처리하고 어떤 부분은 별도 객체에서 처리할 지 결정한 기준이 있으신가요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"자동차 n 대가 있으면 이름이 n 개 있어야 해" 라는 로직은 비즈니스 로직쪽에 더 가까울 것 같아서, 제거했고, split 같이 단순하게 처리하기 편하게 하기 위한 것들은 그냥 view 에서 처리하는 방향으로 하려고 했어요
입력을 처리하기 위한 편의성의 여부에 따라 달라질 것 같아요