consistency チュートリアル

このページはコントリビューター向けです。レイヤー間の一致テストの実行方法と、演算を追加または変更したときにテストを追加する方法を説明します。ライブラリの利用者がこのパッケージをインポートすることはありません。

クイックスタート

リポジトリ (またはそれを含むワークスペース) から、このパッケージのテストを実行します。

moon test -p Luna-Flow/luna-poly/consistency

すべてのテストが成功するはずです。失敗した場合は、2 つのレイヤーまたは 2 つの表現の結果が食い違っています。

日常的なタスク

新しい演算のチェックを追加する

両方のレイヤーに演算を追加したら、src/consistency/core_wbtest.mbt にホワイトボックステストを追加し、両方の方法で計算して正規形の出力を比較します。例:

test "new operation stays aligned" {
  let immutable = @immut.DensePolynomial::from_coefficients([1, 2, 3])
  let mutable = @mutable.DensePolynomial::from_coefficients([1, 2, 3])
  assert_true(
    immutable.new_operation().to_coefficients() ==
    mutable.new_operation().to_coefficients(),
  )
}

2 つのレイヤーは型が異なるので、to_coefficients() または to_terms() を通じて比較します (必要なら to_array() で指数ベクトルを変換します)。

失敗時の契約をチェックする

チェック付き API では、同じ不正な入力に対して両方のレイヤーが None を返すことをアサートします。

さらに進む

単一の表現の法則はその表現のパッケージに置きます (moonbitlang/quickcheck を使う src/immut/laws_wbtest.mbt を参照)。表現間およびレイヤー間の等式はここに置きます。

よくある落とし穴

  • 異なる型の比較。 @immut.DensePolynomial と @mutable.DensePolynomial は == で比較できません。正規形のエクスポート結果を比較してください。
  • to_terms() の順序。 項ストレージは降順、疎ストレージは昇順です。比較の前に TermPolynomial::from_terms を通して正規化してください。

次のステップ