Skip to content
New issue

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

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

Already on GitHub? # to your account

[2단계 - 자동차 경주 리팩토링] 에버(손채영) 미션 제출합니다. #791

Merged
merged 10 commits into from
Feb 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 1 addition & 3 deletions src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import domain.RacingGame;
import view.InputView;
import view.MessageResolver;
import view.OutputView;

public class Main {
public static void main(String[] args) {
InputView inputView = new InputView();
MessageResolver messageResolver = new MessageResolver();
OutputView outputView = new OutputView(messageResolver);
OutputView outputView = new OutputView();
RacingGame racingGame = new RacingGame(inputView, outputView);

racingGame.run();
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/domain/Car.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ public static Car of(String name, int position) {
}

public Integer getPosition() {
return this.position.getPosition();
return position.getPosition();
}

public String getCarName() {
return this.carName.getCarName();
return carName.getCarName();
}

public void tryMove() {
Expand All @@ -33,7 +33,7 @@ public void tryMove() {
}

private boolean canMove() {
return powerStrategy.checkRandomNumberRange();
return powerStrategy.canMove();
}

private void move() {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/domain/CarName.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public static CarName from(String carName) {
}

private void validate(String carName) {
if (carName.length() > LIMIT_LENGTH) {
if (carName.length() > LIMIT_LENGTH || carName.isEmpty()) {
throw new IllegalArgumentException(ERROR_OF_LENGTH);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/domain/Position.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ private void validate(int position) {
}

public int getPosition() {
return this.position;
return position;
}

public void increase() {
Expand Down
11 changes: 0 additions & 11 deletions src/main/java/domain/PowerGenerator.java

This file was deleted.

19 changes: 19 additions & 0 deletions src/main/java/domain/PowerManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package domain;

import java.util.Random;

public class PowerManager {
Copy link

Choose a reason for hiding this comment

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

PowerManager 👍🏻
객체 책임을 분리한 덕분에 랜덤 값에 대한 테스트가 가능해졌네요!

Copy link
Member Author

Choose a reason for hiding this comment

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

맞습니다 랜덤 값 테스트를 위해 많이 고민해보았어요.
저의 설계에 100%의 확신이 없었는데 확신이 생겼네요 감사합니다 😊


private static final Integer MIN = 0;
private static final Integer MAX = 9;
private static final Integer THRESHOLD = 4;

public Integer generatePower() {
Random random = new Random();
return random.nextInt(MAX - MIN + 1);
}

public boolean isSufficientPower(int power) {
return THRESHOLD <= power;
}
}
12 changes: 5 additions & 7 deletions src/main/java/domain/PowerStrategy.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,18 @@

public class PowerStrategy {

private static final Integer THRESHOLD = 4;

private final PowerGenerator powerGenerator;
private final PowerManager powerManager;

private PowerStrategy() {
this.powerGenerator = new PowerGenerator();
this.powerManager = new PowerManager();
}

public static PowerStrategy from() {
return new PowerStrategy();
}

public boolean checkRandomNumberRange() {
Integer randomNumber = powerGenerator.makeRandomNumber();
return THRESHOLD <= randomNumber;
public boolean canMove() {
Integer randomNumber = powerManager.generatePower();
return powerManager.isSufficientPower(randomNumber);
}
}
9 changes: 2 additions & 7 deletions src/main/java/util/StringParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,9 @@ public static List<String> split(String target, String delimiter) {
}

public static Integer parseToInt(String target) {
validateNumeric(target);
return Integer.parseInt(target);
}

public static void validateNumeric(String target) {
try {
Integer.parseInt(target);
} catch (NumberFormatException e) {
return Integer.parseInt(target);
} catch (NumberFormatException ex) {
throw new IllegalArgumentException(ERROR_OF_TYPE);
}
}
Expand Down
10 changes: 1 addition & 9 deletions src/main/java/view/MessageResolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,10 @@ public class MessageResolver {

public String resolveMoveResultMessage(List<Car> cars) {
return cars.stream()
.map(car -> car.getCarName() + DELIMITER_FOR_MOVE_RESULT + resolveCarPositionMessage(car.getPosition()))
.map(car -> car.getCarName() + DELIMITER_FOR_MOVE_RESULT + MOVE_STATEMENT.repeat(car.getPosition()))
.collect(Collectors.joining("\n")) + "\n";
}

private String resolveCarPositionMessage(Integer carPosition) {
String message = "";
for (int i = 0; i < carPosition; i++) {
message += MOVE_STATEMENT;
}
return message;
}

public String resolveWinnerMessage(List<Car> winners) {
return winners.stream()
.map(Car::getCarName)
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/view/OutputView.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ public class OutputView {

private final MessageResolver messageResolver;

public OutputView(MessageResolver messageResolver) {
this.messageResolver = messageResolver;
public OutputView() {
this.messageResolver = new MessageResolver();
}

public void printResultPrefix() {
Expand Down
27 changes: 27 additions & 0 deletions src/test/java/domain/CarNameTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package domain;

import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

public class CarNameTest {

@DisplayName("자동차 이름이 5자가 넘지 않을 경우 정상적으로 도메인이 생성된다.")
@ParameterizedTest
@ValueSource(strings = {"1", "4444", "55555"})
void createByValidNameLength(String name) {
assertThatCode(() -> CarName.from(name))
.doesNotThrowAnyException();
}

@DisplayName("자동차 이름이 5자 초과 또는 0자 이하일 경우 에러가 발생한다.")
@ParameterizedTest
@ValueSource(strings = {"", "666666"})
void createByInvalidNameLength(String name) {
assertThatThrownBy(() -> CarName.from(name))
.isInstanceOf(IllegalArgumentException.class);
}
}
27 changes: 27 additions & 0 deletions src/test/java/domain/PositionTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package domain;

import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

public class PositionTest {

@DisplayName("자동차 위치가 음수가 아닐 경우 정상적으로 도메인이 생성된다.")
@ParameterizedTest
@ValueSource(ints = {0, 1, 999})
void createByValidNameLength(int position) {
assertThatCode(() -> Position.from(position))
.doesNotThrowAnyException();
}

@DisplayName("자동차 위치가 음수인 경우 에러가 발생한다.")
@ParameterizedTest
@ValueSource(ints = {-999, -2, -1})
void createByInvalidNameLength(int position) {
assertThatThrownBy(() -> Position.from(position))
.isInstanceOf(IllegalArgumentException.class);
}
}
18 changes: 0 additions & 18 deletions src/test/java/domain/PowerGeneratorTest.java

This file was deleted.

36 changes: 36 additions & 0 deletions src/test/java/domain/PowerManagerTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package domain;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

@DisplayName("범위 난수 생성 테스트")
class PowerManagerTest {

@DisplayName("생성된 난수는 지정된 범위를 벗어나지 않는다")
@RepeatedTest(50)
void testRangeOfRandomNumber() {
PowerManager powerManager = new PowerManager();
int randomNumber = powerManager.generatePower();
assertThat(randomNumber).isBetween(0, 9);
}

@DisplayName("생성된 파워가 임계값 이상인 경우 파워는 충분하다.")
@ParameterizedTest
@ValueSource(ints = {4, 5, 9})
void testSufficiencyOfValidPower(int power) {
PowerManager powerManager = new PowerManager();
assertThat(powerManager.isSufficientPower(power)).isTrue();
}

@DisplayName("생성된 파워가 임계값 미만인 경우 파워는 충분하지 않다.")
@ParameterizedTest
@ValueSource(ints = {0, 1, 3})
void testSufficiencyOfInvalidPower(int power) {
PowerManager powerManager = new PowerManager();
assertThat(powerManager.isSufficientPower(power)).isFalse();
}
}