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 モードを持つランナーは、サポートされない行を失敗の終了コードに変えます。

実行をシャードに分割する

フィルタを通過したケースに 0,1,2,…0, 1, 2, \dots と番号を付け、シャードが選択するものを残します。絞り込み後のケース数を 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 に設定してください。

次のステップ