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..82390fb5 100644 --- a/app/src/main/java/htw/berlin/prog2/ha1/Calculator.java +++ b/app/src/main/java/htw/berlin/prog2/ha1/Calculator.java @@ -1,5 +1,4 @@ package htw.berlin.prog2.ha1; - /** * Eine Klasse, die das Verhalten des Online Taschenrechners imitiert, welcher auf * https://www.online-calculator.com/ aufgerufen werden kann (ohne die Memory-Funktionen) @@ -7,20 +6,15 @@ * Enthält mit Absicht noch diverse Bugs oder unvollständige Funktionen. */ public class Calculator { - private String screen = "0"; - private double latestValue; - private String latestOperation = ""; - /** * @return den aktuellen Bildschirminhalt als String */ public String readScreen() { return screen; } - /** * Empfängt den Wert einer gedrückten Zifferntaste. Da man nur eine Taste auf einmal * drücken kann muss der Wert positiv und einstellig sein und zwischen 0 und 9 liegen. @@ -30,12 +24,9 @@ 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 = ""; - 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 @@ -49,7 +40,6 @@ public void pressClearKey() { latestOperation = ""; latestValue = 0.0; } - /** * Empfängt den Wert einer gedrückten binären Operationstaste, also eine der vier Operationen * Addition, Substraktion, Division, oder Multiplikation, welche zwei Operanden benötigen. @@ -63,7 +53,6 @@ public void pressBinaryOperationKey(String operation) { latestValue = Double.parseDouble(screen); latestOperation = operation; } - /** * Empfängt den Wert einer gedrückten unären Operationstaste, also eine der drei Operationen * Quadratwurzel, Prozent, Inversion, welche nur einen Operanden benötigen. @@ -82,10 +71,11 @@ public void pressUnaryOperationKey(String operation) { }; 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); + if(screen.endsWith(".0")) screen = screen.substring(0,screen.length()-2); } - /** * Empfängt den Befehl der gedrückten Dezimaltrennzeichentaste, im Englischen üblicherweise "." * Fügt beim ersten Mal Drücken dem aktuellen Bildschirminhalt das Trennzeichen auf der rechten @@ -94,6 +84,7 @@ public void pressUnaryOperationKey(String operation) { * Beim zweimaligem Drücken, oder wenn bereits ein Trennzeichen angezeigt wird, passiert nichts. */ public void pressDotKey() { + if(!screen.endsWith(".")) screen = screen + "."; if(!screen.contains(".")) screen = screen + "."; } @@ -107,7 +98,6 @@ public void pressDotKey() { public void pressNegativeKey() { screen = screen.startsWith("-") ? screen.substring(1) : "-" + screen; } - /** * Empfängt den Befehl der gedrückten "="-Taste. * Wurde zuvor keine Operationstaste gedrückt, passiert nichts. @@ -123,6 +113,7 @@ public void pressEqualsKey() { case "-" -> latestValue - Double.parseDouble(screen); case "x" -> latestValue * Double.parseDouble(screen); case "/" -> latestValue / Double.parseDouble(screen); + case "%" -> latestValue % Double.parseDouble(screen); default -> throw new IllegalArgumentException(); }; screen = Double.toString(result); @@ -130,4 +121,5 @@ public void pressEqualsKey() { if(screen.endsWith(".0")) screen = screen.substring(0,screen.length()-2); if(screen.contains(".") && screen.length() > 11) screen = screen.substring(0, 10); } -} + +} \ No newline at end of file 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..37970702 100644 --- a/app/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java +++ b/app/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java @@ -90,5 +90,50 @@ void testMultipleDecimalDots() { //TODO hier weitere Tests erstellen + @Test + @DisplayName("should display result after subtracting two positive digit numbers") + void testPositiveSubstraktion() { + Calculator calc = new Calculator(); + + calc.pressDigitKey(8); + calc.pressBinaryOperationKey("-"); + calc.pressDigitKey(2); + calc.pressEqualsKey(); + + String expected = "6"; + String actual = calc.readScreen(); + + assertEquals(expected, actual); + } + + @Test + @DisplayName("should display error when drawing the inversion") + void testInversion() { + Calculator calc = new Calculator(); + + calc.pressUnaryOperationKey("1/x"); + + String expected = "Error"; + String actual = calc.readScreen(); + + assertEquals(expected, actual); + } + + @Test + @DisplayName("should display the percentage of the number") + void testPercent() { + Calculator calc = new Calculator(); + + calc.pressDigitKey(8); + calc.pressDigitKey(0); + calc.pressDigitKey(0); + calc.pressUnaryOperationKey("%"); + + String expected = "8"; + String actual = calc.readScreen(); + + assertEquals(expected, actual); + } + }