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
25 changes: 24 additions & 1 deletion src/main/java/htw/berlin/prog2/ha1/Calculator.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public class Calculator {

private String latestOperation = "";


/**
* @return den aktuellen Bildschirminhalt als String
*/
Expand Down Expand Up @@ -48,6 +49,8 @@ public void pressClearKey() {
screen = "0";
latestOperation = "";
latestValue = 0.0;


}

/**
Expand All @@ -59,7 +62,17 @@ public void pressClearKey() {
* 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
*/
// Bugfix: Bei mehreren Operationen wurde die erste Rechenoperation ignoriert,
// weil latestValue und latestOperation einfach überschrieben wurden,
// ohne die vorherige Operation auszuführen.
// Lösung: Wenn bereits eine Operation existiert (latestOperation ist nicht leer)
// und eine neue eingegeben wird, wird zuerst pressEqualsKey() aufgerufen,
// um die vorherige Operation auszuführen.

public void pressBinaryOperationKey(String operation) {
if (!latestOperation.isEmpty() && !screen.equals("0")) {
pressEqualsKey(); // Führt die vorige Operation aus
}
latestValue = Double.parseDouble(screen);
latestOperation = operation;
}
Expand All @@ -71,7 +84,15 @@ public void pressBinaryOperationKey(String operation) {
* der Bildschirminhalt mit dem Ergebnis aktualisiert.
* @param operation "√" für Quadratwurzel, "%" für Prozent, "1/x" für Inversion
*/
//Problem % wird als eigene Operation behandelt
public void pressUnaryOperationKey(String operation) {
//Jetzt wird geprüft, ob vorher eine binäre Operation eingegeben wurde
if (operation.equals("%") && !latestOperation.isEmpty()) {
double percent = latestValue * Double.parseDouble(screen) / 100; //Prozentsatz vom ersten Wert berechnet
screen = Double.toString(percent);
return;
}

latestValue = Double.parseDouble(screen);
latestOperation = operation;
var result = switch(operation) {
Expand Down Expand Up @@ -129,5 +150,7 @@ public void pressEqualsKey() {
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);


}
}
}
81 changes: 81 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,86 @@ void testMultipleDecimalDots() {


//TODO hier weitere Tests erstellen
//Zwei grüne Teste
//-3 x 4 ergibt -12
@Test
@DisplayName("should display results after multiplier to negative Numbers")
void testMultiplyNegativeNumbers() {

Calculator calc = new Calculator();
calc.pressDigitKey(3);
calc.pressNegativeKey();
calc.pressBinaryOperationKey("x");
calc.pressDigitKey(4);
calc.pressEqualsKey();
String expected = "-12";
String actual = calc.readScreen();
assertEquals(expected, actual);

}


//Addieren von -5 und -5 ergibt -10
@Test
@DisplayName("should display results after adding to negative Numbers")

void testNegativeNumbers() {
Calculator calc = new Calculator();
calc.pressDigitKey(5);
calc.pressNegativeKey();
calc.pressBinaryOperationKey("+");
calc.pressDigitKey(5);
calc.pressNegativeKey();
calc.pressEqualsKey();
String expected = "-10";
String actual = calc.readScreen();
assertEquals(expected, actual);


}

//2.Aufgabe 2: Erster roter Test
/** Mehrere Operationen hintereinander ohne Equalkey funktioniert nicht die Erste Operation wird ignoriert
* Erwartet 8+2-5=5
* tatsächlich 2-5=-3
*
*/
@Test
@DisplayName("performsOperationsWithoutEqualkey")
void testPerformOperationsWithoutEqualkey() {
Calculator calc = new Calculator();
calc.pressDigitKey(8);
calc.pressBinaryOperationKey("+");
calc.pressDigitKey(2);
calc.pressBinaryOperationKey("-");
calc.pressDigitKey(5);
calc.pressEqualsKey();
String expected = "5";
String actual = calc.readScreen();
assertEquals(expected, actual);

}
//2.Roter Test
// Test soll 200+10% berechnen,was 220 ergeben sollte also 200 + 10% von 200
// jedoch wird java.lang.IllegalArgumentException angezeigt
// Da % wurde als eigene Operation behandelt wurde.

@Test
@DisplayName("should calculate percentage based on first number")
void testCalculatePercentage() {
Calculator calc = new Calculator();
calc.pressDigitKey(2);
calc.pressDigitKey(0);
calc.pressDigitKey(0);
calc.pressBinaryOperationKey("+");
calc.pressDigitKey(1);
calc.pressDigitKey(0);
calc.pressUnaryOperationKey("%");
calc.pressEqualsKey();

String expected = "220";
String actual = calc.readScreen();
assertEquals(expected, actual);
}
}