Skip to content

Commit 1b1db78

Browse files
authored
Step2 (#5940)
* StringAddCalculator * StringAddCalculator * apply review
1 parent be8dcf5 commit 1b1db78

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import java.util.Arrays;
2+
import java.util.Objects;
3+
import java.util.regex.Matcher;
4+
import java.util.regex.Pattern;
5+
6+
public class StringAddCalculator {
7+
8+
public static final String DELIMITER = ",|:";
9+
public static final String CUSTOM_DELIMITER_REGEX = "//(.)\n(.*)";
10+
public static final Pattern PATTERN = Pattern.compile(CUSTOM_DELIMITER_REGEX);
11+
public static final int CUSTOM_DELIMITER_GROUP = 1;
12+
public static final int TEXT_TOKEN_GROUP = 2;
13+
14+
public static int splitAndSum(String text) {
15+
if (isNullOrBlank(text)) {
16+
return 0;
17+
}
18+
final Matcher matcher = PATTERN.matcher(text);
19+
if (matcher.find()) {
20+
final String customDelimiter = matcher.group(CUSTOM_DELIMITER_GROUP);
21+
final String textToken = matcher.group(TEXT_TOKEN_GROUP);
22+
return sum(validateNegative(toInts(split(textToken, customDelimiter))));
23+
}
24+
return sum(validateNegative(toInts(split(text, DELIMITER))));
25+
}
26+
27+
private static boolean isNullOrBlank(String text) {
28+
return Objects.isNull(text) || text.isBlank();
29+
}
30+
31+
private static String[] split(String text, String delimiter) {
32+
return text.split(delimiter);
33+
}
34+
35+
private static int[] toInts(String[] values) {
36+
final int[] result = new int[values.length];
37+
for (int i = 0; i < values.length; i++) {
38+
result[i] = getParseInt(values[i]);
39+
}
40+
return result;
41+
}
42+
43+
private static int[] validateNegative(int[] values) {
44+
for (int value : values) {
45+
if (value < 0) {
46+
throw new RuntimeException("have negative value");
47+
}
48+
}
49+
return values;
50+
}
51+
52+
private static int getParseInt(String values) {
53+
return Integer.parseInt(values);
54+
}
55+
56+
private static int sum(int[] values) {
57+
return Arrays.stream(values).sum();
58+
}
59+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import org.junit.jupiter.api.DisplayName;
2+
import org.junit.jupiter.api.Test;
3+
4+
import static org.assertj.core.api.Assertions.assertThat;
5+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
6+
7+
public class StringAddCalculatorTest {
8+
@Test
9+
@DisplayName("null_또는_빈문자가_입력으로_들어오면_무조건_0_리턴")
10+
public void nullOrBlankTest() {
11+
int result = StringAddCalculator.splitAndSum(null);
12+
assertThat(result).isEqualTo(0);
13+
14+
result = StringAddCalculator.splitAndSum("");
15+
assertThat(result).isEqualTo(0);
16+
17+
result = StringAddCalculator.splitAndSum(" ");
18+
assertThat(result).isEqualTo(0);
19+
}
20+
21+
@Test
22+
@DisplayName("숫자_하나가_입력으로_들어와도_정상적으로_숫자합이_계산된다")
23+
void singleNumTest() {
24+
final int actual = StringAddCalculator.splitAndSum("1");
25+
assertThat(actual).isEqualTo(1);
26+
}
27+
28+
@Test
29+
@DisplayName("컴마 구분자가 포함된 문자열을 입력으로 받았을 때 정상동작한다")
30+
void commaTest() {
31+
assertThat(StringAddCalculator.splitAndSum("1,2")).isEqualTo(3);
32+
}
33+
34+
@Test
35+
@DisplayName("콜론 구분자가 포함된 문자열을 입력으로 받았을 때 정상동작한다")
36+
void colonsTest() {
37+
assertThat(StringAddCalculator.splitAndSum("1:2")).isEqualTo(3);
38+
}
39+
40+
@Test
41+
@DisplayName("컴마와 콜론 구분자가 포함된 문자열을 입력으로 받았을 때 정상동작한다")
42+
void commaColonsTest() {
43+
assertThat(StringAddCalculator.splitAndSum("1:2,3")).isEqualTo(6);
44+
}
45+
46+
@Test
47+
@DisplayName("커스텀 구분자가 포함된 문자열을 입력으로 받았을 때 정상동작한다")
48+
void customDelimiter() {
49+
assertThat(StringAddCalculator.splitAndSum("//;\n1;2;3")).isEqualTo(6);
50+
}
51+
52+
@Test
53+
@DisplayName("음수가 포함된 문자열을 입력으로 받았을 때 RuntimeException이 발생한다")
54+
public void splitAndSum_negative() {
55+
assertThatThrownBy(() -> StringAddCalculator.splitAndSum("-1,2,3"))
56+
.isInstanceOf(RuntimeException.class);
57+
}
58+
}

0 commit comments

Comments
 (0)