/********************************************************************** inchiwrite.cpp - tests for writing InChIs This file is part of the Open Babel project. For more information, see Copyright (C) 2007 by Chris Morley This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ***********************************************************************/ // used to set import/export for Cygwin DLLs #ifdef WIN32 #define USING_OBDLL #endif #include #include #include #include #include #include using namespace std; namespace OpenBabel{ extern string GetInChI(istream& is); } using namespace OpenBabel; int main(int argc, char* argv[]) { if(argc !=3) { cout << "Usage: inchiwrite Testmols.xxx Results.txt\n" "Testmols.xxx can be any format but must have the appropriate extension.\n" "Results.txt is a text file with the correct the correct InChIs.\n" "It can contain other text interspersed." << endl; return 1; } ifstream ifs(argv[1]); if(!ifs) { cout << "# Cannot open " << argv[1]; return 1; } ifstream results(argv[2]); if(!results) { cout << "# Cannot open " << argv[2]; return 1; } stringstream ssout; OBConversion conv(&ifs, &ssout); OBFormat* pFormat = conv.FormatFromExt(argv[1]); if(!pFormat) { cout << "# Skipped. Did not recognize the format of " << argv[1] << endl; return 1; } conv.SetInFormat(pFormat); if(!conv.SetOutFormat("inchi")) { cout << "# Skipped. Did not find InChI Format" << endl; return 1; } conv.AddOption("w",OBConversion::OUTOPTIONS); //suppress routine warnings int count = conv.Convert(); if(count<=0) { cout << "# Skipped. Did not convert any molecules" << endl; return 2; } cout << "1.." << count << " # molecules converted\n"; //Compare ssout with the correct InChIs int nfail=0; int n, skipped=0; for(n=1;ssout;++n) { string correct = GetInChI(results); string generated; ssout >> generated; if(correct.empty() || generated.empty()) break; if(correct.size()<9)//skip molecules with an empty InChI { skipped++; cout << "ok " << n << " # ignored empty InChI\n"; continue; } if(generated != correct) { cout << "Not ok " << n << " # Mismatch in molecule #" << n << ". generated / correct\n" << "# " << generated << "\n# " << correct << '\n'; nfail++; } else cout << "ok " << n << " # InChI matched expected\n"; } cout << n-1-skipped<< " molecules compared" << endl; cout << "# " << skipped << " # empty molecules skipped" << endl; cout << nfail << " failures" << endl; return 0; }