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

private String latestOperation = "";

private boolean isNewInput = false;

/**
* @return den aktuellen Bildschirminhalt als String
*/
Expand All @@ -31,8 +33,10 @@ public String readScreen() {
public void pressDigitKey(int digit) {
if(digit > 9 || digit < 0) throw new IllegalArgumentException();

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

if(screen.equals("0") || screen.equals("Error") || isNewInput) {
screen = "";
isNewInput = false;
}
screen = screen + digit;
}

Expand All @@ -46,7 +50,7 @@ public void pressDigitKey(int digit) {
*/
public void pressClearKey() {
screen = "0";
latestOperation = "";
latestOperation = ""; //Die CE Eingabe wird nicht beachtet. Es werden in jedem Fall alle bisher getätigten Eingaben gelöscht.
latestValue = 0.0;
}

Expand All @@ -62,6 +66,7 @@ public void pressClearKey() {
public void pressBinaryOperationKey(String operation) {
latestValue = Double.parseDouble(screen);
latestOperation = operation;
isNewInput = true;
}

/**
Expand All @@ -77,11 +82,12 @@ public void pressUnaryOperationKey(String operation) {
var result = switch(operation) {
case "√" -> Math.sqrt(Double.parseDouble(screen));
case "%" -> Double.parseDouble(screen) / 100;
case "1/x" -> 1 / Double.parseDouble(screen);
case "1/x" -> 1 / Double.parseDouble(screen); //1 / 0 ergibt infinity, wird hier nicht behandelt
default -> throw new IllegalArgumentException();
};
screen = Double.toString(result);
if(screen.equals("NaN")) screen = "Error";
if(screen.equals("Infinity")) screen = "Error";
if(screen.contains(".") && screen.length() > 11) screen = screen.substring(0, 10);

}
Expand All @@ -105,7 +111,7 @@ public void pressDotKey() {
* entfernt und der Inhalt fortan als positiv interpretiert.
*/
public void pressNegativeKey() {
screen = screen.startsWith("-") ? screen.substring(1) : "-" + screen;
screen = screen.startsWith("-") ? screen.substring(1) : "-" + screen; //so in Ordnung
}

/**
Expand All @@ -122,12 +128,12 @@ public void pressEqualsKey() {
case "+" -> latestValue + Double.parseDouble(screen);
case "-" -> latestValue - Double.parseDouble(screen);
case "x" -> latestValue * Double.parseDouble(screen);
case "/" -> latestValue / Double.parseDouble(screen);
case "/" -> latestValue / Double.parseDouble(screen); //Analog zu oben; latestValue / 0 führt zu einem Fehler
default -> throw new IllegalArgumentException();
};
screen = Double.toString(result);
if(screen.equals("Infinity")) screen = "Error";
if(screen.equals("Infinity")) screen = "Error"; //In keinem Ergebnis kann "Infinity" im String stehen
if(screen.endsWith(".0")) screen = screen.substring(0,screen.length()-2);
if(screen.contains(".") && screen.length() > 11) screen = screen.substring(0, 10);
if(screen.contains(".") && screen.length() > 11) screen = screen.substring(0, 10); //Die Gesamtlänge der Zahl wird hier auf 10 Stellen Begrenzt. Soll eigentlich mit "e" und der Potenz Arbeiten.
}
}
42 changes: 42 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 @@ -88,7 +88,49 @@ void testMultipleDecimalDots() {
assertEquals(expected, actual);
}

@Test
@DisplayName("Ersetzt auf dem Display die 0, wenn eine Zahl zwischen 1 und 9 nachfolgend gedrückt wird")
void testPressDigitKey(){
Calculator calc = new Calculator();

calc.pressDigitKey(0);
calc.pressDigitKey(5);

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

assertEquals(expected, actual);
}

@Test
@DisplayName("Anfügen mehrerer gleicher aufeinanderfolgender Zahlen")
void testPressDigitKeyWholeNumber(){
Calculator calc = new Calculator();

calc.pressDigitKey(3);
calc.pressBinaryOperationKey("+");
calc.pressDigitKey(3);
calc.pressDigitKey(4);

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

assertEquals(expected, actual);
}

@Test
@DisplayName("1/X wirft bei screen = 0 einen Error")
void testDivideOneByZero(){
Calculator calc = new Calculator();

calc.pressDigitKey(0);
calc.pressUnaryOperationKey("1/x");

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

assertEquals(expected, actual);
}
//TODO hier weitere Tests erstellen
}