Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
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
22 changes: 19 additions & 3 deletions src/main/java/htw/berlin/prog2/ha1/Calculator.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,29 @@ public String readScreen() {
* drücken kann muss der Wert positiv und einstellig sein und zwischen 0 und 9 liegen.
* Führt in jedem Fall dazu, dass die gerade gedrückte Ziffer auf dem Bildschirm angezeigt
* oder rechts an die zuvor gedrückte Ziffer angehängt angezeigt wird.
* Modifiziert, sodass nun auch die pressDotKey Taste vor einer Zahl gedrückt werden kann,
* um daraus "0.Zahl" zu machen.
* @param digit Die Ziffer, deren Taste gedrückt wurde
*/
public void pressDigitKey(int digit) {
if(digit > 9 || digit < 0) throw new IllegalArgumentException();

if(screen.equals("0") || latestValue == Double.parseDouble(screen)) screen = "";
if(screen.equals("0") || (isCompleteNumber(screen) && latestValue == Double.parseDouble(screen))) screen = "";

screen = screen + digit;
}

/**
* Hilfsmethode, die festlegt, was genau als "komplette/fertige Zahl" gilt, damit der Screen
* nicht fälschlicherweise bei einer Eingabe von der Punkt-Taste zurückgesetzt wird
* und somit eine Eingabe von Punkt-Taste -> 5 -> 0.5 berechnet werden kann.
* @param screen Der Output des Screens
* @return komplette Zahl, darf nicht mit "." enden und auch nicht leer sein.
*/
private boolean isCompleteNumber(String screen) {
return !screen.endsWith(".") && !screen.isEmpty();
}

/**
* Empfängt den Befehl der C- bzw. CE-Taste (Clear bzw. Clear Entry).
* Einmaliges Drücken der Taste löscht die zuvor eingegebenen Ziffern auf dem Bildschirm
Expand All @@ -55,11 +68,11 @@ public void pressClearKey() {
* Addition, Substraktion, Division, oder Multiplikation, welche zwei Operanden benötigen.
* Beim ersten Drücken der Taste wird der Bildschirminhalt nicht verändert, sondern nur der
* Rechner in den passenden Operationsmodus versetzt.
* Beim zweiten Drücken nach Eingabe einer weiteren Zahl wird direkt des aktuelle Zwischenergebnis
* Beim zweiten Drücken nach Eingabe einer weiteren Zahl wird direkt das aktuelle Zwischenergebnis
* auf dem Bildschirm angezeigt. Falls hierbei eine Division durch Null auftritt, wird "Error" angezeigt.
* @param operation "+" für Addition, "-" für Substraktion, "x" für Multiplikation, "/" für Division
*/
public void pressBinaryOperationKey(String operation) {
public void pressBinaryOperationKey(String operation) {
latestValue = Double.parseDouble(screen);
latestOperation = operation;
}
Expand All @@ -81,6 +94,9 @@ public void pressUnaryOperationKey(String operation) {
default -> throw new IllegalArgumentException();
};
screen = Double.toString(result);
if(screen.endsWith(".0")) {
screen = screen.substring(0, screen.length() - 2); //1. Fix, entfernt zwei Stellen, wenn das Ergebnis mit ".0" endet.
}
if(screen.equals("NaN")) screen = "Error";
if(screen.contains(".") && screen.length() > 11) screen = screen.substring(0, 10);

Expand Down
48 changes: 48 additions & 0 deletions src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.beans.Transient;

@DisplayName("Retro calculator")
class CalculatorTest {

Expand Down Expand Up @@ -90,5 +92,51 @@ void testMultipleDecimalDots() {


//TODO hier weitere Tests erstellen
@Test
@DisplayName("should display result when multiplicating two positive numbers")
void testPositiveMultiplication() {
Calculator calc = new Calculator();

calc.pressDigitKey(7);
calc.pressBinaryOperationKey("x");
calc.pressDigitKey(3);
calc.pressEqualsKey();

String expected = "21";
String actual = calc.readScreen();

assertEquals(expected, actual);
}

@Test
@DisplayName("should display result when calculating the square root of nine")
void testSquareRootOfNine() {
Calculator calc = new Calculator();

calc.pressDigitKey(9);
calc.pressUnaryOperationKey("√");

String expected = "3"; //1. roter Test, anstatt von 3 wird 3.0 ausgegeben.
String actual = calc.readScreen();

assertEquals(expected, actual);
}

@Test
@DisplayName("should handle and display decimal input correctly")
void testDecimalInputHandling() {
Calculator calc = new Calculator();

calc.pressDotKey();
calc.pressDigitKey(5);
calc.pressBinaryOperationKey("+");
calc.pressDigitKey(1);
calc.pressEqualsKey();

String expected = "1.5"; //2. roter Test, sollte z. B. mit der Zahl "5" 0.5 anstatt 5 anzeigen, wenn zuerst die Punkt-Taste und danach eine Zahl (in dem Fall 5) gedrückt wird.
String actual = calc.readScreen(); //Führt zu einem falschen Ergebnis.

assertEquals(expected, actual);
}
}