/note/tech

A Markdown-based test suite

要約:

■ 1. 概要と背景

  • EndBASICのコアを書き直すにあたり、テストをRustのユニットテストからMarkdownで記述する方式に移行
  • AIコーディングエージェントの実験がEndBASIC開発の再開を動機付け
    • AIエージェントがEndBASIC公式ドキュメントをもとにゲームを生成することに成功
    • これを受けてEndBASICの「自己文書化」強化、高速化、機能拡張の三方針を立案
  • テストをMarkdownで書くことで、LLMがテストから言語仕様・動作ルールを自律的に学習できると判断

■ 2. Markdownテストスイートの構成

  • テストスイートの実体:
    • core/tests/ ディレクトリ以下の .md ファイル群(現在448テストケース、13,000行超)
    • 各ファイルが複数のテストケースを含むコンテナとして機能
  • テストケースの構造:
    • ■ Source — コンパイラへの入力(BASICソースコード)
    • ■ Compilation errors — コンパイル失敗時のエラーメッセージ(失敗時のみ)
    • ■ Disassembly — コンパイル後のバイトコード(成功時)
    • ■ Exit code — ゼロ以外の終了コード(任意)
    • ■ Output — プログラムのコンソール出力(成功時)
    • ■ Runtime errors — 実行時エラー(成功時)

■ 3. テストの実行方法

  • ドライバの動作:
    • tests/ ディレクトリ内の全Markdownファイルを列挙して順次処理
    • 各ファイルからテストケースのタイトルと Source セクションを抽出
    • 各テストケースをコンパイラ・VMに投入し、副作用をキャプチャ
    • 実行結果を新規Markdownファイルとして出力(actual)
  • ゴールデンファイルとの比較:
    • ドライバが出力したファイル(actual)をリポジトリにチェックインされた既存ファイル(golden)と差分比較
    • 差異があればテスト失敗とし、diff で差分を表示
  • ゴールデンファイルの再生成:
    • REGEN=true 環境変数を設定することで、ドライバがゴールデンファイルをその場で上書き再生成
    • 再生成後はGitで差分を確認し、コード変更と合わせてコミット

■ 4. 評価

  • メリット:
    • 以前のRustベースのテストと比較して格段に修正・確認が容易
    • 主要なテキストエディタのMarkdownサポートを活用でき、フェンスコードブロックの整形も機能
    • LLMが言語仕様のルールをMarkdownテストから自律的に抽出・学習できる
  • デメリット:
    • REGEN=true による再生成が容易すぎるため、ソース位置や逆アセンブルコードの細かいミスを見逃しやすい
    • 逆アセンブルの差分が命令アドレスを含むため、命令の追加・削除で全アドレスがシフトしノイズが多い
    • Rustの cargo test によるテストフィルタリングが機能せず、Markdownファイル内の個別テストケースは実行単位として扱えない
    • エンドツーエンドテストが安価なコンポーネントに限定的で汎用性に乏しい