std:assert — アサーション
標準ライブラリモジュール (index.md)。本書中の裸の §N は本書の節を指す。言語の意味論は ../language-spec.md を参照。テストランナー (hikari test) との関係は ../test.md を参照。
import assert := "std:assert" は equal / not_equal / ok / length / empty / fail の 6 slot を持つ namespace object を assert に束縛する。値の検査に用い、条件を満たさないとき panic (Error, language-spec.md §16) を投げる。
std:test に依存しない。std:fs / std:term と違い I/O を伴わず、純粋・同期 (Future を返さない)。REPL・playground・hikari run・hikari test のいずれからも同じように使える。
import assert := "std:assert" assert.equal(1 + 1, 2) # 通過 (何も起きない) assert.ok ("a" < "b") # 通過 assert.equal(1 + 1, 3) # panic: assert.equal: expected 3, got 2
| 名前 | 形 | pass 条件 | 失敗メッセージ例 |
|---|---|---|---|
equal |
equal(actual, expected) |
actual == expected (language-spec.md §9.1。ユーザー定義 == スロットも尊重) |
assert.equal: expected 3, got 4 |
not_equal |
not_equal(a, b) |
a == b が偽 |
assert.not_equal: expected values to differ, both 3 |
ok |
ok(cond) |
cond が true (Bool、language-spec.md §9.3) |
assert.ok: expected true, got false |
length |
length(coll, expected) |
coll の長さが expected (Int) と等しい (§3) |
assert.length: expected length 3, got 2 ([1, 2]) |
empty |
empty(coll) |
coll の長さが 0 (§3) |
assert.empty: expected empty, got length 2 ([1, 2]) |
fail |
fail(message) |
(常に失敗) | message |
本モジュールは効果を1 つも持たない(../language-spec.md §17.9)。
両辺・実値の表示は各値の Inspect を用いる。
1. 失敗の伝播
- アサーション失敗はすべて panic (
Error) として起こる。回復可能エラー (Result/{kind, message}) ではない。 std:testのrunの中 (Trial のblock内) で失敗した場合は、runがその Trial の境界で捕捉し FAIL として記録する (test.md §2)。runの外 (REPL への直接入力・hikari runの通常コード等) で失敗した場合は、通常の panic としてトップレベルまで伝播し、診断付きで停止・非ゼロ終了する (language-spec.md §16.1)。
2. ok の引数型
ok(cond)のcondは Bool。非 Bool を渡すこと自体が型不一致 panic になる (assert.okの失敗メッセージではなく、language-spec.md §16 の型 contract 違反)。
3. length / empty の対象
collの長さは言語のメンバー解決 (language-spec.md §3.2) と同じ順で得る:collがオブジェクトでlengthスロットを持てばそれを呼び、なければ受け手の型の組込lengthメソッド (String / Bytes / List / Tuple / Range、std:map/std:set/std:arrayの各コレクション) を呼ぶ。- どちらも持たない値 (Int 等) を渡すこと自体が型不一致 panic (language-spec.md §16 の型 contract 違反)。
lengthの結果が Int でない場合も同様。 length(coll, expected)のexpectedは Int。非 Int は型不一致 panic。- 失敗メッセージには実際の長さと
collのInspectを併記する (上表)。