#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); }