
# Zgodność test262

[test262](https://github.com/tc39/test262) to oficjalny zestaw testów zgodności utrzymywany przez TC39 i kanoniczny sposób porównywania silników JavaScript.

Phasis przechodzi **cały zestaw testów w 100 %** we wszystkich kategoriach — semantykę języka, bibliotekę standardową, `Intl`, `annexB` starsze funkcje internetowe, katalog `staging` zawierający testy na etapie inkubacji oraz autotesty zestawu. Bez omijania przez flagi funkcji, wpisów na liście blokad luk hosta ani wykluczeń według fragmentów.

Zestaw jest przypięty do konkretnej wersji: podmoduł git `test262` ustala rewizję, względem której mierzony jest Phasis, a nowe testy z upstreamu są uwzględniane dopiero po zaktualizowaniu podmodułu. Pełny obraz testów zapisany w [`COMPAT.md`](https://github.com/inline0/phasis/blob/main/COMPAT.md) jest generowany przez workflow `compat-matrix.yml` uruchamiany ręcznie, a nie przy każdym pushu; `COMPAT.md` zapisuje datę wykonania obrazu i użyty commit.

Dla porównania [test262.fyi](https://test262.fyi) sprawdza ten sam zestaw testów względem każdego silnika JS używanego produkcyjnie:

| Silnik | Zgodność |
|---|---:|
| V8 (Chrome / Node) | 99.8 % |
| SpiderMonkey (Firefox) | 99.6 % |
| JavaScriptCore (Safari) | 99.4 % |
| QuickJS | ~97 % |
| Hermes (React Native) | ~95 % |
| **Phasis** | **100 %** |

W każdym z tych silników pozostaje niewielka luka (nowo wdrożone propozycje, rzadkie przypadki brzegowe w trakcie tworzenia). Phasis wypełnia tę lukę, ponieważ jest implementacją przeznaczoną wyłącznie do zapewniania zgodności.

## Uruchamianie lokalne

Runner wymaga podmodułu `test262` i klas testowych repozytorium, których nie ma w pakiecie Composer, dlatego uruchom go z klonu:

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

Pełny przebieg na nowszym Macu trwa około 20 minut; zadania w macierzy CI działają równolegle i kończą się w kilka minut.

Aby podczas debugowania uruchomić tylko jedną kategorię:

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

Pełną listę flag znajdziesz w [referencji CLI](https://phasis.inline0.dev/pl/docs/cli#bin-test262).

## Dlaczego to ważne

JavaScript ma subtelną semantykę — `NaN !== NaN`, `-0 === 0`, `[1] + 1 === "11"`, dokładną kolejność wyliczania właściwości i moment wykonywania mikrozadań Promise. Biblioteka uruchamiająca kod użytkownika JS musi za każdym razem poprawnie obsługiwać każdy z tych elementów. Miara poprawności to test262; wynik 100 % oznacza, że program JS działający w V8 generuje identyczne bajtowo dane wyjściowe w Phasis (z wyjątkiem interfejsów API dostępnych tylko w przeglądarce).
