diff --git a/src/main/java/calculator/StringCalculator.java b/src/main/java/calculator/StringCalculator.java new file mode 100644 index 00000000000..f6826cd7b51 --- /dev/null +++ b/src/main/java/calculator/StringCalculator.java @@ -0,0 +1,45 @@ +package calculator; + +public class StringCalculator { + + public static int calculate(String input) { + validateNotBlank(input); + + String[] values = input.split(" "); + return calculate(values); + } + + private static void validateNotBlank(String input) { + if (input == null || input.isEmpty()) { + throw new IllegalArgumentException("Input cannot be null or empty"); + } + } + + private static int calculate(String[] values) { + int result = Integer.parseInt(values[0]); + + for (int i = 1; i < values.length; i++) { + String operation = values[i]; + i++; + int number = Integer.parseInt(values[i]); + result = calculate(result, operation, number); + } + + return result; + } + + private static int calculate(int number1, String operation, int number2) { + switch (operation) { + case "+": + return number1 + number2; + case "-": + return number1 - number2; + case "*": + return number1 * number2; + case "/": + return number1 / number2; + default: + throw new IllegalArgumentException("Invalid operation: " + operation); + } + } +} diff --git a/src/test/java/calculator/StringCalculatorTest.java b/src/test/java/calculator/StringCalculatorTest.java new file mode 100644 index 00000000000..26662f81600 --- /dev/null +++ b/src/test/java/calculator/StringCalculatorTest.java @@ -0,0 +1,46 @@ +package calculator; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +public class StringCalculatorTest { + + @Test + public void add() { + int result = StringCalculator.calculate("1 + 2 + 3"); + assertThat(result).isEqualTo(6); + } + + @Test + public void subtract() { + int result = StringCalculator.calculate("10 - 2 - 3"); + assertThat(result).isEqualTo(5); + } + + @Test + public void multiply() { + int result = StringCalculator.calculate("2 * 3 * 4"); + assertThat(result).isEqualTo(24); + } + + @Test + public void divide() { + int result = StringCalculator.calculate("10 / 2"); + assertThat(result).isEqualTo(5); + } + + @ParameterizedTest + @NullAndEmptySource + public void blankInput(String input) { + assertThatIllegalArgumentException().isThrownBy(() -> StringCalculator.calculate(input)); + } + + @Test + public void invalidOperation() { + assertThatIllegalArgumentException().isThrownBy(() -> StringCalculator.calculate("1 % 2")); + } +}