
# Võrdlusallikaga testimine

Phasis iga teostusotsus sõltub ühest küsimusest: **kas V8 annab sama väljundi?**

JavaScript semantika on nüansirikas — `NaN !== NaN`, `-0 === 0`, `[1] + 1 === "11"`, atribuutide loendamise täpne järjekord ning `Promise` mikrotööde ajastus. Nende tuletamine spetsifikatsiooni lugedes on aeglane ja veaohtlik. Phasis väldib seda, kasutades Node.js-i (V8) võrdlusallikana: kirjuta JS-s stsenaarium, käivita see V8-is ja salvesta väljund tõena; seejärel käivita see Phasis-is, salvesta väljund ning võrdle tulemusi.

```
1. SETUP    → a JavaScript source file or snippet
2. ORACLE   → Node.js executes it, output captured as truth
3. ACTUAL   → Phasis executes it, output captured
4. COMPARE  → oracle vs actual, diff measures the gap
```

## Testimise kaks taset

### Tase 1 — kohandatud stsenaariumid

Iga `scenarios/`-i stsenaarium on väike JS-programm, mille väljund on teada. Ühe stsenaariumi käivitamiseks:

```bash
./bin/test-scenario operators/arithmetic
```

Käivita kõik stsenaariumid või ainult üks kategooria, soovi korral paralleelselt:

```bash
./bin/test-regression
./bin/test-regression --jobs 4
./bin/test-regression --category expressions
```

Värskenda võrdlusallikat (e.g, näiteks pärast Node.js versiooni uuendamist):

```bash
./bin/oracle --refresh operators/arithmetic
```

Stsenaariumid on korraldatud ECMAScripti peatükkide kaupa: literaalid, tehtemärgid, muutujad, juhtvoog, funktsioonid, objektid, massiivid, klassid, sisseehitatud funktsioonid, vead, koostalitlus, erijuhud.

### Tase 2 — test262

Ametlik TC39 vastavustestide komplekt on git alamoodulina teegis `test262/`. Iga test kontrollib end ise: see läbitakse, kui viga ei teki, ja kukub läbi, kui viga tekib (`negative` testide puhul vastupidi). Testirakendaja laadib enne iga testi `assert.js` ja `sta.js`.

```bash
./bin/test262                                    # full suite
./bin/test262 --category built-ins/Array         # subset
./bin/test262 --jobs 4                           # parallel
./bin/test262 --failures                         # one line per failing test
./bin/compat-report                              # full COMPAT.md + compat.json
```

Täieliku testikomplekti hetktõmmis asub failis [`COMPAT.md`](https://github.com/inline0/phasis/blob/main/COMPAT.md), mille loob uuesti `bin/compat-report`. CI-s käivitab töövoog `compat-matrix.yml` selle osadena ja salvestab tulemuse; töövoog käivitatakse käsitsi, mitte iga tõuke korral.

## Kohalik kontroll enne tõukamist

`./bin/verify-all` käivitab kvaliteedikontrolli, mida CI nõuab:

```
=== PHPStan ===                  level 6, zero errors
=== Code Standards ===           PHPCS, zero warnings
=== PHPUnit ===                  unit suite passes
=== Oracle Regression ===        scenarios under `scenarios/` pass
```

Sellest üksi **ei piisa** — test262-st tuleb võtta valim ka kõigi muudatuste puhul, mis puudutavad parserit, interpretaatorit või sisseehitatud funktsioone. Iga tõmbetaotluse korral käivitab CI PHPStan, PHPCS, ühiktestid ja oraakli regressioonitestid; WPT ja populaarsete pakettide komplekt käivitatakse siis, kui tõmbetaotlus muudab `src/` või nende testandmeid. Kogu test262 maatriks ei kuulu tõmbetaotluste CI-sse, seega võta mõjutatud kategooriatest kohapeal valim.

## Miks see toimib

V8 käsitlemine tõeallikana kõrvaldab arendustsüklist peaaegu kogu spetsifikatsiooni lugemise. Lahknevus V8-ga viitab alati Phasis veale — mitte spetsifikatsiooni mitmetimõistetavusele, mille üle saaks vaielda. Kui parandus sisse viiakse, muutuvad vastavad test262 kirjed püsivateks regressioonitestideks.

100% läbimismäär on selle distsipliini tulemus: iga PR-i hinnatakse V8 järgi, CI lükkab tagasi regressioonid oraakli, WPT ja populaarsete pakettide komplektides ning test262 maatriks kinnitab kogu komplekti tulemuse selle käivitamisel.
