diff --git a/src/main/java/htw/berlin/prog2/ha1/Calculator.java b/src/main/java/htw/berlin/prog2/ha1/Calculator.java index 84c04f2..7912795 100644 --- a/src/main/java/htw/berlin/prog2/ha1/Calculator.java +++ b/src/main/java/htw/berlin/prog2/ha1/Calculator.java @@ -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 @@ -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; } @@ -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); diff --git a/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java b/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java index ddff0da..d24aef6 100644 --- a/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java +++ b/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java @@ -5,6 +5,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; +import java.beans.Transient; + @DisplayName("Retro calculator") class CalculatorTest { @@ -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); + } }