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
34 changes: 19 additions & 15 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 @@ -45,9 +46,8 @@ public void pressDigitKey(int digit) {
* im Ursprungszustand ist.
*/
public void pressClearKey() {
screen = "0";
latestOperation = "";
latestValue = 0.0;
screen = "" + latestValue;
latestValue = Double.parseDouble(screen);
}

/**
Expand All @@ -57,9 +57,10 @@ 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) {
public void pressBinaryOperationKey(String operation) {
latestValue = Double.parseDouble(screen);
latestOperation = operation;
}
Expand All @@ -69,20 +70,21 @@ public void pressBinaryOperationKey(String operation) {
* 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) {
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 +96,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 +120,18 @@ 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();
default -> Double.parseDouble(screen);
};
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);
}
}


51 changes: 51 additions & 0 deletions 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,56 @@ void testMultipleDecimalDots() {


//TODO hier weitere Tests erstellen

@Test
@DisplayName("should display result after subtracting two positive multi-digit numbers")
void testSubtracting() {
Calculator calc = new Calculator();

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

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

assertEquals(expected, actual);
}
@Test
@DisplayName("should display result after clearing and performing new operation")
void testClearKey() {
Calculator calc = new Calculator();

calc.pressDigitKey(3);
calc.pressBinaryOperationKey("x");
calc.pressDigitKey(2);
calc.pressClearKey();
calc.pressDigitKey(1);
calc.pressEqualsKey();

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

assertEquals(expected, actual);
}
@Test
@DisplayName("should display 0 when multiplying by zero")
void testMultiplicationByZero() {
Calculator calc = new Calculator();

calc.pressDigitKey(7);
calc.pressBinaryOperationKey("x");
calc.pressDigitKey(0);
calc.pressEqualsKey();

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

assertEquals(expected, actual);
}
}

//Test