# バッチ設計書 19-test.lua

## 概要

本ドキュメントは、ユニットテストを実行するスクリプト `test.lua` のバッチ設計書です。

### 本バッチの処理概要

このスクリプトは、Lua言語サーバーの各機能に対するユニットテストを実行します。パーサー、補完、診断、定義ジャンプ、ホバー、リネームなど、言語サーバープロトコル（LSP）の主要機能を網羅的にテストします。

**業務上の目的・背景**：Lua言語サーバーは複雑なLuaコード解析機能を提供しており、コード変更による回帰を防ぐためには継続的なテストが不可欠です。このテストスクリプトは、開発中の機能追加やバグ修正が既存機能に影響を与えていないことを確認するために使用されます。CI/CDパイプラインでの自動テストや、開発者による手動テストの両方で活用されます。

**バッチの実行タイミング**：開発中のローカルテスト、プルリクエスト時のCI/CD自動テスト、リリース前の回帰テストとして実行されます。

**主要な処理内容**：
1. テスト環境の初期化（パス設定、グローバル変数設定）
2. ログシステムの初期化
3. 必要なライブラリの読み込み確認
4. テストクライアント（lclient）の起動
5. 各テストモジュールの順次実行
6. テスト結果の表示と終了

**前後の処理との関連**：ビルド後に実行されることが想定されています。make.luaのビルド定義にテストタスクが含まれています。

**影響範囲**：テスト実行のみで、本番環境やユーザーデータには影響しません。

## バッチ種別

テスト実行・品質検証

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（手動/CI/CD） |
| 実行時刻 | - |
| 実行曜日 | - |
| 実行日 | - |
| トリガー | 手動 / CI/CDパイプライン / ビルド後 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| ビルド済みの実行環境 | beeランタイムとネイティブモジュールがビルド済みであること |
| テストディレクトリの存在 | test/ディレクトリにテストモジュールが配置されていること |
| test_root/ディレクトリの存在 | テスト用のワークスペースディレクトリ |

### 実行可否判定

スクリプトが直接実行されると、テスト処理が開始されます。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| -n= / --name= | string | No | nil | 特定のテストのみを実行するためのフィルタ |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| test/*.lua | Luaモジュール | 各機能のテストモジュール |
| test_root/ | ディレクトリ | テスト用ワークスペース |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | テスト実行結果（各テストの名前と所要時間） |
| log/test.log | ログファイル | 詳細なテストログ |
| 終了コード | - | os.exit()で終了 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | test.log |
| 出力先 | ROOT/log/ |
| 文字コード | UTF-8 |
| 区切り文字 | - |

## 処理フロー

### 処理シーケンス

```
1. パス設定
   └─ package.pathにtest/を追加

2. 環境設定
   └─ ROOT、LOGPATH、METAPATH等のグローバル変数設定
   └─ TEST = true、DEVELOP = true に設定

3. 引数解析
   └─ -n= / --name= オプションでフィルタ設定

4. ガベージコレクション設定
   └─ collectgarbageのパラメータ調整

5. ログ初期化
   └─ log.init()でtest.logを作成

6. ライブラリ読み込み確認
   └─ loadAllLibs()で必要なモジュールを確認
   └─ bee.filesystem、bee.subprocess、bee.thread等

7. テストクライアント初期化
   └─ lclient()でテスト用クライアントを起動
   └─ ワークスペース初期化

8. 主要テストの実行
   └─ testAll()で以下のテストを順次実行：
       - basic、parser_test、definition、type_inference
       - implementation、references、hover、completion
       - diagnostics、crossfile、highlight、inlay_hint
       - rename、signature、command、document_symbol
       - code_action、other

9. 追加テストの実行
   └─ tclient、full、plugins.test、cli.test

10. 終了処理
    └─ 1秒待機後にos.exit()
```

### フローチャート

```mermaid
flowchart TD
    A[test.lua実行] --> B[パス・環境設定]
    B --> C[引数解析]
    C --> D[GC設定]
    D --> E[ログ初期化]
    E --> F[ライブラリ読み込み確認]
    F --> G{全ライブラリOK?}
    G -->|No| H[エラー終了]
    G -->|Yes| I[lclient初期化]
    I --> J[ワークスペース準備]
    J --> K[testAll実行]
    K --> L[追加テスト実行]
    L --> M[完了メッセージ]
    M --> N[1秒待機]
    N --> O[os.exit]
```

## データベース操作仕様

### 操作別データベース影響一覧

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| - | - | - | データベースは使用しない |

### テーブル別操作詳細

データベース操作は行いません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ライブラリ読み込み失敗 | 必要なモジュールが見つからない | ビルドを再実行する |
| - | テスト失敗 | アサーション失敗 | テストコードまたは本体コードを修正 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | - |
| リトライ対象エラー | - |

### 障害時対応

テスト失敗時はエラーメッセージが表示されます。ログファイルで詳細を確認し、該当するテストケースまたは本体コードを修正します。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし |
| コミットタイミング | - |
| ロールバック条件 | - |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 数百〜数千のテストケース |
| 目標処理時間 | 数分以内 |
| メモリ使用量上限 | 特に制限なし |

## 排他制御

テストは独立したワークスペース（test_root/）を使用するため、排他制御は不要です。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| デバッグログ | 初期化時 | 「测试开始」 |
| テスト開始 | 各テスト開始時 | 「测试[テスト名]...」 |
| テスト完了 | 各テスト完了時 | 「测试[テスト名]用时[秒数]」 |
| 完了メッセージ | 全テスト完了時 | 「test finish.」 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| テスト失敗 | 1件以上 | CI/CDシステム |

## 備考

- このスクリプトはプロジェクトルートの `test.lua` に配置されています
- テストモジュールは `test/` ディレクトリに配置されています
- LOCALEは 'zh-cn' に設定されます（中国語のテストメッセージ）
- io.writeは空関数で上書きされ、テスト中の不要な出力を抑制します
- `-n=` または `--name=` オプションで特定のテストのみを実行できます
- テストクライアント（lclient）を使用してLSPプロトコルをシミュレートします
- 実行されるテストカテゴリ：
  - basic: 基本機能テスト
  - parser_test: パーサーテスト
  - definition: 定義ジャンプテスト
  - type_inference: 型推論テスト
  - implementation: 実装検索テスト
  - references: 参照検索テスト
  - hover: ホバー情報テスト
  - completion: 補完機能テスト
  - diagnostics: 診断機能テスト
  - crossfile: 複数ファイル関連テスト
  - highlight: ハイライトテスト
  - inlay_hint: インレイヒントテスト
  - rename: リネームテスト
  - signature: シグネチャヘルプテスト
  - command: コマンドテスト
  - document_symbol: ドキュメントシンボルテスト
  - code_action: コードアクションテスト
  - other: その他のテスト
