NEPLg2 Standard Library - test - test
Web Playground
Web Playground

test

標準ひょうじゅんライブラリよう簡易かんいテスト支援しえん

目的もくてき

  • stdlib と tutorials で共通に使う assert_* / check_* / finish_checks を提供し、失敗しっぱいを trap ではなく Result<(),str> として表現ひょうげんします。
  • 単発たんぱつ検査けんさと、複数ふくすう検査けんさ継続けいぞく実行じっこうする collectable な検査けんさ両方りょうほうおなじモジュールであつかいます。

実装じっそう

  • 単発たんぱつassert_*対応たいおうする check_*結果けっかけ、Err のときだけ FAIL: 形式けいしき表示ひょうじおこなったうえで Result::Errかえします。
  • 集約しゅうやく検査けんさVec<Result<(),str>>保持ほじし、finish_checks表示ひょうじせずに Result<(),str>たたみます。
  • 表示ひょうじ必要ひつような test case は checks_print_machine / checks_print_human明示的めいじてきびます。

注意ちゅうい

  • 失敗しっぱい最終さいしゅう判定はんていresult_exit_codechecks_exit_code のような helper で i32 にとし、runner がわ比較ひかくする前提ぜんていです。
  • 表示ひょうじ#target std のときだけおこないます。std 以外の target では Result だけがかえります。
  • reboot は「明示的めいじてきに print する」方針ほうしんとし、checks_exit_code は stdout をよごしません。
  • doctest は使つかかた保証ほしょうが目的であり、境界条件や回帰確認は tests/stdlib/* 側で行います。

計算量けいさんりょう

  • assert_*check_* の単体判定は O(1) か、比較対象の長さに応じた O(n) です。
  • 集約 API は summary 文字列もじれつ構築こうちくふくむため、finish_checks 全体ぜんたいでは O(n^2) になりえます。

test_str_eq

文字列もじれつひとしいか判定はんていする

目的もくてき

  • a と b の内容が同じなら true を返します。

実装じっそう

  • 長さ一致を確認し、バイト単位で比較します。

注意ちゅうい

  • UTF-8 のバイト列として比較します。

計算量けいさんりょう

  • 時間じかん: O(n)
  • 空間くうかん: O(n)(再帰呼び出しぶん)

test_str_eq_loop

文字列もじれつ比較ひかく内部ないぶループ

目的もくてき

  • i を進めながら各バイトを比較します。

実装じっそう

  • 一致なら再帰、差異があれば false を返します。

注意ちゅうい

  • 呼び出し側で長さ一致を確認している前提です。

計算量けいさんりょう

  • 時間じかん: O(n)
  • 空間くうかん: O(n)(再帰呼び出しぶん)

test_print_fail

失敗しっぱいメッセージを表示ひょうじする

目的もくてき

  • msg を赤色で標準出力へ表示します。

実装じっそう

  • ANSI 赤色コードで色付けして出力します。

注意ちゅうい

  • #target std表示ひょうじ helper です。
  • 端末が ANSI に対応している必要があります。

計算量けいさんりょう

  • 時間じかん: O(n)
  • 空間くうかん: O(n)

test_checked

成功せいこうログを表示ひょうじする

目的もくてき

  • "Checked " きの成功せいこうログを色付いろづきで表示ひょうじし、Result::Ok ()かえします。

実装じっそう

  • 文字列を連結し、ansi_green で出力します。

注意ちゅうい

  • #target std表示ひょうじ helper です。
  • 端末が ANSI に対応している必要があります。

計算量けいさんりょう

  • 時間じかん: O(n)
  • 空間くうかん: O(n)

test_fail

失敗しっぱいメッセージをして Result::Errかえ

目的もくてき

  • msg を FAIL: 形式けいしき表示ひょうじし、安全あんぜんResult::Err として失敗しっぱいかえします。

実装じっそう

  • #target std では test_print_failび、そのあと Result::Err msgかえします。

注意ちゅうい

  • この helper 自体じたいは trap しません。最終さいしゅう判定はんていがわおこないます。

計算量けいさんりょう

  • 時間じかん: O(n)
  • 空間くうかん: O(n)

checks_new

集約しゅうやく検査けんされつからベクタをつく

目的もくてき

  • finish_checks に渡す Vec<Result<(),str>> を空の状態で作ります。
  • push の型引数を毎回書かずに collectable な検査列を組み立てる入口として使います。

実装じっそう

  • new<Result<(),str>> を呼び、検査結果専用の空ベクタを返します。

注意ちゅうい

  • 返り値は Result<(),str> 専用です。
  • 以後の追加は checks_push を使うと型引数を書かずに済みます。

計算量けいさんりょう

  • 時間じかん: O(1)
  • 空間くうかん: O(1)

使い方つかいかた

TEST
#entry main
#target std
#import "std/test" as *
fn main <()*>i32> ():
    let checks <Vec<Result<(),str>>> checks_new;
    checks_exit_code checks

checks_push

集約しゅうやく検査けんされつに 1 けん追加ついかする

目的もくてき

  • Result<(),str>Vec<Result<(),str>> に追加し、pipe で連結しやすい形を提供します。

実装じっそう

  • vec_push<Result<(),str>> を固定して呼び、push の型推論詳細を利用者へ露出させません。

注意ちゅうい

  • 検査そのものは check_* 側で評価済みであり、この関数は格納しかしません。
  • 返り値は同じベクタなので、|> checks_push ... |> checks_push ... と連結できます。

計算量けいさんりょう

  • 時間じかん: 償却 O(1)
  • 最悪さいあく時間じかん: O(n)(再確保が起きる場合)
  • 空間くうかん: 償却 O(1)

使い方つかいかた

TEST
#entry main
#target std
#import "std/test" as *
fn main <()*>i32> ():
    let checks <Vec<Result<(),str>>>:
        checks_new
        |> checks_push check true
        |> checks_push check true
    checks_exit_code checks

check

条件じょうけんResult<(),str> としてかえ

目的もくてき

  • assert と同じ条件判定を行い、その場で停止せず Result<(),str> として返します。
  • 複数の検査を Vec<Result<(),str>> に集約して最後にまとめて判定したいときに使います。

実装じっそう

  • ok が true なら Ok(())、false なら固定メッセージ付きの Err を返します。

注意ちゅうい

  • 失敗時に詳細な説明が必要なら、この関数ではなく check_eq_i32check_str_eq のような専用版を使ってください。
  • この関数自体は何も表示しません。表示と最終失敗判定は finish_checks が担当します。

計算量けいさんりょう

  • 時間じかん: O(1)
  • 空間くうかん: O(1)

使い方つかいかた

TEST
#entry main
#target std
#import "std/test" as *
fn main <()*>i32> ():
    let checks <Vec<Result<(),str>>>:
        checks_new
        |> checks_push check true
        |> checks_push check true
    checks_exit_code checks

check_eq_i32

i32 の等値とうち検査けんさResult<(),str> としてかえ

目的もくてき

  • expectedactual の比較結果を即時停止ではなく値として返します。

実装じっそう

  • 等しければ Ok(())、異なれば expectedactual を文字列化したメッセージ付き Err を返します。

注意ちゅうい

  • assert_eq_i32 はこの関数の結果を受けてただちに失敗終了する薄いラッパです。
  • 失敗を複数件まとめたいときはこの関数を Vec<Result<(),str>> に積んでください。

計算量けいさんりょう

  • 時間じかん: O(1)
  • 空間くうかん: O(1)

使い方つかいかた

TEST
#entry main
#target std
#import "std/test" as *
fn main <()*>i32> ():
    let checks <Vec<Result<(),str>>>:
        checks_new
        |> checks_push check_eq_i32 10 add 4 6
        |> checks_push check_eq_i32 3 sub 8 5
    checks_exit_code checks

check_ne

bool がひとしくないことを Result<(),str> としてかえ

目的もくてき

  • ab が同じなら詳細メッセージ付き Err、違えば Ok(()) を返します。

実装じっそう

  • bool の組み合わせを分岐し、一致時だけ値を文字列化して失敗メッセージを組み立てます。

注意ちゅうい

  • bool 専用です。
  • true/false のどちらで一致したかを失敗メッセージに含めます。

計算量けいさんりょう

  • 時間じかん: O(1)
  • 空間くうかん: O(1)

check_str_eq

文字列もじれつ等値とうち検査けんさResult<(),str> としてかえ

目的もくてき

  • 文字列比較の結果を、直ちに停止せずに後段へ渡せる形で返します。

実装じっそう

  • test_str_eq で UTF-8 バイト列を比較し、不一致時だけ詳細メッセージを組み立てます。

注意ちゅうい

  • 比較単位は Unicode の文字数ではなく UTF-8 のバイト列です。
  • 長い文字列では、失敗メッセージ自体の生成にも連結コストがかかります。

計算量けいさんりょう

  • 時間じかん: O(n)
  • 空間くうかん: O(n)(失敗時メッセージ生成ぶん)

使い方つかいかた

TEST
#entry main
#target std
#import "std/test" as *
fn main <()*>i32> ():
    let checks <Vec<Result<(),str>>>:
        checks_new
        |> checks_push check_str_eq "hello" concat "he" "llo"
    checks_exit_code checks

check_ok_i32

Result<i32,i32>Ok であることをあたいとしてかえ

目的もくてき

  • Result::Ok を期待する検査を集約可能な Result<(),str> に変換します。

実装じっそう

  • matchOk/Err を分け、Err の場合だけ失敗メッセージを返します。

注意ちゅうい

  • Result<i32,i32> 専用です。
  • Ok の中身は返さず、成功・失敗だけを返します。

計算量けいさんりょう

  • 時間じかん: O(1)
  • 空間くうかん: O(1)

check_err_i32

Result<i32,i32>Err であることをあたいとしてかえ

目的もくてき

  • Result::Err を期待する検査を集約可能な Result<(),str> に変換します。

実装じっそう

  • matchOk/Err を分け、Ok の場合だけ失敗メッセージを返します。

注意ちゅうい

  • Result<i32,i32> 専用です。
  • Err の中身は返さず、成功・失敗だけを返します。

計算量けいさんりょう

  • 時間じかん: O(1)
  • 空間くうかん: O(1)

check_status_str

機械きかいけ summary よう状態じょうたい文字列もじれつかえ

目的もくてき

  • Result<(),str>ok / err <msg>安定あんていした summary へん変換へんかんし、machine がわでも追跡ついせきしやすくします。

実装じっそう

  • Okokかえし、Err msgerr と msg を連結れんけつしてかえします。

注意ちゅうい

  • checks_summary内部ないぶ helper です。
  • msg をそのまま summary にふくめるため、非常ひじょうなが失敗しっぱいぶんは summary ぎょうながくなります。

計算量けいさんりょう

  • 時間じかん: O(1)
  • 空間くうかん: O(1)

checks_has_err_loop

Errふくむかをじゅん調しらべる内部ないぶ helper

目的もくてき

  • 集約しゅうやく検査列けんされつ失敗しっぱいがあるかを線形せんけい走査そうさ判定はんていします。

実装じっそう

  • Vec の backing store を 1 かいだけし、raw data を添字そえじ走査そうさします。
  • 最初さいしょErrつかった時点じてんで true をかえします。

注意ちゅうい

  • 内部ないぶ helper です。
  • checks_dataVec<Result<(),str>> の data pointer、nながさです。

計算量けいさんりょう

  • 時間じかん: O(n)
  • 空間くうかん: O(n)(再帰さいき

checks_has_err

集約しゅうやく検査列けんされつErrふくまれるか判定はんていする

目的もくてき

  • 最終さいしゅう失敗しっぱい判定はんていまえに、すくなくとも 1 けん失敗しっぱいがあるかを調しらべます。

実装じっそう

  • Vec<Result<(),str>> を temporary memory に保存ほぞんし、長さと data pointer を 1 かいだけして checks_has_err_loopわたします。

注意ちゅうい

  • 失敗しっぱい詳細しょうさいかえしません。詳細しょうさい表示ひょうじには finish_checks使つかってください。

計算量けいさんりょう

  • 時間じかん: O(n)
  • 空間くうかん: O(n)(再帰さいき

checks_summary_loop

[ok,err <msg>,...] 形式けいしき要約ようやくつく内部ないぶ helper

目的もくてき

  • 集約しゅうやく検査列けんされつを、okerr <msg>ならぶ summary 文字列もじれつ変換へんかんします。

実装じっそう

  • Vec の raw data を先頭せんとうからじゅん走査そうさし、check_status_str結果けっか必要ひつよう区切くぎりとともに連結れんけつします。

注意ちゅうい

  • 失敗しっぱい件数けんすうだけでなく、summary ぎょうだけでかく失敗しっぱい理由りゆうまでいたい場面ばめん想定そうていした helper です。

計算量けいさんりょう

  • 時間じかん: O(n^2)(文字列もじれつ連結れんけつかえすため)
  • 空間くうかん: O(n)

checks_summary

集約しゅうやく検査列けんされつ[ok,err <msg>,...] 形式けいしき整形せいけいする

目的もくてき

  • 複数ふくすう検査けんさ結果けっか安定あんていした 1 ぎょう文字列表現もじれつひょうげんたたみ、runner や log がわあつかいやすくします。

実装じっそう

  • Vec<Result<(),str>> を temporary memory に保存ほぞんし、[ からはじめて checks_summary_loop連結れんけつします。

注意ちゅうい

  • これは machine / log けの安定あんてい表現ひょうげんです。人間にんげんけの色付いろづ表示ひょうじchecks_print_human使つかいます。

計算量けいさんりょう

  • 時間じかん: O(n^2)(文字列もじれつ連結れんけつかえすため)
  • 空間くうかん: O(n)

checks_print_human_line

1 けんぶんの test 結果けっか人間にんげんけに色付いろづきで表示ひょうじする

目的もくてき

  • [index] ok または [index] err <msg>かたちで、1 けん検査けんさ結果けっかやすく表示ひょうじします。

実装じっそう

  • 添字そえじ部分ぶぶんは灰色、ok は緑、err <msg> は赤で表示ひょうじします。

注意ちゅうい

  • 標準ひょうじゅん出力しゅつりょくへの表示ひょうじ#target std のときだけおこないます。

計算量けいさんりょう

  • 時間じかん: O(m)(m は msg のながさ)
  • 空間くうかん: O(m)

checks_print_human_loop

Vec<Result<(),str>>じゅん色付いろづ表示ひょうじする内部ないぶ helper

目的もくてき

  • 集約しゅうやく検査列けんされつ全要素ぜんようそ人間にんげんけにならべて表示ひょうじします。

実装じっそう

  • raw data をじゅん走査そうさし、checks_print_human_line へ 1 けんずつわたします。

注意ちゅうい

  • 成功せいこう case でも失敗しっぱい case でも全件ぜんけん表示ひょうじします。

計算量けいさんりょう

  • 時間じかん: O(n + s)(s はすべての msg ながさの合計ごうけい
  • 空間くうかん: O(n)(再帰さいき

checks_print_human

Vec<Result<(),str>>人間にんげんけに色付いろづ表示ひょうじする

目的もくてき

  • Vec<Result<(),str>>[index] ok / err <msg>かたち全件ぜんけん表示ひょうじし、人間にんげん成功せいこう失敗しっぱい即座そくざめるようにします。
  • 表示ひょうじおなVec<Result<(),str>>かえし、そのあとchecks_exit_code追加ついか helper と合成ごうせいできるようにします。

実装じっそう

  • checks を temporary memory に保存ほぞんし、raw data を checks_print_human_loopわたしたあと、おなVec<Result<(),str>>もどしてかえします。

注意ちゅうい

  • #target std 専用せんようです。
  • machine けの安定あんてい表現ひょうげん必要ひつようなら checks_summary使つかいます。

計算量けいさんりょう

  • 時間じかん: O(n + s)(s はすべての msg ながさの合計ごうけい
  • 空間くうかん: O(n)(再帰さいき

checks_print_machine

Vec<Result<(),str>> を machine け summary として表示ひょうじする

目的もくてき

  • test case がわで summary だけを stdout へ明示的めいじてきしたいときに使つかいます。
  • 表示ひょうじおなVec<Result<(),str>>かえし、そのあと処理しょりつなげられるようにします。

実装じっそう

  • checks を temporary memory に保存ほぞんし、checks_summary計算けいさんして失敗しっぱいがあるときは FAIL: 付きつき、なければ Checked 付きつきで 1 ぎょう表示ひょうじします。
  • 最後さいごおなVec<Result<(),str>>もどしてかえします。

注意ちゅうい

  • finish_checkschecks_exit_code自動じどう表示ひょうじしません。stdout が必要ひつような test case ではこの helper を明示的めいじてきんでください。
  • #target std 専用せんようです。

計算量けいさんりょう

  • 時間じかん: O(n^2)(checks_summary構築こうちくふくむ)
  • 空間くうかん: O(n)

checks_print_report

test 終了時しゅうりょうじに summary と human 一覧いちらんまとめてまとめて表示ひょうじする

目的もくてき

  • checks_push ちゅうにはなにも print せず、test 本体ほんたい末尾まつびで 1 かいだけ明示的めいじてき結果けっかしたい場合ばあい標準ひょうじゅん helper を提供ていきょうします。

実装じっそう

  • checks_print_machineあとchecks_print_humanび、おなVec<Result<(),str>>かえします。

注意ちゅうい

  • checks_exit_code とはべつです。stdout が必要ひつような test case だけ、return 直前ちょくぜんでこの helper をんでください。
  • #target std 専用せんようです。

計算量けいさんりょう

  • checks_print_machinechecks_print_human合計ごうけいじゅんじます。

finish_checks

複数ふくすう検査けんさをまとめて Result<(),str>たた

目的もくてき

  • Vec<Result<(),str>> として集約しゅうやくした検査けんさ最後さいごにまとめて評価ひょうかします。
  • 途中とちゅう検査けんさ継続けいぞくしつつ、最後さいご表示ひょうじなしで成功せいこう / 失敗しっぱいあたいとしてられます。

実装じっそう

  • checks_summary で machine け summary をつくります。
  • 失敗しっぱいが 1 けんでもあれば Result::Err summary、なければ Result::Ok ()かえします。
  • move model にわせ、入力にゅうりょくVec<Result<(),str>> は 1 かいだけ memory に保存ほぞんしてから helper へわたします。

注意ちゅうい

  • 想定そうてい用途ようと<Vec<Result<(),str>>> new |> push check_* ... のような段階的だんかいてき収集しゅうしゅうです。
  • stdout へしたい場合ばあいchecks_print_report などを test case がわ明示的めいじてきんでください。
  • runner 連携れんけい終了しゅうりょう code が必要ひつよう場合ばあいchecks_exit_code使つかいます。

計算量けいさんりょう

  • 時間じかん: O(n^2)(summary 文字列もじれつ構築こうちくふくむ)
  • 空間くうかん: O(n)

使い方つかいかた

TEST
#entry main
#target std
#import "std/test" as *
#import "core/math" as *
fn main <()*>i32> ():
    let checks <Vec<Result<(),str>>>:
        checks_new
        |> checks_push check_eq_i32 3 add 1 2
        |> checks_push check_str_eq "ok" "ok"
        |> checks_push check_ok_i32 Result::Ok 7
    checks_exit_code checks

result_exit_code

Result<(),str> を i32 の終了しゅうりょう code へ変換へんかんする

目的もくてき

  • 安全あんぜんResult<(),str> 表現ひょうげんを、runner が比較ひかくできる i32 にとします。

実装じっそう

  • Ok なら 0、Err なら 1 をかえします。

注意ちゅうい

  • 詳細しょうさい失敗しっぱい内容ないよう表示ひょうじtest_failchecks_print_* helper が担当たんとうします。

計算量けいさんりょう

  • 時間じかん: O(1)
  • 空間くうかん: O(1)

checks_exit_code

集約しゅうやく検査けんさを i32 の終了しゅうりょう code へ変換へんかんする

目的もくてき

  • finish_checks結果けっかをそのまま mainかえあたいつなげられるようにします。

実装じっそう

  • finish_checksんでから result_exit_codeわたします。

注意ちゅうい

  • stdout をともな表示ひょうじおこないません。必要なら test case がわchecks_print_machine / checks_print_humanんでください。

計算量けいさんりょう

  • finish_checksじゅんじます。

assert

条件じょうけんが false のとき失敗しっぱいする

目的もくてき

  • ok が false なら FAIL: 表示ひょうじつきの Result::Errかえします。

実装じっそう

  • if で分岐し、false なら test_fail を呼びます。

注意ちゅうい

  • ok は bool である必要があります。

計算量けいさんりょう

  • 時間じかん: O(1)
  • 空間くうかん: O(1)

使い方つかいかた

TEST
#entry main
#target std
#import "std/test" as *
fn main <()*>i32> ():
    let checks <Vec<Result<(),str>>>:
        checks_new
        |> checks_push assert true
        |> checks_push assert eq 3 add 1 2
    checks_exit_code checks

assert_eq_i32

i32 の等値とうち検証けんしょうする

目的もくてき

  • expected と actual が等しいことを保証します。

実装じっそう

  • eq の結果が false なら詳細メッセージを作って test_fail します。

注意ちゅうい

  • i32 専用です。

計算量けいさんりょう

  • 時間じかん: O(1)
  • 空間くうかん: O(1)

使い方つかいかた

TEST
#entry main
#target std
#import "std/test" as *
#import "core/math" as *
fn main <()*>i32> ():
    let checks <Vec<Result<(),str>>>:
        checks_new
        |> checks_push assert_eq_i32 6 add 1 5
        |> checks_push assert_eq_i32 3 sub 10 7
    checks_exit_code checks

assert_ne

bool がひとしくないことを検証けんしょうする

目的もくてき

  • a と b が同じなら詳細メッセージを作って test_fail します。

実装じっそう

  • a の値で分岐し、b との一致を確認します。

注意ちゅうい

  • bool 専用です。

計算量けいさんりょう

  • 時間じかん: O(1)
  • 空間くうかん: O(1)

使い方つかいかた

TEST
#entry main
#target std
#import "std/test" as *
fn main <()*>i32> ():
    let checks <Vec<Result<(),str>>>:
        checks_new
        |> checks_push assert_ne true false
        |> checks_push assert_ne false true
    checks_exit_code checks

assert_str_eq

文字列もじれつひとしいことを検証けんしょうする

目的もくてき

  • expected と actual が同じであることを保証します。

実装じっそう

  • test_str_eq で比較し、false なら詳細メッセージを作って test_fail します。

注意ちゅうい

  • UTF-8 のバイト列として比較します。

計算量けいさんりょう

  • 時間じかん: O(n)
  • 空間くうかん: O(n)

使い方つかいかた

TEST
#entry main
#target std
#import "std/test" as *
#import "alloc/string" as *
fn main <()*>i32> ():
    let checks <Vec<Result<(),str>>>:
        checks_new
        |> checks_push assert_str_eq "prefix-suffix" concat "prefix-" "suffix"
        |> checks_push assert_str_eq "true" from_bool true
    checks_exit_code checks

assert_ok_i32

ResultOk であることを検証けんしょうする

目的もくてき

  • Result::Ok を受け付け、Err なら詳細メッセージを作って test_fail します。

実装じっそう

  • match で Ok/Err を分岐します。

注意ちゅうい

  • Result<i32,i32> 専用です。

計算量けいさんりょう

  • 時間じかん: O(1)
  • 空間くうかん: O(1)

使い方つかいかた

TEST
#entry main
#target std
#import "std/test" as *
#import "core/result" as *
fn main <()*>i32> ():
    result_exit_code assert_ok_i32 Result<i32,i32>::Ok 42

assert_err_i32

ResultErr であることを検証けんしょうする

目的もくてき

  • Result::Err を受け付け、Ok なら詳細メッセージを作って test_fail します。

実装じっそう

  • match で Ok/Err を分岐します。

注意ちゅうい

  • Result<i32,i32> 専用です。

計算量けいさんりょう

  • 時間じかん: O(1)
  • 空間くうかん: O(1)

使い方つかいかた

TEST
#entry main
#target std
#import "std/test" as *
#import "core/result" as *
fn main <()*>i32> ():
    result_exit_code assert_err_i32 Result<i32,i32>::Err 7