🧊

TypeScriptCompilerのベースラインとテストの仕組み

OXCなんかで、TypeScriptのテストケースを参照して、カバレッジを取ってることは知ってた。

けど、

  • ./tests/baselines/reference/にある.errors.txtはどう読み解くのが正解なのか?
  • TSC自体はどのAPIを使ってテストしているのか?

みたいなことが、なんとな〜くしかわかってなかった。

今回はそれを明らかにしたい。

./tests/baselines/reference配下においてあるものをベースラインと呼んでる。

https://github.com/microsoft/TypeScript/blob/main/CONTRIBUTING.md#managing-the-baselines

テストの足回り

実際にはもう少し色々な準備があるけど、だいたいこんな感じか。

./src/testRunner/runner.tsで呼んでるstartTestEnvironment()がエントリーポイントらしい。

startTestEnvironment()

つぎはCompilerBaselineRunnerの詳細へ。

CompilerBaselineRunner

このverifyDiagnostics()が一番知りたかったやつ。CompilerTestをみてく。

CompilerTest

Compilerはただのnamespaceだった。

Compiler#compileFiles()

Compiler#doErrorBaseline()

このBaselineもただのnamespaceだった。

Baseline#runBaseline()

スナップショットと差分があったらthrowするというだけ。

まとめ

  • TSCのテストは、src/testRunnersrc/harnessでがっつり実装されてる
  • 内部的にはmochaを使ってがんばってる
  • コンパイラーに関しては2パターンをテスト
    • tests/cases/compiler: Regressions
    • tests/cases/conformance: Conformance
  • 内容は、tests/baselines/referenceにある各種ファイルとのスナップショットテスト
    • .errors.txtだけでなく、.symbols.typesのほか、emitされた.jsなど
  • .errors.txtは、Diagnostic[]を文字列化したもの
    • テストケースは@filenameコメントで複数ファイルから構成されることもある
    • その場合も全ファイル分をまとめたスナップショットになる
    • どのファイルでどのエラーが出たか、ちゃんとわかるようになってる

だいたい予想してた通りでよかった。