diff --git a/src/main/java/com/serenitydojo/calculator/Calculator.java b/src/main/java/com/serenitydojo/calculator/Calculator.java index 8e88bf0..88b40ca 100644 --- a/src/main/java/com/serenitydojo/calculator/Calculator.java +++ b/src/main/java/com/serenitydojo/calculator/Calculator.java @@ -1,7 +1,40 @@ package com.serenitydojo.calculator; +import org.apache.commons.lang3.StringUtils; + public class Calculator { public int evaluate(String expression) { - return 0; + if(expression.isEmpty()) { + return 0; + } + + int calculationResult = 0; + String currentOperator = "+"; + + String[] characters = expression.split("\\s"); + + for(String character : characters) { + if (!StringUtils.isNumeric(character)) { + currentOperator = character; + } else { + calculationResult = calculation(calculationResult, currentOperator, character); + } + } + return calculationResult; + } + + private int calculation(int calculationResult, String currentOperator, String character) throws IllegalMathsOperatorException { + switch(currentOperator) { + case "+": + return calculationResult + Integer.parseInt(character); + case "-": + return calculationResult - Integer.parseInt(character); + case "*": + return calculationResult * Integer.parseInt(character); + case "/": + return calculationResult / Integer.parseInt(character); + default: + throw new IllegalMathsOperatorException(currentOperator + " operator is not supported!"); + } } -} +} \ No newline at end of file diff --git a/src/main/java/com/serenitydojo/calculator/IllegalMathsOperatorException.java b/src/main/java/com/serenitydojo/calculator/IllegalMathsOperatorException.java new file mode 100644 index 0000000..2a59e68 --- /dev/null +++ b/src/main/java/com/serenitydojo/calculator/IllegalMathsOperatorException.java @@ -0,0 +1,7 @@ +package com.serenitydojo.calculator; + +public class IllegalMathsOperatorException extends RuntimeException { + public IllegalMathsOperatorException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/src/test/java/com/serenitydojo/calculator/WhenDoingMaths.java b/src/test/java/com/serenitydojo/calculator/WhenDoingMaths.java index eac4b31..b6e8b22 100644 --- a/src/test/java/com/serenitydojo/calculator/WhenDoingMaths.java +++ b/src/test/java/com/serenitydojo/calculator/WhenDoingMaths.java @@ -13,38 +13,43 @@ public void shouldReturnZeroForAnEmptyString() { assertThat(calculator.evaluate("")).isEqualTo(0); } -// @Test(expected = IllegalMathsOperatorException.class) -// public void shouldReportNonSupportedOperations() { -// calculator.evaluate("1 ^ 2"); -// } -// -// @Test -// public void shouldReturnTheValueOfASingleNumber() { -// assertThat(calculator.evaluate("1")).isEqualTo(1); -// } -// -// @Test -// public void shouldAddTwoNumbers() { -// assertThat(calculator.evaluate("1 + 1")).isEqualTo(2); -// } -// -// @Test -// public void shouldAddThreeNumbers() { -// assertThat(calculator.evaluate("1 + 2 + 3")).isEqualTo(6); -// } -// -// @Test -// public void shouldAlsoSubtract() { -// assertThat(calculator.evaluate("10 - 6")).isEqualTo(4); -// } -// -// @Test -// public void shouldAddAndSubtract() { -// assertThat(calculator.evaluate("10 + 5 - 6")).isEqualTo(9); -// } -// -// @Test -// public void shouldMultiplyNumbers() { -// assertThat(calculator.evaluate("10 * 5")).isEqualTo(50); -// } -} + @Test(expected = IllegalMathsOperatorException.class) + public void shouldReportNonSupportedOperations() { + calculator.evaluate("1 ^ 2"); + } + + @Test + public void shouldReturnTheValueOfASingleNumber() { + assertThat(calculator.evaluate("1")).isEqualTo(1); + } + + @Test + public void shouldAddTwoNumbers() { + assertThat(calculator.evaluate("1 + 1")).isEqualTo(2); + } + + @Test + public void shouldAddThreeNumbers() { + assertThat(calculator.evaluate("1 + 2 + 3")).isEqualTo(6); + } + + @Test + public void shouldAlsoSubtract() { + assertThat(calculator.evaluate("10 - 6")).isEqualTo(4); + } + + @Test + public void shouldAddAndSubtract() { + assertThat(calculator.evaluate("10 + 5 - 6")).isEqualTo(9); + } + + @Test + public void shouldMultiplyNumbers() { + assertThat(calculator.evaluate("10 * 5")).isEqualTo(50); + } + + @Test + public void shouldDivideNumbers() { + assertThat(calculator.evaluate("25 / 5")).isEqualTo(5); + } +} \ No newline at end of file