Junit Test für die Einfahren Methode, Gebühren berechnen methode,

Code-Verbesserungen, Use Case für das Parkhaus
main
3009594 2024-10-04 15:18:26 +02:00
parent 1bfd8bed19
commit 9cc877e0e9
8 changed files with 212 additions and 67 deletions

View File

@ -0,0 +1,41 @@
Frage 1:
Ich: erkläre mir mit einfachen Wörtern, wie man die Prüfziffer einer 16stellige VISA-Karten überprüft?
ChatGPT: Um die Prüfziffer einer 16-stelligen VISA-Karte zu überprüfen, verwendet man den sogenannten Luhn-Algorithmus. Hier ist eine einfache Schritt-für-Schritt-Erklärung, wie das funktioniert:
Zahlen von rechts nach links durchgehen: Schreibe die 16-stellige Kartennummer auf und beginne mit der letzten Ziffer (die ganz rechts steht).
Jede zweite Ziffer verdoppeln: Beginne bei der zweitletzten Ziffer und verdopple jede zweite Zahl. Wenn das Ergebnis des Verdoppelns zweistellig ist (z. B. 7 × 2 = 14), addiere die beiden Ziffern zusammen (also 1 + 4 = 5).
Alle Ziffern addieren: Nachdem du die Verdopplungen und die Additionen gemacht hast, zähle alle Ziffern zusammen (die verdoppelten und die unveränderten).
Durch 10 teilen: Wenn die Summe der Ziffern durch 10 teilbar ist (also ohne Rest), ist die Kartennummer gültig. Wenn nicht, ist sie ungültig.
Beispiel:
Kartennummer: 4532 7084 1234 5678
Verdopple jede zweite Ziffer (von rechts aus gesehen):
8 bleibt 8
7 wird zu 14 (1 + 4 = 5)
6 bleibt 6
5 wird zu 10 (1 + 0 = 1)
usw.
Addiere die Ziffern zusammen: Summe = 70
Da 70 durch 10 teilbar ist, ist die Kartennummer gültig.
Das ist der Grundprozess zur Überprüfung der Prüfziffer.
-------------------------------------------------------------------------------------------------------------------
Frage 2:
Ich: was macht die methode mathe.Ceil() einfach?
ChatGPT:Die Methode Math.ceil() ist eine Funktion aus der Java-Bibliothek, die eine Zahl aufrundet. Sie gibt den kleinsten ganzzahligen Wert zurück, der größer oder gleich der eingegebenen Zahl ist.
Funktionsweise von Math.ceil():
Wenn die Zahl bereits ganzzahlig ist, bleibt sie unverändert.
Wenn die Zahl einen Nachkommateil hat, wird sie zur nächsten vollen Zahl aufgerundet.
Beispiel:
Math.ceil(2.1); // Ausgabe: 3.0
Math.ceil(3.7); // Ausgabe: 4.0
Math.ceil(1.01); // Ausgabe: 2.0

Binary file not shown.

View File

@ -0,0 +1,9 @@
package Parkhaus;
public class AutoNichtGefundenException extends Exception {
AutoNichtGefundenException(String autoNichtGefunden){
super(autoNichtGefunden);
}
}

View File

@ -3,51 +3,73 @@ package Parkhaus;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
/* Jedes Fahrzeug hat ihr eigene:
* - Kennzeichen
* - Einfahrtzeit sowie Ausfahrtzeit
* - Betrag
*
* - Ich gehe davon aus, dass das Fahrzeug automatisch als nicht bezahlt gilt, wenn es in das Parkhaus einfährt.
*
*/
public class Fahrzeug { public class Fahrzeug {
private String kennzeichen; private final String kennzeichen;
private Date einfahrt; private final Date einfahrt;
private Date ausfahrt; private Date ausfahrt;
private boolean bezahlt; private boolean bezahlt;
private int betrag;
Fahrzeug() {
Fahrzeug() { this.kennzeichen = kennzeichenzufaelliggenerieren.kennzeichengenerieren();
this.kennzeichen = kennzeichenzufaelliggenerieren.kennzeichenzufaelliggenerieren();
this.einfahrt = new Date(); this.einfahrt = new Date();
this.betrag = 0;
this.bezahlt = false;
} }
Fahrzeug(String kennzeichen, Date einfahrt) { Fahrzeug(String kennzeichen, Date einfahrt) {
this.kennzeichen = kennzeichen; this.kennzeichen = kennzeichen;
this.einfahrt = einfahrt; this.einfahrt = einfahrt;
this.betrag = 0;
this.bezahlt = false;
} }
public String getKennzeichen() {
return kennzeichen;
}
public String getKennzeichen() {
return kennzeichen;
}
// Diese Methode hilft mir, die Zeit in der Console formatted auszugeben
public String getEinfahrtFormatted() { public String getEinfahrtFormatted() {
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
return sdf.format(einfahrt); return sdf.format(einfahrt);
} }
public Date getAusfahrt() { public Date getEinfahrt() {
return ausfahrt; return einfahrt;
} }
public void setAusfahrt(Date ausfahrt) { public Date getAusfahrt() {
this.ausfahrt = ausfahrt; return ausfahrt;
} }
public boolean isBezahlt() { public void setAusfahrt(Date ausfahrt) {
return bezahlt; this.ausfahrt = ausfahrt;
} }
public void setBezahlt(boolean bezahlt) { public boolean isBezahlt() {
this.bezahlt = bezahlt; return bezahlt;
} }
public void setBezahlt(boolean bezahlt) {
this.bezahlt = bezahlt;
}
public int getBetrag() {
return betrag;
}
public void setBetrag(int betrag) {
this.betrag = betrag;
}
} }

