# Aegis Labyrinth – Test- & Audit-Suite

> Automatisierte **Test-, Audit- und Performance-Suite** für das Single-File-Browser-Game `Aegis-Labyrinth.html`.
> Dieses Repo enthält **nicht** das Spiel selbst – es enthält die Werkzeuge, um die Game-Source-Datei im vollen Umfang zu testen, zu auditieren und als Audit-Bericht auszuwerten.

**Ziel:** Jede Änderung an `Aegis-Labyrinth.html` automatisch validieren – Funktionalität (3 Audits), Regressionsschutz (Self-Play), Performance (FPS/Heap) und einen maschinenlesbaren + HTML-Bericht erzeugen.

![License: GPL-3.0](https://img.shields.io/badge/License-GPL--3.0-blue.svg)

> 📜 **Version & Historie:** Laufende Version + Changelog in [`CHANGELOG.md`](./CHANGELOG.md)
> (aktuell: **Game `1.0.2`**, **Suite `1.0.0`**).

## ⚠️ Voraussetzung: Game-Datei manuell legen

Die zu testende Datei **`Aegis-Labyrinth.html`** gehört **nicht** zu diesem Repo (wird nicht versioniert).
Lege/kopiere sie **vor** dem ersten Testlauf in die Projekt-Root:

```
Laby/
├── Aegis-Labyrinth.html      ← ⚠️ MANUELL HINZUFÜGEN (Source of truth, extern)
└── ...
```

Alle Test-Skripte erwarten die Datei an genau diesem Ort (Projekt-Root).
Fehlt sie, bricht `audit.mjs` mit `❌ Aegis-Labyrinth.html nicht gefunden!` ab.

> Tipp: Damit die Datei nicht versehentlich committet wird, `Aegis-Labyrinth.html` in die `.gitignore` aufnehmen.

---

## Was wird getestet?

| Suite | Skript | Was es prüft | Ausgabe |
|---|---|---|---|
| **Audit** | `tests/audit.mjs` | Die 3 eingebauten Audits: `runSelfAudit`, `runExtensionAudit`, `runRedesignAudit` + JS-Page-Errors + Assertions | `audit-result.json` |
| **Self-Play** | `tests/selfplay.mjs` | Deterministischer Bot spielt Level 0 durch → Regressionsschutz & Balance | `selfplay-results.json` |
| **Performance** | `tests/perf-test.mjs` | FPS unter Last (schweres Level + viele Türme) + Heap | `perf-result.json` |
| **Report** | `tests/report.mjs` | Fügt alle `*-result.json` zu einem HTML-Report zusammen | `report.html` |

---

## Setup

```bash
# 1. Dependencies (Playwright + Chromium)
npm install
npx playwright install chromium

# 2. Game-Datei in die Projekt-Root legen
#    → Aegis-Labyrinth.html manuell kopieren (siehe oben)
```

> `node >= 18` wird empfohlen (Top-Level-`await` in den `.mjs`-Skripten).

---

## Quick-Start / Ausführung

Jedes Skript ist auch als npm-Script verfügbar:

```bash
npm run audit      # node tests/audit.mjs            → audit-result.json
npm run selfplay   # node tests/selfplay.mjs [n]     → selfplay-results.json   (Default 10 Episoden)
npm run perf       # node tests/perf-test.mjs [ms] [towers] → perf-result.json (Default 15000ms / 50 Türme)
npm run report     # node tests/report.mjs           → report.html

# Kompletter Lauf (Audit + Self-Play + Perf)
npm test
```

Direkt aufrufen (nützlich für CI / Parameter):

```bash
node tests/selfplay.mjs 50        # 50 Episoden
node tests/perf-test.mjs 30000 80 # 30 s messen, 80 Türme
```

### Exit-Code-Vertrag

| Skript | `exit 0` | `exit ≠ 0` |
|---|---|---|
| `audit.mjs` | alle Assertions grün, keine Page-Errors | ≥ 1 Fehler (Assertion / Page-Error) → `1`, Crash → `2` |
| `perf-test.mjs` | FPS ≥ Zielwert (55) | FPS < Zielwert → `1` |
| `selfplay.mjs` | (liefert immer 0) | – |
| `report.mjs` | (liefert immer 0) | – |

---

## Die getestete Debug-API

Die Suite hängt vollständig an der **öffentlichen Debug-API** des Games (`window.__AEGIS_DEBUG__`) plus frei im Global Scope liegenden Funktionen. Details: [`docs/01_Debug_API.md`](./docs/01_Debug_API.md).

```js
// State lesen
window.__AEGIS_DEBUG__.getState()

// Level / Credits / Wave
window.__AEGIS_DEBUG__.selectLevel(0)
window.__AEGIS_DEBUG__.setCredits(999999)
window.__AEGIS_DEBUG__.startWave()

// Die 3 Audits
window.__AEGIS_DEBUG__.runSelfAudit()
window.__AEGIS_DEBUG__.runExtensionAudit()
window.__AEGIS_DEBUG__.runRedesignAudit()
```

> **Wichtig (Playwright):** `const`/`let` im Global Scope (`TOWER_TYPES`, `Game`, `placeTower`, `buySkill`, `simulate`, …) liegen **nicht** auf `window`. In `page.evaluate()` müssen sie als **bare Identifier** referenziert werden.

---

## Projektstruktur

```
Laby/
├── Aegis-Labyrinth.html              # ⚠️ Game-Source – MANUELL HINZUFÜGEN (nicht versioniert)
├── package.json                      # npm-Scripts (audit, selfplay, perf, report, test, setup)
├── package-lock.json
├── .gitignore
├── LICENSE                           # GNU GPL v3
├── README.md                         # diese Datei
├── CHANGELOG.md                      # Version-Historie (Game + Suite) & Änderungs-Log
├── tests/
│   ├── audit.mjs                     # Playwright-Audit-Suite (3 Audits + Assertions)
│   ├── selfplay.mjs                  # Self-Play-Bot (deterministisch, Level 0)
│   ├── perf-test.mjs                 # FPS/Heap-Messung unter Last
│   └── report.mjs                    # HTML-Report-Generator (report.html)
└── docs/
    ├── 01_Debug_API.md               # __AEGIS_DEBUG__-API & In-Game-Console (Test-Orakel)
    ├── 02_Audits.md                  # Die 3 Audits im Detail + Assertions + Exit-Codes
    ├── 03_Automatisierung_CI.md      # Playwright-Automatisierung, Self-Play, Perf, CI
    ├── 04_Resultate_Report.md        # Ausgabe-Dateien & report.html (Schema-Referenz)
    ├── 05_Tasks_Backlog.md           # Implementierte Tasks (Changelog) & Backlog
    └── 06_Refactoring_Game.md        # (Advisory) Refactoring-/Performance-Empfehlungen für die Game-Datei
```

---

## Erzeugte Artefakte (werden NICHT committet)

| Datei | Von | Beschreibung |
|---|---|---|
| `audit-result.json` | `audit.mjs` | Raw-Audit-Reports + Assertions + Page-Errors + Summary |
| `selfplay-results.json` | `selfplay.mjs` | Episoden-Log + Win-Rate + Aggregates |
| `perf-result.json` | `perf-test.mjs` | FPS, Heap, Setup-Metadaten |
| `report.html` | `report.mjs` | Zusammengefasster, menschlich lesbarer CI-Report |
| `audit-final.png` | `audit.mjs` | Finaler Screenshot des Headless-Browsers |

Schema-Details: [`docs/04_Resultate_Report.md`](./docs/04_Resultate_Report.md).

---

## CI / Automatisierung

Empfohlene Stufen (Details in [`docs/03_Automatisierung_CI.md`](./docs/03_Automatisierung_CI.md)):

| Stufe | Inhalt | Wann |
|---|---|---|
| **Pre-Commit / Push** | `npm run audit` (schnell) | bei jedem Commit / PR |
| **Nightly** | Audit + `selfplay.mjs 50` + `perf-test.mjs` | zeitplangetrieben |
| **Release** | Audit + `selfplay.mjs 500` + Perf + Report-Artifact | Tagging |

> ⚠️ In CI muss die `Aegis-Labyrinth.html` als **Secret/Artifact** bereitgestellt werden, da sie nicht im Repo liegt.

---

## Dokumentation

| Datei | Inhalt |
|---|---|
| [`01_Debug_API.md`](./docs/01_Debug_API.md) | Komplette `__AEGIS_DEBUG__`-API + In-Game-Debug-Console |
| [`02_Audits.md`](./docs/02_Audits.md) | Was `self`/`extension`/`redesign` prüfen, Assertions, Exit-Codes |
| [`03_Automatisierung_CI.md`](./docs/03_Automatisierung_CI.md) | Playwright-Aufruf, Self-Play-Konzept, Perf, CI-Workflows |
| [`04_Resultate_Report.md`](./docs/04_Resultate_Report.md) | JSON-Schemata + `report.html`-Aufbau |
| [`05_Tasks_Backlog.md`](./docs/05_Tasks_Backlog.md) | Abgeschlossene Tasks (Changelog) + offenes Backlog |
| [`06_Refactoring_Game.md`](./docs/06_Refactoring_Game.md) | Performance-/Refactoring-Empfehlungen für `Aegis-Labyrinth.html` |
| [`CHANGELOG.md`](./CHANGELOG.md) | Laufende Version + Version-Historie & Änderungs-Log (Game + Suite) |

---

## Lizenz

Dieses Projekt (die Test- & Audit-Suite) ist unter **GNU General Public License v3.0** (GPL-3.0) lizenziert.
Die vollständige Lizenz finden Sie in der Datei [`LICENSE`](./LICENSE).

> ⚠️ Die getestete Game-Datei `Aegis-Labyrinth.html` ist **nicht** Teil dieses Repos und unterliegt deren eigener Lizenzierung.
> Der GPL-3.0-Schutz erstreckt sich auf alle Dateien in diesem Repository (Tests, Docs, Konfiguration).
