# Dokumentation der Unittest-Szenarien Die drei Testfaelle in `tests/test_sitzplatzverteilung.py` pruefen die Platzierungs- und Trennungslogik von `Sitzplatzverteilung` (in `libs/Strukturdaten.py`) anhand konkreter, handgebauter Tisch-/Gruppenkonfigurationen. Jeder Test schreibt zusaetzlich eine SVG-Visualisierung nach `doc/images/` (erzeugt mit `Sitzplatzverteilung.alsSVG()`, das auch ueber den `--tosvg`-Schalter von `bin/platz.bat`/`bin/platz.sh` erreichbar ist). Tische werden darin als weisse Kreise dargestellt, Personen als farbige Kreise innerhalb ihres Tischkreises; alle Personen derselben Gruppe haben dieselbe Farbe. ## Szenario 1: Drei Tische in einer Kette, drei Paare `TestDreiTischeKettePaare` in `tests/test_sitzplatzverteilung.py` - Drei Tische `T1-T2-T3` (Kette: T1 nur mit T2 benachbart, T3 nur mit T2 benachbart), je 2 Plaetze. - Drei Gruppen zu je 2 Personen (Paare). Da jeder Tisch exakt so viele Plaetze hat wie eine Gruppe Personen, passt jedes Paar komplett an einen Tisch. Der Test prueft, dass keine Gruppe getrennt wird (`GruppenTeilungGet(G) == 0` fuer alle drei Gruppen) und dass die optimale Wertigkeit (`SV.value == 0`, keine Strafpunkte) erreicht wird. ![Drei Tische in einer Kette, drei Paare](images/drei_tische_kette_paare.svg) ## Szenario 2: Vier Tische in einer Linie, zwei Vierergruppen `TestVierTischeLinieViergruppen` in `tests/test_sitzplatzverteilung.py` - Vier Tische `T1-T2-T3-T4` in einer Linie (T1↔T2↔T3↔T4), je 2 Plaetze. - Zwei Gruppen zu je 4 Personen. Da kein Tisch 4 Plaetze hat, muss jede Vierergruppe auf zwei Tische aufgeteilt werden. Der Test prueft, dass jede Gruppe genau einmal geteilt wird (`GruppenTeilungGet(G) == 1`) und dass die beiden Teiltische pro Gruppe ein zusammenhaengendes Nachbarpaar bilden — entweder `{T1,T2}` oder `{T3,T4}}`, nie ueber die mittlere Naht zwischen T2 und T3 hinweg vermischt. Ausserdem sind am Ende alle vier Tische voll besetzt. ![Vier Tische in einer Linie, zwei Vierergruppen](images/vier_tische_linie_viergruppen.svg) ## Szenario 3: Sechs Tische im Kreis, vier Dreiergruppen `TestSechsTischeKreisDreiergruppen` in `tests/test_sitzplatzverteilung.py` - Sechs Tische `T1..T6`, im Kreis angeordnet (jeder Tisch hat genau zwei Nachbarn: z.B. T1 ist mit T2 und T6 benachbart), je 2 Plaetze. - Vier Gruppen zu je 3 Personen (12 Personen auf 6×2 = 12 Plaetzen — exakt ausgelastet). Da kein Tisch 3 Plaetze hat, muss jede Dreiergruppe auf zwei Tische aufgeteilt werden (2+1). Der Test prueft zwei Arten von Eigenschaften: - **Immer gueltig, unabhaengig vom Zufalls-Seed:** Bei exakt ausgelasteten 12 Plaetzen fuer 12 Personen bleibt keine andere Aufteilung uebrig — jede Gruppe wird also garantiert genau einmal geteilt (`GruppenTeilungGet(G) == 1`), und am Ende sind alle sechs Tische voll besetzt. - **Nur mit dem hier fest gewaehlten Seed zusaetzlich beobachtet:** Die beiden Teiltische jeder Gruppe sind tatsaechlich echte Nachbarn im Kreis. Das ist keine Garantie des Algorithmus fuer jeden beliebigen Seed — bei sehr knapper Auslastung kann der GA-Platzierungsfallback (`Sitzplatzverteilung.GruppeSetzen`, wenn `NachbarTische` keine passenden Nachbarn mehr findet) auch nicht benachbarte Tische fuer die beiden Teile einer Gruppe waehlen. Mit einem grossen Stichprobentest ueber viele Seeds trat das in gut zwei Dritteln der Faelle auf; der im Test verwendete Seed wurde bewusst so gewaehlt, dass zusaetzlich die Nachbarschaftseigenschaft zutrifft, um sie hier sichtbar zu machen. Die `Koordinaten` der sechs Tische in diesem Test sind bewusst auf einem Kreis im mathematischen Sinn angeordnet (Winkel gleichmaessig verteilt), damit auch die SVG-Visualisierung die Kreisform erkennen laesst — die tatsaechliche Nachbarschaft, die der Algorithmus fuer die Platzierung nutzt, kommt aber ausschliesslich aus der `Nachbarliste`/`Nachbarn`-Angabe jedes Tisches, nicht aus den Koordinaten. ![Sechs Tische im Kreis, vier Dreiergruppen](images/sechs_tische_kreis_dreiergruppen.svg) ## Bilder neu erzeugen Die drei SVGs in `doc/images/` werden beim Ausfuehren der Testsuite automatisch neu geschrieben: ```bash bin/run_tests.sh ``` ```bat bin\run_tests.bat ```