source: src/Parser/unittests/ParserXyzUnitTest.cpp@ ff4fff9

CombiningParticlePotentialParsing
Last change on this file since ff4fff9 was fac58f, checked in by Frederik Heber <heber@…>, 9 years ago

Converted FormatParser::save() to using vector of const atom ptrs.

  • required to change all save() functions in all parsers.
  • Property mode set to 100644
File size: 5.8 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010-2012 University of Bonn. All rights reserved.
5 * Copyright (C) 2013 Frederik Heber. All rights reserved.
6 *
7 *
8 * This file is part of MoleCuilder.
9 *
10 * MoleCuilder is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * MoleCuilder is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with MoleCuilder. If not, see <http://www.gnu.org/licenses/>.
22 */
23
24/*
25 * ParserXyzUnitTest.cpp
26 *
27 * Created on: Mar 3, 2010
28 * Author: metzler
29 */
30
31// include config.h
32#ifdef HAVE_CONFIG_H
33#include <config.h>
34#endif
35
36#include "ParserXyzUnitTest.hpp"
37
38#include <cppunit/CompilerOutputter.h>
39#include <cppunit/extensions/TestFactoryRegistry.h>
40#include <cppunit/ui/text/TestRunner.h>
41
42#include "Atom/atom.hpp"
43#include "Atom/AtomObserver.hpp"
44#include "CodePatterns/Log.hpp"
45#include "Descriptors/AtomTypeDescriptor.hpp"
46#include "Element/element.hpp"
47#include "Element/periodentafel.hpp"
48#include "Parser/ChangeTracker.hpp"
49#include "Parser/XyzParser.hpp"
50#include "World.hpp"
51
52#ifdef HAVE_TESTRUNNER
53#include "UnitTestMain.hpp"
54#endif /*HAVE_TESTRUNNER*/
55
56using namespace std;
57
58// Registers the fixture into the 'registry'
59CPPUNIT_TEST_SUITE_REGISTRATION( ParserXyzUnitTest );
60
61static string waterXyz = "\
623\n\
63\tH2O: water molecule\n\
64O\t0\t0\t0\n\
65H\t0.758602\t0\t0.504284\n\
66H\t0.758602\t0\t-0.504284\n";
67static string waterMultiXyz = "\
683\n\
69\tH2O: water molecule, time step 0\n\
70O\t0\t0\t0\n\
71H\t0.758602\t0\t0.504284\n\
72H\t0.758602\t0\t-0.504284\n\
733\n\
74\tH2O: water molecule, time step 1\n\
75O\t0\t0\t0\n\
76H\t0.76\t0\t0.504284\n\
77H\t0.756\t0\t-0.504284\n";
78
79void ParserXyzUnitTest::setUp() {
80 World::getInstance();
81
82 parser = new FormatParser<xyz>();
83
84 setVerbosity(2);
85
86 // we need hydrogens and oxygens in the following tests
87 CPPUNIT_ASSERT(World::getInstance().getPeriode()->FindElement(1) != NULL);
88 CPPUNIT_ASSERT(World::getInstance().getPeriode()->FindElement(8) != NULL);
89}
90
91void ParserXyzUnitTest::tearDown()
92{
93 delete parser;
94 ChangeTracker::purgeInstance();
95 World::purgeInstance();
96 AtomObserver::purgeInstance();
97}
98
99/************************************ tests ***********************************/
100
101void ParserXyzUnitTest::rewriteAnXyzTest() {
102 cout << "Testing the XYZ parser." << endl;
103 stringstream input;
104 input << waterXyz;
105 parser->load(&input);
106 input.clear();
107
108 CPPUNIT_ASSERT_EQUAL(3, const_cast<const World &>(World::getInstance()).numAtoms());
109
110 // store and parse in again
111 {
112 stringstream output;
113 std::vector<const atom *> atoms = const_cast<const World &>(World::getInstance()).
114 getAllAtoms();
115 parser->save(&output, atoms);
116 input << output.str();
117 parser->load(&input);
118 }
119
120 // now twice as many
121 CPPUNIT_ASSERT_EQUAL(6, World::getInstance().numAtoms());
122
123 // check every atom
124 std::vector<atom *> atoms = World::getInstance().getAllAtoms();
125 std::vector<atom *>::const_iterator firstiter = atoms.begin();
126 std::vector<atom *>::const_iterator seconditer = atoms.begin();
127 for (size_t i=0;i<3;i++)
128 ++seconditer;
129 for (;
130 seconditer != atoms.end();
131 ++firstiter,++seconditer) {
132 // check position and type (only stuff xyz stores)
133 CPPUNIT_ASSERT_EQUAL((*firstiter)->getPosition(),(*seconditer)->getPosition());
134 CPPUNIT_ASSERT_EQUAL((*firstiter)->getType(),(*seconditer)->getType());
135 }
136}
137
138void ParserXyzUnitTest::readMultiXyzTest() {
139 cout << "Testing the multi time step XYZ parser." << endl;
140 stringstream input;
141 input << waterMultiXyz;
142 parser->load(&input);
143 input.clear();
144
145 // 3 not 6 atoms!
146 CPPUNIT_ASSERT_EQUAL(3, const_cast<const World &>(World::getInstance()).numAtoms());
147
148 // check for trajectory size
149 BOOST_FOREACH (const atom *_atom, const_cast<const World &>(World::getInstance()).getAllAtoms())
150 CPPUNIT_ASSERT_EQUAL((size_t) 2, _atom->getTrajectorySize());
151}
152
153void ParserXyzUnitTest::writeMultiXyzTest() {
154 stringstream input;
155 input << waterMultiXyz;
156 parser->load(&input);
157 input.clear();
158
159 // 3 not 6 atoms!
160 CPPUNIT_ASSERT_EQUAL(3, const_cast<const World &>(World::getInstance()).numAtoms());
161
162 // store and parse in again
163 {
164 stringstream output;
165 std::vector<const atom *> atoms = const_cast<const World &>(World::getInstance()).
166 getAllAtoms();
167 parser->save(&output, atoms);
168 input << output.str();
169 parser->load(&input);
170 }
171
172 // now twice as many
173 CPPUNIT_ASSERT_EQUAL(6, World::getInstance().numAtoms());
174
175 // check for trajectory size of all 6! atoms
176 BOOST_FOREACH (const atom *_atom, const_cast<const World &>(World::getInstance()).getAllAtoms())
177 CPPUNIT_ASSERT_EQUAL((size_t) 2, _atom->getTrajectorySize());
178
179 // check every atom
180 std::vector<const atom *> atoms = const_cast<const World &>(World::getInstance()).
181 getAllAtoms();
182 std::vector<const atom *>::const_iterator firstiter = atoms.begin();
183 std::vector<const atom *>::const_iterator seconditer = atoms.begin();
184 for (size_t i=0;i<3;i++)
185 ++seconditer;
186 for (;
187 seconditer != atoms.end();
188 ++firstiter,++seconditer) {
189 CPPUNIT_ASSERT_EQUAL((*firstiter)->getType(),(*seconditer)->getType());
190 for (unsigned int step = 0; step < 2; ++step) {
191 // check position and type (only stuff xyz stores)
192 CPPUNIT_ASSERT_EQUAL(
193 (*firstiter)->getPositionAtStep(step),
194 (*seconditer)->getPositionAtStep(step));
195 }
196 }
197}
Note: See TracBrowser for help on using the repository browser.