Files
platz/doc/docu_tests.md
T
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

4.1 KiB
Raw Blame History

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

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

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

Bilder neu erzeugen

Die drei SVGs in doc/images/ werden beim Ausfuehren der Testsuite automatisch neu geschrieben:

bin/run_tests.sh
bin\run_tests.bat