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规范化。
后续步骤
- consistency 设计列出了检查的内容。
- 贡献指南介绍了提交 PR 前的检查。