source: src/Graph/unittests/BoostGraphCreatorUnitTest.cpp@ 1c0b0b

Candidate_v1.7.0 stable
Last change on this file since 1c0b0b was 1c0b0b, checked in by Frederik Heber <frederik.heber@…>, 3 years ago

Graph6Writer::write_elementlist uses BFS from boundary atom.

  • the elementlist is not stable as the set of atoms is arbitrary to any kind of permutation. However, the underlying bond graph is not, even though it may also have some symmetries.
  • Therefore, we use a BFS from a non-hydrogen atom on the boundary.
  • FIX: BoosGraphCreator gets vector of const atom*.
  • Property mode set to 100644
File size: 6.7 KB
RevLine 
[0dc8bf2]1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2017 Frederik Heber. All rights reserved.
5 *
6 *
7 * This file is part of MoleCuilder.
8 *
9 * MoleCuilder is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * MoleCuilder is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with MoleCuilder. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23/*
24 * BoostGraphCreatorUnitTest.cpp
25 *
26 * Created on: May 19, 2017
27 * Author: heber
28 */
29
30// include config.h
31#ifdef HAVE_CONFIG_H
32#include <config.h>
33#endif
34
35using namespace std;
36
37#include <cppunit/CompilerOutputter.h>
38#include <cppunit/extensions/TestFactoryRegistry.h>
39#include <cppunit/ui/text/TestRunner.h>
40
41#include <boost/assign.hpp>
42
43#include "CodePatterns/Assert.hpp"
44
45#include "Atom/atom.hpp"
46#include "Graph/BoostGraphCreator.hpp"
[4a6ef3]47#include "Graph/BreadthFirstSearchGatherer.hpp"
[0dc8bf2]48#include "molecule.hpp"
49#include "Element/periodentafel.hpp"
50#include "World.hpp"
51
52#include "BoostGraphCreatorUnitTest.hpp"
53
54#ifdef HAVE_TESTRUNNER
55#include "UnitTestMain.hpp"
56#endif /*HAVE_TESTRUNNER*/
57
58using namespace boost::assign;
59
60/********************************************** Test classes **************************************/
61
62// Registers the fixture into the 'registry'
63CPPUNIT_TEST_SUITE_REGISTRATION( BoostGraphCreatorTest );
64
65
66void BoostGraphCreatorTest::setUp()
67{
68 BGCreator = new BoostGraphCreator;
69
70 // construct element
71 hydrogen = World::getInstance().getPeriode()->FindElement(1);
72 carbon = World::getInstance().getPeriode()->FindElement(6);
73 CPPUNIT_ASSERT(hydrogen != NULL && "could not find element hydrogen");
74 CPPUNIT_ASSERT(carbon != NULL && "could not find element carbon");
75
76 // construct molecule (tetraeder of hydrogens)
77 TestMolecule = World::getInstance().createMolecule();
78 CPPUNIT_ASSERT(TestMolecule != NULL && "could not create molecule");
79 atom *Walker = World::getInstance().createAtom();
80 CPPUNIT_ASSERT(Walker != NULL && "could not create atom");
81 Walker->setType(carbon);
82 Walker->setPosition(Vector(5., 5., 5. ));
83 TestMolecule->AddAtom(Walker);
84
85 atom *OtherWalker = World::getInstance().createAtom();
86 CPPUNIT_ASSERT(OtherWalker != NULL && "could not create atom");
87 OtherWalker->setType(carbon);
88 Walker->setPosition(Vector(6.5, 5., 5. ));
89 TestMolecule->AddAtom(OtherWalker);
90 Walker->addBond(OtherWalker);
91
92 atom *HWalker = World::getInstance().createAtom();
93 CPPUNIT_ASSERT(HWalker != NULL && "could not create atom");
94 HWalker->setType(hydrogen);
95 HWalker->setPosition(Vector(4.3, 4.5, 5. ));
96 TestMolecule->AddAtom(HWalker);
97 Walker->addBond(HWalker);
98
99 HWalker = World::getInstance().createAtom();
100 CPPUNIT_ASSERT(HWalker != NULL && "could not create atom");
101 HWalker->setType(hydrogen);
102 HWalker->setPosition(Vector(4.3, 5.5, 5. ));
103 TestMolecule->AddAtom(HWalker);
104 Walker->addBond(HWalker);
105
106 HWalker = World::getInstance().createAtom();
107 CPPUNIT_ASSERT(HWalker != NULL && "could not create atom");
108 HWalker->setType(hydrogen);
109 HWalker->setPosition(Vector(7.2, 4.5, 5. ));
110 TestMolecule->AddAtom(HWalker);
111 OtherWalker->addBond(HWalker);
112
113 HWalker = World::getInstance().createAtom();
114 CPPUNIT_ASSERT(HWalker != NULL && "could not create atom");
115 HWalker->setType(hydrogen);
116 HWalker->setPosition(Vector(7.2, 5.5, 5. ));
117 TestMolecule->AddAtom(HWalker);
118 OtherWalker->addBond(HWalker);
119
120 // check that TestMolecule was correctly constructed
121 CPPUNIT_ASSERT_EQUAL( TestMolecule->getAtomCount(), 6 );
122
123};
124
125
126void BoostGraphCreatorTest::tearDown()
127{
128 delete BGCreator;
129
130 // remove molecule
131 World::getInstance().destroyMolecule(TestMolecule);
132 // note that all the atoms, molecules, the tafel and the elements
133 // are all cleaned when the world is destroyed
134 World::purgeInstance();
135 logger::purgeInstance();
136};
137
138/** Tests whether setup works.
139 */
140void BoostGraphCreatorTest::SetupTest()
141{
142// CPPUNIT_ASSERT_EQUAL (false, TestMolecule->empty());
143}
144
145/** Tests whether createFromRange() works.
146 */
147void BoostGraphCreatorTest::createFromRangeTest()
148{
149// CPPUNIT_ASSERT_EQUAL (false, TestMolecule->empty());
150};
151
152/** Tests whether createFromMolecule() works.
153 */
154void BoostGraphCreatorTest::createFromMoleculeTest()
155{
[4a6ef3]156 BGCreator->createFromMolecule(*TestMolecule, BreadthFirstSearchGatherer::AlwaysTruePredicate);
[0dc8bf2]157
158 CPPUNIT_ASSERT_EQUAL ((size_t)6, BGCreator->getNumVertices());
159 CPPUNIT_ASSERT_EQUAL ((size_t)5, BGCreator->getNumEdges());
160};
161
162/** Tests whether createFromAtoms() works.
163 */
164void BoostGraphCreatorTest::createFromAtomsTest()
165{
[1c0b0b]166 std::vector<const atom *> atoms;
[0dc8bf2]167 std::copy(TestMolecule->begin(), TestMolecule->end(), std::back_inserter(atoms));
[4a6ef3]168 BGCreator->createFromAtoms(atoms, BreadthFirstSearchGatherer::AlwaysTruePredicate);
[0dc8bf2]169
170 CPPUNIT_ASSERT_EQUAL ((size_t)6, BGCreator->getNumVertices());
171 CPPUNIT_ASSERT_EQUAL ((size_t)5, BGCreator->getNumEdges());
172};
[e0b960]173
174/** Tests whether adding and removing edges works.
175 */
176void BoostGraphCreatorTest::addremoveEdgeTest()
177{
178 typedef std::pair<int,int> E;
179
180 E edges[] = { E(0,1), E(1,2), E(2,3), E(3,4) };
181 const size_t no_nodes = 5;
182 BGCreator->graph =
183 BoostGraphCreator::UndirectedGraph(edges, edges + sizeof(edges) / sizeof(E), no_nodes);
184 BGCreator->atomids_nodeids +=
185 make_pair(0,0), make_pair(1,1), make_pair(2,2), make_pair(3,3), make_pair(4,4);
186 for (size_t i=0;i<no_nodes;++i)
187 boost::put(boost::get(boost::vertex_name, BGCreator->graph), boost::vertex(i, BGCreator->graph), i);
188
189 CPPUNIT_ASSERT_EQUAL ((size_t)5, BGCreator->getNumVertices());
190 CPPUNIT_ASSERT_EQUAL ((size_t)4, BGCreator->getNumEdges());
191
192 bool status;
193 // remove a valid edge
194 {
195 status = BGCreator->removeEdge((atomId_t)0,(atomId_t)1);
196 CPPUNIT_ASSERT_EQUAL (true, status);
197 status = BGCreator->addEdge((atomId_t)0,(atomId_t)1);
198 CPPUNIT_ASSERT_EQUAL (true, status);
199 // check again whether edge has really been added again
200 status = BGCreator->removeEdge((atomId_t)0,(atomId_t)1);
201 CPPUNIT_ASSERT_EQUAL (true, status);
202 status = BGCreator->addEdge((atomId_t)0,(atomId_t)1);
203 CPPUNIT_ASSERT_EQUAL (true, status);
204 }
205
206 // remove an invalid edge
207 {
208 status = BGCreator->removeEdge((atomId_t)0,(atomId_t)2);
209 CPPUNIT_ASSERT_EQUAL (false, status);
210 }
211
212 // add a present edge
213 {
214 status = BGCreator->addEdge((atomId_t)0,(atomId_t)1);
215 CPPUNIT_ASSERT_EQUAL (false, status);
216 }
217};
Note: See TracBrowser for help on using the repository browser.