Skip to content
Open
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
70 changes: 59 additions & 11 deletions src/main/java/htw/berlin/prog2/ha1/Calculator.java
Original file line number Diff line number Diff line change
Expand Up @@ -117,17 +117,65 @@ public void pressNegativeKey() {
* Operation (ggf. inklusive letztem Operand) erneut auf den aktuellen Bildschirminhalt angewandt
* und das Ergebnis direkt angezeigt.
*/


/**
* Neuer JavaDoc
* Empfängt den Befehl der gedrückten "="-Taste.
* Wurde zuvor keine Operationstaste gedrückt, passiert nichts.
* Wurde zuvor eine binäre Operationstaste gedrückt und zwei Operanden eingegeben, wird das
* Ergebnis der Operation angezeigt. **Falls hierbei eine Division durch Null auftritt
* oder das Ergebnis mathematisch nicht definiert ist (unendlich), wird "Error" angezeigt.**
* Wird die Taste weitere Male gedrückt (ohne andere Tasten dazwischen), so wird die letzte
* Operation (ggf. inklusive letztem Operand) erneut auf den aktuellen Bildschirminhalt angewandt
* und das Ergebnis direkt angezeigt.
*/


public void pressEqualsKey() {
var result = switch(latestOperation) {
case "+" -> latestValue + Double.parseDouble(screen);
case "-" -> latestValue - Double.parseDouble(screen);
case "x" -> latestValue * Double.parseDouble(screen);
case "/" -> latestValue / Double.parseDouble(screen);
default -> throw new IllegalArgumentException();
};
screen = Double.toString(result);
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);
// Falls noch gar keine Operation gewählt wurde, tun wir nichts
if (latestOperation == null || latestOperation.isEmpty()) {
return;
}

// Hier wird die Variable erstellt, die dir aktuell fehlt:
double secondValue = Double.parseDouble(screen);
double result = 0;

switch (latestOperation) {
case "+" -> result = latestValue + secondValue;
case "-" -> result = latestValue - secondValue;
case "x" -> result = latestValue * secondValue;
case "/" -> {
if (secondValue == 0) {
screen = "Error";
return; // Beendet die Methode sofort
}
result = latestValue / secondValue;
}
default -> throw new IllegalArgumentException();
}

// Ergebnis in String umwandeln
screen = Double.toString(result);

// Formatierung für die Tests
if (screen.equals("Infinity") || screen.equals("NaN")) {
screen = "Error";
}

// Entfernt das .0 bei Ganzzahlen (wichtig für die Tests!)
if (screen.endsWith(".0")) {
screen = screen.substring(0, screen.length() - 2);
}

// Kürzt zu lange Zahlen (Überlaufschutz)
if (screen.contains(".") && screen.length() > 11) {
screen = screen.substring(0, 11);
}
}



}

75 changes: 75 additions & 0 deletions src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,5 +90,80 @@ void testMultipleDecimalDots() {


//TODO hier weitere Tests erstellen


// Teilaufgabe 2


@Test
@DisplayName("should display result after adding two negative numbers")
void testNegativeAddition(){
Calculator calc = new Calculator();

calc.pressNegativeKey();
calc.pressDigitKey(2);
calc.pressNegativeKey();
calc.pressDigitKey(2);
calc.pressEqualsKey();

String expected = "-4";
String actual = calc.readScreen();

assertEquals(expected, actual);


}


//Teilaufgabe 3



@Test
@DisplayName("should clear the internal state after pressing clear")
void testClearState() {
Calculator calc = new Calculator();

// Erste Rechnung
calc.pressDigitKey(5);
calc.pressBinaryOperationKey("+");
calc.pressDigitKey(5);
calc.pressEqualsKey(); // Ergebnis ist 10

// Rechner löschen
calc.pressClearKey(); // Hier liegt vermutlich der Fehler

// Neue Rechnung
calc.pressDigitKey(5);
calc.pressBinaryOperationKey("+");

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

assertEquals(expected, actual);
// Dieser Test wird ROT, weil dein Rechner "15" statt "5" liefert.
}



@Test
@DisplayName("should display Error when dividing by zero")
void testDivisionBy0() {
Calculator calc = new Calculator();

calc.pressDigitKey(8);
calc.pressBinaryOperationKey("/");
calc.pressDigitKey(0);
calc.pressEqualsKey();

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

assertEquals(expected, actual);
}




}