Tests für KurztripEmpfehlung Klasse

WetterService
danai 2024-06-17 12:48:17 +02:00
parent a17d823f7b
commit 1746ad7bb1
2 changed files with 195 additions and 0 deletions

View File

@ -1,5 +1,145 @@
package domain;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class KurztripEmpfehlung {
private List<Ort> alleOrte;
private Ort heimatort;
public KurztripEmpfehlung() {
this.alleOrte = ladeAlleOrte();
this.heimatort = null;
}
public void setHeimatort(Ort heimatort) {
this.heimatort = heimatort;
}
public List<Ort> zufallsorteFahrrad(int maxEntfernung) {
List<Ort> gefilterteOrte = new ArrayList<>();
if (heimatort == null) {
System.out.println("Heimatort ist nicht gesetzt.");
return gefilterteOrte;
}
for (Ort ort : alleOrte) {
double entfernung = berechneEntfernung(heimatort, ort);
if (entfernung <= maxEntfernung) {
gefilterteOrte.add(ort);
}
}
if (gefilterteOrte.isEmpty()) {
System.out.println("Keine Orte innerhalb der Entfernung von " + maxEntfernung + " km gefunden.");
return gefilterteOrte;
}
return zufallsorteAuswaehlen(gefilterteOrte, Math.min(3, gefilterteOrte.size()));
}
public List<Ort> zufallsortePKW(int minEntfernung) {
List<Ort> gefilterteOrte = new ArrayList<>();
if (heimatort == null) {
System.out.println("Heimatort ist nicht gesetzt.");
return gefilterteOrte;
}
for (Ort ort : alleOrte) {
double entfernung = berechneEntfernung(heimatort, ort);
if (entfernung >= minEntfernung) {
gefilterteOrte.add(ort);
}
}
if (gefilterteOrte.isEmpty()) {
System.out.println("Keine Orte mindestens " + minEntfernung + " km entfernt gefunden.");
return gefilterteOrte;
}
return zufallsorteAuswaehlen(gefilterteOrte, Math.min(3, gefilterteOrte.size()));
}
private List<Ort> zufallsorteAuswaehlen(List<Ort> orte, int anzahl) {
List<Ort> zufallsorte = new ArrayList<>();
Random random = new Random();
int size = orte.size();
if (size <= 0) {
throw new IllegalArgumentException("Die Liste der Orte ist leer oder hat eine ungültige Größe.");
}
for (int i = 0; i < anzahl; i++) {
int index = random.nextInt(size);
zufallsorte.add(orte.get(index));
orte.remove(index); // Sicherstellen, dass Orte nicht doppelt empfohlen werden
size--; // Reduzieren der Größe der Liste nach Entfernen eines Elements
}
return zufallsorte;
}
public double berechneEntfernung(Ort standort, Ort zielort) {
double b1 = Math.toRadians(standort.getBreitengrad());
double b2 = Math.toRadians(zielort.getBreitengrad());
double l1 = Math.toRadians(standort.getLängengrad());
double l2 = Math.toRadians(zielort.getLängengrad());
double deltaL = l2 - l1;
double cosDeltaL = Math.cos(deltaL);
double acosArgument = Math.sin(b1) * Math.sin(b2) + Math.cos(b1) * Math.cos(b2) * cosDeltaL;
acosArgument = Math.max(-1.0, Math.min(1.0, acosArgument));
double entfernung = 6378.388 * Math.acos(acosArgument);
return entfernung;
}
private List<Ort> ladeAlleOrte() {
List<Ort> alleOrte = new ArrayList<>();
String csvFile = "src/main/resources/PLZ.csv";
String line;
try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
while ((line = br.readLine()) != null) {
line = line.replaceAll("\\s+", "");
String[] data = line.split(";");
int plz = Integer.parseInt(data[0].replaceAll("\"", ""));
String ortName = data[1].replaceAll("\"", "");
double breitengrad = Double.parseDouble(data[2].replaceAll("\"", ""));
double laengengrad = Double.parseDouble(data[3].replaceAll("\"", ""));
Ort ort = new Ort(plz, ortName, breitengrad, laengengrad);
alleOrte.add(ort);
}
} catch (IOException e) {
System.err.println("Fehler beim Lesen der Datei: " + e.getMessage());
e.printStackTrace();
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
System.err.println("Fehlerhaftes Datenformat in der CSV-Datei: " + e.getMessage());
e.printStackTrace();
}
return alleOrte;
}
public Object getHeimatort() {
return heimatort;
}
}

View File

@ -0,0 +1,55 @@
package domainTest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import domain.KurztripEmpfehlung;
import domain.Ort;
public class KurztripEmpfehlungTest {
private KurztripEmpfehlung empfehlung;
private Ort berlin;
private Ort dresden;
@Before
public void setUp() {
empfehlung = new KurztripEmpfehlung();
berlin = new Ort(10115, "Berlin", 52.5200, 13.4050);
dresden = new Ort(1067, "Dresden", 51.0600336463379, 13.7210676148814);
}
@Test
public void testSetHeimatort() {
empfehlung.setHeimatort(berlin);
assertEquals(berlin, empfehlung.getHeimatort());
}
@Test
public void testZufallsorteFahrrad() {
empfehlung.setHeimatort(berlin);
List<Ort> orte = empfehlung.zufallsorteFahrrad(100);
assertFalse(orte.isEmpty());
assertTrue(orte.size() <= 3);
for (Ort ort : orte) {
assertTrue(empfehlung.berechneEntfernung(berlin, ort) <= 100);
}
}
@Test
public void testZufallsortePKW() {
empfehlung.setHeimatort(berlin);
List<Ort> orte = empfehlung.zufallsortePKW(150);
assertFalse(orte.isEmpty());
assertTrue(orte.size() <= 3);
for (Ort ort : orte) {
assertTrue(empfehlung.berechneEntfernung(berlin, ort) >= 150);
}
}
}