# assertの概要

assertモジュールの概要.

## 目的

このモジュールの目的は,ユニットテストのように 他の関数の動作を書くにする関数を提供することです. 数値計算アルゴリズムをより簡単にテストできることを目標にした 数値的な問題をテストする一貫性があるツールを使用することに 重点を置いています. 具体的には,2つの浮動小数点数を比較する関数を提供し, ここではその2つの数値が"数値的にほぼ等しい"こと, すなわち相対誤差が小さい,を確認することができます.

## 入門

`assert_checktrue`関数により, 論理値の行列がtrueであることを確認できます. 以下のアサーションは失敗し,エラーを発生します.

    assert_checktrue ( [%t %F] );

`assert_checkequal` 関数により, 2つの変数が等しいことを確認できます. 以下のアサーションは成功し,そのまま実行されます.

    assert_checkequal ( %nan , %nan );

`assert_checkalmostequal`関数により, 計算結果が予測した結果に近いことを確認できます. 以下のスクリプトでは,`computed=1.23456` が `expected=1.23457`に近いが, 最大限達成可能な精度に対して11桁が失われていることを確認します.

    assert_checkalmostequal ( 1.23456 , 1.23457 , 1.e11*%eps );

このモジュールの特徴的な機能は, 全てのアサート関数が同じ出力引数を有することです. この機能により,動作を統一でき,アサーションがうまくいかない場合の エラーの管理がシンプルになります. 例えば,呼び出し手順が以下となる関数`assert_checktrue` を見てみましょう:

    flag = assert_checktrue ( condition )
    flag = assert_checktrue ( condition )
    [flag,errmsg] = assert_checktrue ( condition )

conditionのあるエントリがfalseの場合,

- errmsg出力変数が使用されない場合,エラーが生成されます,

- errmsg出力変数が使用された場合,エラーは生成されません.

この動作の理由はスクリプト内(例:ユニットテスト)および 関数内の両方でアサーションを使用出来ることです. 例えば,典型的なユニットテストにおける以下の命令:

    assert_checktrue ( 1+1==12 );

は予想通りにエラーを生成します. 次に,関数内にアサーションによる確認を挿入する場合を考えてみましょう. アサーションが失敗したケースを管理することを考えます. この場合,呼び出し手順`assert_checktrue ( condition )` はエラーを生成し,実行を中断します. `assert_checktrue`で生成されたエラーをキャッチすることで, これを回避したい場合もありえます. これには`execstr`を使用することが必要で, 以下のようなソースコードとなります.

    function y = myfunction ( x )
        ierr=execstr("assert_checktrue ( x==12 )","errcatch");
        if ( ierr <> 0 ) then
            error("Oups!")
        end
        y=x
    endfunction

この場合,エラー処理が簡単になる呼び出し手順 `[flag,errmsg] = assert_checktrue ( condition )`を 代わりに使用すると良いでしょう.

    function y = myfunction2 ( x )
        [flag,errmsg] = assert_checktrue ( x==12 )
        if ( ~flag ) then
            error("Oups!")
        end
        y=x
    endfunction

## 履歴

5.4.0
関数が導入されました