internal/conformance チュートリアル
このページは、適合性フロントエンドを追加・変更するメンテナ向けです。internal/conformance の共有モデルを使って、フロントエンドがケースごとの結果を記録し、実行を要約し、シャードに分割し、シャードを再び統合する方法を示します。このパッケージは Luna-Flow/floating の内部パッケージなので、例は公開モジュールに対してはコンパイルされません。モジュール内部のコード向けに書かれています。
クイックスタート
モジュール内部で、フロントエンドの moon.pkg にこのパッケージをインポートします。
import {
"Luna-Flow/floating/internal/conformance",
}
ケースごとに 1 つの結果を記録して要約します。
///|
test "summarize a run" {
let results = [
@conformance.CaseResult::executable("add001", true),
@conformance.CaseResult::executable("add002", false, message="expected 3, got 2"),
@conformance.CaseResult::new("add003", @conformance.Diagnostic("placeholder"), false),
]
let summary = @conformance.RunSummary::from_results(3, results)
inspect(summary.executable_cases(), content="2")
inspect(summary.failed_cases(), content="1")
inspect(summary.skipped_cases(), content="1")
inspect(summary.success(), content="false")
}
日常的なタスク
処置(disposition)を選ぶ
選択されたすべてのケースに、ちょうど 1 つの処置を与えます。
- ケースを実行した場合は
Executable。結果はpassedで示します。 - コーパスの行がこの種類のテストでない場合は
Diagnostic(reason)。 - 行は有効だが機能が欠けている場合は
Unsupported(reason)。 - 行が主張の対象外である古い慣例に従っている場合は
Legacy(reason)。
スキップされた結果が success() を失敗させることはないため、Unsupported は正直に選んでください。strict モードを持つランナーは、サポートされない行を失敗の終了コードに変えます。
実行をシャードに分割する
フィルタを通過したケースに と番号を付け、シャードが選択するものを残します。絞り込み後のケース数を total として渡します。
///|
fn run_shard(ids : Array[String], shard : @conformance.ShardSpec) -> @conformance.RunSummary {
let results = []
for ordinal, id in ids {
if shard.selects(ordinal) {
results.push(@conformance.CaseResult::executable(id, true))
}
}
@conformance.RunSummary::from_results(ids.length(), results)
}
///|
test "shards merge to the serial run" {
let ids = ["a", "b", "c", "d", "e"]
let parts = [0, 1].map(i => run_shard(ids, @conformance.ShardSpec::new(2, i)))
let merged = @conformance.RunSummary::merge(parts)
inspect(merged.total_cases(), content="5")
inspect(merged.selected_cases(), content="5")
}
ユーザー入力を検証する
コマンドラインのシャードオプションはユーザーから与えられます。ShardSpec::try_new を使い、Err を使用法エラーに変換してください。ShardSpec::new は中断します。
モデルをフロントエンドの型で包む
公開フロントエンドはこれらの型を直接公開しません。gda_expr、mpfr_expr、testfloat_expr は CaseResult と RunSummary を独自の構造体で包み、公開したいアクセサを転送します。同じパターンに従えば、フロントエンドの API を壊さずに内部モデルを変更できます。
さらに進んで
- パッケージのテストは、モジュールを含むワークスペースから実行します:
moon test -p Luna-Flow/floating/internal/conformance。 - internal/runner_cli は、共通のコマンドラインオプション(
--json、--shard-count、--shard-index)を構文解析してShardSpecにします。
よくある落とし穴
- 誤った total。
total_casesは、絞り込みの後、シャード分割の前のケース数を数えるべきで、すべてのシャードで同じ値になります。mergeは最大値を保持します。 - 負の序数。
selectsは%を使い、序数の符号が保たれます。必ず 0 から数えてください。 - スキップされた結果の
passed。 カウンタはこれを無視します。わかりやすさのためfalseに設定してください。
次のステップ
- internal/conformance API
- internal/conformance 設計
- このモデルの上に構築されたフロントエンドについては gda_expr チュートリアル。