Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
5 changes: 5 additions & 0 deletions src/main/java/core/basesyntax/Calculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package core.basesyntax;

public interface Calculator {
double calculate(double a, double b, char ch);
}
37 changes: 37 additions & 0 deletions src/main/java/core/basesyntax/CalculatorImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package core.basesyntax;

public class CalculatorImpl implements Calculator {
@Override
public double calculate(double a, double b, char ch) throws ArithmeticException {
double result;
switch (ch) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
if (b == 0) {
throw new ArithmeticException();
} else {
result = a / b;
}
break;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
} else {
result = a / b;
}
break;
}
return result = a / b;

case '^' :
result = Math.pow(a,b);
break;
Comment on lines +25 to +26
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
result = Math.pow(a,b);
break;
return Math.pow(a,b);

default:
result = 0;
}
if (ch != '+' && ch != '-' && ch != '*'
&& ch != '/' && ch != '^') {
throw new IllegalOperationException("This operation is not thought "
+ "out for this calculator");
}
return result;
}
}
8 changes: 8 additions & 0 deletions src/main/java/core/basesyntax/IllegalOperationException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package core.basesyntax;

public class IllegalOperationException extends RuntimeException {
public IllegalOperationException(String message) {
super(message);
}

}
214 changes: 214 additions & 0 deletions src/test/java/core/basesyntax/CalculatorImplTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
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 CalculatorImplTest {
private static Calculator calculator;
private double operand1;
private double operand2;
private double actual;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

так як ці змінні різні для кожного тест кейсу їх логічніше винести в окремі методи і не оголошувати на рівні класу

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в принципі, ці змінні можна взагалі не створювати, а передавати відразу в метод цифри та char, чи не так?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

так, загаом можна одразу передавати, неймінг потрібен тількки якщо неочевидно чому те чи інше значення було передано (наприклад k як invalidOperation

private char ch;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
private char ch;
private char operation;


@BeforeAll
static void beforeAll() {
calculator = new CalculatorImpl();
}

@Test
void calculate_AdditionTwoPositiveOperands_Ok() {
operand1 = 6;
operand2 = 7;
ch = '+';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 + operand2,actual);
}

@Test
void calculate_AdditionTwoNegativeOperands_Ok() {
operand1 = -6;
operand2 = -7;
ch = '+';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 + operand2,actual);
}

@Test
void calculate_AdditionNegativeAndPositiveOperands_Ok() {
operand1 = 6;
operand2 = -7;
ch = '+';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 + operand2,actual);
}

@Test
void calculate_AdditionZeroDifferentPlaces_Ok() {
operand1 = 6;
operand2 = 0;
ch = '+';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 + operand2,actual);
operand1 = 0;
operand2 = -6;
ch = '+';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 + operand2,actual);
}

@Test
void calculate_AdditionMaxAndMinDoubleValues_Ok() {
operand1 = Double.MIN_VALUE;
operand2 = Double.MAX_VALUE;
ch = '+';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 + operand2,actual);
}

@Test
void calculate_SubtractionTwoPositiveOperands_Ok() {
operand1 = 6;
operand2 = 7;
ch = '-';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 - operand2,actual);
}

@Test
void calculate_SubtractionTwoNegativeOperands_Ok() {
operand1 = -6;
operand2 = -7;
ch = '-';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 - operand2,actual);
}

@Test
void calculate_SubtractionNegativeAndPositiveOperands_Ok() {
operand1 = 6;
operand2 = -7;
ch = '-';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 - operand2,actual);
}

@Test
void calculate_SubtractionZeroDifferentPlaces_Ok() {
operand1 = 6;
operand2 = 0;
ch = '-';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 - operand2,actual);
operand1 = 0;
operand2 = -6;
ch = '-';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 - operand2,actual);
}

@Test
void calculate_SubtractionMaxAndMinDoubleValues_Ok() {
operand1 = Double.MIN_VALUE;
operand2 = Double.MAX_VALUE;
ch = '-';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 - operand2,actual);
}

@Test
void calculate_MultiplicationTwoPositiveOperands() {
operand1 = 5;
operand2 = 6;
ch = '*';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 * operand2,actual);
}

@Test
void calculate_MultiplicationTwoNegativeOperands() {
operand1 = -5;
operand2 = -6;
ch = '*';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 * operand2,actual);
}

@Test
void calculate_MultiplicationZeroDifferentPlaces_Ok() {
operand1 = 6;
operand2 = 0;
ch = '*';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(0,actual);
}

@Test
void calculate_MultiplicationMaxAndMinDoubleValues_Ok() {
operand1 = Double.MIN_VALUE;
operand2 = Double.MAX_VALUE;
ch = '*';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 * operand2,actual);
}

@Test
void calculate_DivisionTwoPositiveOperands() {
operand1 = 5;
operand2 = 6;
ch = '/';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 / operand2,actual);
}

@Test
void calculate_DivisionTwoNegativeOperands() {
operand1 = -5;
operand2 = -6;
ch = '/';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 / operand2,actual);
}

@Test
void calculate_DivisionZeroDifferentPlaces_Ok() {
operand1 = 6;
operand2 = 3;
ch = '/';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 / operand2,actual);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

цей код не належить до випадку, коли ми ділимо на 0 краще його прибрати/перенести в інший тест кейс якщо в цьому є потреба

operand2 = 0;
assertThrows(ArithmeticException.class, () -> {
calculator.calculate(operand1, operand2, ch);
});
}

@Test
void calculate_DivisionMaxAndMinDoubleValues_Ok() {
operand1 = Double.MAX_VALUE;
operand2 = Double.MIN_VALUE;
ch = '/';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(operand1 / operand2,actual);
}

@Test
void calculate_Raising_Ok() {
operand1 = 4;
operand2 = 5;
ch = '^';
actual = calculator.calculate(operand1,operand2,ch);
assertEquals(Math.pow(operand1,operand2),actual);
}

@Test
void calculate_IllegalOperation_NotOk() {
if (ch != '+' && ch != '-' && ch != '*' && ch != '/' && ch != '^') {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

цей тест кейс краще зробити більш читаймим: оголосит невалідну операцію в методі, передати її в calculate і тоді очікувати ексепшн

assertThrows(Exception.class, () -> {
calculator.calculate(operand1, operand2, ch);
});
}
}
}