验证

本指南列出一次改动必须通过的检查、测试所确立的内容,以及测试有意不作的声明。

本地检查

在发起 pull request 之前,于仓库根目录运行:

moon update
moon fmt
moon info
git diff -- src/pkg.generated.mbti
moon check --target all
moon test
moon test --target js
moon test --target native

moon info 会重新生成接口文件;其差异就是公开 API 改动的清单,必须都是有意为之。moon check --target all 在本包中必须没有任何警告。

当 arithmetic 与尚未发布的 luna-generic 一起开发时,应在一个 moon.work 同时列出两个检出副本的工作区中运行 moon check 和 moon test,使测试依赖解析到本地副本。

文档检查关卡

本手册由 lunadoc 检查:

lunadoc update .
lunadoc check --compile .
lunadoc status --pages .

update 会重新生成 doc/locale/manual.pot 并把它合并到中文和日文目录中;check 在出现失效的相对链接、与英文页面不匹配的目录或无法编译的 Typst 附件时失败。每个未标记为 nocheck 的 moonbit 代码块都是完整的测试或定义:把一个页面中的代码块复制到某个临时包的 _test.mbt 文件中,该包以 @lf_arith 导入 Luna-Flow/arithmetic(教程还需以 @lf_alg 导入 Luna-Flow/luna-generic),然后运行 moon test。

测试验证了什么

trait_test.mbt 检查:非检查 trait 能在泛型代码中与 luna-generic 约束组合使用;Float 和 Double 上每个初等函数的代表性取值;Constants 在两种类型中都满足 τ=2π\tau = 2\pi 和 ln⁡e=1\ln e = 1;每种整数类型和 BigInt 的精确 Power;检查平方根和检查除法在有效输入、负输入、0/00/0、∞/∞\infty/\infty 和零除数下的行为;CompareChecked 对 NaN 的拒绝;以及检查整数幂在零指数、负指数、零底数和最小的负 Int 下的行为。

contextual_test.mbt 检查:Int 嵌入 Float 时的精确与舍入情形,以及嵌入 Double 时的精确性;相邻运算的 IEEE 边界(有符号零、最小次正规数、最大有限值、无穷和 NaN);以及借助测试内部定义的类型,验证上下文双曲函数的结果和上下文常量的认证失败能原样经过 trait 传递。

certification_error_wbtest.mbt 检查 CertificationFailureDetail 经过 ArithmeticError::certification_failure 后所有字段都得以保留,并检查各错误谓词保持互斥。

测试不作的声明

测试并不声称 Float 或 Double 的算术是经认证的、它们的初等函数是正确舍入的,或它们的上下文实例会检测舍入。测试验证的是能力词汇、固定格式下的相邻值语义以及错误分类。

持续集成

CI 在 pull request 以及推送到 main 时运行:它构建并检查所有目标,运行默认、JavaScript 和 native 测试套件,验证 pkg.generated.mbti 与源码一致,并检查格式。另有一个工作流在 doc/ 下有改动时运行 Luna Flow 共享的文档检查。publish-package 工作流接受一个显式版本号,要求它与 moon.mod 中的版本一致,重复上述检查,发布到 mooncakes 并创建 GitHub release。一次通过的运行只是仓库层面的证据,而不是对任何后端的数值符合性声明。