Pular para o conteúdo

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:

Shell
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:

Shell
./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).