Files
platz/doc/docu_tests.md
Michael Stangl 74e08f389c Add --tosvg switch to render seating as SVG, plus test images and docs
Sitzplatzverteilung.alsSVG() (libs/Strukturdaten.py) draws tables as
white circles and people as colored circles inside their table's
circle, colored by group membership. Table radius is derived from
the number of seats so all person-circles fit without touching; the
table-to-table grid spacing is derived from the largest table radius
so tables never overlap regardless of their Koordinaten values.

libs/platz.py gains a --tosvg switch that writes
<indir>/Sitzplatzverteilung.svg alongside the existing text/CSV
output.

The three unittest scenarios now each write their rendering to
doc/images/, and doc/docu_tests.md explains the three configurations
and what each test actually verifies (including why the "split
groups land on true neighbor tables" property only holds for a
specifically chosen seed in the circle scenario, not in general).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 12:55:32 +02:00

85 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```