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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_objmgr.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:25:14  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.41
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_objmgr.cpp,v 1000.3 2004/06/01 19:25:14 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. * Authors:  Eugene Vasilchenko, Aleksey Grichenko, Denis Vakatov
  35. *
  36. * File Description:
  37. *   Test the functionality of C++ object manager in MT mode
  38. *
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbiapp.hpp>
  43. #include <corelib/ncbienv.hpp>
  44. #include <corelib/ncbiargs.hpp>
  45. #include <corelib/ncbitime.hpp>
  46. #include <objects/seqloc/Seq_id.hpp>
  47. #include <objects/seqset/Seq_entry.hpp>
  48. #include <objects/seq/Seq_annot.hpp>
  49. #include "test_helper.hpp"
  50. #include <objects/general/Date.hpp>
  51. BEGIN_NCBI_SCOPE
  52. using namespace objects;
  53. /////////////////////////////////////////////////////////////////////////////
  54. //
  55. //  Test application
  56. //
  57. class CTestApp : public CNcbiApplication
  58. {
  59. public:
  60.     virtual void Init(void);
  61.     virtual int  Run (void);
  62. private:
  63.     CRef<CObjectManager> m_ObjMgr;
  64. };
  65. void CTestApp::Init(void)
  66. {
  67.     // Prepare command line descriptions
  68.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  69.     arg_desc->AddFlag("dump_entries", "print all generated seq entries");
  70.     arg_desc->AddFlag("dump_features", "print all found features");
  71.     string prog_description = "testobjmgr";
  72.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  73.                               prog_description, false);
  74.     SetupArgDescriptions(arg_desc.release());
  75. }
  76. int CTestApp::Run(void)
  77. {
  78.     SetDiagPostFlag(eDPF_All);
  79.     NcbiCout << "Testing ObjectManager..." << NcbiEndl;
  80.     CSeq_id id;
  81.     int idx;
  82.     const CArgs& args = GetArgs();
  83.     CDataGenerator::sm_DumpEntries = args["dump_entries"];
  84.     CTestHelper::sm_DumpFeatures = args["dump_features"];
  85.     CTestHelper::sm_TestRemoveEntry = true;
  86.     m_ObjMgr = new CObjectManager;
  87.     // 1.2.3. Scope is an object on the stack
  88.     for (idx = 0; idx <= 0; idx++) {
  89.         CScope Scope1(*m_ObjMgr);
  90.         CScope Scope2(*m_ObjMgr);
  91.         CScope Scope(*m_ObjMgr);
  92.         // populate
  93. #if 1
  94.         CRef<CSeq_entry> entry1(&CDataGenerator::CreateTestEntry1(idx));
  95.         Scope1.AddTopLevelSeqEntry(*entry1);
  96.         CRef<CSeq_entry> entry2(&CDataGenerator::CreateTestEntry2(idx));
  97.         Scope2.AddTopLevelSeqEntry(*entry2);
  98.         Scope.AddScope(Scope1);
  99.         Scope.AddScope(Scope2);
  100. #else
  101.         CRef<CSeq_entry> entry1(&CDataGenerator::CreateTestEntry1(idx));
  102.         Scope.AddTopLevelSeqEntry(*entry1);
  103.         CRef<CSeq_entry> entry2(&CDataGenerator::CreateTestEntry2(idx));
  104.         Scope.AddTopLevelSeqEntry(*entry2);
  105. #endif
  106.         // retrieve data
  107.         CTestHelper::TestDataRetrieval( Scope, 0, 0);
  108.     }
  109.     // 1.2.3. The same scope twice with the same priority
  110.     for (idx = 0; idx <= 0; idx++) {
  111.         CScope Scope1(*m_ObjMgr);
  112.         CScope Scope(*m_ObjMgr);
  113.         // populate
  114.         CRef<CSeq_entry> entry1(&CDataGenerator::CreateTestEntry1(idx));
  115.         Scope1.AddTopLevelSeqEntry(*entry1);
  116.         CRef<CSeq_entry> entry2(&CDataGenerator::CreateTestEntry2(idx));
  117.         Scope1.AddTopLevelSeqEntry(*entry2);
  118.         Scope.AddScope(Scope1);
  119.         Scope.AddScope(Scope1);
  120.         // retrieve data
  121.         CTestHelper::TestDataRetrieval( Scope, 0, 0);
  122.     }
  123.     // 1.2.4. Scope is an object on the heap
  124.     for (idx = 1; idx <= 1; idx++) {
  125.         CRef<CScope> pScope(new CScope(*m_ObjMgr));
  126.         // populate
  127.         CRef<CSeq_entry> entry1(&CDataGenerator::CreateTestEntry1(idx));
  128.         pScope->AddTopLevelSeqEntry(*entry1);
  129.         CRef<CSeq_entry> entry2(&CDataGenerator::CreateTestEntry2(idx));
  130.         pScope->AddTopLevelSeqEntry(*entry2);
  131.         // retrieve data
  132.         CTestHelper::TestDataRetrieval( *pScope, idx, 0);
  133.     }
  134.     // 1.2.5 add annotation to one sequence
  135.     // verify that others did not change
  136.     for (idx = 1; idx <= 1; idx++) {
  137.         CRef<CScope> pScope(new CScope(*m_ObjMgr));
  138.         // populate
  139.         CRef<CSeq_entry> entry1(&CDataGenerator::CreateTestEntry1(idx));
  140.         pScope->AddTopLevelSeqEntry(*entry1);
  141.         CRef<CSeq_entry> entry2(&CDataGenerator::CreateTestEntry2(idx));
  142.         pScope->AddTopLevelSeqEntry(*entry2);
  143.         CTestHelper::TestDataRetrieval( *pScope, idx, 0);
  144.         // add annotation
  145.         CRef<CSeq_annot> annot(&CDataGenerator::CreateAnnotation1(idx));
  146.         pScope->AttachAnnot(*entry1, *annot);
  147.         // retrieve data  (delta=1 - one more annotation)
  148.         CTestHelper::TestDataRetrieval( *pScope, idx, 1);
  149.         // Take the added annotation back
  150.         pScope->RemoveAnnot(*entry1, *annot);
  151.         CTestHelper::TestDataRetrieval( *pScope, idx, 0);
  152.     }
  153.     // 1.2.6. Constructed bio sequences
  154.     for (idx = 1; idx <= 1; idx++) {
  155.         CScope Scope(*m_ObjMgr);
  156.         CRef<CSeq_entry> entry1(&CDataGenerator::CreateTestEntry1(idx));
  157.         Scope.AddTopLevelSeqEntry(*entry1);
  158.         {{
  159.             CRef<CSeq_entry> constr_entry
  160.                 (&CDataGenerator::CreateConstructedEntry( idx, 1));
  161.             Scope.AddTopLevelSeqEntry(*constr_entry);
  162.             // test
  163.             id.SetLocal().SetStr("constructed1");
  164.             CTestHelper::ProcessBioseq(Scope, id, 27,
  165.                 "GCGGTACAATAACCTCAGCAGCAACAA", "",
  166.                 0, 3, 0, 0, 0, 0, 0, 0, 0, 0);
  167.         }}
  168.         {{
  169.             CRef<CSeq_entry> constr_entry
  170.                 (&CDataGenerator::CreateConstructedEntry( idx, 2));
  171.             Scope.AddTopLevelSeqEntry(*constr_entry);
  172.             // test
  173.             id.SetLocal().SetStr("constructed2");
  174.             CTestHelper::ProcessBioseq(Scope, id, 27,
  175.                 "TACCGCCAATAACCTCAGCAGCAACAA", "",
  176.                 0, 3, 0, 0, 0, 0, 0, 0, 0, 0);
  177.         }}
  178.     }
  179.     // 1.2.7. one entry in two scopes
  180.     for (idx = 1; idx <= 1; idx++) {
  181.         // populate scopes
  182.         CScope Scope1(*m_ObjMgr);
  183.         CRef<CScope> pScope2(new CScope(*m_ObjMgr));
  184.         CRef<CSeq_entry> entry1(&CDataGenerator::CreateTestEntry1(idx));
  185.         CRef<CSeq_entry> entry2(&CDataGenerator::CreateTestEntry2(idx));
  186.         Scope1.AddTopLevelSeqEntry(*entry1);
  187.         Scope1.AddTopLevelSeqEntry(*entry2);
  188.         pScope2->AddTopLevelSeqEntry(*entry2);
  189.         // Test with unresolvable references
  190.         id.SetGi(21+idx*1000);
  191.         CTestHelper::ProcessBioseq(*pScope2, id, 22,
  192.             "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  193.             "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
  194.             "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  195.             "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
  196.             1, -1, 1, 1, 0, 0, 1, 1, 0, 0, false, true);
  197.         // add more data to the scope - to make references resolvable
  198.         CRef<CSeq_entry> entry1a(&CDataGenerator::CreateTestEntry1a(idx));
  199.         pScope2->AddTopLevelSeqEntry(*entry1a);
  200.         // Test with resolvable references
  201.         id.SetGi(21+idx*1000);
  202.         CTestHelper::ProcessBioseq(*pScope2, id, 62,
  203.             "AAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAATTTTTTTTTTTT",
  204.             "TTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATTTTTAAAAAAAAAAAA",
  205.             1, 2, 2, 1, 0, 0, 1, 1, 0, 0);
  206.         // 1.2.8. Test scope history
  207.         CRef<CSeq_entry> entry1b(&CDataGenerator::CreateTestEntry1(idx));
  208.         pScope2->AddTopLevelSeqEntry(*entry1b);
  209.         id.SetLocal().SetStr("seq"+NStr::IntToString(11+idx*1000));
  210.         // gi|11 from entry1a must be selected
  211.         CTestHelper::ProcessBioseq(*pScope2, id, 40,
  212.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
  213.             "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT",
  214.             0, 2, 2, 1, 0, 0, 1, 1, 0, 0);
  215.     }
  216.     NcbiCout << " Passed" << NcbiEndl << NcbiEndl;
  217.     return 0;
  218. }
  219. END_NCBI_SCOPE
  220. /////////////////////////////////////////////////////////////////////////////
  221. //  MAIN
  222. USING_NCBI_SCOPE;
  223. int main(int argc, const char* argv[])
  224. {
  225.     return CTestApp().AppMain(argc, argv, 0, eDS_Default, 0);
  226. }
  227. /*
  228. * ---------------------------------------------------------------------------
  229. * $Log: test_objmgr.cpp,v $
  230. * Revision 1000.3  2004/06/01 19:25:14  gouriano
  231. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.41
  232. *
  233. * Revision 1.41  2004/05/21 21:42:14  gorelenk
  234. * Added PCH ncbi_pch.hpp
  235. *
  236. * Revision 1.40  2004/04/01 20:18:12  grichenk
  237. * Added initialization of m_MultiId member.
  238. *
  239. * Revision 1.39  2004/03/31 22:35:17  grichenk
  240. * Fixed number of features found
  241. *
  242. * Revision 1.38  2004/02/03 17:58:51  vasilche
  243. * Always test CScope::RemoveEntry() in single thread.
  244. *
  245. * Revision 1.37  2003/11/04 16:21:37  grichenk
  246. * Updated CAnnotTypes_CI to map whole features instead of splitting
  247. * them by sequence segments.
  248. *
  249. * Revision 1.36  2003/10/09 14:00:56  vasilche
  250. * Added test for multiple instances of datasource.
  251. *
  252. * Revision 1.35  2003/09/30 20:40:48  vasilche
  253. * Added test for CScope::AddScope().
  254. *
  255. * Revision 1.34  2003/09/30 18:04:13  vasilche
  256. * Temporarily avoid failed assertion.
  257. *
  258. * Revision 1.33  2003/09/30 16:22:05  vasilche
  259. * Updated internal object manager classes to be able to load ID2 data.
  260. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  261. * Scope caches results of requests for data to data loaders.
  262. * Optimized CSeq_id_Handle for gis.
  263. * Optimized bioseq lookup in scope.
  264. * Reduced object allocations in annotation iterators.
  265. * CScope is allowed to be destroyed before other objects using this scope are
  266. * deleted (feature iterators, bioseq handles etc).
  267. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  268. * Added 'adaptive' option to objmgr_demo application.
  269. *
  270. * Revision 1.32  2003/08/29 13:34:48  vasilche
  271. * Rewrote CSeqVector/CSeqVector_CI code to allow better inlining.
  272. * CSeqVector::operator[] made significantly faster.
  273. * Added possibility to have platform dependent byte unpacking functions.
  274. *
  275. * Revision 1.31  2003/04/24 16:12:39  vasilche
  276. * Object manager internal structures are splitted more straightforward.
  277. * Removed excessive header dependencies.
  278. *
  279. * Revision 1.30  2003/03/27 21:54:58  grichenk
  280. * Renamed test applications and makefiles, updated references
  281. *
  282. * Revision 1.29  2003/03/26 14:30:23  lavr
  283. * Conform to modified representation of NUL char in NStr::PrintableString()
  284. *
  285. * Revision 1.28  2003/03/04 16:43:53  grichenk
  286. * +Test CFeat_CI with eResolve_All flag
  287. *
  288. * Revision 1.27  2003/02/28 16:37:47  vasilche
  289. * Fixed expected feature count.
  290. * Added optional flags to testobjmgr to dump generated data and found features.
  291. *
  292. * Revision 1.26  2002/12/26 16:39:24  vasilche
  293. * Object manager class CSeqMap rewritten.
  294. *
  295. * Revision 1.25  2002/11/08 22:15:53  grichenk
  296. * Added methods for removing/replacing annotations
  297. *
  298. * Revision 1.24  2002/11/04 21:29:14  grichenk
  299. * Fixed usage of const CRef<> and CRef<> constructor
  300. *
  301. * Revision 1.23  2002/05/09 14:21:50  grichenk
  302. * Turned GetTitle() test on, removed unresolved seq-map test
  303. *
  304. * Revision 1.22  2002/04/25 18:15:25  grichenk
  305. * Adjusted tests to work with the updated CSeqVector
  306. *
  307. * Revision 1.21  2002/04/22 20:07:45  grichenk
  308. * Commented calls to CBioseq::ConstructExcludedSequence()
  309. *
  310. * Revision 1.20  2002/03/18 21:47:16  grichenk
  311. * Moved most includes to test_helper.cpp
  312. * Added test for CBioseq::ConstructExcludedSequence()
  313. *
  314. * Revision 1.19  2002/03/13 18:06:31  gouriano
  315. * restructured MT test. Put common functions into a separate file
  316. *
  317. * Revision 1.18  2002/03/08 21:23:50  gouriano
  318. * reorganized and classified tests
  319. *
  320. * Revision 1.16  2002/03/05 16:08:16  grichenk
  321. * Moved TSE-restriction to new constructors
  322. *
  323. * Revision 1.15  2002/03/04 17:07:18  grichenk
  324. * +Testing feature iterators with single TSE restriction
  325. *
  326. * Revision 1.14  2002/02/25 21:05:31  grichenk
  327. * Removed seq-data references caching. Increased MT-safety. Fixed typos.
  328. *
  329. * Revision 1.13  2002/02/21 19:27:09  grichenk
  330. * Rearranged includes. Added scope history. Added searching for the
  331. * best seq-id match in data sources and scopes. Updated tests.
  332. *
  333. * Revision 1.12  2002/02/07 21:27:36  grichenk
  334. * Redesigned CDataSource indexing: seq-id handle -> TSE -> seq/annot
  335. *
  336. * Revision 1.11  2002/02/06 21:46:11  gouriano
  337. * *** empty log message ***
  338. *
  339. * Revision 1.10  2002/02/05 21:46:28  gouriano
  340. * added FindSeqid function, minor tuneup in CSeq_id_mapper
  341. *
  342. * Revision 1.9  2002/02/04 21:16:27  gouriano
  343. * minor changes to make it run correctly on Solaris
  344. *
  345. * Revision 1.8  2002/01/30 22:09:28  gouriano
  346. * changed CSeqMap interface
  347. *
  348. * Revision 1.7  2002/01/29 17:47:33  grichenk
  349. * Removed commented part
  350. *
  351. * Revision 1.6  2002/01/28 19:44:50  gouriano
  352. * changed the interface of BioseqHandle: two functions moved from Scope
  353. *
  354. * Revision 1.5  2002/01/23 21:59:34  grichenk
  355. * Redesigned seq-id handles and mapper
  356. *
  357. * Revision 1.4  2002/01/18 17:06:30  gouriano
  358. * renamed CScope::GetSequence to CScope::GetSeqVector
  359. *
  360. * Revision 1.3  2002/01/16 18:56:30  grichenk
  361. * Removed CRef<> argument from choice variant setter, updated sources to
  362. * use references instead of CRef<>s
  363. *
  364. * Revision 1.2  2002/01/16 16:28:46  gouriano
  365. * restructured objmgr
  366. *
  367. * Revision 1.1  2002/01/11 19:06:28  gouriano
  368. * restructured objmgr
  369. *
  370. * Revision 1.31  2001/12/20 20:00:30  grichenk
  371. * CObjectManager::ConstructBioseq(CSeq_loc) -> CBioseq::CBioseq(CSeq_loc ...)
  372. *
  373. * Revision 1.30  2001/12/12 22:39:11  grichenk
  374. * Added test for minus-strand intervals in constructed bioseqs
  375. *
  376. * Revision 1.29  2001/12/12 17:48:45  grichenk
  377. * Fixed code using generated classes to work with the updated datatool
  378. *
  379. * Revision 1.28  2001/12/07 19:08:44  grichenk
  380. * Updated Object manager test
  381. *
  382. *
  383. * ===========================================================================
  384. */