Skip to content
Open

HA1 #88

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
49 changes: 36 additions & 13 deletions app/src/main/java/htw/berlin/prog2/ha1/Calculator.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,13 @@ 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.
*
* @param digit Die Ziffer, deren Taste gedrückt wurde
*/
public void pressDigitKey(int digit) {
if(digit > 9 || digit < 0) throw new IllegalArgumentException();
if (digit > 9 || digit < 0) throw new IllegalArgumentException();

if(screen.equals("0") || latestValue == Double.parseDouble(screen)) screen = "";
if (screen.equals("0") || latestValue == Double.parseDouble(screen)) screen = "";

screen = screen + digit;
}
Expand All @@ -57,32 +58,50 @@ public void pressClearKey() {
* Rechner in den passenden Operationsmodus versetzt.
* Beim zweiten Drücken nach Eingabe einer weiteren Zahl wird direkt des 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) {
latestValue = Double.parseDouble(screen);
public void pressBinaryOperationKey(String operation) {

if (screen.startsWith("-") && latestOperation.isEmpty()) {
latestValue = Double.parseDouble(screen);
} else if (!latestOperation.isEmpty()) {
latestValue = latestValue + Double.parseDouble(screen);
} else {
latestValue = Double.parseDouble(screen);
}

latestOperation = operation;
}
screen = "0";


}
/**
* Empfängt den Wert einer gedrückten unären Operationstaste, also eine der drei Operationen
* Quadratwurzel, Prozent, Inversion, welche nur einen Operanden benötigen.
* Beim Drücken der Taste wird direkt die Operation auf den aktuellen Zahlenwert angewendet und
* der Bildschirminhalt mit dem Ergebnis aktualisiert.
*
* @param operation "√" für Quadratwurzel, "%" für Prozent, "1/x" für Inversion
*/
public void pressUnaryOperationKey(String operation) {

if (!latestOperation.isEmpty() && !screen.equals("0")) {
screen = "Error"; // Zeigt einen Fehler an, wenn eine neue Operation eingegeben wird, ohne die vorherige zu beenden
return;
}

latestValue = Double.parseDouble(screen);
latestOperation = operation;
var result = switch(operation) {
var result = switch (operation) {
case "√" -> Math.sqrt(Double.parseDouble(screen));
case "%" -> Double.parseDouble(screen) / 100;
case "1/x" -> 1 / Double.parseDouble(screen);
default -> throw new IllegalArgumentException();
};
screen = Double.toString(result);
if(screen.equals("NaN")) screen = "Error";
if(screen.contains(".") && screen.length() > 11) screen = screen.substring(0, 10);
if (screen.equals("NaN")) screen = "Error";
if (screen.contains(".") && screen.length() > 11) screen = screen.substring(0, 10);

}

Expand All @@ -94,7 +113,7 @@ public void pressUnaryOperationKey(String operation) {
* Beim zweimaligem Drücken, oder wenn bereits ein Trennzeichen angezeigt wird, passiert nichts.
*/
public void pressDotKey() {
if(!screen.contains(".")) screen = screen + ".";
if (!screen.contains(".")) screen = screen + ".";
}

/**
Expand All @@ -118,16 +137,20 @@ public void pressNegativeKey() {
* und das Ergebnis direkt angezeigt.
*/
public void pressEqualsKey() {
var result = switch(latestOperation) {

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);

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);

}
}

58 changes: 57 additions & 1 deletion app/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,5 +90,61 @@ void testMultipleDecimalDots() {


//TODO hier weitere Tests erstellen
}

//Teilaufgabe 1: neu grüner Test
@Test
@DisplayName("should display result after minus two positive multi-digit numbers")
void testPositiveMinus() {
Calculator calc = new Calculator();

calc.pressDigitKey(2);
calc.pressDigitKey(0);
calc.pressBinaryOperationKey("-");
calc.pressDigitKey(1);
calc.pressDigitKey(0);
calc.pressEqualsKey();

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

assertEquals(expected, actual);
}


//Teilaufgabe 2: Zwei Roter Testen hinzufügen
@Test
@DisplayName("should display error when a non-numeric key is pressed")
void testNonNumericInput() {
Calculator calc = new Calculator();

calc.pressDigitKey(5);
calc.pressBinaryOperationKey("+");
calc.pressUnaryOperationKey("x");

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

assertEquals(expected, actual);
}



@Test
@DisplayName("should correctly handle addition between positive and negative numbers")
void testPositiveAndNegativeAddition() {
Calculator calc = new Calculator();

calc.pressDigitKey(7);
calc.pressBinaryOperationKey("+");
calc.pressNegativeKey();
calc.pressDigitKey(3);
calc.pressEqualsKey();

String expected = "4"; // 7 + (-3) = 4
String actual = calc.readScreen();

assertEquals(expected, actual);
}


}