File: SmilesParser_test.C

package info (click to toggle)
ball 1.5.0%2Bgit20180813.37fc53c-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 239,848 kB
  • sloc: cpp: 326,149; ansic: 4,208; python: 2,303; yacc: 1,778; lex: 1,099; xml: 958; sh: 322; makefile: 93
file content (122 lines) | stat: -rw-r--r-- 2,741 bytes parent folder | download | duplicates (8)
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