diablo2-web/TEST_INFRA.md

81 lines
4.6 KiB
Markdown
Raw 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.

# Test Infrastructure — Diablo II 1.13c Isometric Automap & Minimap E2E Suite
## 1. Architecture Overview
The requirement-driven opaque-box E2E test suite in `tests/e2e-automap-113c/` validates all 13 canonical features (`F1`–`F13`) defined in `PROJECT.md § Feature Inventory` against the authoritative Diablo II 1.13c binary specifications (`D2Common.dll` and `D2Client.dll`) and MPQ data tables (`AutoMap.txt`, `LvlTypes.txt`, `Levels.txt`, `Objects.txt`, `MonStats.txt`, `MonStats2.txt`, `SuperUniques.txt`, and 8 automap DC6 sprite sheets).
The test suite is organized into 4 progressive tiers (`160` tests total across 4 test files):
| Tier | File | Scope | Test Count |
|---|---|---|---|
| **Tier 1** | `tests/e2e-automap-113c/tier1-feature-coverage.test.ts` | Happy-path & primary behavior coverage (`5` tests per feature across `F1`–`F13`) | `65` |
| **Tier 2** | `tests/e2e-automap-113c/tier2-boundary-corner.test.ts` | Boundary values, off-by-one edges, negative/invalid inputs, & adversarial stress (`5` tests per feature across `F1`–`F13`) | `65` |
| **Tier 3** | `tests/e2e-automap-113c/tier3-cross-feature-combinations.test.ts` | Pairwise and multi-feature interaction chains (`F1`–`F13` end-to-end combinations) | `18` |
| **Tier 4** | `tests/e2e-automap-113c/tier4-real-world-scenarios.test.ts` | Realistic gameplay scenarios across Acts 1–5 towns/dungeons and full-spectrum 136-level (`1..136`, 365 baked scenes) audits | `12` |
| **Total** | `tests/e2e-automap-113c/*.test.ts` | All 13 features (`F1`–`F13`) | **`160`** |
---
## 2. Authoritative Oracles & Data Sources
1. **Live MPQ Archives (`samples/d2/d2exp.mpq`, `samples/d2/d2data.mpq`)**:
- Loaded in memory via `MpqArchive.open(memorySource(new Uint8Array(fs.readFileSync(...))))`.
- Provides the unmodified 3,348-row `data\global\excel\AutoMap.txt` table (`parseAutomapTable`), `.ds1` map files (`decodeDs1`), and `.dc6` sprite sheets.
2. **Baked 8-Sheet Automap UI Manifest (`src/ui/baked-ui-meta.ts` + `public/assets/ui/automap/*.png`)**:
- `MaxiMap` / `MaxiMapS` (`1499` frames each)
- `Act2Map` / `Act2MapS` (`40` frames each)
- `Act4Map` / `Act4MapS` (`4` frames each)
- `ExTnMap` / `ExTnMapS` (`8` frames each)
3. **Baked 136-Level Scene Pack (`samples/d2-packs/index.json`)**:
- Contains `365` baked scene variants covering all `136` canonical Level IDs (`1..136`), each pre-populated with `scene.automap` (`floors`, `walls`, `objects`, `extras`).
---
## 3. Recording `SpriteRenderer` & `D2FontRenderer` Harness
To deterministically inspect every GPU draw call, scissor clip rectangle, alpha tint, and text overlay without requiring a live browser GPU context in unit/E2E Vitest workers, the test suite uses a lightweight recording harness:
- **Sprite Draw Recording (`renderer.draw(frame, x, y, options)`)**:
Captures `{ kind: 'sprite', frame, x, y, atlas, width, height, tint }` in exact emission order, enabling verification of:
- 6-stage rendering order (`Floors -> Walls -> Objects -> Extras -> Crosshairs -> Text`).
- Sheet routing (`MaxiMap(S)`, `Act2Map(S)`, `Act4Map(S)`, `ExTnMap(S)`).
- Screen-space projection (`projectAutomapCellScreenRect`) with `1/10` (`bMinimap = false`) and `1/20` (`bMinimap = true`) divisors and `yOffset` (`+3` vs `+1`).
- Fade mode alpha tints (`1.0`, `0.75`, `0.45`, `0.25`).
- **Crosshair Quad Recording (`renderer.drawSolidQuad(...)`)**:
Captures `{ kind: 'quad', x0, y0, x1, y1, x2, y2, x3, y3, color }` for each of the 12 radial line segments per crosshair (`AUTOMAP_CROSSHAIR_COLORS.player`, `ally`, `monster`, `boss`).
- **WebGL Scissor Recording (`renderer.gl.enable/scissor/disable`)**:
Captures `gl.scissor(x, glY, width, height)` where `glY = screenHeight - (rect.y + rect.height)`.
- **Bitmap Font Recording (`font.drawText(renderer, text, x, y, options)`)**:
Captures `{ kind: 'text', text, x, y, colorCode }` for exit/dungeon target labels and top-right HUD level/difficulty/timer strings.
---
## 4. Execution Instructions
Run the complete 4-tier E2E Automap 1.13c test suite:
```bash
npx vitest run tests/e2e-automap-113c/
```
Run an individual tier:
```bash
npx vitest run tests/e2e-automap-113c/tier1-feature-coverage.test.ts
npx vitest run tests/e2e-automap-113c/tier2-boundary-corner.test.ts
npx vitest run tests/e2e-automap-113c/tier3-cross-feature-combinations.test.ts
npx vitest run tests/e2e-automap-113c/tier4-real-world-scenarios.test.ts
```
Run TypeScript strict typecheck across the repository:
```bash
npm run typecheck
```
Run the full-spectrum 136-level offline + headless Chrome CDP verification script:
```bash
npx tsx scripts/verify-automap.ts
```