
# test262 적합성 범위

[test262](https://github.com/tc39/test262)는 TC39가 관리하는 공식 적합성 테스트 모음이며 JavaScript 엔진을 비교하는 표준적인 방법입니다.

Phasis는 언어 의미론, 표준 라이브러리, `Intl`, `annexB`의 레거시 웹 기능, 인큐베이팅 테스트가 있는 `staging` 디렉터리, 테스트 하네스 자체 테스트 등 모든 범주에서 **전체 테스트 모음의 100 %를 통과합니다**. 기능 플래그 우회, 호스트 차이 허용 목록, 샤드별 제외 항목은 없습니다.

테스트 모음은 특정 버전에 고정되어 있습니다. `test262` Git 서브모듈이 Phasis를 측정하는 리비전으로 고정하며, 새 업스트림 테스트는 서브모듈을 갱신한 뒤에만 집계됩니다. [`COMPAT.md`](https://github.com/inline0/phasis/blob/main/COMPAT.md)의 전체 테스트 스냅샷은 `compat-matrix.yml` 워크플로를 통해 다시 생성됩니다. 이 워크플로는 푸시마다 실행되는 것이 아니라 수동으로 시작하며, `COMPAT.md`에는 스냅샷 생성 시점과 기준 커밋이 기록됩니다.

비교를 위해 [test262.fyi](https://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는 적합성에 초점을 둔 단일 목적 구현이므로 이 차이를 해소합니다.

## 로컬에서 실행하기

실행기에는 `test262` 서브모듈과 저장소의 테스트 클래스가 필요합니다. 둘 다 Composer 패키지에 포함되어 있지 않으므로 저장소를 복제해 실행하세요.

```bash
git clone https://github.com/inline0/phasis
cd phasis
git submodule update --init test262
composer install
./bin/test262 --jobs 4
```

최신 Mac에서 전체 실행은 약 20분 걸립니다. CI 매트릭스는 여러 샤드에서 병렬 실행해 10분 이내로 완료됩니다.

디버깅 중 특정 범주만 실행하려면 다음을 사용하세요.

```bash
./bin/test262 --category built-ins/Array
./bin/test262 --category language/expressions/yield --failures
```

전체 플래그 목록은 [CLI 참조](https://phasis.inline0.dev/ko/docs/cli#bin-test262)를 확인하세요.

## 중요한 이유

JavaScript에는 미묘한 의미론이 있습니다. `NaN !== NaN`, `-0 === 0`, `[1] + 1 === "11"`, 속성 열거 순서의 정확성, Promise 마이크로태스크의 실행 시점 등이 그렇습니다. JS 사용자 코드를 실행하는 라이브러리는 이 모든 요소를 매번 올바르게 처리해야 합니다. test262는 "올바름"의 기준입니다. 100 % 통과한다는 것은 V8에서 실행되는 JS 프로그램이 브라우저 전용 API를 제외하면 Phasis에서도 바이트 단위로 동일한 출력을 생성한다는 뜻입니다.
