OSDN Git Service

catch ctor/dtor/setUp/tearDown longjmp
authortsutsumi <>
Mon, 29 Sep 2003 15:08:46 +0000 (15:08 +0000)
committertsutsumi <>
Mon, 29 Sep 2003 15:08:46 +0000 (15:08 +0000)
src/ccunit/CCUnitTestFixture.c
src/ccunit/CCUnitTestResult.c

index 179c394..ac4005d 100644 (file)
@@ -99,6 +99,8 @@ CCUnitTestFixture* ccunit_newTestFixture (const char* name,
   ccunit_initList (&fixture->testCases);
   fixture->setUp = setUp;
   fixture->tearDown = tearDown;
+  fixture->ctor = ctor;
+  fixture->dtor = dtor;
   return fixture;
 }
 
@@ -115,20 +117,37 @@ inline struct CCUnitTestResult* ccunit_runTestFixture (CCUnitTestFixture* f)
  *
  * @param testFixture test fixture to run.
  * @param runTest test run function.
+ * @param result test result.
  * @throws _ccunit_runResult_env by longjmp.
  */
-void _ccunit_runBare (CCUnitTestFixture* fixture, void (*runTest) ())
+void _ccunit_runBare (CCUnitTestFixture* fixture,
+                     void (*runTest) (),
+                     CCUnitTestResult* result)
 {
-  int failure;
+  int failure = 0;
+  int runFailure = 0;
   assert (fixture->test.type == ccunitTypeFixture);
   if (fixture->setUp)
-    fixture->setUp ();
-  if ((failure = setjmp (_ccunit_runTest_env)) == 0)
     {
-      runTest ();
+      if ((failure = setjmp (_ccunit_runTest_env)) == 0)
+       fixture->setUp ();
+      else
+       ccunit_addFailure (result, (CCUnitTestFailure*)failure);
+    }
+  if (!failure)
+    {
+      if ((runFailure = setjmp (_ccunit_runTest_env)) == 0)
+       {
+         runTest ();
+       }
     }
   if (fixture->tearDown)
-    fixture->tearDown ();
-  if (failure != 0)
-    longjmp (_ccunit_run_env, failure);
+    {
+      if ((failure = setjmp (_ccunit_runTest_env)) == 0)
+       fixture->tearDown ();
+      else
+       ccunit_addFailure (result, (CCUnitTestFailure*)failure);
+    }
+  if (runFailure)
+    longjmp (_ccunit_run_env, runFailure);
 }
index 06acf5e..c7d981c 100644 (file)
  */
 
 extern jmp_buf _ccunit_run_env;
-extern void _ccunit_runBare (CCUnitTestFixture* testFixture, void (*runTest)());
+extern jmp_buf _ccunit_runTest_env;
+extern void _ccunit_runBare (CCUnitTestFixture* testFixture,
+                            void (*runTest)(),
+                            CCUnitTestResult* result);
 
 /**
  * Informs the result that a test will be started.
@@ -72,22 +75,39 @@ static void endTest (CCUnitTestResult* result, struct CCUnitTestCase* test)
  */
 void _ccunit_runTestCase (CCUnitTestResult* result, CCUnitTestFixture* fixture)
 {
-  int failure;
-  CCUnitListIterator itor;
-  CCUnitTestCase* testCase;
-  ccunit_initListIterator (&fixture->testCases, &itor);
-  while ((testCase = ccunit_nextListIterator (&itor)) != NULL)
+  int failure = 0;
+  if (fixture->ctor)
     {
-      startTest (result, testCase);
-      if ((failure = setjmp (_ccunit_run_env)) == 0)
-       _ccunit_runBare (fixture, testCase->runTest);
+      if ((failure = setjmp (_ccunit_runTest_env)) == 0)
+       fixture->ctor ();
       else
+       ccunit_addFailure (result, (CCUnitTestFailure*)failure);
+    }
+  if (!failure)
+    {
+      CCUnitListIterator itor;
+      CCUnitTestCase* testCase;
+      ccunit_initListIterator (&fixture->testCases, &itor);
+      while ((testCase = ccunit_nextListIterator (&itor)) != NULL)
        {
-         CCUnitTestFailure* f = (CCUnitTestFailure*)failure;
-         f->testCase = testCase;
-         ccunit_addFailure (result, f);
+         startTest (result, testCase);
+         if ((failure = setjmp (_ccunit_run_env)) == 0)
+           _ccunit_runBare (fixture, testCase->runTest, result);
+         else
+           {
+             CCUnitTestFailure* f = (CCUnitTestFailure*)failure;
+             f->testCase = testCase;
+             ccunit_addFailure (result, f);
+           }
+         endTest (result, testCase);
        }
-      endTest (result, testCase);
+    }
+  if (fixture->dtor)
+    {
+      if ((failure = setjmp (_ccunit_runTest_env)) == 0)
+       fixture->dtor ();
+      else
+       ccunit_addFailure (result, (CCUnitTestFailure*)failure);
     }
 }