Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Assert

💡 お知らせ: このドキュメントはAIによって翻訳されています。表現に違和感がある場合は、原文(英語)を参照するか、翻訳にご協力ください。

Flix は、実行時のアサーション(Assertion)のためのライブラリエフェクトとして Assert を提供しています。Assert エフェクトにはデフォルトハンドラがあるため、main で明示的に runWithIO を呼び出す必要はありません。

基本的なアサーション

Assert モジュールは、いくつかのアサーション関数を提供しています。

mod Assert {
    /// `cond` が `true` であることをアサートします。
    def assertTrue(cond: Bool): Unit \ Assert

    /// `cond` が `false` であることをアサートします。
    def assertFalse(cond: Bool): Unit \ Assert

    /// `expected` が `actual` と等しいことをアサートします。
    def assertEq(expected: a, actual: a): Unit \ Assert with Eq[a], ToString[a]

    /// `unexpected` が `actual` と等しくないことをアサートします。
    def assertNeq(unexpected: a, actual: a): Unit \ Assert with Eq[a], ToString[a]

    /// `o` が `Some` であることをアサートします。
    def assertSome(o: Option[a]): Unit \ Assert

    /// `o` が `None` であることをアサートします。
    def assertNone(o: Option[a]): Unit \ Assert with ToString[a]

    /// `r` が `Ok` であることをアサートします。
    def assertOk(r: Result[e, a]): Unit \ Assert with ToString[e]

    /// `r` が `Err` であることをアサートします。
    def assertErr(r: Result[e, a]): Unit \ Assert with ToString[a]

    /// `ma` が空であることをアサートします。
    def assertEmpty(ma: m[a]): Unit \ Assert with Foldable[m]

    /// `ma` が空でないことをアサートします。
    def assertNonEmpty(ma: m[a]): Unit \ Assert with Foldable[m]

    /// 指定されたメッセージ `msg` とともに無条件に成功します。
    def success(msg: String): Unit \ Assert

    /// 指定されたメッセージ `msg` とともに無条件に失敗します。
    def fail(msg: String): Unit \ Assert
}

デフォルトハンドラで Assert を使う

デフォルトハンドラは失敗時に AssertionError をスローするため、明示的なハンドラは必要ありません。

use Assert.{assertTrue, assertFalse, assertEq, assertNeq}

def main(): Unit \ { Assert, IO } =
    assertTrue(1 + 1 == 2);
    assertFalse(1 > 2);
    assertEq(expected = 4, 2 + 2);
    assertNeq(unexpected = 0, 1 + 1);
    println("All assertions passed!")

失敗を標準出力に表示する

runWithStdOut ハンドラは、アサーションの失敗を標準出力に表示しつつ、実行を継続させます。

use Assert.assertEq

def main(): Unit \ IO =
    run {
        assertEq(expected = 4, 2 + 2);
        assertEq(expected = 10, 3 + 3);
        println("Execution continued after failing assertion.")
    } with Assert.runWithStdOut

Logger で失敗をログに記録する

runWithLogger ハンドラは、アサーションの失敗を Logger エフェクトに送ります。

use Assert.assertEq

def main(): Unit \ IO =
    run {
        assertEq(expected = 42, 21 + 21);
        assertEq(expected = 10, 3 + 3);
        println("Execution continued after failing assertion.")
    } with Assert.runWithLogger
      with Logger.runWithIO