consistency チュートリアル

このページはコントリビューター向けです。パッケージ間の一致テストを実行する方法と、immut と mutable の両方に操作を追加するときにテストを追加する方法を示します。考え方は consistency の設計 にあります。

クイックスタート

リポジトリのルートから:

moon test -p consistency

すべてのテストは既定のターゲットで実行されます。このパッケージにはターゲット固有のコードはありません。

日常的なタスク

一致テストを追加する

両方のパッケージで同じ入力を構築し、操作を適用し、共通の観測を比較します。src/consistency/core_wbtest.mbt に置くとすれば、このようなテストの形は次のとおりです。

///|
test "anti_trace stays aligned" {
  let imm = @immut.Matrix::from_2d_array([[1, 2], [3, 4]])
  let mut_m = @mutable.Matrix::from_2d_array([[1, 2], [3, 4]])
  inspect(
    imm.anti_trace().unwrap(),
    content=mut_m.anti_trace().unwrap().to_string(),
  )
}

法則をプロパティとして追加する

小さな整数のタプルを使って quick_check_fn を使い、両パッケージで法則の両辺を比較する Bool を返します。整数を使えば比較は厳密に保たれます。

同じ考え方は自分のコードでも使えます。マニュアルとともにコンパイルされる次の検査は、積について 2 つのパッケージを比較します。

///|
test "products agree across packages" {
  let rows = [[1, -2], [3, 4]]
  let i = @immut.Matrix::from_2d_array(rows)
  let m = @mutable.Matrix::from_2d_array(rows)
  debug_inspect((i * i).to_array() == (m * m).to_array(), content="true")
}

さらに進んで

パッケージ間で操作が意図的に異なる場合は、その違いを述べるテストを追加し、両方の API ページで言及してください。

よくある落とし穴

  • Double の結果を == で比較する。 カーネルは異なる順序で総和をとります。一致テストは整数で行ってください。
  • 要素型をまたいで to_string を比較する。 出力形式が書式だけ異なりうる場合は to_array を使ってください。

次のステップ