ソート関数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;
}