Μετάβαση στο περιεχόμενο

Κάλυψη test262

Το test262 είναι η επίσημη σουίτα δοκιμών συμμόρφωσης που συντηρείται από το TC39 και ο καθιερωμένος τρόπος σύγκρισης μηχανών JavaScript.

Το Phasis περνά ολόκληρη τη σουίτα με ποσοστό 100 % σε κάθε κατηγορία — σημασιολογία γλώσσας, τυπική βιβλιοθήκη, Intl, παλιές λειτουργίες ιστού annexB, τον κατάλογο staging με δοκιμές υπό ανάπτυξη και τις δοκιμές αυτοελέγχου του harness. Χωρίς παρακάμψεις σημαιών λειτουργιών, καταχωρίσεις αποκλεισμού λόγω κενών του host ή εξαιρέσεις ανά shard.

Η σουίτα είναι καρφιτσωμένη: το git submodule test262 καθορίζει την αναθεώρηση ως προς την οποία μετριέται το Phasis, ενώ οι νέες δοκιμές upstream προσμετρώνται μόνο μετά την αναβάθμιση του submodule. Το στιγμιότυπο πλήρους σουίτας στο COMPAT.md αναδημιουργείται από τη ροή εργασίας compat-matrix.yml, η οποία εκκινείται χειροκίνητα και όχι σε κάθε push· το COMPAT.md καταγράφει πότε λήφθηκε το στιγμιότυπο και σε ποιο commit.

Για σύγκριση, το test262.fyi παρακολουθεί την ίδια σουίτα σε κάθε μηχανή JS παραγωγής:

Μηχανή Συμμόρφωση
V8 (Chrome / Node) 99.8 %
SpiderMonkey (Firefox) 99.6 %
JavaScriptCore (Safari) 99.4 %
QuickJS ~97 %
Hermes (React Native) ~95 %
Phasis 100 %

Κάθε μία από αυτές τις μηχανές έχει ένα μικρό υπολειπόμενο κενό (προτάσεις που μόλις προστέθηκαν, σπάνιες ακραίες περιπτώσεις υπό ανάπτυξη). Το Phasis καλύπτει το κενό επειδή είναι υλοποίηση μοναδικού σκοπού με προτεραιότητα στη συμμόρφωση.

Εκτέλεση τοπικά

Ο runner χρειάζεται το submodule test262 και τις κλάσεις δοκιμών του αποθετηρίου, που δεν περιλαμβάνονται στο πακέτο Composer· επομένως εκτελέστε τον από ένα clone:

Κέλυφος
git clone https://github.com/inline0/phasis
cd phasis
git submodule update --init test262
composer install
./bin/test262 --jobs 4

Μια πλήρης εκτέλεση σε πρόσφατο Mac διαρκεί περίπου 20 λεπτά· τα shard του CI εκτελούνται παράλληλα και ολοκληρώνονται σε λιγότερο από δέκα λεπτά.

Για να εκτελέσετε μόνο μία κατηγορία κατά την αποσφαλμάτωση:

Κέλυφος
./bin/test262 --category built-ins/Array
./bin/test262 --category language/expressions/yield --failures

Δείτε την αναφορά CLI για όλες τις διαθέσιμες σημαίες.

Γιατί έχει σημασία

Η JavaScript έχει λεπτές σημασιολογικές λεπτομέρειες — NaN !== NaN, -0 === 0, [1] + 1 === "11", την ακριβή σειρά απαρίθμησης ιδιοτήτων και τον χρονισμό των microtasks των Promise. Μια βιβλιοθήκη που εκτελεί κώδικα χρήστη JS πρέπει να τα χειρίζεται όλα σωστά, κάθε φορά. Το test262 είναι το κριτήριο του «σωστού»· επιτυχία με ποσοστό 100 % σημαίνει ότι ένα πρόγραμμα JS που εκτελείται στο V8 παράγει πανομοιότυπη έξοδο byte προς byte στο Phasis (με εξαίρεση τα API που υπάρχουν μόνο στα προγράμματα περιήγησης).