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を使ってください。
次のステップ
- テストの一覧については consistency API。
- immut API と mutable API。