diff --git a/src/main/java/htw/berlin/prog2/ha1/Calculator.java b/src/main/java/htw/berlin/prog2/ha1/Calculator.java index 84c04f2..bfffe67 100644 --- a/src/main/java/htw/berlin/prog2/ha1/Calculator.java +++ b/src/main/java/htw/berlin/prog2/ha1/Calculator.java @@ -14,6 +14,9 @@ public class Calculator { private String latestOperation = ""; + private boolean wasClearedOnce = false; + + /** * @return den aktuellen Bildschirminhalt als String */ @@ -31,11 +34,14 @@ public String readScreen() { public void pressDigitKey(int digit) { if(digit > 9 || digit < 0) throw new IllegalArgumentException(); + wasClearedOnce = false; + if(screen.equals("0") || latestValue == Double.parseDouble(screen)) screen = ""; screen = screen + digit; } + /** * 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 @@ -45,10 +51,25 @@ public void pressDigitKey(int digit) { * im Ursprungszustand ist. */ public void pressClearKey() { - screen = "0"; - latestOperation = ""; - latestValue = 0.0; + if (!wasClearedOnce) { + screen = "0"; + wasClearedOnce = true; + } else { + screen = "0"; + latestOperation = ""; + latestValue = 0.0; + wasClearedOnce = false; + } + + } + public double getLatestValue() { + return latestValue; + } + public String getLatestOperation() { + return latestOperation; + } + /** * Empfängt den Wert einer gedrückten binären Operationstaste, also eine der vier Operationen @@ -118,6 +139,11 @@ public void pressNegativeKey() { * und das Ergebnis direkt angezeigt. */ public void pressEqualsKey() { + + if (latestOperation.isEmpty()) { + return; + } + var result = switch(latestOperation) { case "+" -> latestValue + Double.parseDouble(screen); case "-" -> latestValue - Double.parseDouble(screen); @@ -129,5 +155,6 @@ public void pressEqualsKey() { if(screen.equals("Infinity")) screen = "Error"; if(screen.endsWith(".0")) screen = screen.substring(0,screen.length()-2); if(screen.contains(".") && screen.length() > 11) screen = screen.substring(0, 10); + latestValue = result; } } diff --git a/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java b/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java index ddff0da..2b9e84c 100644 --- a/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java +++ b/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java @@ -87,8 +87,61 @@ void testMultipleDecimalDots() { assertEquals(expected, actual); } + //TODO hier weitere Tests erstellen + + @Test + @DisplayName("should change sign to postive when pressing negative key twice") + void testChangeOfSign() { + Calculator calc = new Calculator(); + + calc.pressDigitKey(1); + calc.pressDigitKey(6); + calc.pressNegativeKey(); + calc.pressNegativeKey(); + + String expected = "16"; + String actual = calc.readScreen(); + assertEquals(expected, actual); + } + @Test + @DisplayName("should do nothing when equals key is pressed without prior operation") + void testEqualsKeyWithoutOperation() { + Calculator calc = new Calculator(); + + calc.pressDigitKey(1); + calc.pressDigitKey(4); + calc.pressDigitKey(9); + calc.pressEqualsKey(); + + String expected = "149"; + String actual = calc.readScreen(); + + assertEquals(expected, actual); + } + @Test + @DisplayName("should only clear screen on first press and reset memory on second press") + void testDoubleClearResetCalculator() { + Calculator calc = new Calculator(); + + calc.pressDigitKey(4); + calc.pressBinaryOperationKey("+"); + calc.pressDigitKey(2); + calc.pressDigitKey(3); + calc.pressEqualsKey(); + + calc.pressClearKey(); + assertEquals(27, calc.getLatestValue()); + assertEquals("+", calc.getLatestOperation()); + + calc.pressClearKey(); + String expected = "0"; + String actual = calc.readScreen(); + assertEquals(0, calc.getLatestValue()); + assertEquals("", calc.getLatestOperation()); + assertEquals(expected, actual); + + } - //TODO hier weitere Tests erstellen }