⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testdb.c

📁 linux 下 C程序单元测试,可以实现交互模式和静态模式
💻 C
📖 第 1 页 / 共 5 页
字号:
/* *  CUnit - A Unit testing framework library for C. *  Copyright (C) 2001            Anil Kumar *  Copyright (C) 2004,2005,2006  Anil Kumar, Jerry St.Clair * *  This library is free software; you can redistribute it and/or *  modify it under the terms of the GNU Library General Public *  License as published by the Free Software Foundation; either *  version 2 of the License, or (at your option) any later version. * *  This library is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *  Library General Public License for more details. * *  You should have received a copy of the GNU Library General Public *  License along with this library; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *//* *  Implementation of Registry/TestGroup/Testcase management Routines. * *  Aug 2001        Initial implementation (AK) * *  09/Aug/2001     Added startup initialize/cleanup registry functions. (AK) * *  29/Aug/2001     Added Test and Group Add functions. (AK) * *  02/Oct/2001     Added Proper Error codes and Messages on the failure conditions. (AK) * *  13/Oct/2001     Added Code to Check for the Duplicate Group name and test name. (AK) * *  15-Jul-2004     Added doxygen comments, new interface, added assertions to *                  internal functions, moved error handling code to CUError.c, *                  added assertions to make sure no modification of registry *                  during a run, bug fixes, changed CU_set_registry() so that it *                  doesn't require cleaning the existing registry. (JDS) *//** @file *  Management functions for tests, suites, and the test registry (implementation). *//** @addtogroup Framework @{*/#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>#include <stdarg.h>#include "CUnit.h"#include "MyMem.h"#include "TestDB.h"#include "TestRun.h"#include "Util.h"/* *  Global/Static Definitions */static CU_pTestRegistry f_pTestRegistry = NULL; /**< The active internal Test Registry. *//* * Private function forward declarations */static void      cleanup_test_registry(CU_pTestRegistry pRegistry);static CU_pSuite create_suite(const char* strName, CU_InitializeFunc pInit, CU_CleanupFunc pClean);static void      cleanup_suite(CU_pSuite pSuite);static void      insert_suite(CU_pTestRegistry pRegistry, CU_pSuite pSuite);static CU_pTest  create_test(const char* strName, CU_TestFunc pTestFunc);static void      cleanup_test(CU_pTest pTest);static void      insert_test(CU_pSuite pSuite, CU_pTest pTest);static CU_BOOL   suite_exists(CU_pTestRegistry pRegistry, const char* szSuiteName);static CU_BOOL   test_exists(CU_pSuite pSuite, const char* szTestName);/* *  Public Interface functions *//*------------------------------------------------------------------------*//** Initialize the test registry. *  Any existing registry is freed, including all stored suites and *  associated tests.  The most recent stored test results are also cleared. *  <P><B>This function must not be called during a test run (checked *  by assertion)</B></P>. *  @return  CUE_NOMEMORY if memory for the new registry cannot be allocated, *           CUE_SUCCESS otherwise. *  @see CU_cleanup_registry *  @see CU_get_registry *  @see CU_set_registry *  @see CU_registry_initialized */CU_ErrorCode CU_initialize_registry(void){  CU_ErrorCode result;  assert(CU_FALSE == CU_is_test_running());  CU_set_error(result = CUE_SUCCESS);  if (NULL != f_pTestRegistry) {    CU_cleanup_registry();  }  f_pTestRegistry = CU_create_new_registry();  if (NULL == f_pTestRegistry) {    CU_set_error(result = CUE_NOMEMORY);  }  return result;}/*------------------------------------------------------------------------*//** Check whether the test registry has been initialized. *  @return  CU_TRUE if the registry has been initialized, *           CU_FALSE otherwise. *  @see CU_initialize_registry *  @see CU_cleanup_registry */CU_BOOL CU_registry_initialized(void){  return (NULL == f_pTestRegistry) ? CU_FALSE : CU_TRUE;}/*------------------------------------------------------------------------*//** Clear the test registry. *  The active test registry is freed, including all stored suites and *  associated tests.  The most recent stored test results are also cleared. *  After calling this function, CUnit suites cannot be added until *  CU_initialize_registry() or CU_set_registry() is called.  Further, any *  pointers to suites or test cases held by the user will be invalidated *  by calling this function. *  <P>This function may be called multiple times without generating an *  error condition.  However, <B>this function must not be called during *  a test run (checked by assertion)</B></P>. *  @see CU_initialize_registry *  @see CU_get_registry *  @see CU_set_registry */void CU_cleanup_registry(void){  assert(CU_FALSE == CU_is_test_running());  CU_set_error(CUE_SUCCESS);  CU_destroy_existing_registry(&f_pTestRegistry);  /* supposed to handle NULL ok */  CU_clear_previous_results();  CU_CREATE_MEMORY_REPORT(NULL);}/*------------------------------------------------------------------------*//** Retrieve a pointer to the current test registry. *  Returns NULL if the registry has not been initialized using *  CU_initialize_registry().  Directly accessing the registry *  should not be necessary for most users.  This function is *  provided primarily for internal and testing purposes. *  @return A pointer to the current registry (NULL if uninitialized). *  @see CU_initialize_registry *  @see CU_set_registry */CU_pTestRegistry CU_get_registry(void){  return f_pTestRegistry;}/*------------------------------------------------------------------------*//** Set the registry to an existing CU_pTestRegistry instance. *  A pointer to the original registry is returned.  Note that the *  original registry is not freed, and it becomes the caller's *  responsibility to do so.  Directly accessing the registry *  should not be necessary for most users.  This function is *  provided primarily for internal and testing purposes. *  <P><B>This function must not be called during a test run (checked *  by assertion)</B></P>. *  @return A pointer to the original registry that was replaced. *  @see CU_initialize_registry *  @see CU_cleanup_registry *  @see CU_get_registry */CU_pTestRegistry CU_set_registry(CU_pTestRegistry pRegistry){  CU_pTestRegistry pOldRegistry = f_pTestRegistry;  assert(CU_FALSE == CU_is_test_running());  CU_set_error(CUE_SUCCESS);  f_pTestRegistry = pRegistry;  return pOldRegistry;}/*------------------------------------------------------------------------*//** Create a new test suite and add it to the test registry. *  This function creates a new test suite having the specified *  name and initialization/cleanup functions and adds it to the *  test registry.  It returns a pointer to the newly-created suite, *  which will be NULL if there was a problem with the suite creation *  or addition.<br /><br /> *  CU_add_suite() sets the following error codes: *  -CUE_NOREGISTRY if the registry hasn't been initialized. *  -CUE_NO_SUITENAME if strName is NULL. *  -CUE_DUP_SUITE if a suite having strName is already registered. *  -CUE_NOMEMORY if a memory allocation failed.<BR /><BR /> *  NOTE - the CU_pSuite pointer returned should NOT BE FREED BY *  THE USER.  The suite is freed by the CUnit system when *  CU_cleanup_registry() is called. *  <P><B>This function must not be called during a test run (checked *  by assertion)</B></P>. *  @param strName Name for the new test suite (unique, non-NULL). *  @param pInit   Initialization function to call before running suite. *  @param pClean  Cleanup function to call after running suite. *  @return A pointer to the newly-created suite (NULL if creation failed) */CU_pSuite CU_add_suite(const char* strName, CU_InitializeFunc pInit, CU_CleanupFunc pClean){  CU_pSuite pRetValue = NULL;  CU_ErrorCode error = CUE_SUCCESS;  assert(CU_FALSE == CU_is_test_running());  if (NULL == f_pTestRegistry) {    error = CUE_NOREGISTRY;  }  else if (NULL == strName) {    error = CUE_NO_SUITENAME;  }  else if (CU_TRUE == suite_exists(f_pTestRegistry, strName)) {    error = CUE_DUP_SUITE;  }  else {    pRetValue = create_suite(strName, pInit, pClean);    if (NULL == pRetValue) {      error = CUE_NOMEMORY;    }    else {      insert_suite(f_pTestRegistry, pRetValue);    }  }  CU_set_error(error);  return pRetValue;}/*------------------------------------------------------------------------*//** Create a new test case and add it to a test suite. *  This function creates a new test having the specified name and *  function, and adds it to the specified suite.  At present, there is *  no mechanism for creating a test case independent of a suite, although *  this function does return a pointer to the newly-created test.<br /><br /> *  CU_add_test() sets the following error codes: *  -CUE_NOSUITE if pSuite is NULL. *  -CUE_NO_TESTNAME if strName is NULL. *  -CUE_DUP_TEST if a test having strName is already registered to pSuite. *  -CUE_NOMEMORY if a memory allocation failed.<BR /><BR /> *  NOTE - the CU_pTest pointer returned should NOT BE FREED BY *  THE USER.  The test is freed by the CUnit system when *  CU_cleanup_registry() is called. *  <P><B>This function must not be called during a test run (checked *  by assertion)</B></P>. *  @param pSuite  Test suite to which to add new test. *  @param strName Name for the new test case (unique to pSuite, non-NULL). *  @param pTest   Function to call when running the test. *  @return A pointer to the newly-created test (NULL if creation failed) */CU_pTest CU_add_test(CU_pSuite pSuite, const char* strName, CU_TestFunc pTestFunc){  CU_pTest pRetValue = NULL;  CU_ErrorCode error = CUE_SUCCESS;  assert(CU_FALSE == CU_is_test_running());  if (NULL == f_pTestRegistry) {    error = CUE_NOREGISTRY;  }  else if (NULL == pSuite) {    error = CUE_NOSUITE;  }  else if (NULL == strName) {    error = CUE_NO_TESTNAME;  }   else if(NULL == pTestFunc) {    error = CUE_NOTEST;  }  else if (CU_TRUE == test_exists(pSuite, strName)) {    error = CUE_DUP_TEST;  }  else {    pRetValue = create_test(strName, pTestFunc);    if (NULL == pRetValue) {      error = CUE_NOMEMORY;    }    else {      f_pTestRegistry->uiNumberOfTests++;      insert_test(pSuite, pRetValue);    }  }  CU_set_error(error);  return pRetValue;}/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*//*  This section is based conceptually on code *  Copyright (C) 2004  Aurema Pty Ltd. * *  This library is free software; you can redistribute it and/or *  modify it under the terms of the GNU Library General Public *  License as published by the Free Software Foundation; either *  version 2 of the License, or (at your option) any later version. * *  This library is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *  Library General Public License for more details. * *  You should have received a copy of the GNU Library General Public *  License along with this library; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * *  Derived from code contributed by K. Cheung and Aurema Pty Ltd. (thanks!) *    int test_group_register(test_group_t *tg) *    int test_suite_register(test_suite_t *ts) *//*------------------------------------------------------------------------*//** Registers multiple suite arrays in CU_SuiteInfo format. *  The function accepts a variable number of suite arrays to *  be registered.  The number of arrays is indicated by *  the value of the 1st argument, suite_count.  Each suite *  in each array is registered with the CUnit test registry, *  along with all of the associated tests. *  @param	suite_count The number of CU_SuiteInfo* arguments to follow. *  @param ... suite_count number of CU_SuiteInfo* arguments.  NULLs are ignored. *  @return A CU_ErrorCode indicating the error status. *  @see CU_register_suites() */CU_ErrorCode CU_register_nsuites(int suite_count, ...){  CU_SuiteInfo *pSuiteItem = NULL;  CU_TestInfo  *pTestItem = NULL;  CU_pSuite     pSuite = NULL;  va_list argptr;  int i;  va_start(argptr, suite_count);  for (i=0 ; i<suite_count ; ++i) {    pSuiteItem = va_arg(argptr, CU_pSuiteInfo);    if (NULL != pSuiteItem) {      for ( ; NULL != pSuiteItem->pName; pSuiteItem++) {        if (NULL != (pSuite = CU_add_suite(pSuiteItem->pName, pSuiteItem->pInitFunc, pSuiteItem->pCleanupFunc))) {          for (pTestItem = pSuiteItem->pTests; NULL != pTestItem->pName; pTestItem++) {            if (NULL == CU_add_test(pSuite, pTestItem->pName, pTestItem->pTestFunc)) {              return CU_get_error();            }          }        }        else {          return CU_get_error();        }      }    }  }	return CU_get_error();}/*------------------------------------------------------------------------*//** Registers the suites in a single CU_SuiteInfo array.. *  Multiple arrays can be registered using CU_register_nsuites(). *  @param	suite_info NULL-terminated array of CU_SuiteInfo *                    items to register. *  @return A CU_ErrorCode indicating the error status. *  @see CU_register_suites() */CU_ErrorCode CU_register_suites(CU_SuiteInfo suite_info[])

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -