# テスト方針書

## 概要

本ドキュメントは、lua-language-server プロジェクトにおけるテスト方針を定義する。lua-language-server は Lua 言語のための Language Server Protocol (LSP) 実装であり、コード補完、定義ジャンプ、診断、ホバー情報表示などの機能を提供する。本プロジェクトでは、独自のLuaベースのテストフレームワークを使用し、各機能モジュールに対する包括的なテストを実施している。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | パーサー、文法解析、AST処理など個別モジュールの機能検証 | 開発者 |
| 結合テスト | LSP機能（補完、定義、参照、診断など）の統合動作検証 | 開発者 |
| システムテスト | Language Serverクライアント接続を含む全体動作検証 | 開発者 |
| 受入テスト | 複数ワークスペース、ライブラリ読み込みなど実際の利用シナリオでの検証 | 開発者 |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | LSP各機能（補完、定義ジャンプ、診断、ホバー等）の正常動作確認 | 開発時、CI/CD実行時 |
| 性能テスト | 大規模ファイル解析時のパフォーマンス測定 | 開発時（手動） |
| 回帰テスト | バグ修正後の再発防止確認 | CI/CD実行時 |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| ローカル開発環境 | 開発中のテスト実行 | Lua 5.4/5.5 + bee.lua + lpeglabel |
| GitHub Actions (Linux) | CI/CDでのクロスプラットフォームテスト | Ubuntu 22.04, linux-x64 |
| GitHub Actions (macOS) | CI/CDでのクロスプラットフォームテスト | macOS 14, darwin-arm64 |
| GitHub Actions (Windows) | CI/CDでのクロスプラットフォームテスト | Windows Latest, win32-x64 |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| 独自テストフレームワーク (test.lua) | テストエントリーポイント、テストケース実行管理 | プロジェクト組み込み |
| catch.lua | テストスクリプト内のマーカー解析（位置指定テスト用） | プロジェクト組み込み |
| luamake | ビルドシステム、テスト実行 | 最新版 (actboy168/setup-luamake) |
| bee.lua | ファイルシステム、スレッド、ソケット等のLuaライブラリ | プロジェクト組み込み |
| lpeglabel | パターンマッチングライブラリ（パーサーテスト用） | プロジェクト組み込み |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| 行カバレッジ | 明示的な目標値なし（機能カバレッジ重視） |
| 分岐カバレッジ | 明示的な目標値なし（機能カバレッジ重視） |
| 機能カバレッジ | 全LSP機能に対するテストケース網羅 |

**補足**: 本プロジェクトでは従来のコードカバレッジ指標よりも、機能単位でのテストカバレッジを重視している。各LSP機能（定義、参照、補完、診断等）に対してそれぞれ専用のテストモジュールが存在し、機能の動作を網羅的に検証している。

## テストデータ

テストデータは主に以下の形式で準備される：

1. **インラインスクリプト**: テストファイル内にLuaコードを文字列として埋め込み、`catch.lua`のマーカー記法（`<! !>`, `<? ?>`等）を使用して期待位置を指定
2. **外部テストファイル**: `test/example/` ディレクトリ配下に実際のLuaコードサンプルを配置
3. **パフォーマンステストデータ**: `test/parser_test/perform/` ディレクトリ配下にテキストファイルとして配置

### マーカー記法

```lua
-- 例: 定義ジャンプテスト
TEST [[
local <!x!> = 1
print(<?x?>)
]]
-- <!x!> は定義位置、<?x?> はジャンプ元位置を示す
```

## 不具合管理

- **Issue管理**: GitHubのIssue機能を使用
- **報告先**: https://github.com/LuaLS/lua-language-server/issues
- **再現テスト**: 修正されたバグに対しては回帰テストケースを追加（例: `test/definition/bug.lua`）

## CI/CD連携

### GitHub Actions ワークフロー

1. **test.yml**: プッシュおよびプルリクエスト時にテストを実行
   - トリガー: `push`, `pull_request`
   - マトリクスビルド:
     - Linux (Ubuntu 22.04, linux-x64)
     - macOS (macOS 14, darwin-arm64)
     - Windows (Windows Latest, win32-x64)
   - ステップ:
     1. リポジトリのチェックアウト（サブモジュール含む）
     2. luamake のセットアップ
     3. ビルド実行 (`luamake -platform <platform>`)

2. **build.yml**: ビルドおよびリリース用ワークフロー
   - トリガー: `master`ブランチへのプッシュ、タグ付け、プルリクエスト
   - 追加プラットフォーム:
     - Linux ARM64 (Ubuntu 24.04-arm, linux-arm64)
     - macOS x64 (darwin-x64)
     - Windows ia32 (win32-ia32)

### テスト実行コマンド

```bash
# ローカルでのテスト実行
./bin/<platform>/lua-language-server --test

# または luamake を使用
luamake -platform <platform>
```

## テストディレクトリ構成

```
test/
├── test.lua                 # テストエントリーポイント
├── catch.lua                # マーカー解析ユーティリティ
├── basic/                   # 基本機能テスト
│   ├── init.lua
│   ├── textmerger.lua
│   └── filewatch.lua
├── parser_test/             # パーサーテスト
│   ├── init.lua
│   ├── ast/                 # AST生成テスト
│   ├── grammar.lua          # 文法テスト
│   ├── grammar_check.lua
│   ├── syntax_check.lua
│   └── perform/             # パフォーマンステストデータ
├── definition/              # 定義ジャンプテスト
├── references/              # 参照検索テスト
├── completion/              # コード補完テスト
├── diagnostics/             # 診断テスト（58種類以上）
├── hover/                   # ホバー情報テスト
├── highlight/               # ハイライトテスト
├── signature/               # シグネチャヘルプテスト
├── rename/                  # リネームテスト
├── inlay_hint/              # インレイヒントテスト
├── implementation/          # 実装検索テスト
├── type_inference/          # 型推論テスト
├── crossfile/               # ファイル間参照テスト
├── document_symbol/         # ドキュメントシンボルテスト
├── code_action/             # コードアクションテスト
├── command/                 # コマンドテスト
├── tclient/                 # LSPクライアント統合テスト
│   └── tests/               # 17種類のクライアントテスト
├── full/                    # フルテスト（大規模プロジェクト検証）
├── plugins/                 # プラグインテスト
│   ├── ast/
│   ├── ffi/
│   └── node/
├── cli/                     # CLIテスト
│   └── visualize/
├── other/                   # その他テスト
└── example/                 # テストデータサンプル
```

## 備考

### テスト実行オプション

- **特定テストの実行**: `-n=<pattern>` または `--name=<pattern>` オプションで、パターンに一致するテストのみを実行可能
- **診断時間計測**: フルテスト実行時に各診断タスクの所要時間を計測・出力

### テストの特徴

1. **マーカーベーステスト**: 位置ベースの機能（定義ジャンプ、参照検索等）に対し、スクリプト内にマーカーを埋め込む独自の記法を採用
2. **診断テスト網羅性**: 58種類以上の診断ルールに対して個別のテストファイルを用意
3. **クライアント統合テスト**: 実際のLSPクライアント接続をシミュレートしたテスト（tclient）

### 対応Luaバージョン

テストは以下のLuaバージョンに対応：
- Lua 5.5
- Lua 5.4
- Lua 5.3
- Lua 5.2
- Lua 5.1
- LuaJIT

### テストファイル数

- テストファイル総数: 約155ファイル
- 診断テストケース: 58種類以上
- クライアントテストシナリオ: 17種類
