Cobertura de test262
test262 é a suíte oficial de testes de conformidade mantida pela TC39 e a forma canônica de comparar mecanismos JavaScript.
Phasis passa em toda a suíte com 100 % em todas as categorias — semântica da linguagem, biblioteca padrão, Intl, recursos Web legados annexB, o diretório staging de testes em incubação e autotestes do harness. Sem contornos de flags de funcionalidade, entradas na lista de bloqueio de lacunas do host ou exclusões por shard.
A suíte está fixada: o submódulo test262 git fixa a revisão Phasis usada na medição, e novos testes upstream só contam após a atualização do submódulo. O snapshot da suíte completa em COMPAT.md é regenerado pelo workflow compat-matrix.yml, iniciado manualmente em vez de a cada push; COMPAT.md registra quando o snapshot foi obtido e em relação a qual commit.
Para comparação, test262.fyi acompanha a mesma suíte em cada mecanismo JS de produção:
| Mecanismo | Conformidade |
|---|---|
| V8 (Chrome / Node) | 99.8 % |
| SpiderMonkey (Firefox) | 99.6 % |
| JavaScriptCore (Safari) | 99.4 % |
| QuickJS | ~97 % |
| Hermes (React nativo) | ~95 % |
| Phasis | 100 % |
Cada um desses mecanismos ainda tem uma pequena lacuna residual (propostas recém-implementadas, casos extremos raros em desenvolvimento). Phasis fecha essa lacuna por ser uma implementação de propósito único, voltada à conformidade.
Executar localmente
O executor precisa do submódulo test262 e das classes de teste do repositório, que não estão incluídos no pacote Composer; por isso, execute-o a partir de um clone:
git clone https://github.com/inline0/phasis
cd phasis
git submodule update --init test262
composer install
./bin/test262 --jobs 4
Uma execução completa em um Mac recente leva cerca de 20 minutos; a matriz de CI divide os testes em paralelo e termina em poucos minutos.
Para executar apenas uma categoria durante a depuração:
./bin/test262 --category built-ins/Array
./bin/test262 --category language/expressions/yield --failures
Consulte a referência de CLI para ver todas as opções de flags.
Por que isso importa
JavaScript tem semântica sutil — NaN !== NaN, -0 === 0, [1] + 1 === "11", a ordem exata da enumeração de propriedades e o momento das microtarefas de Promise. Uma biblioteca que executa código de usuário JS precisa acertar cada um desses detalhes, sempre. test262 é o padrão de “correto”; passar nele em 100 % significa que um programa JS executado em V8 produz uma saída idêntica byte a byte em Phasis (exceto pelas APIs exclusivas do navegador).