diff --git a/src/main/java/core/basesyntax/Calculate.java b/src/main/java/core/basesyntax/Calculate.java new file mode 100644 index 00000000..f6a46513 --- /dev/null +++ b/src/main/java/core/basesyntax/Calculate.java @@ -0,0 +1,5 @@ +package core.basesyntax; + +public interface Calculate { + double calculate(double a, double b, char c); +} diff --git a/src/main/java/core/basesyntax/Calculator.java b/src/main/java/core/basesyntax/Calculator.java new file mode 100644 index 00000000..b7b80394 --- /dev/null +++ b/src/main/java/core/basesyntax/Calculator.java @@ -0,0 +1,25 @@ +package core.basesyntax; + +public class Calculator implements Calculate { + + @Override + public double calculate(double firstParameter, double secondParameter, char operation) { + switch (operation) { + case '+': + return firstParameter + secondParameter; + case '-': + return firstParameter - secondParameter; + case '*': + return firstParameter * secondParameter; + case '^': + return Math.pow(firstParameter, secondParameter); + case '/': + if (secondParameter == 0) { + throw new ArithmeticException("Division by zero is not allowed."); + } + return firstParameter / secondParameter; + default: + throw new IllegalArgumentException("Invalid operation"); + } + } +} 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/CalculatorTest.java b/src/test/java/core/basesyntax/CalculatorTest.java new file mode 100644 index 00000000..b3ebb007 --- /dev/null +++ b/src/test/java/core/basesyntax/CalculatorTest.java @@ -0,0 +1,146 @@ +package core.basesyntax; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +class CalculatorTest { + private static final double DELTA = 0.0001; + private Calculate calculator = new Calculator(); + private double expected; + private double actual; + + @Test + void calculate_additionWithTwoPositiveOperands_Ok() { + expected = 100.0; + actual = calculator.calculate(90.0, 10.0, '+'); + assertEquals(expected, actual); + } + + @Test + void calculate_additionWithTwoNegativeOperands_Ok() { + expected = - 150.0; + actual = calculator.calculate(-100.0, -50.0, '+'); + assertEquals(expected, actual); + } + + @Test + void calculate_additionWithPositiveAndNegativeOperands_Ok() { + expected = - 150.0; + actual = calculator.calculate(-200.0, 50.0, '+'); + assertEquals(expected, actual); + } + + @Test + void calculate_additionWithFirstOperandIsZero_Ok() { + expected = 50.0; + actual = calculator.calculate(0.0, 50.0, '+'); + assertEquals(expected, actual); + } + + @Test + void calculate_additionWithSecondOperandIsZero_Ok() { + expected = 60.0; + actual = calculator.calculate(60.0, 0.0, '+'); + assertEquals(expected, actual); + } + + @Test + void calculate_additionWithMinAndMaxDoubleValues_Ok() { + expected = Double.MAX_VALUE + Double.MIN_VALUE; + actual = calculator.calculate(Double.MAX_VALUE, Double.MIN_VALUE, '+'); + assertEquals(expected, actual, DELTA); + } + + @Test + void calculate_subtractionWithMinAndMaxDoubleValues_Ok() { + expected = Double.MAX_VALUE - Double.MIN_VALUE; + actual = calculator.calculate(Double.MAX_VALUE, Double.MIN_VALUE, '-'); + assertEquals(expected, actual, DELTA); + } + + @Test + void calculate_multiplicationWithMinAndMaxDoubleValues_Ok() { + expected = Double.MAX_VALUE * Double.MIN_VALUE; + actual = calculator.calculate(Double.MAX_VALUE, Double.MIN_VALUE, '*'); + assertEquals(expected, actual, DELTA); + } + + @Test + void calculate_divisionWithMinAndMaxDoubleValues_Ok() { + expected = Double.MAX_VALUE / Double.MIN_VALUE; + actual = calculator.calculate(Double.MAX_VALUE, Double.MIN_VALUE, '/'); + assertEquals(expected, actual, DELTA); + } + + @Test + void calculate_divisionByZero_NotOk() { + assertThrows(ArithmeticException.class, () -> { + calculator.calculate(2.0, 0.0, '/'); + }); + } + + @Test + void calculate_raisingPositiveValueToThePositivePower_Ok() { + expected = 64.0; + actual = calculator.calculate(8.0, 2.0, '^'); + assertEquals(expected, actual); + } + + @Test + void calculate_raisingNegativeValueToThePositivePower_Ok() { + expected = 64.0; + actual = calculator.calculate(-8.0, 2.0, '^'); + assertEquals(expected, actual); + } + + @Test + void calculate_raisingPositiveValueToTheNegativePower_Ok() { + expected = 0.015625; + actual = calculator.calculate(8.0, -2.0, '^'); + assertEquals(expected, actual, DELTA); + } + + @Test + void calculate_raisingNegativeValueToTheNegativePower_Ok() { + expected = 0.015625; + actual = calculator.calculate(-8.0, -2.0, '^'); + assertEquals(expected, actual, DELTA); + } + + @Test + void calculate_raisingPositiveValueToZeroPower_Ok() { + expected = 1.0; + actual = calculator.calculate(8.0, 0.0, '^'); + assertEquals(expected, actual); + } + + @Test + void calculate_raisingNegativeValueToZeroPower_Ok() { + expected = 1.0; + actual = calculator.calculate(-8.0, 0.0, '^'); + assertEquals(expected, actual); + } + + @Test + void calculate_raisingZeroToPower_Ok() { + expected = 0.0; + actual = calculator.calculate(0.0, 10.0, '^'); + assertEquals(expected, actual); + } + + @Test + void calculate_raisingZeroToNegativePower() { + expected = Double.POSITIVE_INFINITY; + actual = calculator.calculate(0, -2, '^'); + assertEquals(expected, actual); + } + + @Test + void illegalOperation_NotOk() { + assertThrows(IllegalArgumentException.class, () -> { + calculator.calculate(2.0, 3.0, '#'); + }); + } +} 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 { - -}