Aufgaben-Python/courses/java/12_lambdas_streams_api_und_optional/TestAufgabe.java

136 lines
6.4 KiB
Java

package java_course.module12;
import java.util.*;
/**
* 🧪 TESTSUITE: Java 12 - Lambdas, Streams API & Optional
*/
public class TestAufgabe {
private static int testsPassed = 0;
private static int testsTotal = 0;
private static void assertEquals(Object actual, Object expected, String message) {
if (actual == null && expected == null) return;
if (actual == null || !actual.equals(expected)) {
throw new AssertionError("❌ FAILED: " + message + " (Erwartet: " + expected + ", Erhalten: " + actual + ")");
}
}
private static void assertTrue(boolean condition, String message) {
if (!condition) {
throw new AssertionError("❌ FAILED: " + message);
}
}
private static void assertFalse(boolean condition, String message) {
if (condition) {
throw new AssertionError("❌ FAILED: " + message);
}
}
private static List<Aufgabe.Employee> createTestData() {
return List.of(
new Aufgabe.Employee(1, "Alice Müller", "Engineering", 90000.0, List.of("Java", "AWS", "Docker")),
new Aufgabe.Employee(2, "Bob Schmidt", "Engineering", 60000.0, List.of("Java", "TypeScript")),
new Aufgabe.Employee(3, "Carol Weber", "Finance", 80000.0, List.of("Excel", "SAP")),
new Aufgabe.Employee(4, "David Koch", "Finance", 50000.0, List.of("Excel", "Reporting")),
new Aufgabe.Employee(5, "Eva Braun", "HR", 55000.0, List.of("Recruiting", "SAP"))
);
}
// @Test
// TEST: TestStreamBasicsFilterMap - Prüft filter, map, sorted und flatMap
public static void testStreamBasicsFilterMap() {
testsTotal++;
System.out.println("=== RUN testStreamBasicsFilterMap");
List<Aufgabe.Employee> team = createTestData();
List<String> highEarners = Aufgabe.StreamBasics.getHighEarnersNames(team, 75000.0);
assertEquals(highEarners.size(), 2, "2 Mitarbeiter verdienen >= 75000.0");
assertEquals(highEarners.get(0), "Alice Müller", "Erster sortierter Name muss Alice sein");
assertEquals(highEarners.get(1), "Carol Weber", "Zweiter Name Carol");
Set<String> uniqueSkills = Aufgabe.StreamBasics.extractAllUniqueSkills(team);
assertTrue(uniqueSkills.contains("Java"), "Skills müssen Java enthalten");
assertTrue(uniqueSkills.contains("AWS"), "Skills müssen AWS enthalten");
assertTrue(uniqueSkills.contains("SAP"), "Skills müssen SAP enthalten");
assertEquals(uniqueSkills.size(), 7, "Insgesamt 7 eindeutige Fähigkeiten");
testsPassed++;
System.out.println("--- PASS: testStreamBasicsFilterMap");
}
// @Test
// TEST: TestStreamAggregationsCollectors - Prüft groupingBy, averagingDouble und partitioningBy
public static void testStreamAggregationsCollectors() {
testsTotal++;
System.out.println("=== RUN testStreamAggregationsCollectors");
List<Aufgabe.Employee> team = createTestData();
Map<String, List<Aufgabe.Employee>> grouped = Aufgabe.StreamAggregations.groupByDepartment(team);
assertEquals(grouped.get("Engineering").size(), 2, "Engineering hat 2 Mitarbeiter");
assertEquals(grouped.get("Finance").size(), 2, "Finance hat 2 Mitarbeiter");
assertEquals(grouped.get("HR").size(), 1, "HR hat 1 Mitarbeiter");
Map<String, Double> avgSalaries = Aufgabe.StreamAggregations.calculateAverageSalaryPerDepartment(team);
assertEquals(avgSalaries.get("Engineering"), 75000.0, "Engineering Schnitt muss 75000.0 sein");
assertEquals(avgSalaries.get("Finance"), 65000.0, "Finance Schnitt muss 65000.0 sein");
assertEquals(avgSalaries.get("HR"), 55000.0, "HR Schnitt muss 55000.0 sein");
Map<Boolean, List<Aufgabe.Employee>> partitioned = Aufgabe.StreamAggregations.partitionBySeniorSalary(team, 70000.0);
assertEquals(partitioned.get(true).size(), 2, "2 Personen mit Gehalt >= 70000");
assertEquals(partitioned.get(false).size(), 3, "3 Personen mit Gehalt < 70000");
testsPassed++;
System.out.println("--- PASS: testStreamAggregationsCollectors");
}
// @Test
// TEST: TestOptionalServiceNullSafety - Prüft Optional Pipelines & Exceptions
public static void testOptionalServiceNullSafety() {
testsTotal++;
System.out.println("=== RUN testOptionalServiceNullSafety");
List<Aufgabe.Employee> team = createTestData();
Optional<Aufgabe.Employee> emp1 = Aufgabe.OptionalService.findEmployeeById(team, 1);
assertTrue(emp1.isPresent(), "Mitarbeiter 1 muss gefunden werden");
assertEquals(emp1.get().name(), "Alice Müller", "Name muss Alice Müller sein");
Optional<Aufgabe.Employee> empUnknown = Aufgabe.OptionalService.findEmployeeById(team, 999);
assertTrue(empUnknown.isEmpty(), "Mitarbeiter 999 existiert nicht (Optional.empty)");
String deptUpperCase = Aufgabe.OptionalService.getEmployeeDepartmentUpperCase(team, 1);
assertEquals(deptUpperCase, "ENGINEERING", "Department muss ENGINEERING in Großbuchstaben sein");
String unknownDept = Aufgabe.OptionalService.getEmployeeDepartmentUpperCase(team, 999);
assertEquals(unknownDept, "UNKNOWN_DEPARTMENT", "Nicht existierender Mitarbeiter muss UNKNOWN_DEPARTMENT liefern");
double salary = Aufgabe.OptionalService.getSalaryOrThrow(team, 3);
assertEquals(salary, 80000.0, "Gehalt von ID 3 muss 80000 sein");
boolean threwNoSuchElement = false;
try {
Aufgabe.OptionalService.getSalaryOrThrow(team, 999);
} catch (NoSuchElementException e) {
threwNoSuchElement = true;
}
assertTrue(threwNoSuchElement, "getSalaryOrThrow mit ungültiger ID muss NoSuchElementException werfen");
testsPassed++;
System.out.println("--- PASS: testOptionalServiceNullSafety");
}
public static void main(String[] args) {
System.out.println("🧪 Führe Java 12 Streams & Optional Testsuite aus...\n----------------------------------------");
try {
testStreamBasicsFilterMap();
testStreamAggregationsCollectors();
testOptionalServiceNullSafety();
System.out.println("\n🎉 JUnit 5: Alle " + testsPassed + "/" + testsTotal + " Tests erfolgreich bestanden!");
} catch (AssertionError e) {
System.err.println("\n" + e.getMessage());
System.exit(1);
}
}
}