View File

@ -0,0 +1,33 @@
package Parkhaus;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.*;
import java.text.ParseException;
class JTest_Einfahren {
private Parkhaus parkhaus;
@BeforeEach
void start() {
parkhaus = new Parkhaus();
}
@Test
public void testEinfahrenOhneEingabe() throws ParseException {
parkhaus.einfahrenextern("", "");
assertEquals(179, parkhaus.getMaxPlaetze());
}
@Test
public void testEinfahrenMitEingabe() throws ParseException {
String kennzeichen = "MA-SH 4077";
String einfahrtzeit = "01.10.2024, 14:30";
String test = parkhaus.einfahrenextern(kennzeichen, einfahrtzeit);
assertTrue(test.contains(kennzeichen));
assertTrue(test.contains(einfahrtzeit));
assertEquals(179, parkhaus.getMaxPlaetze());
}
}

View File

@ -11,80 +11,122 @@ import java.util.Date;
* *
*/ */
public class Parkhaus { public class Parkhaus {
private ArrayList<Fahrzeug> fahrzeuge; private ArrayList<Fahrzeug> fahrzeuge;
private ArrayList<Fahrzeug> fahrzeugeMitSchuldern; private ArrayList<Fahrzeug> fahrzeugeMitSchulden;
private static int maxPlaetze; private int maxPlaetze;
private SimpleDateFormat sdf; private SimpleDateFormat sdf;
Parkhaus() {
Parkhaus(){
fahrzeuge = new ArrayList<>(); fahrzeuge = new ArrayList<>();
fahrzeugeMitSchuldern = new ArrayList<>(); fahrzeugeMitSchulden = new ArrayList<>();
maxPlaetze = 180; maxPlaetze = 180;
sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
} }
private String einfahrenIntern(String kennzeichen, String einfahrtzeit) throws ParseException { private String einfahrenIntern(String kennzeichen, String einfahrtzeit) throws ParseException {
Date einfahrt; Date einfahrt;
Fahrzeug fahrzeug; Fahrzeug fahrzeug;
if (kennzeichen.isEmpty() && einfahrtzeit.isEmpty()) if (kennzeichen.isEmpty() && einfahrtzeit.isEmpty())
fahrzeug = new Fahrzeug(); fahrzeug = new Fahrzeug();
else { else {
einfahrt = sdf.parse(einfahrtzeit); einfahrt = sdf.parse(einfahrtzeit);
fahrzeug = new Fahrzeug(kennzeichen, einfahrt); fahrzeug = new Fahrzeug(kennzeichen, einfahrt);
} }
fahrzeuge.add(fahrzeug); fahrzeuge.add(fahrzeug);
// reduziere ich die Anzahl der verfügbare Parkplätze im Parkhaus
maxPlaetze--; maxPlaetze--;
return "Das Fahrzeug mit dem Kennzeichen: " + fahrzeug.getKennzeichen() + "\n" + "wurde um: " return "Das Fahrzeug mit dem Kennzeichen: " + fahrzeug.getKennzeichen() + "\n" + "wurde um: "
+ fahrzeug.getEinfahrtFormatted() + " im Parkhaus eingefahren."; + fahrzeug.getEinfahrtFormatted() + " im Parkhaus eingefahren.";
} }
public String einfahrenextern(String kennzeichen, String einfahrtzeit) throws ParseException { public String einfahrenextern(String kennzeichen, String einfahrtzeit) throws ParseException {
if(!checkParkplatze())
return "Das Parkhaus ist voll"; return einfahrenIntern(kennzeichen, einfahrtzeit);
return einfahrenIntern(kennzeichen,einfahrtzeit);
} }
private int berechneParkgebuehrenIntern(String kennzeichen, String ausfahrtzeit)throws AutoNichtGefundenException, ParseException {
Fahrzeug fahrzeug = findeFahrzeug(kennzeichen);
Date ausfahrt = sdf.parse(ausfahrtzeit);
Date einfahrt = fahrzeug.getEinfahrt();
long inMinuten = ((ausfahrt.getTime() - einfahrt.getTime()) / 1000 / 60);
int inStunden = (int) Math.ceil(inMinuten / 60); // Z.b = 6 Stunden
int maxNachtBetrag = 5;
int maxTagBetrag = 15;
int betrag;
if (inMinuten <= 15)
betrag = 0;
// zwische 20 Uhr und 6 Uhr max 5€
else if (einfahrt.getHours() >= 20 || einfahrt.getHours() < 6 || ausfahrt.getHours() >= 20|| ausfahrt.getHours() < 6)
betrag = Math.min(inStunden, maxNachtBetrag);
else {
betrag = inStunden;
if (betrag > maxTagBetrag)
betrag = maxTagBetrag;
}
fahrzeug.setBetrag(betrag);
return fahrzeug.getBetrag();
}
public int berechneParkgebuehrenExtern(String kennzeichen, String ausfahrtzeit) throws AutoNichtGefundenException, ParseException {
int betrag = berechneParkgebuehrenIntern(kennzeichen, ausfahrtzeit);
return betrag;
}
public boolean checkParkplatze() { public boolean checkParkplatze() {
if (maxPlaetze <= 0) return maxPlaetze > 0;
return false;
return true;
} }
private boolean checkSchulden(String kennzeichen) { private boolean checkSchulden(String kennzeichen) {
for (Fahrzeug sc: fahrzeugeMitSchuldern) for (Fahrzeug sc : fahrzeugeMitSchulden)
if (sc.getKennzeichen().equals(kennzeichen)) if (sc.getKennzeichen().equals(kennzeichen))
return true; return true;
return false; return false;
} }
public boolean checkSchuldenExtern(String kennzeichen) { public boolean checkSchuldenExtern(String kennzeichen) {
return checkSchulden(kennzeichen); return checkSchulden(kennzeichen);
} }
public Fahrzeug findeFahrzeug(String kennzeichen) throws AutoNichtGefundenException {
for (Fahrzeug auto : fahrzeuge)
if (auto.getKennzeichen().equals(kennzeichen))
return auto;
throw new AutoNichtGefundenException("Ihre Auto wurde nicht gefunden \n melden Sie sich bitte an die Support");
}
// Getter methoden:
public ArrayList<Fahrzeug> getFahrzeuge() { public ArrayList<Fahrzeug> getFahrzeuge() {
return fahrzeuge; return fahrzeuge;
} }
public ArrayList<Fahrzeug> getFahrzeugeMitSchuldern() { public ArrayList<Fahrzeug> getFahrzeugeMitSchulden() {
return fahrzeugeMitSchuldern; return fahrzeugeMitSchulden;
} }
public static int getMaxPlaetze() { public int getMaxPlaetze() {
return maxPlaetze; return maxPlaetze;
} }
public SimpleDateFormat getSdf() { public SimpleDateFormat getSdf() {
return sdf; return sdf;
} }
} }

