# 検証

```sh
python3 scripts/setup.py
scripts/check.sh
```

Linux x86_64 で固定ツールチェーンを使い、native / js / wasm / wasm-gc の debug・release を検証します。通常の MoonBit テストに C++ コンパイラは不要です。期待値を再生成・検証する開発タスクには `g++` と Python 3.12 以上が必要です。JS テストには Node.js 22 を使います。

## 検証の層

| 検証 | ファイル・内容 |
|---|---|
| 公開 API と独立モデル | `src/verify/*_test.mbt`：単純配列、集合分割、素朴畳み込み、素朴文字列、到達可能性、全カット、全割り当て、実行可能フローの全探索と比較 |
| 上流 C++ との一致 | `src/verify/oracle_test.mbt`：固定乱数 seed で作る 1,186 ケース、16 グループ。数値型の端点、NTT、CRT、slope も含む |
| 上流回帰ケースの移植 | `src/verify/upstream_test.mbt`：InvBoundHand / InvModZero / CRTBound / ModMax / Twice / SameCostPaths / ConvLLBound 等の要点を MoonBit で再現 |
| 入力スケール | `src/verify/scale_test.mbt`：100,000 頂点の鎖状グラフ、100,000 要素の木・文字列、16,384×16,384 の NTT |
| 前提条件 | `src/verify/panic_test.mbt`：範囲外、逆元不在、不正な法・原始根長、MCF 再実行などが panic することを確認 |
| 実用例 | `src/examples/`：Practice2 A〜L の 18 公式サンプル。D/E/G/H は非一意解を制約・最適値で検証 |
| ドキュメント | `src/verify/docs_test.mbt`：README と API ガイドの利用コードを抽出してコンパイル・実行 |
| 配布・API | `scripts/check_artifacts.py`：上流ヘッダのハッシュ、全バックエンドの公開 API、配布対象にキャッシュや検証用ヘッダが混入しないこと |

ランダムテストはすべて決定的です。全探索は小入力に限定し、大入力テストでは結果が解析的に分かるデータを使っています。テスト件数には複数の検証を内包するグループがあり、件数だけが入力ケース数を表すものではありません。

## C++ oracle の再生成

```sh
python3 tests/generate_oracle.py
python3 tests/generate_oracle.py --check
```

`tests/oracle.cpp` を C++17 でコンパイルし、同梱した **未改変 ACL v1.6** ヘッダを呼び出します。実行ファイルは `tests/.cache` にのみ保存します。JSON 出力の 64-bit 整数は Python の整数として読み、MoonBit の整数リテラルへ変換します。JS の Number を経由しません。数論の一部は Python の多倍長整数でも独立検証します。

`tests/reference/UPSTREAM` と `SHA256SUMS` に上流と同一性を記録しています。更新時は意図的に上流を変更し、差分・生成テスト・API ドキュメントを一緒にレビューしてください。`--check` は期待値の不一致をエラーにし、保存済みのテストを書き換えません。

## サンプルとドキュメント

```sh
python3 tests/generate_samples.py --check
python3 tests/generate_docs.py --check
```

公式サンプルは [tests/practice2_samples.json](../tests/practice2_samples.json) に出典 URL とともに保存済みで、CI 中の AtCoder へのアクセスはありません。問題本文は同梱しません。サンプルに対するチェックはオンラインジャッジへの提出・AC の代替ではありません。利用例の `solve(task,input)` は入力文字列と出力文字列を扱い、各実行環境の標準入出力アダプタは呼び出し側で用意します。

## CI と生成物

[CI](../.github/workflows/ci.yml) は 4 ターゲット × 2 プロファイルと、format・コンパイル警告・期待値再生成・公開 API・配布内容・HTML ドキュメント生成を検証します。CI はリポジトリに push した時点で実行されます。

```sh
scripts/moon info --target all
scripts/moon doc
scripts/moon package --list
```

`pkg.generated.mbti` はソースとともに管理します。ツールチェーン、ビルド成果物、oracle バイナリは管理・配布対象から除外しています。`.moonignore` により差分検証用パッケージ・テスト・C++ ヘッダも配布アーカイブから除外します。`moon package` はローカルのアーカイブ作成であり、Mooncakes への公開は行いません。
