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

자동차 경주 2단계 : 문자열 덧셈 계산기 #5359

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
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
13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,15 @@
* 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다.

## 온라인 코드 리뷰 과정
* [텍스트와 이미지로 살펴보는 온라인 코드 리뷰 과정](https://github.com/next-step/nextstep-docs/tree/master/codereview)
* [텍스트와 이미지로 살펴보는 온라인 코드 리뷰 과정](https://github.com/next-step/nextstep-docs/tree/master/codereview)

## To-Do

## Done
* Scanner를 이용하여 자동차 대수 입력
* Scanner를 이용하여 시도 횟수 입력
* Random 클래스의 nextInt(10)을 이용하여 랜덤값 추출
* 자동차의 전진 정보를 담는 리스트 생성
* 랜덤값을 기준으로 자동차 전진/정지 결정
* 리스트의 자동차마다 전진 횟수 증가시키기
* 경주 결과 출력
Empty file removed src/main/java/.gitkeep
Empty file.
92 changes: 92 additions & 0 deletions src/main/java/calculator/Calculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package calculator;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Calculator {
private static final String COMMA = ",";
private static final String COLON = ":";
private static final String SLASH = "//";
private static final String LINECHANGE = "\n";
private static final Pattern COMPILTEDPATTERN = Pattern.compile(SLASH+"(.)"+LINECHANGE+"(.*)");
private static final int FIRST = 1;
private static final int SECOND = 2;

public static int calculate(String text) {
if (isTextEmpty(text)) {
return 0;
}
if (isContainsCustom(text)) {
return addText(splitTextByCustomByDelimiter(text));
}
if (isContainsDelimiter(text)) {
return addText(splitText(text));
}
return stringToInt(text);
}

// text가 빈 문자열인지 확인
private static boolean isTextEmpty(String text) {
return text.isEmpty();
}

private static boolean isContainsDelimiter(String text) {
return text.contains(COMMA) || text.contains(COLON);
}

private static boolean isContainsCustom(String text) {
return text.contains(SLASH) && text.contains(LINECHANGE);
}

private static String[] splitText(String text) {
return text.split(COMMA+"|"+COLON);
}

private static String[] splitTextByCustomByDelimiter(String text) {
Matcher matcher = findPattern(text);
if (canFindPattern(matcher)) {
return findNumbers(matcher).split(findDelimiter(matcher));
}
return null;
}

private static Matcher findPattern(String text) {
return COMPILTEDPATTERN.matcher(text);
}

private static String findNumbers(Matcher matcher) {
return matcher.group(SECOND);
}

private static String findDelimiter(Matcher matcher) {
return matcher.group(FIRST);
}

private static boolean canFindPattern(Matcher matcher) {
return matcher.find();
}

private static int stringToInt(String text) {
int value = Integer.parseInt(text);
if (value < 0) {
throw new RuntimeException();
}
return value;
}

private static int addText(String[] splitted) {
int sum = 0;
for (int token : stringArrayToIntArray(splitted)) {
sum += token;
}
return sum;
}

private static int[] stringArrayToIntArray(String [] results) {
int[] intArray = new int[results.length];
for (int i=0; i<intArray.length; i++) {
intArray[i] = stringToInt(results[i]);
}
return intArray;
}
}
44 changes: 44 additions & 0 deletions src/test/java/calculator/StringCalculateTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package calculator;

import org.junit.jupiter.api.Test;

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

public class StringCalculateTest {
@Test
void null_값() {
int value = Calculator.calculate("");
assertThat(value).isEqualTo(0);
}

@Test
void 숫자_하나() {
int value = Calculator.calculate("1");
assertThat(value).isEqualTo(1);
}

@Test
void 숫자_둘_구분자_컴마() {
int value = Calculator.calculate("1,2");
assertThat(value).isEqualTo(3);
}

@Test
void 숫자_둘_구분자_콜론() {
int value = Calculator.calculate("1:2");
assertThat(value).isEqualTo(3);
}

@Test
void 커스텀_구분자() {
int value = Calculator.calculate("//;\n1;2;3");
assertThat(value).isEqualTo(6);
}

@Test
void 음수_값() {
assertThatThrownBy(() -> Calculator.calculate("-1,2,3"))
.isInstanceOf(RuntimeException.class);
}
}
44 changes: 44 additions & 0 deletions src/test/java/study/SetCollectionTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package study;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;

import java.util.HashSet;
import java.util.Set;

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

public class SetCollectionTest {
private Set<Integer> numbers;

@BeforeEach
void setUp() {
numbers = new HashSet<>();
numbers.add(1);
numbers.add(1);
numbers.add(2);
numbers.add(3);
}

@Test
void sizeTest() {
assertThat(numbers).hasSize(numbers.size());
}

@ParameterizedTest
@ValueSource(ints = {1,2,3})
void containsTest1(int num) {
assertThat(numbers.contains(num)).isTrue();
}

@ParameterizedTest
@CsvSource(value = {"1:true", "2:true", "3:true", "4:false", "5:false"}, delimiter = ':')
void containsTest2(int num, boolean result) {
assertThat(numbers.contains(num)).isEqualTo(result);
}


}
48 changes: 48 additions & 0 deletions src/test/java/study/StringTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package study;

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

import java.util.stream.IntStream;

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

public class StringTest {
@Test
void splitTest1() {
String[] value = "1,2".split(",");
assertThat(value).contains("1");
assertThat(value).containsExactly("1","2");
}

@Test
void splitTest2() {
String[] value = "1".split(",");
assertThat(value).contains("1");
assertThat(value).containsExactly("1");
}

@ParameterizedTest
@ValueSource(strings = {"(1,2)"})
void substringTest(String text) {
String value = text.substring(1, text.indexOf(")"));
assertThat(value).isEqualTo("1,2");
}

@DisplayName("문자열에서 특정 위치의 문자를 확인하고 인덱스를 벗어나면 오류를 발생시킨다")
@ParameterizedTest
@ValueSource(strings = {"abc"})
void charAtTest(String text) {
IntStream.range(0, text.length()).forEach(index -> {
if (index > text.length()) {
assertThatThrownBy(() -> {
throw new StringIndexOutOfBoundsException();
}).isInstanceOf(IndexOutOfBoundsException.class)
.hasMessageContaining("Index: " + index
+ " Size: " + text.length());
}
});
}
}