81 lines
4.6 KiB
Markdown
81 lines
4.6 KiB
Markdown
# 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
|
||
```
|