View File

@ -8,19 +8,16 @@ import java.util.Random;
* - Diese Klasse hat nur die Aufgabe, zufällige Kennzeichen zu generieren * - Diese Klasse hat nur die Aufgabe, zufällige Kennzeichen zu generieren
* - immer wenn diese Klasse ein zufälliges Kennzeichen generiert, * - immer wenn diese Klasse ein zufälliges Kennzeichen generiert,
* - speichere ich das,damit es nicht für mehrere Autos dasselbe Kennzeichen generiert. * - speichere ich das,damit es nicht für mehrere Autos dasselbe Kennzeichen generiert.
*/ */
public class kennzeichenzufaelliggenerieren { public class kennzeichenzufaelliggenerieren {
private static final ArrayList<String> speichereEindutigeNummern = new ArrayList<>();
private static ArrayList<String> speichereEindutigeNummern = new ArrayList<>(); private static final String[] ersteZweiZeichen = { "MA", "HD", "KA", "FF", "ROK", "BW", "HH", "B", "D" };
private static String[] ersteZweiZeichen = { "MA", "HD", "KA", "FF", "ROK", "BW", "HH", "B", "D" }; private static final String[] zweiteZweizeichen = { "ME", "SH", "DF", "KC", "FT", "GH", "OM", "KL", "CV" };
private static String[] zweiteZweizeichen = { "ME", "SH", "DF", "KC", "FT", "GH", "OM", "KL", "CV" };
private static String eindutigeZahlen = ""; private static String eindutigeZahlen = "";
private static Random random = new Random(); private static Random random = new Random();
public static String kennzeichenzufaelliggenerieren() { public static String kennzeichengenerieren() {
String zufaelligeKennzeichen = ""; String zufaelligeKennzeichen;
zufaelligeKennzeichen = ersteZweiZeichen[random.nextInt(ersteZweiZeichen.length)]; zufaelligeKennzeichen = ersteZweiZeichen[random.nextInt(ersteZweiZeichen.length)];
zufaelligeKennzeichen += "-" + zweiteZweizeichen[random.nextInt(zweiteZweizeichen.length)] + " "; zufaelligeKennzeichen += "-" + zweiteZweizeichen[random.nextInt(zweiteZweizeichen.length)] + " ";
@ -54,4 +51,4 @@ public class kennzeichenzufaelliggenerieren {
return true; return true;
} }
} }

View File

@ -5,4 +5,5 @@
* *
*/ */
module Parkhaus { module Parkhaus {
requires org.junit.jupiter.api;
} }