Skip to content
Merged

step1 #4166

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
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
plugins {
id 'java'
id 'org.jetbrains.kotlin.jvm' version '1.7.21'
}

version '1.0-SNAPSHOT'
Expand All @@ -11,6 +12,7 @@ repositories {
dependencies {
testImplementation 'org.assertj:assertj-core:3.22.0'
testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}

java {
Expand Down
49 changes: 49 additions & 0 deletions src/main/java/util/StringCalculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package util;

public class StringCalculator {

public int calculate(String input) {
validateInput(input);
String[] tokens = input.split(" ");

int result = Integer.parseInt(tokens[0]);

for (int i = 1; i < tokens.length; i += 2) {
String operator = tokens[i];
int nextNumber = Integer.parseInt(tokens[i+1]);
result = operate(operator, result, nextNumber);
}
return result;
}

private void validateInput(String input) {
if (input == null || input.isBlank()) {
throw new IllegalArgumentException("input이 null이거나 빈 문자열입니다.");
}
}

private int operate(String operator, int left, int right) {
switch (operator) {
case "+":
return left + right;
case "-":
return left - right;
case "*":
return left * right;
case "/":
return division(left, right);
default:
throw new IllegalArgumentException("올바른 사칙연산 부호가 아닙니다");
}
}

int division(int left, int right) {
if (right == 0) {
throw new IllegalArgumentException("0으로 나눌 수 없습니다.");
}
if (left % right != 0) {
throw new IllegalArgumentException("나눔 값이 정수가 아닙니다.");
}
return left / right;
}
}
56 changes: 56 additions & 0 deletions src/test/java/util/StringCalculatorTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package util;

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

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

public class StringCalculatorTest {
private StringCalculator stringCalculator;

@BeforeEach
void setUp() {
stringCalculator = new StringCalculator();
}

@Test
void testAdd() {
String input = "2 + 3";
int expected = 5;
int result = stringCalculator.calculate(input);
assertThat(result).isEqualTo(expected);
}

@Test
void testSubtract() {
String input = "2 - 3";
int expected = -1;
int result = stringCalculator.calculate(input);
assertThat(result).isEqualTo(expected);
}

@Test
void testMultiply() {
String input = "2 * 3";
int expected = 6;
int result = stringCalculator.calculate(input);
assertThat(result).isEqualTo(expected);
}

@Test
void testDivide() {
String input = "20 / 2";
int expected = 10;
int result = stringCalculator.calculate(input);
assertThat(result).isEqualTo(expected);
}

@ParameterizedTest
@ValueSource(strings = {"", " "})
void intputNullOrEmpty(String input) {
assertThatIllegalArgumentException()
.isThrownBy(() -> stringCalculator.calculate(input));
}
}