# テスト方針書

## 概要

本ドキュメントは、Hack Standard Library (HSL) プロジェクトのテスト方針を定義するものである。HSLはHHVM上で動作するHack言語のための標準ライブラリであり、`vec`、`keyset`、`dict`などのHack配列を操作するためのAPIを提供する。本プロジェクトでは独自の軽量テストフレームワーク「MiniTest」を使用し、GitHub Actions上でCI/CDを実行している。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | 各HSLモジュール（Vec、Dict、Keyset、Str、Math、IO、Async等）の関数単位での動作検証 | 開発者 |
| 結合テスト | 複数モジュール間の連携動作検証（例：IO + File、Async + Vec） | 開発者 |
| システムテスト | HHVM環境全体での動作検証（型チェッカーhh_clientによるTypecheck含む） | CI/CD |
| 受入テスト | HHVMのnightly buildとの互換性検証 | CI/CD（定期実行） |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | 各HSL関数の入出力が仕様通りであることを検証 | 開発時・PR作成時 |
| 性能テスト | 大量データ処理（10,000要素のコレクション等）での動作検証 | 開発時（testExtreme系メソッド） |
| 非同期テスト | Async/Await処理の並行実行制御の検証（Semaphore、Condition等） | 開発時・PR作成時 |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| ローカル開発環境 | 開発者による単体テスト実行 | HHVM + Hack、minitest.sh |
| CI環境（GitHub Actions） | 自動テスト実行・型チェック | Ubuntu-latest、HHVM nightly、Watchman |
| DevContainer | コンテナ化された開発環境 | .devcontainer設定による標準化 |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| MiniTest | 独自軽量テストフレームワーク（HackTest基底クラス） | 内蔵版 |
| hh_client | Hack型チェッカー | HHVM nightly |
| HHVM | Hack実行環境 | nightly |
| Watchman | ファイル変更監視（HHVM依存関係） | apt経由でインストール |
| GitHub Actions | CI/CDパイプライン | v2 |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| 行カバレッジ | 明示的な数値目標は未設定 |
| 分岐カバレッジ | 明示的な数値目標は未設定 |

**注記**: 本プロジェクトはHSLの公式リポジトリであり、テストコードのみが含まれる（ソースコードはHHVMリポジトリに移動済み）。そのため、カバレッジ測定よりもAPI互換性と型安全性の検証に重点を置いている。

## テストデータ

テストデータはDataProviderパターンを使用して管理される。

- **DataProviderメソッド**: 各テストクラスに`provideTestXxx`形式のstaticメソッドを定義
- **入力データ形式**: `vec<tuple<入力1, 入力2, ..., 期待値>>`の形式で複数のテストケースを定義
- **データ種別**:
  - 空のコレクション（vec[], Map{}, Set{}）
  - 単一要素のコレクション
  - 複数要素のコレクション
  - 大量データ（10,000要素）
  - 各種Traversable実装（Vector、Map、Set、Iterator等）
- **ヘルパークラス**:
  - `HackLibTestTraversables`: カスタムIterator/KeyedIteratorの提供
  - `HackLibTestStringable`: Stringable実装のテスト用
  - `HackLibTestForwardOnlyIterator`: 前方向限定イテレータのテスト用

## 不具合管理

- **不具合追跡**: GitHub Issuesを使用（HHVM本体リポジトリとの連携）
- **Fixmeコード**: `.hhconfig`にて`allowed_fixme_codes_strict`で許容されるHH_FIXMEコードを管理
- **スキップ機能**: `markTestSkipped()`メソッドによるテストスキップ（環境依存のテスト等）

## CI/CD連携

GitHub Actionsを使用した継続的インテグレーションを実施。

### ワークフロー設定

- **トリガー**:
  - push: すべてのブランチへのプッシュ時
  - pull_request: PR作成・更新時
  - schedule: 毎日15:42 UTC（定期実行）

### 実行ステップ

1. **リポジトリのチェックアウト**（actions/checkout@v2）
2. **HHVMインストール**（hhvm/actions/install-hack@master、nightly版）
3. **Watchmanインストール**（apt経由）
4. **ロケールサポートインストール**（en_US、fr_FR、tr_TR、da_DK）
5. **型チェック実行**（hh_client）
6. **テスト実行**（./minitest.sh）

### 実行戦略

- **fail-fast: false**: 1つのテストが失敗しても他のテストは継続実行
- **マトリクス**: Ubuntu + HHVM nightly の組み合わせで実行

## 備考

- 本リポジトリはHSLのテストコードのみを含み、実装コードはHHVMリポジトリ（`hphp/hsl`サブディレクトリ）に移行済み
- コントリビューションはHHVMリポジトリへ行う必要がある
- MiniTestフレームワークはHSL自体をテストするため、HSL関数を使用せずに実装されている（循環依存回避）
- テストはすべて非同期対応（`Awaitable<void>`）であり、`async/await`パターンを使用
