# テスト方針書

## 概要

本ドキュメントは、Nimプログラミング言語コンパイラプロジェクトのテスト方針を定義します。Nimコンパイラは独自のテストフレームワーク「Testament」を使用し、コンパイラの機能、標準ライブラリ、コード生成、メモリ管理等を包括的にテストします。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | 個々のコンパイラ機能、言語機能の正確性検証 | Testament (`tests/`ディレクトリ内の各カテゴリ) |
| 結合テスト | コンパイラコンポーネント間の連携確認、バックエンド間の互換性 | Testament (複数ターゲットでのテスト実行: c, cpp, objc, js) |
| システムテスト | エンドツーエンドのコンパイル・実行フロー検証 | Megatest、Nimble Packagesテスト |
| 受入テスト | 外部パッケージとの互換性、実際のユースケース検証 | `nimble-packages`カテゴリ (150以上の外部パッケージ) |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | コンパイラ機能、言語仕様の正確性検証 | 全コミット時 (CI) |
| 回帰テスト | バグ修正の確認、既存機能の維持 | 全コミット時 (CI) |
| メモリ管理テスト | GC (refc, arc, orc, boehm, markAndSweep) の動作検証 | 全コミット時 (CI)、Valgrind有効時 |
| パフォーマンステスト | コンパイル速度、生成コードの効率性 | releaseビルド時 |
| クロスプラットフォームテスト | Linux, macOS, Windows での動作確認 | Azure Pipelines CI |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| Linux (ubuntu-24.04) | 主要テスト環境、amd64アーキテクチャ | GCC-14, Node.js 20.x, Valgrind |
| macOS (macos-15) | arm64アーキテクチャテスト | Apple Clang, SFML, Boehm GC |
| Windows (windows-2025) | Windowsバイナリ生成、バッチテスト | MinGW64 |
| macOS C++ | C++バックエンド特化テスト | NIM_COMPILE_TO_CPP=true |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| Testament | Nimコンパイラ専用テストフレームワーク | Nim内蔵 (testament/testament.nim) |
| Valgrind | メモリリーク検出、メモリエラー検出 | システム提供版 (Linux amd64のみ) |
| Node.js | JavaScriptバックエンドテスト実行 | 20.x |
| Koch | ビルドシステム、テスト実行コマンド | Nim内蔵 (koch.nim) |
| Azure Pipelines | CI/CD パイプライン | Azure DevOps |
| GitHub Actions | ドキュメント生成、パッケージテスト | GitHub提供 |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| コンパイラ機能カテゴリ | 130以上のテストカテゴリ全てをカバー |
| バックエンドターゲット | C, C++, Objective-C, JavaScript の4ターゲット |
| メモリ管理方式 | refc, arc, orc, boehm, markAndSweep |
| 外部パッケージ互換性 | 150以上の主要Nimbleパッケージ |

## テストデータ

### テストファイル命名規則
- テストファイルは `t` で始まるファイル名 (例: `tfoo.nim`)
- `tests/`ディレクトリ配下のカテゴリ別サブディレクトリに配置

### テスト仕様記述 (Spec)
各テストファイルの先頭に`discard """`ブロックでテスト仕様を記述:
- `action`: compile (コンパイルのみ), run (実行まで), reject (コンパイルエラー期待)
- `output`: 期待される出力
- `exitCode`: 期待される終了コード
- `targets`: テスト対象ターゲット (c, cpp, js, objc)
- `matrix`: 複数オプションでの並列テスト
- `disabled`: プラットフォーム別無効化条件

### インラインエラーマーカー
```nim
proc example() = #[tt.Error
     ^ error message expected here ]#
```

## 不具合管理

### テスト結果の管理
- Testament が `testresults.html` を生成
- Azure Pipelines のテスト管理APIに結果を自動アップロード
- `FAIL:` プレフィックスで失敗を統一的に識別可能

### 失敗許容テスト
- `allowFailure` フラグにより、既知の問題があるパッケージをCI失敗なしで監視
- `disabled` 仕様によりプラットフォーム固有の問題を一時的に無効化

### リトライ機構
- `retries` 仕様によりフレーキーテストの再試行が可能

## CI/CD連携

### Azure Pipelines (`azure-pipelines.yml`)
- **トリガー**: `devel`ブランチ、`version-*`ブランチへのプッシュ、全PRへのプッシュ
- **ジョブタイムアウト**: 90分
- **バッチ処理**: Windowsでは`NIM_TESTAMENT_BATCH`で3分割並列実行

### 実行フロー
1. `koch runCI` がCIの主要エントリポイント
2. `testament all` で全テストカテゴリを実行
3. `pcat` コマンドでカテゴリ別並列実行
4. `megatest` で結合可能なテストを単一プロセスで高速実行

### GitHub Actions
- `ci_docs.yml`: ドキュメント生成
- `ci_packages.yml`: パッケージテスト
- `ci_publish.yml`: リリース公開
- `bisects.yml`: バイセクト支援

### スキップ機構
- コミットメッセージに`[skip ci]`を含めることでCI実行をスキップ可能
- `--skipFrom:file`オプションで特定テストをスキップ

## 備考

### 特殊テストカテゴリ
以下のカテゴリは特別な処理が必要:
- `dll`: 動的リンクライブラリテスト
- `gc`: ガーベジコレクションテスト
- `threads`: スレッドテスト (`--threads:on`オプション)
- `js`: JavaScriptバックエンドテスト
- `ic`: インクリメンタルコンパイルテスト
- `nimble-packages`: 外部パッケージテスト

### Megatest
- 結合可能なテスト (`isJoinableSpec`) を単一のメガテストファイルに結合
- コンパイル時間の大幅な短縮
- `useMegatest` フラグで制御

### 環境変数
- `NIM_TESTAMENT_REMOTE_NETWORKING=1`: リモートネットワーキングを使用するテストを有効化
- `NIM_COMPILE_TO_CPP=true`: C++バックエンドでのテスト実行
- `NIMBLE_DIR`: Nimbleディレクトリのカスタムパス指定
