1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
// -*- Mode: C++; tab-width: 2; -*-
// vi: set ts=2:
//
#include <BALL/CONCEPT/classTest.h>
#include <BALLTestConfig.h>
///////////////////////////
#include <BALL/STRUCTURE/smilesParser.h>
#include <BALL/KERNEL/PTE.h>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>
///////////////////////////
using namespace BALL;
typedef std::map<String, Size> Formula;
typedef std::pair<String, Formula> Line;
std::ostream& operator << (std::ostream& os, const std::pair<BALL::String, Size>& p)
{
return os << p.first << p.second;
}
std::ostream& operator << (std::ostream& os, const std::map<String, Size>& f)
{
std::map<String, Size>::const_iterator it(f.begin());
for (; it != f.end(); it++)
{
os << it->first << "/" << it->second << " ";
}
return os;
}
Formula computeFormula(const System& s)
{
Formula f;
AtomConstIterator atom(s.beginAtom());
for (; atom != s.endAtom(); ++atom)
{
f[atom->getElement().getSymbol()]++;
}
return f;
}
Line readSmilesLine(std::istream& is)
{
String line;
line.getline(is);
std::pair<String, Formula> s;
if (line != "")
{
s.first = line.getField(0);
for (Position i = 1; i < line.countFields(); i += 2)
{
s.second[line.getField(i)] = line.getField(i + 1).toUnsignedInt();
}
}
return s;
}
START_TEST(SmilesParser)
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
SmilesParser sp;
CHECK(C)
sp.parse("C");
TEST_EQUAL(sp.getSystem().countAtoms(), 5)
ABORT_IF(sp.getSystem().countAtoms() != 5)
const Atom& atom = *sp.getSystem().getAtom(0);
TEST_EQUAL(atom.getElement(), PTE[Element::C])
TEST_EQUAL(atom.countBonds(), 4)
RESULT
CHECK([C])
sp.parse("[C]");
TEST_EQUAL(sp.getSystem().countAtoms(), 1)
ABORT_IF(sp.getSystem().countAtoms() != 1)
const Atom& atom = *sp.getSystem().getAtom(0);
TEST_EQUAL(atom.getElement(), PTE[Element::C])
TEST_EQUAL(atom.countBonds(), 0)
RESULT
CHECK(parse errors)
TEST_EXCEPTION(Exception::ParseError, sp.parse("X"))
TEST_EXCEPTION(Exception::ParseError, sp.parse("+"))
TEST_EXCEPTION(Exception::ParseError, sp.parse("+4"))
TEST_EXCEPTION(Exception::ParseError, sp.parse("C+"))
RESULT
CHECK(example library)
std::ifstream is(BALL_TEST_DATA_PATH(SmilesParser_test.txt));
std::pair<String, Formula> smiles;
while (is.good())
{
smiles = readSmilesLine(is);
STATUS(smiles.first << "/" << smiles.second)
if (smiles.first == "")
{
break;
}
sp.parse(smiles.first);
TEST_EQUAL(computeFormula(sp.getSystem()), smiles.second)
}
RESULT
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
END_TEST
|