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:
./bin/test-scenario operators/arithmetic
Käivita kõik stsenaariumid või ainult üks kategooria, soovi korral paralleelselt:
./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):
./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.
./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, 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.