123 lines
6 KiB
Python
123 lines
6 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
🧪 Gesamttest-Runner & Gamification-Synchronisation
|
||
===================================================
|
||
Führe dieses Skript aus, um zu sehen, welche Kapitel du bereits erfolgreich gelöst hast
|
||
und um deine XP, dein Level und deine Trophäen zu aktualisieren:
|
||
python3 test_all.py
|
||
"""
|
||
|
||
import sys
|
||
import unittest
|
||
from pathlib import Path
|
||
from gamification import GamificationManager
|
||
|
||
KAPITEL = [
|
||
# LEHRPFAD 1: GRUNDLAGEN
|
||
("Grundlagen 01: Python als Taschenrechner", "lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner"),
|
||
("Grundlagen 02: Variablen & Datentypen", "lehrpfad_1_grundlagen/02_variablen_und_datentypen"),
|
||
("Grundlagen 03: Interaktive Ein- & Ausgabe", "lehrpfad_1_grundlagen/03_ein_und_ausgabe"),
|
||
("Grundlagen 04: Verzweigungen & Bedingungen", "lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen"),
|
||
("Grundlagen 05: Schleifen & Wiederholungen", "lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen"),
|
||
("Grundlagen 06: Eigene Funktionen & Module", "lehrpfad_1_grundlagen/06_funktionen_und_module"),
|
||
("Grundlagen 07: Listen & Sequenzen", "lehrpfad_1_grundlagen/07_listen_und_sequenzen"),
|
||
("Grundlagen 08: Textverarbeitung & Strings", "lehrpfad_1_grundlagen/08_textverarbeitung_und_strings"),
|
||
("Grundlagen 09: Dictionaries & Sets", "lehrpfad_1_grundlagen/09_dictionaries_und_sets"),
|
||
("Grundlagen 10: Comprehensions & Algorithmen", "lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen"),
|
||
|
||
# LEHRPFAD 2: EINSTIEG IN OOP & TOOLS
|
||
("Kapitel 00: Python-Fehlersuche (Warm-up)", "lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen"),
|
||
("Kapitel 01: Einstieg in Klassen", "lehrpfad_2_oop_einstieg/01_einstieg_klassen"),
|
||
("Kapitel 02: Konstruktor & self", "lehrpfad_2_oop_einstieg/02_init_und_self"),
|
||
("Kapitel 03: Methoden & Verhalten", "lehrpfad_2_oop_einstieg/03_methoden_und_verhalten"),
|
||
("Kapitel 04: __str__ & Darstellung", "lehrpfad_2_oop_einstieg/04_str_und_darstellung"),
|
||
("Kapitel 05: Objekte kombinieren", "lehrpfad_2_oop_einstieg/05_objekte_kombinieren"),
|
||
("Kapitel 06: Abschlussprojekt Tamagotchi", "lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi"),
|
||
|
||
# LEHRPFAD 3: FORTGESCHRITTENES OOP & GUIS
|
||
("Kapitel 07: Referenzen & Stammbäume", "lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher"),
|
||
("Kapitel 08: Operator Overloading & Dunder", "lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder"),
|
||
("Kapitel 09: Eigene Unit Tests & TDD", "lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben"),
|
||
("Kapitel 10: Vererbung & super()", "lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super"),
|
||
("Kapitel 11: Polymorphie & Interfaces", "lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces"),
|
||
("Kapitel 12: Exceptions & Fehlerbehandlung", "lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung"),
|
||
("Kapitel 13: Persistenz (JSON & CSV)", "lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv"),
|
||
("Kapitel 14: Desktop-GUIs mit Tkinter", "lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter"),
|
||
("Kapitel 15: Parameter & Eigene Container", "lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container"),
|
||
("Kapitel 16: Master-Abschlussprojekt", "lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt"),
|
||
]
|
||
|
||
def main():
|
||
root = Path(__file__).parent.resolve()
|
||
print("=" * 68)
|
||
print("🎓 PYTHON LERNPORTAL – GESAMTFORTSCHRITT & TESTS")
|
||
print("=" * 68)
|
||
|
||
gesamt_bestanden = 0
|
||
bestandene_ordner = []
|
||
gesamt_tests_bestanden = 0
|
||
|
||
for titel, ordner in KAPITEL:
|
||
kapitel_pfad = root / ordner
|
||
if not kapitel_pfad.exists():
|
||
continue
|
||
|
||
sys.path.insert(0, str(kapitel_pfad))
|
||
|
||
# Testsuite laden
|
||
loader = unittest.TestLoader()
|
||
suite = loader.discover(str(kapitel_pfad), pattern="test_aufgabe.py")
|
||
|
||
# Leisen Runner ausführen
|
||
runner = unittest.TextTestRunner(stream=open("/dev/null", "w"), verbosity=0)
|
||
result = runner.run(suite)
|
||
|
||
# Module für saubere Isolation entfernen
|
||
if str(kapitel_pfad) in sys.path:
|
||
sys.path.remove(str(kapitel_pfad))
|
||
for m in list(sys.modules.keys()):
|
||
if m in ("aufgabe", "test_aufgabe", "musterloesung"):
|
||
del sys.modules[m]
|
||
|
||
anzahl_tests = result.testsRun
|
||
erfolgreich = result.wasSuccessful() and anzahl_tests > 0
|
||
|
||
if erfolgreich:
|
||
print(f" ✅ {titel:48s} ({anzahl_tests}/{anzahl_tests} Tests OK)")
|
||
gesamt_bestanden += 1
|
||
bestandene_ordner.append(ordner)
|
||
gesamt_tests_bestanden += anzahl_tests
|
||
else:
|
||
fehlgeschlagen = len(result.failures) + len(result.errors)
|
||
print(f" ⏳ {titel:48s} (Noch offen / {fehlgeschlagen} Fehler)")
|
||
|
||
print("=" * 68)
|
||
print(f"Ergebnis: {gesamt_bestanden} von {len(KAPITEL)} Kapiteln vollständig gelöst!")
|
||
|
||
# Gamification-Status aktualisieren
|
||
gm = GamificationManager()
|
||
events = gm.sync_mit_test_ergebnissen(bestandene_ordner, gesamt_tests_bestanden)
|
||
lvl = events["lvl_info"]
|
||
|
||
print()
|
||
print("🎮 GAMIFICATION STATUS:")
|
||
print(f" ⭐ Level {lvl['level']} ({lvl['titel']}) | Rang: {lvl['rang']}")
|
||
print(f" 💎 XP: {events['gesamt_xp']} XP (Nächste Stufe bei {lvl['naechste_stufe_xp']} XP)")
|
||
print(f" 🏆 Trophäen: {len(gm.state.get('freigeschaltete_badges', []))} / 14 freigeschaltet")
|
||
|
||
if events.get("level_up"):
|
||
print(f"\n🎉🎉🎉 LEVEL UP! Du bist jetzt Level {lvl['level']} ({lvl['titel']})! 🎉🎉🎉")
|
||
|
||
if events.get("neue_badges"):
|
||
print("\n🎖️ NEU FREIGESCHALTETE TROPHÄEN:")
|
||
for b in events["neue_badges"]:
|
||
print(f" ✨ {b['icon']} {b['name']} (+{b['xp_bonus']} XP Bonus!)")
|
||
print(f" ↳ {b['desc']}")
|
||
|
||
print("-" * 68)
|
||
print("💡 Zeige deinen vollständigen Pass mit: python3 profil.py")
|
||
print("=" * 68)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|