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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_plugins.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:10:30  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_plugins.cpp,v 1000.1 2004/06/01 19:10:30 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: Anatoliy Kuznetsov
  35.  *
  36.  * File Description:
  37.  *   Plugin manager test
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbiapp.hpp>
  42. #include <corelib/ncbiargs.hpp>
  43. #include <corelib/plugin_manager.hpp>
  44. #include <corelib/plugin_manager_impl.hpp>
  45. #include <test/test_assert.h>  /* This header must go last */
  46. BEGIN_NCBI_SCOPE
  47. struct ITest
  48. {
  49.     int  a;
  50.     ITest() : a(10) {}
  51.     virtual int GetA() const = 0;
  52. };
  53. struct ITest2
  54. {
  55.     int  b;
  56.     ITest2() : b(0) {}
  57. };
  58. class CTestDriver : public ITest
  59. {
  60. public:
  61.     CTestDriver() {}
  62.     int GetA() const { return a; }
  63. };
  64. class CTestDriver2 : public ITest
  65. {
  66. public:
  67.     CTestDriver2() {}
  68.     int GetA() const { return 15; }
  69. };
  70. /*
  71. template<> 
  72. class CInterfaceVersion<ITest>
  73. public: 
  74.     enum { 
  75.         eMajor      = 1, 
  76.         eMinor      = 1,
  77.         ePatchLevel = 0 
  78.     };
  79.     static const char* GetName() { return "itest"; } 
  80. };
  81. */
  82. NCBI_DECLARE_INTERFACE_VERSION(ITest,  "itest", 1, 1, 0);
  83. NCBI_DECLARE_INTERFACE_VERSION(ITest2, "itest2", 1, 1, 0);
  84. class CTestCF : public CSimpleClassFactoryImpl<ITest, CTestDriver>
  85. {
  86. public:
  87.     typedef CSimpleClassFactoryImpl<ITest, CTestDriver> TParent;
  88. public:
  89.     CTestCF() : TParent("test_driver", 0)
  90.     {
  91.     }
  92.     ~CTestCF()
  93.     {
  94.     }
  95. };
  96. class CTestCF2 : public CSimpleClassFactoryImpl<ITest, CTestDriver2>
  97. {
  98. public:
  99.     typedef CSimpleClassFactoryImpl<ITest, CTestDriver2> TParent;
  100. public:
  101.     CTestCF2() : TParent("test_driver2", 0)
  102.     {
  103.     }
  104.     ~CTestCF2()
  105.     {
  106.     }
  107. };
  108. //extern "C" {
  109. void NCBI_TestEntryPoint(CPluginManager<ITest>::TDriverInfoList&   info_list,
  110.                          CPluginManager<ITest>::EEntryPointRequest method)
  111. {
  112.     CHostEntryPointImpl<CTestCF>::NCBI_EntryPointImpl(info_list, method);
  113. }
  114. void NCBI_Test2EntryPoint(CPluginManager<ITest>::TDriverInfoList&   info_list,
  115.                          CPluginManager<ITest>::EEntryPointRequest method)
  116. {
  117.     CHostEntryPointImpl<CTestCF2>::NCBI_EntryPointImpl(info_list, method);
  118. }
  119. //}  // extern "C"
  120. END_NCBI_SCOPE
  121. USING_NCBI_SCOPE;
  122. static void s_TEST_PluginManager(void)
  123. {
  124.     CPluginManager<ITest> pm;
  125.     CPluginManager<ITest>::FNCBI_EntryPoint ep = NCBI_TestEntryPoint;
  126.     pm.RegisterWithEntryPoint(ep);
  127.     try {
  128.         ITest* itest = pm.CreateInstance();
  129.         int a = itest->GetA();
  130.         assert(a == 10);
  131.         delete itest;
  132.     } 
  133.     catch (CPluginManagerException& ex)
  134.     {
  135.         cout << "Cannot create ITest instance. " << ex.what() << endl;
  136.         assert(0);
  137.     }
  138.     // Try to find not yet registered driver
  139.     try {
  140.         ITest* itest = pm.CreateInstance("test_driver2");
  141.         assert(0);
  142.         itest->GetA();
  143.     } 
  144.     catch (CPluginManagerException&)
  145.     {
  146.     }
  147.     ep = NCBI_Test2EntryPoint;
  148.     pm.RegisterWithEntryPoint(ep);
  149.     try {
  150.         ITest* itest2 = pm.CreateInstance("test_driver2");
  151.         ITest* itest  = pm.CreateInstance("test_driver");
  152.         int a = itest2->GetA();
  153.         assert(a == 15);
  154.         a = itest->GetA();
  155.         assert(a == 10);
  156.         delete itest2;
  157.         delete itest;
  158.     } 
  159.     catch (CPluginManagerException& ex)
  160.     {
  161.         cout << "Cannot create ITest instance. " << ex.what() << endl;
  162.         assert(0);
  163.     }
  164. }
  165. ////////////////////////////////
  166. // Test application
  167. //
  168. class CTest : public CNcbiApplication
  169. {
  170. public:
  171.     void Init(void);
  172.     int Run(void);
  173. };
  174. void CTest::Init(void)
  175. {
  176.     SetDiagPostLevel(eDiag_Warning);
  177.     auto_ptr<CArgDescriptions> d(new CArgDescriptions);
  178.     d->SetUsageContext("test_dll", "DLL accessory class");
  179.     SetupArgDescriptions(d.release());
  180. }
  181. int CTest::Run(void)
  182. {
  183.     cout << "Run test" << endl << endl;
  184.     s_TEST_PluginManager();
  185.     cout << endl;
  186.     cout << "TEST execution completed successfully!" << endl << endl;
  187.     return 0;
  188. }
  189. ///////////////////////////////////
  190. // APPLICATION OBJECT  and  MAIN
  191. //
  192. int main(int argc, const char* argv[])
  193. {
  194.     return CTest().AppMain(argc, argv, 0, eDS_Default, 0);
  195. }
  196. /*
  197.  * ===========================================================================
  198.  * $Log: test_plugins.cpp,v $
  199.  * Revision 1000.1  2004/06/01 19:10:30  gouriano
  200.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  201.  *
  202.  * Revision 1.4  2004/05/14 13:59:51  gorelenk
  203.  * Added include of ncbi_pch.hpp
  204.  *
  205.  * Revision 1.3  2003/11/19 14:02:17  kuznets
  206.  * Included plugin_manager_impl.hpp
  207.  *
  208.  * Revision 1.2  2003/11/18 17:08:07  kuznets
  209.  * Fixed Workshop compile warnings
  210.  *
  211.  * Revision 1.1  2003/11/18 14:47:34  kuznets
  212.  * Initial revision
  213.  *
  214.  *
  215.  * ===========================================================================
  216.  */