📄 curses.c
字号:
--pPad->uiPadRow;
(*parent_refresh)();
}
break;
case KEY_DOWN:
if (pPad->uiRows - 1 > pPad->uiPadRow + pPad->uiWinRows) {
++pPad->uiPadRow;
(*parent_refresh)();
}
break;
case KEY_LEFT:
if (pPad->uiPadCol) {
--pPad->uiPadCol;
(*parent_refresh)();
}
break;
case KEY_RIGHT:
if (details_pad.uiColumns - 1 > details_pad.uiPadCol + details_pad.uiWinColumns) {
++pPad->uiPadCol;
(*parent_refresh)();
}
break;
default:
break;
}
}
/*------------------------------------------------------------------------*/
/** Create a window having specified parent and dimensions.
* @param pPad Pointer to the new window.
* @param pParent Parent window.
* @param uiRows Number of rows for new window.
* @param uiCols Number of columnss for new window.
*/
static bool create_pad(APPPAD* pPad, WINDOW* pParent, unsigned int uiRows,
unsigned int uiCols)
{
bool bStatus = false;
assert(pParent);
if (pPad->pPad) {
delwin(pPad->pPad);
}
if (NULL != pPad && NULL == (pPad->pPad = newpad(uiRows, uiCols))) {
goto newpad_fail;
}
pPad->uiRows = uiRows;
pPad->uiColumns = uiCols;
pPad->uiPadRow = 0;
pPad->uiPadCol = 0;
pPad->uiWinLeft = application_windows.pDetailsWin->_begx + 1;
pPad->uiWinTop = application_windows.pDetailsWin->_begy + 1;
pPad->uiWinColumns = application_windows.pDetailsWin->_maxx - 2;
pPad->uiWinRows = application_windows.pDetailsWin->_maxy - 2;
bStatus = true;
newpad_fail:
return bStatus;
}
/*------------------------------------------------------------------------*/
/** Print a list of registered suites in the detail window.
* @param pRegistry The CU_pTestRegistry to query (non-NULL).
*/
static void list_suites(CU_pTestRegistry pRegistry)
{
CU_pSuite pCurSuite = NULL;
int i;
if (NULL == pRegistry) {
pRegistry = CU_get_registry();
}
assert(pRegistry);
if (!create_pad(&details_pad, application_windows.pDetailsWin,
pRegistry->uiNumberOfSuites == 0 ? 1 : pRegistry->uiNumberOfSuites + 4, 256)) {
return;
}
if (0 == pRegistry->uiNumberOfSuites) {
mvwprintw(details_pad.pPad, 0, 0, "%s", "No test suites defined.");
refresh_details_window();
return;
}
assert(pRegistry->pSuite);
mvwprintw(details_pad.pPad, 0, 0, "%s", " Suite Name Init? Cleanup? # Tests");
for (i = 0, pCurSuite = pRegistry->pSuite; pCurSuite; pCurSuite = pCurSuite->pNext, i++) {
char szTemp[256];
snprintf(szTemp, sizeof(szTemp), "%3d. %-34.33s %3s %3s %3d",
i + 1,
pCurSuite->pName,
pCurSuite->pInitializeFunc ? "YES" : "NO",
pCurSuite->pCleanupFunc ? "YES" : "NO",
pCurSuite->uiNumberOfTests);
mvwprintw(details_pad.pPad, i + 2, 0, "%s", szTemp);
}
mvwprintw(details_pad.pPad, i + 2, 0, "%s", "------------------------------------------------------------------");
mvwprintw(details_pad.pPad, i + 3, 0, "Total Number of Test Suites : %-d", pRegistry->uiNumberOfSuites);
refresh_details_window();
}
/*------------------------------------------------------------------------*/
/** Print a list of tests contained in a specified suite
* in the detail window.
* @param pSuite The suite to query (non-NULL).
*/
static void list_tests(CU_pSuite pSuite)
{
CU_pTest pCurTest = NULL;
int i;
assert(pSuite);
if (!create_pad(&details_pad, application_windows.pDetailsWin,
pSuite->uiNumberOfTests == 0 ? 1 : pSuite->uiNumberOfTests + 4, 256)) {
return;
}
if (0 == pSuite->uiNumberOfTests) {
mvwprintw(details_pad.pPad, 0, 0, "Suite %s contains no tests.", pSuite->pName);
refresh_details_window();
return;
}
assert(pSuite->pTest);
mvwprintw(details_pad.pPad, 0, 0, " Tests in suite %s", pSuite->pName);
for (i = 0, pCurTest = pSuite->pTest; pCurTest; pCurTest = pCurTest->pNext, i++) {
char szTemp[256];
snprintf(szTemp, sizeof(szTemp), "%3d. %s", i + 1, pCurTest->pName);
mvwprintw(details_pad.pPad, i + 2, 0, "%s", szTemp);
}
mvwprintw(details_pad.pPad, i + 2, 0, "%s", "---------------------------------------------");
mvwprintw(details_pad.pPad, i + 3, 0, "Total Number of Tests : %-d", pSuite->uiNumberOfTests);
refresh_details_window();
}
/*------------------------------------------------------------------------*/
/** Display the record of test failures in the detail window. */
static void show_failures(void)
{
int i;
CU_pFailureRecord pFailure = CU_get_failure_list();
unsigned int nFailures = CU_get_number_of_failures();
if (!create_pad(&details_pad, application_windows.pDetailsWin,
nFailures == 0 ? 1 : nFailures + 5, 256)) {
return;
}
if (0 == nFailures) {
mvwprintw(details_pad.pPad, 0, 0, "%s", "No Failures.");
refresh_details_window();
return;
}
assert(pFailure);
mvwprintw(details_pad.pPad, 1, 0, "%s", " src_file:line# : (suite:test) : failure_condition");
for (i = 0 ; pFailure ; pFailure = pFailure->pNext, i++) {
char szTemp[256];
snprintf(szTemp, 256, "%d. %s:%d : (%s : %s) : %s", i + 1,
pFailure->strFileName ? pFailure->strFileName : "",
pFailure->uiLineNumber,
pFailure->pSuite ? pFailure->pSuite->pName : "",
pFailure->pTest ? pFailure->pTest->pName : "",
pFailure->strCondition ? pFailure->strCondition : "");
mvwprintw(details_pad.pPad, i + 3, 0, "%s", szTemp);
}
mvwprintw(details_pad.pPad, i + 3, 0, "%s", "=============================================");
mvwprintw(details_pad.pPad, i + 4, 0, "Total Number of Failures : %-d", nFailures);
refresh_details_window();
}
/*------------------------------------------------------------------------*/
/** Run all tests within the curses interface.
* The test registry is changed to the specified registry
* before running the tests, and reset to the original
* registry when done.
* @param pRegistry The CU_pTestRegistry containing the tests
* to be run (non-NULL).
* @return An error code indicating the error status
* during the test run.
*/
static CU_ErrorCode curses_run_all_tests(CU_pTestRegistry pRegistry)
{
CU_pTestRegistry pOldRegistry = NULL;
CU_ErrorCode result;
assert(pRegistry);
reset_run_parameters();
f_uiTotalTests = pRegistry->uiNumberOfTests;
f_uiTotalSuites = pRegistry->uiNumberOfSuites;
if (NULL != pRegistry) {
pOldRegistry = CU_set_registry(pRegistry);
}
result = CU_run_all_tests();
if (NULL != pOldRegistry) {
CU_set_registry(pOldRegistry);
}
return result;
}
/*------------------------------------------------------------------------*/
/** Run a specified suite within the curses interface.
* @param pSuite The suite to be run (non-NULL).
* @return An error code indicating the error status
* during the test run.
*/
static CU_ErrorCode curses_run_suite_tests(CU_pSuite pSuite)
{
reset_run_parameters();
f_uiTotalTests = pSuite->uiNumberOfTests;
f_uiTotalSuites = 1;
return CU_run_suite(pSuite);
}
/*------------------------------------------------------------------------*/
/** Run a specific test for the specified suite within
* the curses interface.
* @param pSuite The suite containing the test to be run (non-NULL).
* @param pTest The test to be run (non-NULL).
* @return An error code indicating the error status
* during the test run.
*/
static CU_ErrorCode curses_run_single_test(CU_pSuite pSuite, CU_pTest pTest)
{
reset_run_parameters();
f_uiTotalTests = 1;
f_uiTotalSuites = 1;
return CU_run_test(pSuite, pTest);
}
/*------------------------------------------------------------------------*/
/** Reset the local run counters and prepare for a test run. */
static void reset_run_parameters(void)
{
f_pCurrentTest = NULL;
f_pCurrentSuite = NULL;
f_uiTestsRunSuccessful = f_uiTestsRun = f_uiTotalTests = f_uiTestsFailed = f_uiTestsSkipped = 0;
f_uiTotalSuites = f_uiSuitesSkipped = 0;
refresh_progress_window();
refresh_summary_window();
refresh_run_summary_window();
}
/*------------------------------------------------------------------------*/
/** Handler function called at start of each test.
* @param pTest The test being run.
* @param pSuite The suite containing the test.
*/
static void curses_test_start_message_handler(const CU_pTest pTest, const CU_pSuite pSuite)
{
f_pCurrentTest = (CU_pTest)pTest;
f_pCurrentSuite = (CU_pSuite)pSuite;
refresh_run_summary_window();
}
/*------------------------------------------------------------------------*/
/** Handler function called at completion of each test.
* @param pTest The test being run.
* @param pSuite The suite containing the test.
* @param pFailure Pointer to the 1st failure record for this test.
*/
static void curses_test_complete_message_handler(const CU_pTest pTest,
const CU_pSuite pSuite,
const CU_pFailureRecord pFailure)
{
/* Not used in curses implementation - quiet compiler warning */
CU_UNREFERENCED_PARAMETER(pTest);
CU_UNREFERENCED_PARAMETER(pSuite);
CU_UNREFERENCED_PARAMETER(pFailure);
f_uiTestsRun++;
if (CU_get_number_of_tests_failed() != f_uiTestsFailed) {
f_uiTestsFailed++;
}
else {
f_uiTestsRunSuccessful++;
}
refresh_summary_window();
refresh_progress_window();
}
/*------------------------------------------------------------------------*/
/** Handler function called at completion of all tests in a suite.
* @param pFailure Pointer to the test failure record list.
*/
static void curses_all_tests_complete_message_handler(const CU_pFailureRecord pFailure)
{
/* Not used in curses implementation - quiet compiler warning */
CU_UNREFERENCED_PARAMETER(pFailure);
f_pCurrentTest = NULL;
f_pCurrentSuite = NULL;
if (!create_pad(&details_pad, application_windows.pDetailsWin, 16 , 256)) {
return;
}
mvwprintw(details_pad.pPad, 0, 0, "%s", "====== Suite Run Summary ======");
mvwprintw(details_pad.pPad, 1, 0, " TOTAL SUITES: %4u", f_uiTotalSuites);
mvwprintw(details_pad.pPad, 2, 0, " Run: %4u", f_uiTotalSuites - f_uiSuitesSkipped);
mvwprintw(details_pad.pPad, 3, 0, " Skipped: %4u", f_uiSuitesSkipped);
mvwprintw(details_pad.pPad, 5, 0, "%s", "====== Test Run Summary =======");
mvwprintw(details_pad.pPad, 6, 0, " TOTAL TESTS: %4u", f_uiTotalTests);
mvwprintw(details_pad.pPad, 7, 0, " Run: %4u", f_uiTestsRun);
mvwprintw(details_pad.pPad, 8, 0, " Skipped: %4u", f_uiTestsSkipped);
mvwprintw(details_pad.pPad, 9, 0, " Successful: %4u", f_uiTestsRunSuccessful);
mvwprintw(details_pad.pPad, 10, 0, " Failed: %4u", f_uiTestsFailed);
mvwprintw(details_pad.pPad, 12, 0, "%s", "====== Assertion Summary ======");
mvwprintw(details_pad.pPad, 13, 0, " TOTAL ASSERTS: %4u", CU_get_number_of_asserts());
mvwprintw(details_pad.pPad, 14, 0, " Passed: %4u", CU_get_number_of_successes());
mvwprintw(details_pad.pPad, 15, 0, " Failed: %4u", CU_get_number_of_failures());
refresh_details_window();
refresh_run_summary_window();
}
/*------------------------------------------------------------------------*/
/** Handler function called when suite initialization fails.
* @param pSuite The suite for which initialization failed.
*/
static void curses_suite_init_failure_message_handler(const CU_pSuite pSuite)
{
assert(pSuite);
f_uiTestsSkipped += pSuite->uiNumberOfTests;
f_uiSuitesSkipped++;
refresh_summary_window();
refresh_progress_window();
}
/** @} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -