OSDN Git Service

add functions for fixture setUp/tearDown.
authortsutsumi <>
Thu, 19 Aug 2010 10:19:46 +0000 (10:19 +0000)
committertsutsumi <>
Thu, 19 Aug 2010 10:19:46 +0000 (10:19 +0000)
ASSERT tried in the setUp function in the unsuccessful case
as well so that the tearDown function was called.

src/ccunit/CCUnitTestFixture.c

index 86abe1f..7239149 100644 (file)
@@ -78,6 +78,7 @@ static CCUnitTestFailure* runTest (CCUnitTestCase* testCase,
                                   CCUnitTestResult* result)
 {
   CCUnitTestFailure* runFailure = NULL;
+  _ccunit_testFailure = NULL;
   if (setUp && setUp->runTest)
     {
       if (setjmp (_ccunit_runTest_env) == 0)
@@ -85,10 +86,12 @@ static CCUnitTestFailure* runTest (CCUnitTestCase* testCase,
       else
        {
          _ccunit_testFailure->testCase = setUp;
-         return _ccunit_testFailure;
+         ccunit_addFailure (result, _ccunit_testFailure);
        }
     }
-  if (setjmp (_ccunit_runTest_env) == 0)
+  if (_ccunit_testFailure)
+    ;
+  else if (setjmp (_ccunit_runTest_env) == 0)
     {
       result->runCount ++;
       testCase->runTest ();
@@ -97,6 +100,7 @@ static CCUnitTestFailure* runTest (CCUnitTestCase* testCase,
     {
       runFailure = _ccunit_testFailure;
       runFailure->testCase = testCase;
+      _ccunit_testFailure = NULL;
     }
   if (tearDown && tearDown->runTest)
     {
@@ -122,15 +126,39 @@ static void run (CCUnitTest* test, CCUnitTestResult* result)
   CCUnitListIterator itor;
   CCUnitTestCase* testCase;
   assert (test->type == ccunitTypeFixture);
-  ccunit_initListIterator (&fixture->testCases, &itor);
-  while ((testCase = ccunit_nextListIterator (&itor)) != NULL)
+  _ccunit_testFailure = NULL;
+  if (fixture->setup_setUp && fixture->setup_setUp->runTest)
     {
-      CCUnitTestFailure* failure = NULL;
-      _ccunit_startTest (result, testCase);
-      failure = runTest (testCase, fixture->setUp, fixture->tearDown, result);
-      if (failure)
-       ccunit_addFailure (result, failure);
-      _ccunit_endTest (result, testCase);
+      if (setjmp (_ccunit_runTest_env) == 0)
+       fixture->setup_setUp->runTest ();
+      else
+       {
+         _ccunit_testFailure->testCase = fixture->setup_setUp;
+         ccunit_addFailure (result, _ccunit_testFailure);
+       }
+    }
+  if (!_ccunit_testFailure)
+    {
+      ccunit_initListIterator (&fixture->testCases, &itor);
+      while ((testCase = ccunit_nextListIterator (&itor)) != NULL)
+       {
+         CCUnitTestFailure* failure;
+         _ccunit_startTest (result, testCase);
+         failure = runTest (testCase, fixture->setUp, fixture->tearDown, result);
+         if (failure)
+           ccunit_addFailure (result, failure);
+         _ccunit_endTest (result, testCase);
+       }
+    }
+  if (fixture->setup_tearDown && fixture->setup_tearDown->runTest)
+    {
+      if (setjmp (_ccunit_runTest_env) == 0)
+       fixture->setup_tearDown->runTest ();
+      else
+       {
+         _ccunit_testFailure->testCase = fixture->setup_tearDown;
+         ccunit_addFailure (result, _ccunit_testFailure);
+       }
     }
 }
 
@@ -163,6 +191,20 @@ CCUnitTestFixture* ccunit_newTestFixture (const char* name,
   return fixture;
 }
 
+inline void ccunit_setTestFixtureSetup (CCUnitTestFixture* fixture,
+                                       CCUnitTestFunc* setup_setUp,
+                                       CCUnitTestFunc* setup_tearDown)
+{
+  if (!fixture)
+    return;
+  if (fixture->setup_setUp)
+    ccunit_deleteTestCase (fixture->setup_setUp);
+  fixture->setup_setUp = setup_setUp;
+  if (fixture->setup_tearDown)
+    ccunit_deleteTestCase (fixture->setup_tearDown);
+  fixture->setup_tearDown = setup_tearDown;
+}
+
 inline struct CCUnitTestResult* ccunit_runTestFixture (CCUnitTestFixture* f)
 {
   CCUnitTestResult* result;