consistency 教程

本页面向贡献者:说明如何运行跨层一致性测试,以及在新增或修改操作时如何添加测试。库的使用者从不导入此包。

快速开始

在仓库中(或在包含它的工作区中)运行此包的测试:

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

所有测试都应通过;失败意味着两层或两种表示的结果不一致。

日常任务

为新操作添加检查

当你向两层都添加一个操作时,在 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(),
  )
}

通过 to_coefficients() 或 to_terms() 比较(必要时用 to_array() 转换指数向量),因为两层的类型不同。

检查失败契约

对于带检查的 API,断言两层在相同的无效输入上都返回 None。

深入了解

单一表示的定律属于该表示自己的包(见 src/immut/laws_wbtest.mbt,它使用 moonbitlang/quickcheck);跨表示和跨层的等式放在这里。

常见陷阱

  • 比较不同类型。 @immut.DensePolynomial 与 @mutable.DensePolynomial 不能用 == 比较;请比较它们的规范导出结果。
  • to_terms() 的顺序。 项存储为降序,稀疏存储为升序;比较前先通过 TermPolynomial::from_terms 规范化。

后续步骤