test_objmgr_basic.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:11k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_objmgr_basic.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:25:18  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.21
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_objmgr_basic.cpp,v 1000.3 2004/06/01 19:25:18 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author:
  35. *           Andrei Gourianov
  36. *
  37. * File Description:
  38. *           1.1 Basic tests
  39. *
  40. * ---------------------------------------------------------------------------
  41. * $Log: test_objmgr_basic.cpp,v $
  42. * Revision 1000.3  2004/06/01 19:25:18  gouriano
  43. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.21
  44. *
  45. * Revision 1.21  2004/05/21 21:42:14  gorelenk
  46. * Added PCH ncbi_pch.hpp
  47. *
  48. * Revision 1.20  2004/03/16 15:47:28  vasilche
  49. * Added CBioseq_set_Handle and set of EditHandles
  50. *
  51. * Revision 1.19  2003/11/26 20:57:06  vasilche
  52. * Removed redundant const before enum parameter.
  53. *
  54. * Revision 1.18  2003/09/30 16:22:05  vasilche
  55. * Updated internal object manager classes to be able to load ID2 data.
  56. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  57. * Scope caches results of requests for data to data loaders.
  58. * Optimized CSeq_id_Handle for gis.
  59. * Optimized bioseq lookup in scope.
  60. * Reduced object allocations in annotation iterators.
  61. * CScope is allowed to be destroyed before other objects using this scope are
  62. * deleted (feature iterators, bioseq handles etc).
  63. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  64. * Added 'adaptive' option to objmgr_demo application.
  65. *
  66. * Revision 1.17  2003/06/19 18:23:46  vasilche
  67. * Added several CXxx_ScopeInfo classes for CScope related information.
  68. * CBioseq_Handle now uses reference to CBioseq_ScopeInfo.
  69. * Some fine tuning of locking in CScope.
  70. *
  71. * Revision 1.16  2003/06/02 16:06:39  dicuccio
  72. * Rearranged src/objects/ subtree.  This includes the following shifts:
  73. *     - src/objects/asn2asn --> arc/app/asn2asn
  74. *     - src/objects/testmedline --> src/objects/ncbimime/test
  75. *     - src/objects/objmgr --> src/objmgr
  76. *     - src/objects/util --> src/objmgr/util
  77. *     - src/objects/alnmgr --> src/objtools/alnmgr
  78. *     - src/objects/flat --> src/objtools/flat
  79. *     - src/objects/validator --> src/objtools/validator
  80. *     - src/objects/cddalignview --> src/objtools/cddalignview
  81. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  82. * replaces the three libmmdb? libs.
  83. *
  84. * Revision 1.15  2003/05/21 16:03:08  vasilche
  85. * Fixed access to uninitialized optional members.
  86. * Added initialization of mandatory members.
  87. *
  88. * Revision 1.14  2003/05/20 15:44:39  vasilche
  89. * Fixed interaction of CDataSource and CDataLoader in multithreaded app.
  90. * Fixed some warnings on WorkShop.
  91. * Added workaround for memory leak on WorkShop.
  92. *
  93. * Revision 1.13  2003/04/29 19:51:14  vasilche
  94. * Fixed interaction of Data Loader garbage collector and TSE locking mechanism.
  95. * Made some typedefs more consistent.
  96. *
  97. * Revision 1.12  2003/04/24 20:48:47  vasilche
  98. * Added missing header.
  99. *
  100. * Revision 1.11  2003/03/27 21:54:58  grichenk
  101. * Renamed test applications and makefiles, updated references
  102. *
  103. * Revision 1.10  2002/12/26 16:39:24  vasilche
  104. * Object manager class CSeqMap rewritten.
  105. *
  106. * Revision 1.9  2002/11/04 21:29:14  grichenk
  107. * Fixed usage of const CRef<> and CRef<> constructor
  108. *
  109. * Revision 1.8  2002/10/23 12:43:31  gouriano
  110. * comment out unused parameters
  111. *
  112. * Revision 1.7  2002/06/04 17:18:33  kimelman
  113. * memory cleanup :  new/delete/Cref rearrangements
  114. *
  115. * Revision 1.6  2002/05/14 20:06:28  grichenk
  116. * Improved CTSE_Info locking by CDataSource and CDataLoader
  117. *
  118. * Revision 1.5  2002/05/06 03:28:53  vakatov
  119. * OM/OM1 renaming
  120. *
  121. * Revision 1.4  2002/04/02 14:51:52  gouriano
  122. * *** empty log message ***
  123. *
  124. * Revision 1.3  2002/03/20 17:03:51  gouriano
  125. * *** empty log message ***
  126. *
  127. * Revision 1.2  2002/03/01 20:12:17  gouriano
  128. * *** empty log message ***
  129. *
  130. * Revision 1.1  2002/03/01 19:41:35  gouriano
  131. * *** empty log message ***
  132. *
  133. *
  134. * ===========================================================================
  135. */
  136. #include <ncbi_pch.hpp>
  137. #include <corelib/ncbiapp.hpp>
  138. #include <objects/seqset/Seq_entry.hpp>
  139. #include <objects/seq/Bioseq.hpp>
  140. #include <objmgr/object_manager.hpp>
  141. #include <objmgr/scope.hpp>
  142. #include <objmgr/seq_entry_handle.hpp>
  143. #include <objmgr/data_loader.hpp>
  144. BEGIN_NCBI_SCOPE
  145. using namespace objects;
  146. //===========================================================================
  147. // CTestDataLoader
  148. class CTestDataLoader : public CDataLoader
  149. {
  150. public:
  151.     CTestDataLoader(const string& loader_name) : CDataLoader( loader_name)
  152.         {
  153.         }
  154.     virtual void GetRecords(const CSeq_id_Handle& /*id*/,
  155.                             EChoice /*choice*/)
  156.         {
  157.         }
  158. };
  159. //===========================================================================
  160. // CTestApplication
  161. class CTestApplication : public CNcbiApplication
  162. {
  163. public:
  164.     CRef<CSeq_entry> CreateTestEntry(void);
  165.     virtual int Run( void);
  166. };
  167. CRef<CSeq_entry> CTestApplication::CreateTestEntry(void)
  168. //---------------------------------------------------------------------------
  169. {
  170.     CRef<CSeq_entry> entry(new CSeq_entry);
  171.     entry->SetSeq().SetId();
  172.     entry->SetSeq().SetInst();
  173.     entry->SetSeq().SetInst().SetRepr(CSeq_inst::eRepr_not_set);
  174.     entry->SetSeq().SetInst().SetMol(CSeq_inst::eMol_not_set);
  175.     return entry;
  176. }
  177. int CTestApplication::Run()
  178. //---------------------------------------------------------------------------
  179. {
  180.     int error = 0;
  181.     string name1("DL_1"), name2("DL_2");
  182. NcbiCout << "1.1.1 Creating CScope ==============================" << NcbiEndl;
  183. {
  184.     {
  185.         CRef< CObjectManager> pOm(new CObjectManager);
  186.         {
  187.             CTestDataLoader *pLoader1 = new CTestDataLoader( name1);
  188.             pOm->RegisterDataLoader( *pLoader1, CObjectManager::eNonDefault);
  189.             CTestDataLoader *pLoader2 = new CTestDataLoader( name2);
  190.             pOm->RegisterDataLoader( *pLoader2, CObjectManager::eDefault);
  191.             // scope in CRef container
  192.             CRef< CScope> pScope1(new CScope(*pOm));
  193.             pScope1->AddDefaults(); // loader 2 added
  194.             pScope1->AddDataLoader( name1);
  195.             // scope on the stack
  196.             CScope scope2(*pOm);
  197.             scope2.AddDefaults(); // loader 2 added
  198.             // scope on the heap
  199.             CScope* pScope3 = new CScope(*pOm);
  200.             pScope3->AddDefaults(); // loader 2 added
  201.             delete pScope3; //  loader 2 alive
  202.         }
  203.         // scopes deleted, all dataloaders alive
  204.     }
  205. // objmgr deleted, all dataloaders deleted
  206. }
  207. NcbiCout << "1.1.2 Adding Seq_entry to the scope=================" << NcbiEndl;
  208. {
  209.     {
  210.         CRef< CObjectManager> pOm(new CObjectManager);
  211.         {
  212.             // 3 scopes
  213.             CRef< CScope> pScope1(new CScope(*pOm));
  214.             CScope scope2(*pOm);
  215.             CRef<CScope> pScope3(new CScope(*pOm));
  216.             CRef< CSeq_entry> pEntry = CreateTestEntry();
  217.             // add entry to all scopes
  218.             pScope1->AddTopLevelSeqEntry( *pEntry);
  219.             scope2.AddTopLevelSeqEntry( *pEntry);
  220.             pScope3->AddTopLevelSeqEntry( *pEntry);
  221.             pScope1.Reset();
  222.             pScope3.Reset();
  223.             //delete pScope3; // data source and seq_entry alive
  224.         }
  225.         // scopes deleted, seq_entry and data source deleted
  226.     }
  227. // objmgr deleted
  228. }
  229. NcbiCout << "1.1.3 Handling Data loader==========================" << NcbiEndl;
  230. {
  231.     {
  232.         CRef< CObjectManager> pOm(new CObjectManager);
  233.         {
  234.             CTestDataLoader *pLoader1 = new CTestDataLoader( name1);
  235.             CScope* pScope1 = new CScope(*pOm);
  236.             pScope1->AddDefaults(); // nothing added
  237.             // must throw an exception: dataloader1 not found
  238.             NcbiCout << "Expecting exception:" << NcbiEndl;
  239.             try {
  240.                 pScope1->AddDataLoader( name1);
  241.                 NcbiCout << "ERROR: AddDataLoader has succeeded" << NcbiEndl;
  242.                 error = 1;
  243.             }
  244.             catch (exception& e) {
  245.                 NcbiCout << "Expected exception: " << e.what() << NcbiEndl;
  246.             }
  247.             pOm->RegisterDataLoader( *pLoader1, CObjectManager::eNonDefault);
  248.             pScope1->AddDefaults(); // nothing added
  249.             pScope1->AddDataLoader( name1); // ok
  250.             // must fail - dataloader1 is in use
  251.             NcbiCout << "Expecting error:" << NcbiEndl;
  252.             if (pOm->RevokeDataLoader( name1))
  253.             {
  254.                 NcbiCout << "ERROR: RevokeDataLoader has succeeded" << NcbiEndl;
  255.                 error = 1;
  256.             }
  257.             delete pScope1; // loader1 alive
  258.             // delete dataloader1
  259.             pOm->RevokeDataLoader( name1); // ok
  260.             // must throw an exception - dataloader1 not registered
  261.             NcbiCout << "Expecting exception:" << NcbiEndl;
  262.             try {
  263.                 pOm->RevokeDataLoader( name1);
  264.                 NcbiCout << "ERROR: RevokeDataLoader has succeeded" << NcbiEndl;
  265.                 error = 1;
  266.             }
  267.             catch (exception& e) {
  268.                 NcbiCout << "Expected exception: " << e.what() << NcbiEndl;
  269.             }
  270.         }
  271.     }
  272. }
  273. if ( error ) {
  274. NcbiCout << "==================================================" << NcbiEndl;
  275. NcbiCout << "ERROR: Some tests failed." << NcbiEndl;
  276. }
  277. else {
  278. NcbiCout << "==================================================" << NcbiEndl;
  279. NcbiCout << "Test completed successfully" << NcbiEndl;
  280. }
  281.     return error;
  282. }
  283. END_NCBI_SCOPE
  284. USING_NCBI_SCOPE;
  285. //===========================================================================
  286. // entry point
  287. int main( int argc, const char* argv[])
  288. {
  289.     return CTestApplication().AppMain( argc, argv, 0, eDS_Default, 0);
  290. }