Newer
Older
libkc / modules / test / src / test_assert.c
Nomura Kei on 22 May 5 KB update
#include <stdio.h>
#include <errno.h>

#include <kc.h>
#include <kc_ut.h>
#include <kc_assert.h>

// プロトタイプ宣言
static void test_assert_handler(const char *msg);
static void test_assert_setup(void);
static void test_assert_teardown(void);
static void test_assert_off(void);
static void test_assert_on(void);

static void test_assert_long(void);
static void test_assert_double(void);
static void test_assert_string(void);
static void test_assert_binary(void);
static void test_assert_null(void);
static void test_assert_true_false(void);

/**
 * assert 単体テストスイート
 */
void suite_assert(void)
{
    KcUt *ut = KcUt_get_instance();
    ut->add(ut, UT_SETUP, "### SETUP (assert) ###", test_assert_setup);
    ut->add(ut, UT_TESTCASE, "assert long", test_assert_long);
    ut->add(ut, UT_TESTCASE, "assert double", test_assert_double);
    ut->add(ut, UT_TESTCASE, "assert string", test_assert_string);
    ut->add(ut, UT_TESTCASE, "assert binary", test_assert_binary);
    ut->add(ut, UT_TESTCASE, "assert null", test_assert_null);
    ut->add(ut, UT_TESTCASE, "assert true/false", test_assert_true_false);
    ut->add(ut, UT_TEARDOWN, "### TEARDOWN (assert) ###", test_assert_teardown);
}

////////////////////////////////////////////////////////////////////////////////
//
// For assert_handler
//

/**
 * assert テスト用ハンドラが実行されたか否かを表します。
 */
static bool test_assert_handler_pass = false;

/**
 * ut.c にて使われているハンドラバックアップ用。
 */
static void (*test_assert_handler_backup)(const char *msg);

/**
 * assert テスト用のハンドラ。
 */
static void test_assert_handler(const char *msg)
{
    UNUSED_VARIABLE(msg);
    test_assert_handler_pass = true;
}

/**
 * assert テストのため、assert_handler を設定します。
 * ※assert にて失敗のテスト実施の際、ut 用のハンドラを使うとテストNGとなるため。
 */
static void test_assert_setup(void)
{
    test_assert_handler_backup = assert_handler;
}

/**
 * assert テストのため、assert_handler を元にもどします。
 */
static void test_assert_teardown(void)
{
    assert_handler = test_assert_handler_backup;
}

/**
 * 単体テストのエラー検出を無効にします。
 */
static void test_assert_off(void)
{
    assert_handler = test_assert_handler;
}

/**
 * 単体テストのエラー検出を有効にします。
 */
static void test_assert_on(void)
{
    assert_handler = test_assert_handler_backup;
}

/**
 * assert long 単体テスト。
 */
static void test_assert_long(void)
{
    test_assert_handler_pass = false;
    test_assert_off();
    assert_equals(1234, 1234); // テスト対象
    test_assert_on();
    assert_false(test_assert_handler_pass);

    test_assert_handler_pass = false;
    test_assert_off();
    assert_equals(1234, 1235); // テスト対象
    test_assert_on();
    assert_true(test_assert_handler_pass);
}

/**
 * assert double 単体テスト。
 */
static void test_assert_double(void)
{
    test_assert_handler_pass = false;
    test_assert_off();
    assert_equals(12.34, 12.34, 0.1); // テスト対象
    test_assert_on();
    assert_false(test_assert_handler_pass);

    test_assert_handler_pass = false;
    test_assert_off();
    assert_equals(12.34, 12.35, 0.1); // テスト対象
    test_assert_on();
    assert_false(test_assert_handler_pass);

    test_assert_handler_pass = false;
    test_assert_off();
    assert_equals(12.34, 13.35, 0.1); // テスト対象
    test_assert_on();
    assert_true(test_assert_handler_pass);
}

/**
 * assert string 単体テスト。
 */
static void test_assert_string(void)
{
    test_assert_handler_pass = false;
    test_assert_off();
    assert_equals("ABC", "ABC"); // テスト対象
    test_assert_on();
    assert_false(test_assert_handler_pass);

    test_assert_handler_pass = false;
    test_assert_off();
    assert_equals("ABC", "DEF"); // テスト対象
    test_assert_on();
    assert_true(test_assert_handler_pass);
}

/**
 * assert binary 単体テスト。
 */
static void test_assert_binary(void)
{
    test_assert_handler_pass = false;
    char v1[] = {'A', 0, 'B', ' ', 'C', 0x81};
    char v2[] = {'A', 0, 'B', ' ', 'C', 0x81};
    char v3[] = {'A', 0, 'B', 0x19, 'C', 0x81};
    test_assert_off();
    assert_equals(v1, v2, 6); // テスト対象
    test_assert_on();
    assert_false(test_assert_handler_pass);

    test_assert_handler_pass = false;
    test_assert_off();
    assert_equals(v1, v3, 6); // テスト対象
    test_assert_on();
    assert_true(test_assert_handler_pass);
}

/**
 * assert null 単体テスト。
 */
static void test_assert_null(void)
{
    const char *ptr = "ABC";
    const char *ptr_null = NULL;

    // not null
    test_assert_handler_pass = false;
    test_assert_off();
    assert_not_null(ptr); // テスト対象
    test_assert_on();
    assert_false(test_assert_handler_pass);

    // null
    test_assert_handler_pass = false;
    test_assert_off();
    assert_null(ptr_null); // テスト対象
    test_assert_on();
    assert_false(test_assert_handler_pass);

    // not null error
    test_assert_handler_pass = false;
    test_assert_off();
    assert_not_null(ptr_null); // テスト対象
    test_assert_on();
    assert_true(test_assert_handler_pass);

    // null error
    test_assert_handler_pass = false;
    test_assert_off();
    assert_null(ptr); // テスト対象
    test_assert_on();
    assert_true(test_assert_handler_pass);
}

/**
 * assert true/false 単体テスト。
 */
static void test_assert_true_false(void)
{
    test_assert_handler_pass = false;
    test_assert_off();
    assert_true(false); // テスト対象
    test_assert_on();
    assert_true(test_assert_handler_pass);

    test_assert_handler_pass = false;
    test_assert_off();
    assert_false(true); // テスト対象
    test_assert_on();
    assert_true(test_assert_handler_pass);

    test_assert_handler_pass = false;
    test_assert_off();
    assert_fail(); // テスト対象
    test_assert_on();
    assert_true(test_assert_handler_pass);
}