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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: asniotest.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:41:07  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: asniotest.cpp,v 1000.2 2004/06/01 19:41: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:  Paul Thiessen
  35. *
  36. * File Description:
  37. *      test suite for asn serialization library, asn data i/o
  38. *
  39. * ===========================================================================
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <corelib/ncbienv.hpp>
  43. #include <corelib/ncbifile.hpp>
  44. #include <corelib/ncbitime.hpp>
  45. #include <serial/serial.hpp>
  46. #include <serial/objistrasn.hpp>
  47. #include <serial/objistrasnb.hpp>
  48. #include <serial/objostrasn.hpp>
  49. #include <serial/objostrasnb.hpp>
  50. #include <util/random_gen.hpp>
  51. #include <memory>
  52. #include <objects/seqloc/Seq_loc.hpp>
  53. #include <objects/seqloc/Seq_interval.hpp>
  54. #include <objects/seqloc/Seq_id.hpp>
  55. #include <objects/seqloc/PDB_seq_id.hpp>
  56. #include <objects/seqloc/PDB_mol_id.hpp>
  57. #include <objects/cdd/Cdd.hpp>
  58. #include <objects/cdd/Global_id.hpp>
  59. #include <objects/ncbimime/Ncbi_mime_asn1.hpp>
  60. #include <objects/mmdb1/Atom.hpp>
  61. #include <objects/mmdb1/Atom_id.hpp>
  62. #include <objects/mmdb2/Model_space_points.hpp>
  63. #include <objects/mmdb3/Region_coordinates.hpp>
  64. #include <objects/cn3d/Cn3d_color.hpp>
  65. #include <objects/general/User_object.hpp>
  66. #include <objects/seqset/Seq_entry.hpp>
  67. #include <objects/id1/ID1server_maxcomplex.hpp>
  68. #include <objects/id1/id1_client.hpp>
  69. #include "asniotest.hpp"
  70. BEGIN_NCBI_SCOPE
  71. USING_SCOPE(objects);
  72. // diagnostic streams
  73. #define INFOMSG(stream) ERR_POST(Info << stream)
  74. #define WARNINGMSG(stream) ERR_POST(Warning << stream)
  75. #define ERRORMSG(stream) ERR_POST(Error << stream << '!')
  76. // directory that contains test files (default overridden by env. var. ASNIOTEST_FILES)
  77. string pathToFiles(".");
  78. // keep track of files created, to remove them at the end
  79. list < string > filesCreated;
  80. // a utility function for reading different types of ASN data from a file
  81. template < class ASNClass >
  82. bool ReadASNFromFile(const char *filename, ASNClass *ASNobject, bool isBinary, string *err)
  83. {
  84.     err->erase();
  85.     // initialize the binary input stream
  86.     auto_ptr<CNcbiIstream> inStream;
  87.     inStream.reset(new CNcbiIfstream(
  88.         (pathToFiles + CDirEntry::GetPathSeparator() + filename).c_str(),
  89.         IOS_BASE::in | IOS_BASE::binary));
  90.     if (!(*inStream)) {
  91.         *err = "Cannot open file for reading";
  92.         return false;
  93.     }
  94.     auto_ptr<CObjectIStream> inObject;
  95.     if (isBinary) {
  96.         // Associate ASN.1 binary serialization methods with the input
  97.         inObject.reset(new CObjectIStreamAsnBinary(*inStream));
  98.     } else {
  99.         // Associate ASN.1 text serialization methods with the input
  100.         inObject.reset(new CObjectIStreamAsn(*inStream));
  101.     }
  102.     // Read the asn data
  103.     bool okay = true;
  104.     try {
  105.         *inObject >> *ASNobject;
  106.         INFOMSG("read file " << filename);
  107.     } catch (exception& e) {
  108.         *err = e.what();
  109.         okay = false;
  110.     }
  111.     return okay;
  112. }
  113. // for writing out ASN data (to temporary files); all files written this way will be removed at program end
  114. template < class ASNClass >
  115. bool WriteASNToFile(const ASNClass& ASNobject, bool isBinary,
  116.     string *err, EFixNonPrint fixNonPrint = eFNP_Default)
  117. {
  118.     err->erase();
  119.     // construct a temp file name
  120.     CNcbiOstrstream oss;
  121.     oss << "test_" << (filesCreated.size() + 1) << (isBinary ? ".bin" : ".txt");
  122.     string filename = CNcbiOstrstreamToString(oss);
  123.     string fullPath = CDirEntry::MakePath(pathToFiles, filename);
  124.     if (CFile(fullPath).Exists()) {
  125.         WARNINGMSG("Overwriting temporary file " << fullPath);
  126.         // *err = "Can't overwrite file ";
  127.         // *err += fullPath;
  128.         // return false;
  129.     }
  130.     // initialize a binary output stream
  131.     auto_ptr<CNcbiOstream> outStream;
  132.     outStream.reset(new CNcbiOfstream(
  133.         fullPath.c_str(),
  134.         isBinary ? (IOS_BASE::out | IOS_BASE::binary) : IOS_BASE::out));
  135.     if (!(*outStream)) {
  136.         *err = "Cannot open file for writing";
  137.         return false;
  138.     }
  139.     filesCreated.push_back(fullPath);
  140.     auto_ptr<CObjectOStream> outObject;
  141.     if (isBinary) {
  142.         // Associate ASN.1 binary serialization methods with the input
  143.         outObject.reset(new CObjectOStreamAsnBinary(*outStream, fixNonPrint));
  144.     } else {
  145.         // Associate ASN.1 text serialization methods with the input
  146.         outObject.reset(new CObjectOStreamAsn(*outStream, fixNonPrint));
  147.     }
  148.     // write the asn data
  149.     bool okay = true;
  150.     try {
  151.         *outObject << ASNobject;
  152.         outStream->flush();
  153.         INFOMSG("wrote file " << filename);
  154.     } catch (exception& e) {
  155.         *err = e.what();
  156.         okay = false;
  157.     }
  158.     return okay;
  159. }
  160. template < class ASNClass >
  161. bool WriteASNToFilesTxtBin(const ASNClass& ASNobject, string *err)
  162. {
  163.     return (WriteASNToFile(ASNobject, false, err) && WriteASNToFile(ASNobject, true, err));
  164. }
  165. // test function macros
  166. #define BEGIN_TEST_FUNCTION(func) 
  167.     int func (void) { 
  168.         int nErrors = 0; 
  169.         string err; 
  170.         INFOMSG("Running " #func " test");
  171. #define END_TEST_FUNCTION 
  172.         return nErrors; 
  173.     }
  174. #define ADD_ERR(msg) 
  175.     do { 
  176.         ERRORMSG(msg); 
  177.         nErrors++; 
  178.     } while (0)
  179. #define ADD_ERR_RETURN(msg) 
  180.     do { 
  181.         ERRORMSG(msg); 
  182.         nErrors++; 
  183.         return nErrors; 
  184.     } while (0)
  185. #define SHOULD_THROW_EXCEPTION(object, accessor) 
  186.     do { 
  187.         try { 
  188.             object.accessor(); 
  189.             ADD_ERR(#accessor "() should have thrown an exception"); 
  190.         } catch (exception& e) { 
  191.             INFOMSG(#accessor "() correctly threw exception " << e.what()); 
  192.         } 
  193.     } while (0)
  194. // tests reading and writing of asn data files
  195. BEGIN_TEST_FUNCTION(BasicFileIO)
  196.     // read in a trivial object
  197.     CSeq_id seqId;
  198.     if (!ReadASNFromFile("pdbSeqId.txt", &seqId, false, &err))
  199.         ADD_ERR_RETURN("failed to load pdbSeqId.txt: " << err);
  200.     // test text and binary output
  201.     if (!WriteASNToFilesTxtBin(seqId, &err))
  202.         ADD_ERR("failed to write CSeq_id: " << err);
  203.     // now try a bigger object (in binary this time)
  204.     CCdd cdd;
  205.     if (!ReadASNFromFile("ADF.bin", &cdd, true, &err))
  206.         ADD_ERR_RETURN("failed to load ADF.bin: " << err);
  207.     if (!WriteASNToFilesTxtBin(cdd, &err))
  208.         ADD_ERR("failed to write CCdd: " << err);
  209.     // structure
  210.     CNcbi_mime_asn1 mime;
  211.     if (!ReadASNFromFile("1doi.bin", &mime, true, &err))
  212.         ADD_ERR_RETURN("failed to load 1doi.bin: " << err);
  213.     if (!WriteASNToFilesTxtBin(mime, &err))
  214.         ADD_ERR("failed to write CNcbi_mime_asn1: " << err);
  215. END_TEST_FUNCTION
  216. // tests output of Assign()-copied objects
  217. BEGIN_TEST_FUNCTION(AssignAndOutput)
  218.     // try to output a copied simple object
  219.     CSeq_id s1;
  220.     if (!ReadASNFromFile("pdbSeqId.txt", &s1, false, &err))
  221.         ADD_ERR_RETURN("failed to load pdbSeqId.txt: " << err);
  222.     CSeq_id s2;
  223.     s2.Assign(s1);
  224.     if (!WriteASNToFilesTxtBin(s2, &err))
  225.         ADD_ERR("failed to write Assign()'ed Seq-id: " << err);
  226.     // try to output a copied complex object
  227.     CCdd c1;
  228.     if (!ReadASNFromFile("ADF.bin", &c1, true, &err))
  229.         ADD_ERR_RETURN("failed to load ADF.bin: " << err);
  230.     CCdd c2;
  231.     c2.Assign(c1);
  232.     if (!WriteASNToFilesTxtBin(c2, &err))
  233.         ADD_ERR("failed to write Assign()'ed Cdd: " << err);
  234.     // structure
  235.     CNcbi_mime_asn1 m1;
  236.     if (!ReadASNFromFile("1doi.bin", &m1, true, &err))
  237.         ADD_ERR_RETURN("failed to load 1doi.bin: " << err);
  238.     CNcbi_mime_asn1 m2;
  239.     m2.Assign(m1);
  240.     if (!WriteASNToFilesTxtBin(m2, &err))
  241.         ADD_ERR("failed to write Assign()'ed Ncbi_mime_asn1: " << err);
  242. END_TEST_FUNCTION
  243. // tests operations and validations of a mandatory asn field (id and element from Atom)
  244. BEGIN_TEST_FUNCTION(MandatoryField)
  245.     // read in a good asn blob
  246.     CAtom a1;
  247.     if (!ReadASNFromFile("goodAtom.txt", &a1, false, &err))
  248.         ADD_ERR_RETURN("failed to load goodAtom.txt: " << err);
  249.     // try to read in a bad asn blob, missing a field - should fail
  250.     INFOMSG("reading badAtom.txt - should fail");
  251.     CAtom a2;
  252.     if (ReadASNFromFile("badAtom.txt", &a2, false, &err))
  253.         ADD_ERR_RETURN("badAtom.txt should not have loaded successfully");
  254.     // Get/CanGet/Set/IsSet tests on loaded and created objects
  255.     if (!a1.CanGetId() || !a1.IsSetId() || a1.GetId() != 37)
  256.         ADD_ERR("id access failed");
  257.     CAtom a3;
  258.     if (a3.CanGetElement() || a3.IsSetElement())
  259.         ADD_ERR("new Atom should not have element");
  260.     SHOULD_THROW_EXCEPTION(a3, GetElement);
  261.     a3.SetElement(CAtom::eElement_lr);
  262.     if (!a3.CanGetElement() || !a3.IsSetElement() || a3.GetElement() != CAtom::eElement_lr)
  263.         ADD_ERR("bad element state after SetElement()");
  264.     // shouldn't be able to write without id
  265.     INFOMSG("trying to write incomplete Atom - should fail");
  266.     if (WriteASNToFilesTxtBin(a3, &err))
  267.         ADD_ERR("should not be able to write Atom with no id");
  268.     a3.SetId().Set(92);
  269.     if (!WriteASNToFilesTxtBin(a3, &err))
  270.         ADD_ERR("failed to write complete Atom: " << err);
  271. END_TEST_FUNCTION
  272. // test list (SEQUENCE) field
  273. BEGIN_TEST_FUNCTION(ListField)
  274.     // read in a valid object, with a mandatory but empty list
  275.     CModel_space_points m1;
  276.     if (!ReadASNFromFile("goodMSP.txt", &m1, false, &err))
  277.         ADD_ERR_RETURN("failed to read goodMSP.txt: " << err);
  278.     if (!m1.IsSetX() || !m1.CanGetX() || m1.GetX().size() != 3 || m1.GetX().front() != 167831)
  279.         ADD_ERR("x access failed");
  280.     if (!m1.IsSetZ() || !m1.CanGetZ() || m1.GetZ().size() != 0)
  281.         ADD_ERR("z access failed");
  282.     // test created object
  283.     CModel_space_points m2;
  284.     if (m2.IsSetX() || !m2.CanGetX() || m2.GetX().size() != 0)
  285.         ADD_ERR_RETURN("bad x state in new object");
  286.     m2.SetScale_factor() = 15;
  287.     m2.SetX().push_back(21);
  288.     m2.SetX().push_back(931);
  289.     if (!m2.IsSetX() || !m2.CanGetX() || m2.GetX().size() != 2)
  290.         ADD_ERR_RETURN("bad x state after SetX()");
  291.     m2.SetY().push_back(0);
  292.     INFOMSG("trying to write incomplete Model-space-points - should fail");
  293.     if (WriteASNToFilesTxtBin(m2, &err))
  294.         ADD_ERR("shouldn't be able to write incomplete Model-space-points");
  295.     m2.SetZ();  // set but empty!
  296.     if (!WriteASNToFilesTxtBin(m2, &err))
  297.         ADD_ERR("failed to write complete Model-space-points: " << err);
  298.     // missing a mandatory list
  299.     CModel_space_points m3;
  300.     INFOMSG("trying to read incomplete Model-space-points - should fail");
  301.     if (ReadASNFromFile("badMSP.txt", &m3, false, &err))
  302.         ADD_ERR("shouldn't be able to read incomplete Model-space-points: " << err);
  303.     // OPTIONAL list (coordinate-indices from Region-coordinates)
  304.     CRegion_coordinates r1;
  305.     if (!ReadASNFromFile("goodRC.txt", &r1, false, &err))
  306.         ADD_ERR_RETURN("failed to read goodRC.txt: " << err);
  307.     if (r1.IsSetCoordinate_indices() || !r1.CanGetCoordinate_indices() ||
  308.             r1.GetCoordinate_indices().size() != 0)
  309.         ADD_ERR("bad state for missing OPTIONAL list");
  310. END_TEST_FUNCTION
  311. // test OPTIONAL fields (using Global-id type)
  312. BEGIN_TEST_FUNCTION(OptionalField)
  313.     // object read from file
  314.     CGlobal_id g1;
  315.     if (!ReadASNFromFile("goodGID.txt", &g1, false, &err))
  316.         ADD_ERR_RETURN("failed to read goodGID.txt: " << err);
  317.     if (g1.IsSetRelease() || g1.CanGetRelease())
  318.         ADD_ERR("bad release state");
  319.     SHOULD_THROW_EXCEPTION(g1, GetRelease);
  320.     if (!g1.IsSetVersion() || !g1.CanGetVersion() || g1.GetVersion() != 37)
  321.         ADD_ERR("bad version state");
  322.     // new object
  323.     CGlobal_id g2;
  324.     if (g2.IsSetRelease() || g2.CanGetRelease())
  325.         ADD_ERR("bad release state in new object");
  326.     SHOULD_THROW_EXCEPTION(g2, GetRelease);
  327.     g2.SetAccession("something");
  328.     g2.SetRelease("something else");
  329.     if (!g2.IsSetRelease() || !g2.CanGetRelease())
  330.         ADD_ERR("bad release state after SetRelease()");
  331.     if (!WriteASNToFilesTxtBin(g2, &err))
  332.         ADD_ERR("failed to write good Global-id: " << err);
  333. END_TEST_FUNCTION
  334. // check fields with DEFAULT value
  335. BEGIN_TEST_FUNCTION(DefaultField)
  336.     CCn3d_color c1;
  337.     if (!ReadASNFromFile("goodColor.txt", &c1, false, &err))
  338.         ADD_ERR_RETURN("failed to read goodColor.txt: " << err);
  339.     if (!c1.IsSetScale_factor() || !c1.CanGetScale_factor() || c1.GetScale_factor() != 17)
  340.         ADD_ERR("bad scale-factor access");
  341.     if (c1.IsSetAlpha() || !c1.CanGetAlpha() || c1.GetAlpha() != 255)
  342.         ADD_ERR("bad alpha access");
  343.     CCn3d_color c2;
  344.     if (c2.IsSetAlpha() || !c2.CanGetAlpha() || c2.GetAlpha() != 255)
  345.         ADD_ERR("bad alpha state after construction");
  346.     c2.SetAlpha(37);
  347.     if (!c2.IsSetAlpha() || !c2.CanGetAlpha() || c2.GetAlpha() != 37)
  348.         ADD_ERR("bad alpha state after SetAlpha()");
  349.     c2.SetRed(1);
  350.     c2.SetGreen(2);
  351.     c2.SetBlue(3);
  352.     if (!WriteASNToFilesTxtBin(c2, &err))
  353.         ADD_ERR("failed to write good Cn3d-color: " << err);
  354. END_TEST_FUNCTION
  355. // check problem with zero Real data
  356. BEGIN_TEST_FUNCTION(ZeroReal)
  357.     CUser_object originalUO, newUO;
  358.     if(!ReadASNFromFile("userObject.txt", &originalUO, false, &err))
  359.         ADD_ERR_RETURN("failed to read userObject.txt: " << err);
  360.     if (!WriteASNToFilesTxtBin(originalUO, &err))
  361.         ADD_ERR("failed to write original User-object: " << err);
  362.     // copy via streams
  363.     CNcbiStrstream asnIOstream;
  364.     ncbi::CObjectOStreamAsnBinary outObject(asnIOstream);
  365.     outObject << originalUO;
  366.     ncbi::CObjectIStreamAsnBinary inObject(asnIOstream);
  367.     inObject >> newUO;
  368.     if (!WriteASNToFilesTxtBin(newUO, &err))
  369.         ADD_ERR("failed to write new User-object: " << err);
  370. END_TEST_FUNCTION
  371. BEGIN_TEST_FUNCTION(FullBlobs)
  372.     CNcbiIfstream gilist
  373.         (CDirEntry::MakePath(pathToFiles, "representativeGIs.txt").c_str());
  374.     string        line;
  375.     CID1Client    id1;
  376.     CRandom       rng(CurrentTime().GetTimeT());
  377.     id1.SetAllowDeadEntries(true);
  378.     while (NcbiGetlineEOL(gilist, line)) {
  379.         if (line.empty()  ||  !isdigit(line[0]) ) {
  380.             continue;
  381.         }
  382.         int gi = NStr::StringToInt(line, 10, NStr::eCheck_Skip);
  383.         if (gi <= 0) {
  384.             continue;
  385.         }
  386.         INFOMSG("Trying GI " << gi);
  387.         CRef<CSeq_entry> se;
  388.         try {
  389.             CID1server_maxcomplex req;
  390.             req.SetGi(gi);
  391.             req.SetMaxplex(eEntry_complexities_entry);
  392.             se = id1.AskGetsefromgi(req);
  393.         } catch (exception& e) {
  394.             ADD_ERR("failed to retrieve blob for GI " << gi << ": "
  395.                     << e.what());
  396.             continue;
  397.         }
  398.         ESerialDataFormat sdf = eSerial_None;
  399.         string            sdf_name;
  400.         switch (rng.GetRand(0, 2)) {
  401.         case 0:  sdf = eSerial_AsnText;    sdf_name = "text ASN.1";    break;
  402.         case 1:  sdf = eSerial_AsnBinary;  sdf_name = "binary ASN.1";  break;
  403.         case 2:  sdf = eSerial_Xml;        sdf_name = "XML";           break;
  404.         }
  405.         CConn_MemoryStream stream;
  406.         try {
  407.             auto_ptr<CObjectOStream> out(CObjectOStream::Open(sdf, stream));
  408.             *out << *se;
  409.         } catch (exception& e) {
  410.             ADD_ERR("failed to generate " << sdf_name << " for GI " << gi
  411.                     << ": " << e.what());
  412.             continue;
  413.         }
  414.         CSeq_entry se2;
  415.         try {
  416.             auto_ptr<CObjectIStream> in(CObjectIStream::Open(sdf, stream));
  417.             *in >> se2;
  418.         } catch (exception& e) {
  419.             ADD_ERR("failed to parse " << sdf_name << " for GI " << gi << ": "
  420.                     << e.what());
  421.             continue;
  422.         }
  423.         if (!SerialEquals(*se, se2)) {
  424.             ADD_ERR("failed equality after " << sdf_name
  425.                     << " round trip for GI " << gi);
  426.         }
  427.     }
  428. END_TEST_FUNCTION
  429. // test to make sure that a value of -1 converted to an unsigned int will still read/write
  430. BEGIN_TEST_FUNCTION(UnsignedInt)
  431.     int signedInt = -1;
  432.     CRef < CSeq_loc > seqloc(new CSeq_loc());
  433.     seqloc->SetInt().SetFrom(signedInt);
  434.     seqloc->SetInt().SetTo(signedInt);
  435.     seqloc->SetInt().SetId().SetGi(0);
  436.     if (!WriteASNToFile(*seqloc, false, &err))
  437.         ADD_ERR_RETURN("output of seqloc with '-1' failed: " << err);
  438.     // load latest test output file
  439.     CNcbiOstrstream oss;
  440.     oss << "test_" << filesCreated.size() << ".txt";
  441.     string filename = CNcbiOstrstreamToString(oss);
  442.     CRef < CSeq_loc > seqloc2(new CSeq_loc());
  443.     if (!ReadASNFromFile(filename.c_str(), seqloc2.GetPointer(), false, &err))
  444.         ADD_ERR_RETURN("input of seqloc with '-1' failed: " << err);
  445.     if (!seqloc2->Equals(*seqloc))
  446.         ADD_ERR("seqloc with '-1' Equals test failed");
  447.     CRef < CSeq_loc > seqloc3(new CSeq_loc());
  448.     seqloc3->Assign(*seqloc);
  449.     if (!WriteASNToFile(*seqloc3, false, &err))
  450.         ADD_ERR("output of Assign'ed seqloc with '-1' failed: " << err);
  451.     if (((int) seqloc3->GetInt().GetFrom()) != -1)
  452.         ADD_ERR("seqloc post-Assign value test failed");
  453.     CRef < CSeq_loc > seqloc4(new CSeq_loc());
  454.     if (!ReadASNFromFile("seqLocTest.txt", seqloc4.GetPointer(), false, &err))
  455.         ADD_ERR_RETURN("reading seqLocTest.txt failed: " << err);
  456.     if (seqloc4->GetInt().GetFrom() != ((unsigned int) 4294967295))
  457.         ADD_ERR("seqloc unsigned int value test failed");
  458. END_TEST_FUNCTION
  459. // to call test functions, counting errors
  460. #define RUN_TEST(func) 
  461.     do { 
  462.         int errors = func(); 
  463.         nErrors += errors; 
  464.         if (errors) 
  465.             ERRORMSG(#func " test failed"); 
  466.     } while (0)
  467. int ASNIOTestApp::Run(void)
  468. {
  469.     if (GetEnvironment().Get("ASNIOTEST_FILES").size() > 0) {
  470.         pathToFiles = GetEnvironment().Get("ASNIOTEST_FILES");
  471.     } else if (CDirEntry("data/pdbSeqId.txt").Exists()) {
  472.         pathToFiles = "data";
  473.     }
  474.     INFOMSG("Looking for sample files in " << pathToFiles);
  475.     int nErrors = 0;
  476.     try {
  477.         INFOMSG("Running tests...");
  478.         // individual tests
  479.         RUN_TEST(BasicFileIO);
  480.         RUN_TEST(AssignAndOutput);
  481.         RUN_TEST(MandatoryField);
  482.         RUN_TEST(ListField);
  483.         RUN_TEST(OptionalField);
  484.         RUN_TEST(DefaultField);
  485.         RUN_TEST(ZeroReal);
  486.         RUN_TEST(FullBlobs);
  487.         RUN_TEST(UnsignedInt);
  488.     } catch (exception& e) {
  489.         ERRORMSG("uncaught exception: " << e.what());
  490.         nErrors++;
  491.     }
  492.     while (filesCreated.size() > 0) {
  493.         CFile file(filesCreated.front());
  494.         if (!file.Remove()) {
  495.             ERRORMSG("Couldn't remove file " << filesCreated.front());
  496.             nErrors++;
  497.         }
  498.         filesCreated.pop_front();
  499.     }
  500.     if (nErrors == 0)
  501.         INFOMSG("No errors encountered, all tests succeeded!");
  502.     else
  503.         ERRORMSG(nErrors << " error" << ((nErrors == 1) ? "" : "s") << " encountered");
  504. #ifdef _DEBUG
  505.     INFOMSG("(Debug mode build, " << __DATE__ << ")");
  506. #else
  507.     INFOMSG("(Release mode build, " << __DATE__ << ")");
  508. #endif
  509.     return nErrors;
  510. }
  511. END_NCBI_SCOPE
  512. USING_NCBI_SCOPE;
  513. int main(int argc, const char* argv[])
  514. {
  515.     // diagnostic streams setup
  516.     SetDiagStream(&NcbiCout);       // send all diagnostic messages to cout
  517.     SetDiagPostLevel(eDiag_Info);   // show all messages
  518.     // turn on C++ object verification
  519.     CSerialObject::SetVerifyDataGlobal(eSerialVerifyData_Always);
  520.     CObjectOStream::SetVerifyDataGlobal(eSerialVerifyData_Always);
  521.     ASNIOTestApp app;
  522.     return app.AppMain(argc, argv, NULL, eDS_Default, NULL);    // don't use config file
  523. }
  524. /*
  525. * ---------------------------------------------------------------------------
  526. * $Log: asniotest.cpp,v $
  527. * Revision 1000.2  2004/06/01 19:41:07  gouriano
  528. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  529. *
  530. * Revision 1.15  2004/05/21 21:42:51  gorelenk
  531. * Added PCH ncbi_pch.hpp
  532. *
  533. * Revision 1.14  2004/03/09 21:19:53  ucko
  534. * Only warn about overwriting temporary files, since the previous run
  535. * may have crashed and left them behind.
  536. *
  537. * Revision 1.13  2004/02/12 18:33:29  thiessen
  538. * add Assign test to UnsignedInt test
  539. *
  540. * Revision 1.12  2004/02/12 17:59:58  thiessen
  541. * remove one gcc warning
  542. *
  543. * Revision 1.11  2004/02/12 17:55:12  thiessen
  544. * add UnsignedInt test
  545. *
  546. * Revision 1.10  2004/02/02 22:12:31  ucko
  547. * Test retrieval and round-trip conversion of a variety of representative blobs.
  548. *
  549. * Revision 1.9  2004/01/23 16:29:52  ucko
  550. * Try to find test files in data/.
  551. *
  552. * Revision 1.8  2004/01/15 14:35:13  thiessen
  553. * add date to output
  554. *
  555. * Revision 1.7  2004/01/12 22:43:08  thiessen
  556. * add ZeroReal test
  557. *
  558. * Revision 1.6  2003/12/11 17:52:10  thiessen
  559. * add Optional and Default field tests
  560. *
  561. * Revision 1.5  2003/12/11 15:21:02  thiessen
  562. * add mandatory and list tests
  563. *
  564. * Revision 1.4  2003/11/25 20:53:02  ucko
  565. * Make template-accessed variables non-static to fix compilation on WorkShop.
  566. *
  567. * Revision 1.3  2003/11/25 14:36:16  thiessen
  568. * restructure macros
  569. *
  570. * Revision 1.2  2003/11/21 15:26:12  thiessen
  571. * add Assign test
  572. *
  573. * Revision 1.1  2003/11/21 14:48:51  thiessen
  574. * initial checkin
  575. *
  576. */