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
43 changes: 32 additions & 11 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,9 +58,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,19 +71,23 @@ 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
* @author Quang Vien
* da der UnaryOperationKey als latestValue bezeichnet wird, kann die Methode @see pressEqualskey
* nicht funktionieren. Bug wurde mit Miroslav Keil gefunden und gefixt.
*/
public void pressUnaryOperationKey(String operation) {
latestValue = Double.parseDouble(screen);
latestOperation = operation;
var result = switch(operation) {
//latestValue = Double.parseDouble(screen);
//latestOperation = 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.contains(".") && screen.length() > 11) screen = screen.substring(0, 10);
if (screen.contains(".") && screen.length() > 11) screen = screen.substring(0, 10);

}

Expand All @@ -93,7 +99,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.endsWith(".")) screen = screen + ".";
}

/**
Expand All @@ -115,17 +121,32 @@ public void pressNegativeKey() {
* 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.
* <p>
* Bug: Kann keine Lösung geben da der letzte Input √ ist.
*
* @author Quang Vien
* Wenn man 100 000 000 mit 100 000 000 multipliziert kommt als Ergebnis
* im Onlinecalculator 1+e16. Gib man diese Lösung als expected in das Programm
* kommt die Lösung jedoch in einer anderen Schreibweise (1.0E16)
* <p>
* Ansatz: Dem Programm sagen, dass die Zahl anders angezeigt wird, da die Lösung richtig
* ist.
*/
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.endsWith(".0")) screen = screen.substring(0,screen.length()-2);
if(screen.contains(".") && screen.length() > 11) screen = screen.substring(0, 10);
int index = screen.indexOf(".0E16");
if (index > -1) screen = screen.substring(0, index) + "e+16";
if (screen.endsWith(".0")) screen = screen.substring(0, screen.length() - 2);
if (screen.contains(".") && screen.length() > 11) screen = screen.substring(0, 10);


}
}

75 changes: 75 additions & 0 deletions app/src/test/java/htw/berlin/prog2/ha1/CalculatorTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package htw.berlin.prog2.ha1;

import org.checkerframework.common.value.qual.StaticallyExecutable;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

Expand Down Expand Up @@ -41,5 +42,79 @@ void testSquareRoot() {
}

//TODO hier weitere Tests erstellen

@Test
@DisplayName("should display the result after dividing the numerator with the denominator")
void testDivide(){
Calculator calc = new Calculator();

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

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

assertEquals(expected, actual);
}


@Test
@DisplayName("should Display the result after subtracting one squareroot with another")
void testSubtractSquareRoots(){
Calculator calc = new Calculator();

calc.pressDigitKey(7);
calc.pressDigitKey(6);
calc.pressUnaryOperationKey("√");
calc.pressBinaryOperationKey("-");
calc.pressDigitKey(7);
calc.pressDigitKey(2);
calc.pressUnaryOperationKey("√");
calc.pressEqualsKey();

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

assertEquals(expected, actual);


}

@Test
@DisplayName("should display the result after multiplying 2 numbers")
void testMultiply(){
Calculator calc = new Calculator();


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

String expected = "1e+16";
String actual = calc.readScreen();

assertEquals(expected, actual);

}

}