ソート関数CUnitテストコード
ソート関数用のCUnitテストコードを書いてみたので公開する。
ターゲットは以下のプロトタイプ宣言を持つソート関数。
pArrayが配列,numはその要素数である。
void sort(int *pArray, int num);
試してみると、書けていたと思っていたテストコードもなかなかすべてをパスしない。
#include <stdio.h> #include <CUnit/Cunit.h> #include <CUnit/Automated.h> #include "sort.h" #define ELENUM_OF(array) ((sizeof(array)) / (sizeof((array)[0]))) void (*pSort)(int *, int); /* NULL、要素無し、要素負 */ void testSort0(void) { int aBuf[] = {3, 2, 1}; /* 配列NULL */ pSort(NULL, ELENUM_OF(aBuf)); CU_ASSERT_EQUAL(aBuf[0], 3); CU_ASSERT_EQUAL(aBuf[1], 2); CU_ASSERT_EQUAL(aBuf[2], 1); /* 要素数-1 */ pSort(aBuf, -1); CU_ASSERT_EQUAL(aBuf[0], 3); CU_ASSERT_EQUAL(aBuf[1], 2); CU_ASSERT_EQUAL(aBuf[2], 1); /* 要素数0 */ pSort(aBuf, 0); CU_ASSERT_EQUAL(aBuf[0], 3); CU_ASSERT_EQUAL(aBuf[1], 2); CU_ASSERT_EQUAL(aBuf[2], 1); } /* 要素数1,2,3 */ void testSort1(void) { int aBuf[] = {3, 2, 1}; /* 要素数1 */ pSort(aBuf, 1); CU_ASSERT_EQUAL(aBuf[0], 3); CU_ASSERT_EQUAL(aBuf[1], 2); CU_ASSERT_EQUAL(aBuf[2], 1); /* 要素数2 */ pSort(aBuf, 2); CU_ASSERT_EQUAL(aBuf[0], 2); CU_ASSERT_EQUAL(aBuf[1], 3); CU_ASSERT_EQUAL(aBuf[2], 1); /* 要素数3 */ pSort(aBuf, 3); CU_ASSERT_EQUAL(aBuf[0], 1); CU_ASSERT_EQUAL(aBuf[1], 2); CU_ASSERT_EQUAL(aBuf[2], 3); } /* ソート済み配列 */ void testSort2(void) { int aBuf[] = {0,1,2,3,4,5,6,7,8,9}; pSort(aBuf, ELENUM_OF(aBuf)); CU_ASSERT_EQUAL(aBuf[0], 0); CU_ASSERT_EQUAL(aBuf[1], 1); CU_ASSERT_EQUAL(aBuf[2], 2); CU_ASSERT_EQUAL(aBuf[3], 3); CU_ASSERT_EQUAL(aBuf[4], 4); CU_ASSERT_EQUAL(aBuf[5], 5); CU_ASSERT_EQUAL(aBuf[6], 6); CU_ASSERT_EQUAL(aBuf[7], 7); CU_ASSERT_EQUAL(aBuf[8], 8); CU_ASSERT_EQUAL(aBuf[9], 9); } /* 稠密配列 */ void testSort3(void) { int aBuf[] = {8,3,2,1,7,5,9,4,0,6}; pSort(aBuf, ELENUM_OF(aBuf)); CU_ASSERT_EQUAL(aBuf[0], 0); CU_ASSERT_EQUAL(aBuf[1], 1); CU_ASSERT_EQUAL(aBuf[2], 2); CU_ASSERT_EQUAL(aBuf[3], 3); CU_ASSERT_EQUAL(aBuf[4], 4); CU_ASSERT_EQUAL(aBuf[5], 5); CU_ASSERT_EQUAL(aBuf[6], 6); CU_ASSERT_EQUAL(aBuf[7], 7); CU_ASSERT_EQUAL(aBuf[8], 8); CU_ASSERT_EQUAL(aBuf[9], 9); } /* 離散的配列 */ void testSort4(void) { int aBuf[] = {0x82,0x123,0x1000,0x24,-1,0x47, 0x9ca,0x51,0x9,-4,0x0,0x916,-129}; pSort(aBuf, ELENUM_OF(aBuf)); CU_ASSERT_EQUAL(aBuf[0], -129); CU_ASSERT_EQUAL(aBuf[1], -4); CU_ASSERT_EQUAL(aBuf[2], -1); CU_ASSERT_EQUAL(aBuf[3], 0x0); CU_ASSERT_EQUAL(aBuf[4], 0x9); CU_ASSERT_EQUAL(aBuf[5], 0x24); CU_ASSERT_EQUAL(aBuf[6], 0x47); CU_ASSERT_EQUAL(aBuf[7], 0x51); CU_ASSERT_EQUAL(aBuf[8], 0x82); CU_ASSERT_EQUAL(aBuf[9], 0x123); CU_ASSERT_EQUAL(aBuf[10], 0x916); CU_ASSERT_EQUAL(aBuf[11], 0x9ca); CU_ASSERT_EQUAL(aBuf[12], 0x1000); } int main(void) { CU_pSuite suiteSort; /* レジストリ初期化 */ CU_initialize_registry(); /* テストスート追加 */ suiteSort = CU_add_suite("Sort", NULL, NULL); /* テスト追加 */ CU_add_test(suiteSort, "NULL, no element", testSort0); CU_add_test(suiteSort, "just 1,2,3 element", testSort1); CU_add_test(suiteSort, "ordered array", testSort2); CU_add_test(suiteSort, "normal sort", testSort3); CU_add_test(suiteSort, "discrete sort", testSort4); /* テスト実施 */ pSort = heapSort; CU_automated_run_tests(); /* 出力ファイル名設定 */ CU_set_output_filename("Sort"); /* ファイル出力 */ CU_list_tests_to_file(); /* レジストリクリア */ CU_cleanup_registry(); return 0; }