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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_plugins.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 20:45:07  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_plugins.cpp,v 1000.2 2004/06/01 20:45:07 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:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *    Test application for plugins
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbiapp.hpp>
  41. #include <corelib/ncbiargs.hpp>
  42. #include <corelib/ncbienv.hpp>
  43. #include <corelib/ncbireg.hpp>
  44. #include <gui/core/doc_manager.hpp>
  45. #include <gui/core/idocument.hpp>
  46. #include <gui/core/plugin_exception.hpp>
  47. #include <gui/core/plugin_utils.hpp>
  48. #include <gui/plugin/PluginArgSet.hpp>
  49. #include <objects/seq/Bioseq.hpp>
  50. #include <objects/seq/Seq_annot.hpp>
  51. #include <objects/seqalign/Seq_align.hpp>
  52. #include <objects/seqloc/Seq_id.hpp>
  53. #include <objects/seqset/Seq_entry.hpp>
  54. #include <objmgr/object_manager.hpp>
  55. #include <objmgr/scope.hpp>
  56. USING_NCBI_SCOPE;
  57. USING_SCOPE(objects);
  58. //
  59. // a test exception class
  60. //
  61. class CPluginTestException : EXCEPTION_VIRTUAL_BASE public CException
  62. {
  63. public:
  64.     // Enumerated list of document management errors
  65.     enum EErrCode {
  66.         eTestFailed
  67.     };
  68.     // Translate the specific error code into a string representations of
  69.     // that error code.
  70.     virtual const char* GetErrCodeString(void) const
  71.     {
  72.         switch (GetErrCode()) {
  73.         case eTestFailed:   return "eTestFailed";
  74.         default:            return CException::GetErrCodeString();
  75.         }
  76.     }
  77.     NCBI_EXCEPTION_DEFAULT(CPluginTestException, CException);
  78. };
  79. class CPluginTestApp : public CNcbiApplication
  80. {
  81. public:
  82.     CPluginTestApp();
  83. private:
  84.     int m_Plugins;
  85.     virtual void Init(void);
  86.     virtual int  Run(void);
  87.     virtual void Exit(void);
  88.     void TestPluginArgSet();
  89. };
  90. CPluginTestApp::CPluginTestApp()
  91.     : m_Plugins(0)
  92. {
  93. }
  94. void CPluginTestApp::Init(void)
  95. {
  96.     // Create command-line argument descriptions class
  97.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  98.     // Specify USAGE context
  99.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  100.                               "Plug-in test application");
  101.     // Setup arg.descriptions for this application
  102.     SetupArgDescriptions(arg_desc.release());
  103. }
  104. void CPluginTestApp::TestPluginArgSet(void)
  105. {
  106.     {{
  107.          // build a list of arguments in a temporary CPluginArgSet
  108.          CPluginArgSet args;
  109.          cout << "testing built-in argument types..." << endl;
  110.          args.AddArgument("int",    "Integer", CPluginArg::eInteger);
  111.          args.AddArgument("double", "Double",  CPluginArg::eDouble);
  112.          args.AddArgument("string", "String",  CPluginArg::eString);
  113.          // make sure these args are invalid
  114.          if ( CPluginUtils::IsValid(args["int"]) ) {
  115.              NCBI_THROW(CPluginTestException, eTestFailed,
  116.                         "Invalid integer argument reports itself as valid");
  117.          } else {
  118.              LOG_POST(Error
  119.                       << "  empty integer value correctly reports invalid");
  120.          }
  121.          if ( CPluginUtils::IsValid(args["double"]) ) {
  122.              NCBI_THROW(CPluginTestException, eTestFailed,
  123.                         "Invalid double argument reports itself as valid");
  124.          } else {
  125.              LOG_POST(Error
  126.                       << "  empty double value correctly reports invalid");
  127.          }
  128.          if ( CPluginUtils::IsValid(args["string"]) ) {
  129.              NCBI_THROW(CPluginTestException, eTestFailed,
  130.                         "Invalid string argument reports itself as valid");
  131.          } else {
  132.              LOG_POST(Error
  133.                       << "  empty string value correctly reports invalid");
  134.          }
  135.          args["int"   ].SetInteger(0);
  136.          args["double"].SetDouble(0.0);
  137.          args["string"].SetString("foo");
  138.          // make sure these args are valid
  139.          if ( !CPluginUtils::IsValid(args["int"]) ) {
  140.              NCBI_THROW(CPluginTestException, eTestFailed,
  141.                         "Valid integer argument reports itself as invalid");
  142.          } else {
  143.              LOG_POST(Error
  144.                       << "  valid integer value correctly reports valid");
  145.          }
  146.          if ( !CPluginUtils::IsValid(args["double"]) ) {
  147.              NCBI_THROW(CPluginTestException, eTestFailed,
  148.                         "Valid double argument reports itself as invalid");
  149.          } else {
  150.              LOG_POST(Error
  151.                       << "  valid double value correctly reports valid");
  152.          }
  153.          if ( !CPluginUtils::IsValid(args["string"]) ) {
  154.              NCBI_THROW(CPluginTestException, eTestFailed,
  155.                         "Valid string argument reports itself as invalid");
  156.          } else {
  157.              LOG_POST(Error
  158.                       << "  valid string value correctly reports valid");
  159.          }
  160.      }}
  161.     //
  162.     // more complicated validity checks...
  163.     //
  164.     // set some values in these arguments
  165.     CRef<CScope> scope(new CScope(CDocManager::GetObjectManager()));
  166.     scope->AddDefaults();
  167.     CRef<CSeq_id> id(new CSeq_id("ref|NT_029998"));
  168.     CRef<IDocument> doc(CDocManager::CreateDocument(*scope, *id));
  169.     {{
  170.          // build a list of arguments in a temporary CPluginArgSet
  171.          CPluginArgSet args;
  172.          cout << "testing data model argument types..." << endl;
  173.          args.AddArgument("bioseq",    "Bioseq",    CBioseq::GetTypeInfo());
  174.          args.AddArgument("seq-align", "Seq-align", CSeq_align::GetTypeInfo());
  175.          args.AddArgument("seq-entry", "Seq-entry", CSeq_entry::GetTypeInfo());
  176.          args.AddArgument("seq-feat",  "Seq-feat",  CSeq_feat::GetTypeInfo());
  177.          args.AddArgument("seq-loc",   "Seq-loc",   CSeq_loc::GetTypeInfo());
  178.          // make sure these args are invalid
  179.          if ( CPluginUtils::IsValid(args["bioseq"]) ) {
  180.              NCBI_THROW(CPluginTestException, eTestFailed,
  181.                         "Invalid bioseq argument reports itself as valid");
  182.          } else {
  183.              LOG_POST(Error
  184.                       << "  invalid bioseq value reports invalid");
  185.          }
  186.          if ( CPluginUtils::IsValid(args["seq-feat"]) ) {
  187.              NCBI_THROW(CPluginTestException, eTestFailed,
  188.                         "Invalid seq-feat argument reports itself as valid");
  189.          } else {
  190.              LOG_POST(Error
  191.                       << "  invalid seq-feat value reports invalid");
  192.          }
  193.          if ( CPluginUtils::IsValid(args["seq-loc"]) ) {
  194.              NCBI_THROW(CPluginTestException, eTestFailed,
  195.                         "Invalid seq-loc argument reports itself as valid");
  196.          } else {
  197.              LOG_POST(Error
  198.                       << "  invalid seq-loc value reports invalid");
  199.          }
  200.          if ( CPluginUtils::IsValid(args["seq-entry"]) ) {
  201.              NCBI_THROW(CPluginTestException, eTestFailed,
  202.                         "Invalid seq-entry argument reports itself as valid");
  203.          } else {
  204.              LOG_POST(Error
  205.                       << "  invalid seq-entry value reports invalid");
  206.          }
  207.          if ( CPluginUtils::IsValid(args["seq-align"]) ) {
  208.              NCBI_THROW(CPluginTestException, eTestFailed,
  209.                         "Invalid seq-align argument reports itself as valid");
  210.          } else {
  211.              LOG_POST(Error
  212.                       << "  invalid seq-align value reports invalid");
  213.          }
  214.          CRef<CBioseq>    bioseq(new CBioseq());
  215.          CRef<CSeq_align> align (new CSeq_align());
  216.          CRef<CSeq_entry> entry (new CSeq_entry());
  217.          CRef<CSeq_feat>  feat  (new CSeq_feat());
  218.          CRef<CSeq_loc>   loc   (new CSeq_loc());
  219.          args["bioseq"   ].SetObject(*doc, *bioseq);
  220.          args["seq-align"].SetObject(*doc, *align);
  221.          args["seq-entry"].SetObject(*doc, *entry);
  222.          args["seq-feat" ].SetObject(*doc, *feat);
  223.          args["seq-loc"  ].SetObject(*doc, *loc);
  224.          // make sure these args are valid
  225.          if ( !CPluginUtils::IsValid(args["bioseq"]) ) {
  226.              NCBI_THROW(CPluginTestException, eTestFailed,
  227.                         "Valid bioseq argument reports itself as invalid");
  228.          } else {
  229.              LOG_POST(Error
  230.                       << "  valid bioseq value reports valid");
  231.          }
  232.          if ( !CPluginUtils::IsValid(args["seq-feat"]) ) {
  233.              NCBI_THROW(CPluginTestException, eTestFailed,
  234.                         "Valid seq-feat argument reports itself as invalid");
  235.          } else {
  236.              LOG_POST(Error
  237.                       << "  valid seq-feat value reports valid");
  238.          }
  239.          if ( !CPluginUtils::IsValid(args["seq-loc"]) ) {
  240.              NCBI_THROW(CPluginTestException, eTestFailed,
  241.                         "Valid seq-loc argument reports itself as invalid");
  242.          } else {
  243.              LOG_POST(Error
  244.                       << "  valid seq-loc value reports valid");
  245.          }
  246.          if ( !CPluginUtils::IsValid(args["seq-entry"]) ) {
  247.              NCBI_THROW(CPluginTestException, eTestFailed,
  248.                         "Valid seq-entry argument reports itself as invalid");
  249.          } else {
  250.              LOG_POST(Error
  251.                       << "  valid seq-entry value reports valid");
  252.          }
  253.          if ( !CPluginUtils::IsValid(args["seq-align"]) ) {
  254.              NCBI_THROW(CPluginTestException, eTestFailed,
  255.                         "Valid seq-align argument reports itself as invalid");
  256.          } else {
  257.              LOG_POST(Error
  258.                       << "  valid seq-align value reports valid");
  259.          }
  260.      }}
  261.     //
  262.     // optional arguments
  263.     //
  264.     {{
  265.          CPluginArgSet args;
  266.          cout << "testing optional argument types..." << endl;
  267.          args.AddOptionalArgument("foo", "Foo", CPluginArg::eInteger);
  268.          // test nonexistant argument and catch its exception
  269.          try {
  270.              if ( CPluginUtils::IsValid(args["nonexistant"])) {
  271.                  LOG_POST(Error << "found valid nonexistant argument");
  272.              }
  273.          }
  274.          catch (CPluginException& e) {
  275.              LOG_POST(Error << "correctly caught CPluginException - message = "
  276.                       << e.what());
  277.          }
  278.          // next, test existant but invalid argument
  279.          try {
  280.              if ( CPluginUtils::IsValid(args["foo"])) {
  281.                  LOG_POST(Error << "foo found, is valid");
  282.              } else {
  283.                  LOG_POST(Error << "foo found, isn't valid");
  284.              }
  285.              const CPluginArg& arg = args["foo"];
  286.              if (arg.IsEmpty()) {
  287.                  LOG_POST(Error << "foo found, is empty");
  288.              }
  289.          }
  290.          catch (CPluginException& e) {
  291.              LOG_POST(Error << "caught CPluginException: " << e.what());
  292.              throw;
  293.          }
  294.      }}
  295.     cout << "test of CPluginArgSet SUCCEEDED." << endl;
  296. }
  297. int CPluginTestApp::Run(void)
  298. {
  299.     // Get arguments
  300.     CArgs args = GetArgs();
  301.     // test CPluginArgSet
  302.     TestPluginArgSet();
  303.     return 0;
  304. }
  305. /////////////////////////////////////////////////////////////////////////////
  306. //  Cleanup
  307. void CPluginTestApp::Exit(void)
  308. {
  309.     SetDiagStream(0);
  310. }
  311. /////////////////////////////////////////////////////////////////////////////
  312. //  MAIN
  313. int main(int argc, const char* argv[])
  314. {
  315.     // Execute main application function
  316.     return CPluginTestApp().AppMain(argc, argv, 0, eDS_Default, 0);
  317. }
  318. /*
  319.  * ===========================================================================
  320.  * $Log: test_plugins.cpp,v $
  321.  * Revision 1000.2  2004/06/01 20:45:07  gouriano
  322.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  323.  *
  324.  * Revision 1.13  2004/05/21 22:27:41  gorelenk
  325.  * Added PCH ncbi_pch.hpp
  326.  *
  327.  * Revision 1.12  2004/01/07 17:39:02  vasilche
  328.  * Fixed include path to genbank loader.
  329.  *
  330.  * Revision 1.11  2003/09/29 15:42:05  dicuccio
  331.  * Deprecated gui/scope.hpp.  Merged gui/core/types.hpp into gui/types.hpp
  332.  *
  333.  * Revision 1.10  2003/09/04 18:27:33  dicuccio
  334.  * Use IDocument instead of CDocument
  335.  *
  336.  * Revision 1.9  2003/09/04 14:01:52  dicuccio
  337.  * Introduce IDocument and IView as abstract base classes for CDocument and CView
  338.  *
  339.  * Revision 1.8  2003/07/24 02:37:42  ucko
  340.  * Moved logic for validating arguments into CPluginUtils.
  341.  *
  342.  * Revision 1.7  2003/06/25 17:02:55  dicuccio
  343.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  344.  * implementation file.  Lots of #include file clean-ups.
  345.  *
  346.  * Revision 1.6  2003/06/02 16:06:18  dicuccio
  347.  * Rearranged src/objects/ subtree.  This includes the following shifts:
  348.  *     - src/objects/asn2asn --> arc/app/asn2asn
  349.  *     - src/objects/testmedline --> src/objects/ncbimime/test
  350.  *     - src/objects/objmgr --> src/objmgr
  351.  *     - src/objects/util --> src/objmgr/util
  352.  *     - src/objects/alnmgr --> src/objtools/alnmgr
  353.  *     - src/objects/flat --> src/objtools/flat
  354.  *     - src/objects/validator --> src/objtools/validator
  355.  *     - src/objects/cddalignview --> src/objtools/cddalignview
  356.  * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  357.  * replaces the three libmmdb? libs.
  358.  *
  359.  * Revision 1.5  2003/05/19 13:36:00  dicuccio
  360.  * Moved gui/core/plugin/ -> gui/plugin/.  Merged gui/core/algo, gui/core/doc/,
  361.  * and gui/core/view/ into one library (gui/core/)
  362.  *
  363.  * Revision 1.4  2003/05/09 16:50:28  dicuccio
  364.  * Previous log message should have been:
  365.  * Revised all tests - made reporting more explicit.  Added tests for optional and
  366.  * default arguments, explicitly test IsValid() and IsEmpty()
  367.  *
  368.  * Revision 1.3  2003/05/09 16:48:25  dicuccio
  369.  * Added explicit verification that default set-constraint string arguments will
  370.  * ave their menu values shown
  371.  *
  372.  * Revision 1.2  2003/04/25 14:15:24  dicuccio
  373.  * Fix compilation errors resulting from changes to plugin API
  374.  *
  375.  * Revision 1.1  2003/03/20 19:57:28  dicuccio
  376.  * Initial revision
  377.  *
  378.  * ===========================================================================
  379.  */