diff --git a/pom.xml b/pom.xml
index edd71909..adca8e20 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,7 @@
https://raw.githubusercontent.com/mate-academy/style-guides/master/java/checkstyle.xml
- 5.7.0
+ 5.7.2
diff --git a/src/main/java/core/basesyntax/Calculator.java b/src/main/java/core/basesyntax/Calculator.java
new file mode 100644
index 00000000..ff438c2d
--- /dev/null
+++ b/src/main/java/core/basesyntax/Calculator.java
@@ -0,0 +1,5 @@
+package core.basesyntax;
+
+public interface Calculator {
+ double calculate(double firstNum, double secondNum, char mathOperation);
+}
diff --git a/src/main/java/core/basesyntax/CalculatorImplementation.java b/src/main/java/core/basesyntax/CalculatorImplementation.java
new file mode 100644
index 00000000..ecfd1c58
--- /dev/null
+++ b/src/main/java/core/basesyntax/CalculatorImplementation.java
@@ -0,0 +1,45 @@
+package core.basesyntax;
+
+public class CalculatorImplementation implements Calculator {
+
+ @Override
+ public double calculate(double firstNum, double secondNum, char mathOperation) {
+ switch (mathOperation) {
+ case '+':
+ return addition(firstNum, secondNum);
+ case '-':
+ return subtraction(firstNum, secondNum);
+ case '/':
+ return division(firstNum, secondNum);
+ case '*':
+ return multiplication(firstNum, secondNum);
+ case '^':
+ return raiseToPower(firstNum, secondNum);
+ default:
+ throw new RuntimeException("Wrong input. Please try again");
+ }
+ }
+
+ private double addition(double firstNum, double secondNum) {
+ return firstNum + secondNum;
+ }
+
+ private double subtraction(double firstNum, double secondNum) {
+ return firstNum - secondNum;
+ }
+
+ private double division(double firstNum, double secondNum) {
+ if (secondNum == 0) {
+ throw new ArithmeticException("Divide by zero");
+ }
+ return firstNum / secondNum;
+ }
+
+ private double multiplication(double firstNum, double secondNum) {
+ return firstNum * secondNum;
+ }
+
+ private double raiseToPower(double firstNum, double secondNum) {
+ return Math.pow(firstNum, secondNum);
+ }
+}
diff --git a/src/main/java/core/basesyntax/HelloWorld.java b/src/main/java/core/basesyntax/HelloWorld.java
deleted file mode 100644
index 97db782b..00000000
--- a/src/main/java/core/basesyntax/HelloWorld.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package core.basesyntax;
-
-/**
- * Feel free to remove this class and create your own.
- */
-public class HelloWorld {
-
-}
diff --git a/src/test/java/core/basesyntax/CalculatorImplementationTest.java b/src/test/java/core/basesyntax/CalculatorImplementationTest.java
new file mode 100644
index 00000000..5ea25ba6
--- /dev/null
+++ b/src/test/java/core/basesyntax/CalculatorImplementationTest.java
@@ -0,0 +1,253 @@
+package core.basesyntax;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+class CalculatorImplementationTest {
+ private static final double DELTA = 0.00001;
+ private static final String DIVISION_OPERATION_MESSAGE = "Oops, operation of"
+ + " division doesn't work correctly";
+ private static final String MULTIPLICATION_OPERATION_MESSAGE = "Oops, operation of"
+ + " multiplication doesn't work correctly";
+ private static final String SUBTRACTION_OPERATION_MESSAGE = "Oops, operation of"
+ + " subtraction doesn't work correctly";
+ private static final String ADDITION_OPERATION_MESSAGE = "Oops, operation of"
+ + " addition doesn't work correctly";
+ private static CalculatorImplementation calculator;
+ private static double actual;
+ private static double expected;
+
+ @BeforeAll
+ static void beforeAll() {
+ calculator = new CalculatorImplementation();
+ }
+
+ @Test
+ void addition_TwoPositiveOperands_Ok() {
+ actual = calculator.calculate(200.3, 0.7, '+');
+ expected = 201.0;
+ assertEquals(actual, expected, DELTA, ADDITION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void addition_TwoNegativeOperands_Ok() {
+ actual = calculator.calculate(-20.65, -10.35, '+');
+ expected = -31.0;
+ assertEquals(actual, expected, DELTA, ADDITION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void addition_positiveAndNegativeOperands_Ok() {
+ actual = calculator.calculate(150.0, -90.5, '+');
+ expected = 59.5;
+ assertEquals(actual, expected, DELTA, ADDITION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void addition_NegativeAndPositiveOperands_Ok() {
+ actual = calculator.calculate(-30.45, 30.05, '+');
+ expected = -0.4;
+ assertEquals(actual, expected, DELTA, ADDITION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void addition_WithZero_Ok() {
+ actual = calculator.calculate(0.0, 222.22, '+');
+ expected = 222.22;
+ assertEquals(actual, expected);
+ actual = calculator.calculate(234.34, 0.0, '+');
+ expected = 234.34;
+ assertEquals(actual, expected, DELTA, ADDITION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void addition_MinAndMaxDoubleValues_Ok() {
+ actual = calculator.calculate(Double.MAX_VALUE, Double.MIN_VALUE, '+');
+ expected = Double.MAX_VALUE + Double.MIN_VALUE;
+ assertEquals(actual, expected, DELTA, ADDITION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void subtraction_TwoPositiveOperands_Ok() {
+ actual = calculator.calculate(125.75, 98.05, '-');
+ expected = 27.7;
+ assertEquals(actual, expected, DELTA, SUBTRACTION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void subtraction_TwoNegativeOperands_Ok() {
+ actual = calculator.calculate(-78.634, -18.995, '-');
+ expected = -59.639;
+ assertEquals(actual, expected, DELTA, SUBTRACTION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void subtraction_PositiveAndNegativeOperands_Ok() {
+ actual = calculator.calculate(123.456, -123.456, '-');
+ expected = 246.912;
+ assertEquals(actual, expected, DELTA, SUBTRACTION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void subtraction_NegativeAndPositiveOperands_Ok() {
+ actual = calculator.calculate(-232.98, 785.38, '-');
+ expected = -1018.36;
+ assertEquals(actual, expected, DELTA, SUBTRACTION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void subtraction_WithZero_Ok() {
+ actual = calculator.calculate(0.0, 444.44, '-');
+ expected = -444.44;
+ assertEquals(actual, expected, DELTA, SUBTRACTION_OPERATION_MESSAGE);
+ actual = calculator.calculate(555.58, 0.0, '-');
+ expected = 555.58;
+ assertEquals(actual, expected, DELTA, SUBTRACTION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void subtraction_MinAndMaxDoubleValues_Ok() {
+ actual = calculator.calculate(Double.MAX_VALUE, Double.MIN_VALUE, '-');
+ expected = Double.MAX_VALUE - Double.MIN_VALUE;
+ assertEquals(actual, expected, DELTA, SUBTRACTION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void multiplication_TwoPositiveOperands_Ok() {
+ actual = calculator.calculate(2.34, 2.210, '*');
+ expected = 5.1714;
+ assertEquals(actual, expected, DELTA, MULTIPLICATION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void multiplication_TwoNegativeOperands_Ok() {
+ actual = calculator.calculate(-5.65, -7.77, '*');
+ expected = 43.9005;
+ assertEquals(actual, expected, DELTA, MULTIPLICATION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void multiplication_PositiveAndNegativeOperands_Ok() {
+ actual = calculator.calculate(15.0, -3.5, '*');
+ expected = -52.5;
+ assertEquals(actual, expected, DELTA, MULTIPLICATION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void multiplication_NegativeAndPositiveOperands_Ok() {
+ actual = calculator.calculate(-10.45, 10.05, '*');
+ expected = -105.0225;
+ assertEquals(actual, expected, DELTA, MULTIPLICATION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void multiplication_WithZero_Ok() {
+ actual = calculator.calculate(0.0, 12.22, '*');
+ expected = 0;
+ assertEquals(actual, expected, DELTA, MULTIPLICATION_OPERATION_MESSAGE);
+ actual = calculator.calculate(15.15, 0.0, '*');
+ expected = 0;
+ assertEquals(actual, expected, DELTA, MULTIPLICATION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void multiplication_MinAndMaxDoubleValues_Ok() {
+ actual = calculator.calculate(Double.MAX_VALUE, Double.MIN_VALUE, '*');
+ expected = Double.MAX_VALUE * Double.MIN_VALUE;
+ assertEquals(actual, expected, DELTA, MULTIPLICATION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void division_TwoPositiveOperands_Ok() {
+ actual = calculator.calculate(60.30, 3.15, '/');
+ expected = 19.1428571;
+ assertEquals(actual, expected, DELTA, DIVISION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void division_TwoNegativeOperands_Ok() {
+ actual = calculator.calculate(-1.234, -0.456, '/');
+ expected = 2.70614035;
+ assertEquals(actual, expected, DELTA, DIVISION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void division_PositiveAndNegativeOperands_Ok() {
+ actual = calculator.calculate(15.0, -3.5, '/');
+ expected = -4.28571429;
+ assertEquals(actual, expected, DELTA, DIVISION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void division_NegativeAndPositiveOperands_Ok() {
+ actual = calculator.calculate(-10, 2, '/');
+ expected = -5;
+ assertEquals(actual, expected, DELTA, DIVISION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void division_WithZero_Ok() {
+ actual = calculator.calculate(0.0, 35.35, '/');
+ expected = 0;
+ assertEquals(actual, expected, DELTA, DIVISION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void division_WhenSecondOperandZero_NotOk() {
+ assertThrows(ArithmeticException.class, () -> calculator.calculate(100.55, 0, '/'));
+ assertThrows(ArithmeticException.class, () -> calculator.calculate(0, 0, '/'));
+ }
+
+ @Test
+ void division_MinAndMaxDoubleValues_Ok() {
+ actual = calculator.calculate(Double.MAX_VALUE, Double.MIN_VALUE, '/');
+ expected = Double.MAX_VALUE / Double.MIN_VALUE;
+ assertEquals(actual, expected, DELTA, DIVISION_OPERATION_MESSAGE);
+ }
+
+ @Test
+ void raising_ToAPowerTwoPositiveOperands_Ok() {
+ actual = calculator.calculate(2, 5, '^');
+ expected = 32;
+ assertEquals(actual, expected);
+ }
+
+ @Test
+ void raising_ToAPowerTwoNegativeOperands_Ok() {
+ actual = calculator.calculate(-2, -5, '^');
+ expected = -0.03125;
+ assertEquals(actual, expected);
+ }
+
+ @Test
+ void raising_ToAPowerPositiveAndNegativeOperands_Ok() {
+ actual = calculator.calculate(2, -5, '^');
+ expected = 0.03125;
+ assertEquals(actual, expected);
+ }
+
+ @Test
+ void raising_ToAPowerNegativeAndPositiveOperands_Ok() {
+ actual = calculator.calculate(-10, 2, '^');
+ expected = 100;
+ assertEquals(actual, expected);
+ }
+
+ @Test
+ void raising_ToAPowerWithZero_Ok() {
+ actual = calculator.calculate(0, 2, '^');
+ expected = 0;
+ assertEquals(actual, expected);
+ actual = calculator.calculate(2, 0, '^');
+ expected = 1;
+ assertEquals(actual, expected);
+ }
+
+ @Test
+ void illegalOperation_NotOk() {
+ assertThrows(RuntimeException.class, () -> calculator.calculate(20, 4, '#'));
+ }
+}
diff --git a/src/test/java/core/basesyntax/HelloWorldTest.java b/src/test/java/core/basesyntax/HelloWorldTest.java
deleted file mode 100644
index 9a90d822..00000000
--- a/src/test/java/core/basesyntax/HelloWorldTest.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package core.basesyntax;
-
-/**
- * Feel free to remove this class and create your own.
- */
-public class HelloWorldTest {
-
-}