diff --git a/app/src/main/java/htw/berlin/prog2/ha1/Calculator.java b/app/src/main/java/htw/berlin/prog2/ha1/Calculator.java index 84c04f21..203788b7 100644 --- a/app/src/main/java/htw/berlin/prog2/ha1/Calculator.java +++ b/app/src/main/java/htw/berlin/prog2/ha1/Calculator.java @@ -14,6 +14,8 @@ public class Calculator { private String latestOperation = ""; + private boolean isNewInput = false; + /** * @return den aktuellen Bildschirminhalt als String */ @@ -31,8 +33,10 @@ public String readScreen() { 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") || screen.equals("Error") || isNewInput) { + screen = ""; + isNewInput = false; + } screen = screen + digit; } @@ -46,7 +50,7 @@ public void pressDigitKey(int digit) { */ public void pressClearKey() { screen = "0"; - latestOperation = ""; + latestOperation = ""; //Die CE Eingabe wird nicht beachtet. Es werden in jedem Fall alle bisher getätigten Eingaben gelöscht. latestValue = 0.0; } @@ -62,6 +66,7 @@ public void pressClearKey() { public void pressBinaryOperationKey(String operation) { latestValue = Double.parseDouble(screen); latestOperation = operation; + isNewInput = true; } /** @@ -77,11 +82,12 @@ public void pressUnaryOperationKey(String operation) { var result = switch(operation) { case "√" -> Math.sqrt(Double.parseDouble(screen)); case "%" -> Double.parseDouble(screen) / 100; - case "1/x" -> 1 / Double.parseDouble(screen); + case "1/x" -> 1 / Double.parseDouble(screen); //1 / 0 ergibt infinity, wird hier nicht behandelt default -> throw new IllegalArgumentException(); }; screen = Double.toString(result); if(screen.equals("NaN")) screen = "Error"; + if(screen.equals("Infinity")) screen = "Error"; if(screen.contains(".") && screen.length() > 11) screen = screen.substring(0, 10); } @@ -105,7 +111,7 @@ public void pressDotKey() { * entfernt und der Inhalt fortan als positiv interpretiert. */ public void pressNegativeKey() { - screen = screen.startsWith("-") ? screen.substring(1) : "-" + screen; + screen = screen.startsWith("-") ? screen.substring(1) : "-" + screen; //so in Ordnung } /** @@ -122,12 +128,12 @@ public void pressEqualsKey() { case "+" -> latestValue + Double.parseDouble(screen); case "-" -> latestValue - Double.parseDouble(screen); case "x" -> latestValue * Double.parseDouble(screen); - case "/" -> latestValue / Double.parseDouble(screen); + case "/" -> latestValue / Double.parseDouble(screen); //Analog zu oben; latestValue / 0 führt zu einem Fehler default -> throw new IllegalArgumentException(); }; screen = Double.toString(result); - if(screen.equals("Infinity")) screen = "Error"; + if(screen.equals("Infinity")) screen = "Error"; //In keinem Ergebnis kann "Infinity" im String stehen if(screen.endsWith(".0")) screen = screen.substring(0,screen.length()-2); - if(screen.contains(".") && screen.length() > 11) screen = screen.substring(0, 10); + if(screen.contains(".") && screen.length() > 11) screen = screen.substring(0, 10); //Die Gesamtlänge der Zahl wird hier auf 10 Stellen Begrenzt. Soll eigentlich mit "e" und der Potenz Arbeiten. } } diff --git a/app/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java b/app/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java index ddff0daf..eca01171 100644 --- a/app/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java +++ b/app/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java @@ -88,7 +88,49 @@ void testMultipleDecimalDots() { assertEquals(expected, actual); } + @Test + @DisplayName("Ersetzt auf dem Display die 0, wenn eine Zahl zwischen 1 und 9 nachfolgend gedrückt wird") + void testPressDigitKey(){ + Calculator calc = new Calculator(); + + calc.pressDigitKey(0); + calc.pressDigitKey(5); + String expected = "5"; + String actual = calc.readScreen(); + + assertEquals(expected, actual); + } + + @Test + @DisplayName("Anfügen mehrerer gleicher aufeinanderfolgender Zahlen") + void testPressDigitKeyWholeNumber(){ + Calculator calc = new Calculator(); + + calc.pressDigitKey(3); + calc.pressBinaryOperationKey("+"); + calc.pressDigitKey(3); + calc.pressDigitKey(4); + + String expected = "34"; + String actual = calc.readScreen(); + + assertEquals(expected, actual); + } + + @Test + @DisplayName("1/X wirft bei screen = 0 einen Error") + void testDivideOneByZero(){ + Calculator calc = new Calculator(); + + calc.pressDigitKey(0); + calc.pressUnaryOperationKey("1/x"); + + String expected = "Error"; + String actual = calc.readScreen(); + + assertEquals(expected, actual); + } //TODO hier weitere Tests erstellen }