source: src/Fragmentation/unittests/KeySetsContainerUnitTest.cpp@ bc069f

Action_Thermostats Add_AtomRandomPerturbation Add_RotateAroundBondAction Add_SelectAtomByNameAction Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_StructOpt_integration_tests Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_ChronosMutex Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion GeometryObjects Gui_displays_atomic_force_velocity IndependentFragmentGrids_IntegrationTest JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks RotateToPrincipalAxisSystem_UndoRedo StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg ThirdParty_MPQC_rebuilt_buildsystem TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps Ubuntu_1604_changes stable
Last change on this file since bc069f was 34af97, checked in by Frederik Heber <heber@…>, 9 years ago

FIX: KeySetsContainer::insert(KeySetsContainer&) was not fully working.

  • sets were simply appended and according to their index sets.
  • this works for normal index sets but not for forceindexsets, which have the additional (excluded) hydrogens that take not part when counting the bond order.
  • As FragmentationResultsContainer relied on index and forceindex to have the same fragment order, this was no longer true.
  • Added extensive unit test on KeySetsContainer::insert().
  • Property mode set to 100644
File size: 7.7 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 *
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 * KeySetsContainerUnitTest.cpp
25 *
26 * Created on: Sep 16, 2011
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 headers that implement a archive in simple text format
42#include <boost/archive/text_oarchive.hpp>
43#include <boost/archive/text_iarchive.hpp>
44
45#include <boost/assign.hpp>
46
47#include "Fragmentation/KeySetsContainer.hpp"
48
49#include "KeySetsContainerUnitTest.hpp"
50
51#ifdef HAVE_TESTRUNNER
52#include "UnitTestMain.hpp"
53#endif /*HAVE_TESTRUNNER*/
54
55using namespace boost::assign;
56
57/********************************************** Test classes **************************************/
58
59// Registers the fixture into the 'registry'
60CPPUNIT_TEST_SUITE_REGISTRATION( KeySetsContainerTest );
61
62
63void KeySetsContainerTest::setUp()
64{
65 Keys = new KeySetsContainer();
66};
67
68
69void KeySetsContainerTest::tearDown()
70{
71 delete Keys;
72};
73
74/** UnitTest for operator==()
75 */
76void KeySetsContainerTest::EqualityTest()
77{
78 // compare to self
79 CPPUNIT_ASSERT( *Keys == *Keys );
80
81 // create other instance
82 KeySetsContainer *Keys2 = new KeySetsContainer();
83 CPPUNIT_ASSERT( *Keys == *Keys2 );
84 Keys2->Order = 2;
85 CPPUNIT_ASSERT( *Keys != *Keys2 );
86 delete Keys2;
87};
88
89/** UnitTest for serialization
90 */
91void KeySetsContainerTest::SerializationTest()
92{
93 // write element to stream
94 std::stringstream stream;
95 boost::archive::text_oarchive oa(stream);
96 oa << Keys;
97
98 std::cout << "Contents of archive is " << stream.str() << std::endl;
99
100 // create and open an archive for input
101 boost::archive::text_iarchive ia(stream);
102 // read class state from archive
103 KeySetsContainer *Keys2;
104
105 ia >> Keys2;
106
107 CPPUNIT_ASSERT (*Keys == *Keys2);
108
109 delete Keys2;
110};
111
112static void fillKeySetsContainer(KeySetsContainer *_Keys)
113{
114 // insert keysets
115 KeySetsContainer::IntVector keyset;
116 keyset += 1;
117 _Keys->KeySets.push_back(keyset);
118 keyset += 2;
119 _Keys->KeySets.push_back(keyset);
120 keyset += 3;
121 _Keys->KeySets.push_back(keyset);
122 // insert number of keys per keyset
123 _Keys->AtomCounter += 1,2,3;
124 // insert total number of keysets/fragments
125 _Keys->FragmentCounter = 3;
126 // insert maximum number of keys over all contained keysets
127 _Keys->Order = 3;
128 // insert number of keysets with the same number of keys
129 _Keys->FragmentsPerOrder += 1,1,1;
130 // insert keyset index in keysets per same number of keys
131 _Keys->OrderSet.resize(3);
132 _Keys->OrderSet[0] = KeySetsContainer::IntVector(1, 0);
133 _Keys->OrderSet[1] = KeySetsContainer::IntVector(1, 1);
134 _Keys->OrderSet[2] = KeySetsContainer::IntVector(1, 2);
135}
136
137/** UnitTest for insert() into an empty container
138 */
139void KeySetsContainerTest::insertIntoEmptyTest()
140{
141 // fill other container
142 KeySetsContainer *Keys2 = new KeySetsContainer();
143 fillKeySetsContainer(Keys2);
144
145 // insert filled one (Keys2) into empty (Keys)
146 Keys->insert(*Keys2);
147
148 CPPUNIT_ASSERT (*Keys == *Keys2);
149
150 delete Keys2;
151}
152
153/** UnitTest for insert() empty into a filled container
154 */
155void KeySetsContainerTest::insertEmptyIntoTest()
156{
157 // fill other container
158 KeySetsContainer *Keys2 = new KeySetsContainer();
159 fillKeySetsContainer(Keys2);
160
161 // create result container (we know this works from insertIntoEmptyTest())
162 KeySetsContainer *resultKeys = new KeySetsContainer();
163 resultKeys->insert(*Keys2);
164
165 // fill empty (Keys) into filled oned (Keys2)
166 Keys2->insert(*Keys);
167
168 // create empty for comparison
169 KeySetsContainer *emptyKeys = new KeySetsContainer();
170
171 CPPUNIT_ASSERT (*Keys2 == *resultKeys);
172 CPPUNIT_ASSERT (*Keys == *emptyKeys);
173
174 delete Keys2;
175 delete resultKeys;
176 delete emptyKeys;
177}
178
179/** UnitTest for insert() smaller filled into another filled container
180 */
181void KeySetsContainerTest::insertSmallerIntoTest()
182{
183 // fill other container
184 KeySetsContainer *Keys2 = new KeySetsContainer();
185 fillKeySetsContainer(Keys2);
186
187 // fill Keys, too
188 {
189 KeySetsContainer::IntVector keyset;
190 keyset += 2;
191 Keys->KeySets.push_back(keyset);
192 // insert number of keys per keyset
193 Keys->AtomCounter += 1;
194 // insert total number of keysets/fragments
195 Keys->FragmentCounter = 1;
196 // insert maximum number of keys over all contained keysets
197 Keys->Order = 1;
198 // insert number of keysets with the same number of keys
199 Keys->FragmentsPerOrder += 1;
200 // insert keyset index in keysets per same number of keys
201 Keys->OrderSet.resize(1);
202 Keys->OrderSet[0] = KeySetsContainer::IntVector(1, 0);
203 }
204
205 // create comparison container
206 KeySetsContainer *resultKeys = new KeySetsContainer();
207 {
208 fillKeySetsContainer(resultKeys);
209 KeySetsContainer::IntVector keyset;
210 keyset += 2;
211 resultKeys->KeySets.push_back(keyset);
212 resultKeys->AtomCounter += 1;
213 resultKeys->FragmentCounter = 4;
214 resultKeys->Order = 3;
215 resultKeys->FragmentsPerOrder[0] = 2;
216 CPPUNIT_ASSERT( resultKeys->OrderSet.size() == (size_t)3 );
217 resultKeys->OrderSet[0] += 3;
218 }
219
220 // insert smaller into larger one
221 Keys2->insert(*Keys);
222
223 CPPUNIT_ASSERT (*Keys != *Keys2);
224 CPPUNIT_ASSERT (*resultKeys == *Keys2);
225
226 delete Keys2;
227 delete resultKeys;
228}
229
230/** UnitTest for insert() larger filled into another filled container
231 */
232void KeySetsContainerTest::insertLargerIntoTest()
233{
234 // fill other container
235 KeySetsContainer *Keys2 = new KeySetsContainer();
236 fillKeySetsContainer(Keys2);
237
238 // fill Keys, too
239 {
240 KeySetsContainer::IntVector keyset;
241 keyset += 2;
242 Keys->KeySets.push_back(keyset);
243 // insert number of keys per keyset
244 Keys->AtomCounter += 1;
245 // insert total number of keysets/fragments
246 Keys->FragmentCounter = 1;
247 // insert maximum number of keys over all contained keysets
248 Keys->Order = 1;
249 // insert number of keysets with the same number of keys
250 Keys->FragmentsPerOrder += 1;
251 // insert keyset index in keysets per same number of keys
252 Keys->OrderSet.resize(1);
253 Keys->OrderSet[0] = KeySetsContainer::IntVector(1, 0);
254 }
255
256 // create comparison container
257 KeySetsContainer *resultKeys = new KeySetsContainer();
258 {
259 // we know this works from insertIntoEmptyTest()
260 resultKeys->insert(*Keys);
261 // add larger keysets
262 fillKeySetsContainer(resultKeys);
263
264 resultKeys->AtomCounter.clear();
265 resultKeys->AtomCounter += 1,1,2,3;
266 resultKeys->FragmentCounter = 4;
267 resultKeys->FragmentsPerOrder.clear();
268 resultKeys->FragmentsPerOrder += 2,1,1;
269 resultKeys->OrderSet.clear();
270 resultKeys->OrderSet.resize(3);
271 resultKeys->OrderSet[0] = KeySetsContainer::IntVector(1, 0);
272 resultKeys->OrderSet[0] += 1;
273 resultKeys->OrderSet[1] = KeySetsContainer::IntVector(1, 2);
274 resultKeys->OrderSet[2] = KeySetsContainer::IntVector(1, 3);
275 }
276
277 // insert larger into smaller one
278 Keys->insert(*Keys2);
279
280 CPPUNIT_ASSERT (*Keys != *Keys2);
281 CPPUNIT_ASSERT (*resultKeys == *Keys);
282
283 delete Keys2;
284 delete resultKeys;
285}
Note: See TracBrowser for help on using the repository browser.