Aufgaben-Python/g10_comprehensions_datum_algorithmen/test_aufgabe.py

143 lines
5.1 KiB
Python

import unittest
import sys
from datetime import datetime, date, timedelta
from pathlib import Path
# Sicherstellen, dass das aktuelle Verzeichnis im Modulpfad ist
sys.path.insert(0, str(Path(__file__).parent))
try:
import aufgabe
except ImportError as e:
raise ImportError(f"Konnte 'aufgabe.py' nicht importieren: {e}")
class TestKapitelG10(unittest.TestCase):
def test_01_quadratzahlen_gerade(self):
"""Prüft, ob quadratzahlen_gerade Quadrate der geraden Zahlen liefert."""
self.assertTrue(
hasattr(aufgabe, "quadratzahlen_gerade"),
"Fehler: Funktion 'quadratzahlen_gerade' fehlt in aufgabe.py!"
)
eingabe = [1, 2, 3, 4, 5, 6]
ergebnis = aufgabe.quadratzahlen_gerade(eingabe)
erwartet = [4, 16, 36]
self.assertIsInstance(ergebnis, list, "Fehler: Rückgabewert muss eine Liste sein!")
self.assertEqual(
ergebnis,
erwartet,
f"Fehler: Erwartet {erwartet}, aber erhalten: {ergebnis}"
)
# Nur ungerade Zahlen
self.assertEqual(aufgabe.quadratzahlen_gerade([1, 3, 5, 7]), [])
# Leere Liste
self.assertEqual(aufgabe.quadratzahlen_gerade([]), [])
def test_02_filtriere_lange_woerter(self):
"""Prüft, ob filtriere_lange_woerter Wörter nach Mindestlänge filtert."""
self.assertTrue(
hasattr(aufgabe, "filtriere_lange_woerter"),
"Fehler: Funktion 'filtriere_lange_woerter' fehlt in aufgabe.py!"
)
woerter = ["Python", "ist", "eine", "tolle", "Sprache"]
ergebnis = aufgabe.filtriere_lange_woerter(woerter, 5)
erwartet = ["Python", "tolle", "Sprache"]
self.assertIsInstance(ergebnis, list, "Fehler: Rückgabewert muss eine Liste sein!")
self.assertEqual(
ergebnis,
erwartet,
f"Fehler: Erwartet {erwartet}, aber erhalten: {ergebnis}"
)
# Hohe Mindestlänge (kein Treffer)
self.assertEqual(aufgabe.filtriere_lange_woerter(woerter, 20), [])
# Mindestlänge 0 (alle Wörter)
self.assertEqual(aufgabe.filtriere_lange_woerter(woerter, 0), woerter)
def test_03_tage_bis_datum(self):
"""Prüft die Datumsberechnung mit strptime und timedelta."""
self.assertTrue(
hasattr(aufgabe, "tage_bis_datum"),
"Fehler: Funktion 'tage_bis_datum' fehlt in aufgabe.py!"
)
heute = date.today()
# 1. Heute
heute_str = heute.strftime("%Y-%m-%d")
self.assertEqual(aufgabe.tage_bis_datum(heute_str), 0, "Fehler: Tage bis heute muss 0 sein!")
# 2. In 14 Tagen
zukunft = heute + timedelta(days=14)
zukunft_str = zukunft.strftime("%Y-%m-%d")
self.assertEqual(
aufgabe.tage_bis_datum(zukunft_str),
14,
f"Fehler: Tage bis {zukunft_str} sollte 14 sein!"
)
# 3. Vor 5 Tagen
vergangenheit = heute - timedelta(days=5)
vergangenheit_str = vergangenheit.strftime("%Y-%m-%d")
self.assertEqual(
aufgabe.tage_bis_datum(vergangenheit_str),
-5,
f"Fehler: Tage bis {vergangenheit_str} sollte -5 sein!"
)
def test_04_formatiere_deutsches_datum(self):
"""Prüft die Formatierung mit .strftime in DD.MM.YYYY."""
self.assertTrue(
hasattr(aufgabe, "formatiere_deutsches_datum"),
"Fehler: Funktion 'formatiere_deutsches_datum' fehlt in aufgabe.py!"
)
# Test mit date Objekt
d1 = date(2026, 12, 24)
self.assertEqual(
aufgabe.formatiere_deutsches_datum(d1),
"24.12.2026",
"Fehler: date(2026, 12, 24) sollte als '24.12.2026' formatiert werden."
)
# Test mit datetime Objekt und einstelligen Ziffern (Prüfung führender Nullen)
dt = datetime(2025, 3, 4, 15, 30)
self.assertEqual(
aufgabe.formatiere_deutsches_datum(dt),
"04.03.2025",
"Fehler: Führende Nullen beachten! datetime(2025, 3, 4) -> '04.03.2025'."
)
def test_05_finde_aelteste_person(self):
"""Prüft die Algorithmus-Suche nach der ältesten Person."""
self.assertTrue(
hasattr(aufgabe, "finde_aelteste_person"),
"Fehler: Funktion 'finde_aelteste_person' fehlt in aufgabe.py!"
)
personen = [
{"name": "Anna", "alter": 25},
{"name": "Ben", "alter": 32},
{"name": "Clara", "alter": 19}
]
self.assertEqual(
aufgabe.finde_aelteste_person(personen),
"Ben",
"Fehler: 'Ben' (32) ist die älteste Person."
)
# Einzelne Person
self.assertEqual(
aufgabe.finde_aelteste_person([{"name": "Opa Wilhelm", "alter": 88}]),
"Opa Wilhelm"
)
# Leere Liste
self.assertEqual(
aufgabe.finde_aelteste_person([]),
"",
"Fehler: Bei leerer Personenliste soll ein leerer String '' zurückgegeben werden."
)
if __name__ == "__main__":
unittest.main(verbosity=2)