Verify.cxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. static const char* const Verify_cxx_Version = 
  51.     "$Id: Verify.cxx,v 1.7 2001/06/30 02:26:20 bko Exp $";
  52. #include <cassert>
  53. #include <iomanip>
  54. #include "Verify.hxx"
  55. #include "Lock.hxx"
  56. #include "Mutex.hxx"
  57. using Vocal::Threads::Lock;
  58. using Vocal::Threads::Mutex;
  59. TestStatistics* TestStatistics::myInstance = 0;
  60. Mutex * TestStatistics::myMutex = new Mutex;
  61. TestStatistics::TestStatistics()
  62.     : myPassed(0),
  63.       myFailed(0),
  64.       myBroken(0),
  65.       myUnexpectedPass(0)
  66. {
  67. }
  68. TestStatistics::~TestStatistics()
  69. {
  70. }
  71. void
  72. TestStatistics::passed()
  73. {
  74.     Lock lock(*myMutex);
  75.     if(!myInstance)
  76.     {
  77. myInstance = new TestStatistics();
  78.     }
  79.     myInstance->myPassed++;
  80. }
  81. void
  82. TestStatistics::failed()
  83. {
  84.     Lock lock (*myMutex);
  85.     if(!myInstance)
  86.     {
  87. myInstance = new TestStatistics();
  88.     }
  89.     myInstance->myFailed++;
  90. }
  91. void
  92. TestStatistics::broken()
  93. {
  94.     Lock lock (*myMutex);
  95.     if(!myInstance)
  96.     {
  97. myInstance = new TestStatistics();
  98.     }
  99.     myInstance->myBroken++;
  100. }
  101. void
  102. TestStatistics::unexpectedPass()
  103. {
  104.     Lock lock (*myMutex);
  105.     if(!myInstance)
  106.     {
  107. myInstance = new TestStatistics();
  108.     }
  109.     myInstance->myUnexpectedPass++;
  110. }
  111. void
  112. TestStatistics::covered(const char * filename, int line, const char * label)
  113. {
  114.     Lock lock (*myMutex);
  115.     if(!myInstance)
  116.     {
  117. myInstance = new TestStatistics();
  118.     }
  119.     TestStatistics::CoverageInfo coverageInfo(filename, line, label);
  120.     
  121.     set<CoverageInfo>::const_iterator i = myInstance->myCovered.find(coverageInfo);
  122.     if ( i == myInstance->myCovered.end() )
  123.     {
  124.         myInstance->myCovered.insert(coverageInfo);
  125.     }
  126. }
  127. int
  128. TestStatistics::finish(const char* filename, int testcase_count)
  129. {
  130.     bool anyFailed = false;
  131.     Lock lock (*myMutex);
  132.     if(myInstance)
  133.     {
  134. assert(filename);
  135. cerr << "VerifySummary:" << filename 
  136.      << ':' << testcase_count
  137.      << ':' << myInstance->myPassed
  138.      << ':' << myInstance->myFailed
  139.      << ':' << myInstance->myBroken
  140.      << ':' << myInstance->myUnexpectedPass
  141.      << "nn";
  142. cerr << "-------------------------------------------------------------"
  143.      << "---------n";
  144. cerr << "Report for " << filename << "nn";
  145. bool brokenTest = false;
  146. if(
  147.     (myInstance->myPassed + myInstance->myFailed + 
  148.      myInstance->myBroken + myInstance->myUnexpectedPass)
  149.     != testcase_count)
  150. {
  151.     brokenTest = true;
  152. }
  153. cerr << "Summary: ";
  154. if(brokenTest)
  155. {
  156.     // the test is broken
  157.     cerr << "TEST BROKENn";
  158. }
  159. else if(testcase_count == myInstance->myPassed)
  160. {
  161.     // best of all possible -- everything is good
  162.     cerr << "PASSn";
  163. }
  164. else if (myInstance->myFailed == 0)
  165. {
  166.     // everything's ok, but there are some broken entries
  167.     cerr << "PASS WITH KNOWN BUGSn";
  168. }
  169. else if (myInstance->myFailed > 0)
  170. {
  171. cerr << "FAILn";
  172. }
  173. else 
  174. {
  175.     cerr << "VERIFY BUGn";
  176. }
  177. cerr << 'n';
  178. cerr << "Total Number of Test Cases: " << testcase_count << 'n';
  179. cerr << "Number of Test Cases run: " 
  180.      << (myInstance->myPassed +
  181.  myInstance->myFailed +
  182.  myInstance->myBroken + 
  183.  myInstance->myUnexpectedPass) << "nn";
  184. cerr << "test_verify()n";
  185. cerr << "    Expected:   " 
  186.      << myInstance->myPassed + myInstance->myFailed << 'n';
  187. cerr << "    Passes:     " << myInstance->myPassed << 'n';
  188. cerr << "    Fails:      " << myInstance->myFailed << 'n';
  189. cerr << 'n';
  190. cerr << "test_bug()n";
  191. cerr << "    Expected:   " 
  192.      << myInstance->myBroken + myInstance->myUnexpectedPass
  193.      << 'n';
  194. cerr << "    Bugs:       " << myInstance->myBroken << 'n';
  195. cerr << "    Fixed Bugs: " << myInstance->myUnexpectedPass << 'n';
  196. cerr << "nn";
  197. if(brokenTest)
  198. {
  199.     cerr << "Help With Broken Tests:n";
  200.     cerr << "The number of test cases and bugs specified in test_return_code() did notn";
  201.     cerr << "match the number of times test_verify() and/or test_bug() were called.n";
  202.     cerr << "To fix this, you should probably update the number of times you expectn";
  203.     cerr << "test_verify() and/or test_bug() to be called in the arguments ton";
  204.     cerr << "test_return_code().n";
  205. }
  206. cerr << "============================================================"
  207.      << "==========n";
  208.         for (   set<CoverageInfo>::const_iterator i = myInstance->myCovered.begin();
  209.                 i != myInstance->myCovered.end();
  210.                 ++i
  211.              )
  212.         {
  213.             cerr << i->file << ':' << i->line 
  214.                  << ": covered label: " << i->label << endl;
  215.         }
  216. delete myInstance; myInstance = 0;
  217.     }
  218.     if(anyFailed)
  219.     {
  220. return -1;
  221.     }
  222.     else
  223.     {
  224. return 0;
  225.     }
  226. }
  227. #if 0
  228. /** this class exists so that TestStatistics::finish() can be called
  229.  * when the program finishes.  To do this, it calls it in the
  230.  * destructor, and a global instance of the class is instantiated.
  231.  */
  232. class TestStatisticDestructorActivation
  233. {
  234.     public:
  235. TestStatisticDestructorActivation()
  236. {
  237. }
  238. ~TestStatisticDestructorActivation()
  239. {
  240.     TestStatistics::finish(0);
  241. }
  242. };
  243. /// here is the global instance
  244. static TestStatisticDestructorActivation junk;
  245. #endif