
# test262-Abdeckung

[test262](https://github.com/tc39/test262) ist die offizielle, von TC39 gepflegte Konformitätstestsuite und die maßgebliche Methode, um JavaScript-Engines miteinander zu vergleichen.

Phasis besteht **die gesamte Suite zu 100 %** in allen Kategorien — Sprachsemantik, Standardbibliothek, `Intl`, `annexB` Legacy-Webfunktionen, das `staging`-Verzeichnis mit Tests in der Inkubationsphase und die Selbsttests des Test-Harness. Keine Umgehungen per Feature-Flag, keine Blocklisteneinträge für Host-Lücken, keine Ausschlüsse einzelner Shards.

Die Suite ist fest versioniert: Das `test262`-Git-Submodul legt die Revision fest, an der Phasis gemessen wird; neue Upstream-Tests zählen erst, wenn das Submodul aktualisiert wird. Der vollständige Suite-Snapshot in [`COMPAT.md`](https://github.com/inline0/phasis/blob/main/COMPAT.md) wird durch den `compat-matrix.yml`-Workflow neu erstellt, der manuell statt bei jedem Push gestartet wird; `COMPAT.md` hält fest, wann der Snapshot erstellt wurde und gegen welchen Commit.

Zum Vergleich: [test262.fyi](https://test262.fyi) prüft dieselbe Suite für alle produktiv eingesetzten JS-Engines:

| Engine | Konformität |
|---|---:|
| V8 (Chrome / Node) | 99.8 % |
| SpiderMonkey (Firefox) | 99.6 % |
| JavaScriptCore (Safari) | 99.4 % |
| QuickJS | ~97 % |
| Hermes (React Native) | ~95 % |
| **Phasis** | **100 %** |

Bei diesen Engines bleibt jeweils eine kleine Lücke (neu hinzugekommene Vorschläge, seltene Edge-Cases in Entwicklung). Phasis schließt diese Lücke, weil es eine spezialisierte Implementierung ist, bei der Konformität an erster Stelle steht.

## Lokal ausführen

Der Runner benötigt das `test262`-Submodul und die Testklassen des Repositorys, die beide nicht im Composer-Paket enthalten sind. Führe ihn daher in einem Klon aus:

```bash
git clone https://github.com/inline0/phasis
cd phasis
git submodule update --init test262
composer install
./bin/test262 --jobs 4
```

Ein vollständiger Lauf dauert auf einem aktuellen Mac etwa 20 Minuten; die CI-Matrix führt die Shards parallel aus und ist in weniger als zehn Minuten fertig.

So führst du beim Debuggen nur eine Kategorie aus:

```bash
./bin/test262 --category built-ins/Array
./bin/test262 --category language/expressions/yield --failures
```

Alle Flags findest du in der [CLI-Referenz](https://phasis.inline0.dev/de/docs/cli#bin-test262).

## Warum das wichtig ist

JavaScript hat subtile Semantik — `NaN !== NaN`, `-0 === 0`, `[1] + 1 === "11"`, die genaue Reihenfolge der Property-Aufzählung und den Zeitpunkt von Promise-Microtasks. Eine Bibliothek, die JS-Code von Nutzern ausführt, muss all das jedes Mal korrekt umsetzen. test262 ist der Maßstab für „korrekt“; 100 % zu bestehen bedeutet, dass ein JS-Programm, das auf V8 läuft, auf Phasis byte-identische Ausgabe erzeugt (abgesehen von reinen Browser-APIs).
