3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
9 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
10 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
11 * Copyright (c) 2001-2009, The GROMACS development team,
12 * check out http://www.gromacs.org for more information.
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * If you want to redistribute modifications, please consider that
20 * scientific software is very special. Version control is crucial -
21 * bugs must be traceable. We will be happy to consider code for
22 * inclusion in the official distribution, but derived work must not
23 * be called official GROMACS. Details are found in the README & COPYING
24 * files - if they are missing, get the official version at www.gromacs.org.
26 * To help us fund GROMACS development, we humbly ask that you cite
27 * the papers on the package - you can find them in the top README file.
29 * For more info, check our website at http://www.gromacs.org
33 * Tests for analysis data functionality.
35 * These tests check the functionality of gmx::AnalysisData, as well as its
36 * base classes gmx::AbstractAnalysisData and gmx::AbstractAnalysisDataStored.
37 * Most checking is done using gmx::test::AnalysisDataTestFixture and mock
38 * modules that implement gmx::AnalysisDataModuleInterface.
40 * \author Teemu Murtola <teemu.murtola@cbr.su.se>
41 * \ingroup module_analysisdata
45 #include <gmock/gmock.h>
46 #include <gtest/gtest.h>
48 #include "gromacs/analysisdata/analysisdata.h"
49 #include "gromacs/fatalerror/exceptions.h"
52 #include "mock_module.h"
54 using gmx::test::MockAnalysisModule;
59 /********************************************************************
60 * Tests for gmx::AnalysisData.
64 * Tests that simple initialization works.
66 TEST(AnalysisDataInitializationTest, BasicInitialization)
68 gmx::AnalysisData data;
69 EXPECT_EQ(0, data.columnCount());
70 EXPECT_FALSE(data.isMultipoint());
71 EXPECT_EQ(0, data.frameCount());
74 EXPECT_EQ(1, data.columnCount());
75 EXPECT_FALSE(data.isMultipoint());
77 data.setColumns(3, true);
78 EXPECT_EQ(3, data.columnCount());
79 EXPECT_TRUE(data.isMultipoint());
82 EXPECT_EQ(1, data.columnCount());
83 EXPECT_FALSE(data.isMultipoint());
87 * Tests that checking for compatibility of modules with multicolumn data
90 TEST(AnalysisDataInitializationTest, ChecksMultiColumnModules)
92 gmx::AnalysisData data;
95 std::auto_ptr<MockAnalysisModule> mod(new MockAnalysisModule(0));
96 EXPECT_THROW(data.addModule(mod.release()), gmx::APIError);
98 mod.reset(new MockAnalysisModule(gmx::AnalysisDataModuleInterface::efAllowMulticolumn));
99 EXPECT_NO_THROW(data.addModule(mod.release()));
103 * Tests that checking for compatibility of modules with multipoint data
106 TEST(AnalysisDataInitializationTest, ChecksMultiPointModules)
108 gmx::AnalysisData data;
109 data.setColumns(1, true);
111 std::auto_ptr<MockAnalysisModule> mod(new MockAnalysisModule(0));
112 EXPECT_THROW(data.addModule(mod.release()), gmx::APIError);
114 mod.reset(new MockAnalysisModule(gmx::AnalysisDataModuleInterface::efAllowMultipoint));
115 EXPECT_NO_THROW(data.addModule(mod.release()));
119 typedef gmx::test::AnalysisDataTestFixture AnalysisDataTest;
121 // Input data for the tests below.
122 using gmx::test::END_OF_DATA;
123 using gmx::test::END_OF_FRAME;
124 using gmx::test::MPSTOP;
125 static const real inputdata[] = {
126 1.0, 0.0, 1.0, 2.0, END_OF_FRAME,
127 2.0, 1.0, 1.0, 1.0, END_OF_FRAME,
128 3.0, 2.0, 0.0, 0.0, END_OF_FRAME,
133 * Tests that data is forwarded correctly to modules using two independent
136 TEST_F(AnalysisDataTest, CallsModuleCorrectly)
138 gmx::test::AnalysisDataTestInput input(inputdata);
139 gmx::AnalysisData data;
140 data.setColumns(input.columnCount());
142 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
143 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
144 ASSERT_NO_THROW(presentAllData(input, &data));
148 * Tests that data is forwarded correctly to modules that are added using
150 * Uses two independent modules.
152 TEST_F(AnalysisDataTest, CallsColumnModuleCorrectly)
154 gmx::test::AnalysisDataTestInput input(inputdata);
155 gmx::AnalysisData data;
156 data.setColumns(input.columnCount());
158 ASSERT_NO_THROW(addStaticColumnCheckerModule(input, 0, 2, &data));
159 ASSERT_NO_THROW(addStaticColumnCheckerModule(input, 2, 1, &data));
160 ASSERT_NO_THROW(presentAllData(input, &data));
164 * Tests that data is forwarded correctly to modules when the data is added as
165 * individual points and not as full frames.
167 TEST_F(AnalysisDataTest, CallsModuleCorrectlyWithIndividualPoints)
169 gmx::test::AnalysisDataTestInput input(inputdata);
170 gmx::AnalysisData data;
171 data.setColumns(input.columnCount());
173 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
174 ASSERT_NO_THROW(addStaticColumnCheckerModule(input, 1, 2, &data));
175 gmx::AnalysisDataHandle *handle = NULL;
176 ASSERT_NO_THROW(handle = data.startData(NULL));
177 for (int row = 0; row < input.frameCount(); ++row)
179 const gmx::test::AnalysisDataTestInputFrame &frame = input.frame(row);
180 const gmx::test::AnalysisDataTestInputPointSet &points = frame.points();
181 ASSERT_NO_THROW(handle->startFrame(row, frame.x(), frame.dx()));
182 for (int column = 0; column < input.columnCount(); ++column)
184 ASSERT_NO_THROW(handle->addPoint(column, points.y(column)));
186 ASSERT_NO_THROW(handle->finishFrame());
187 EXPECT_EQ(row + 1, data.frameCount());
189 ASSERT_NO_THROW(handle->finishData());
193 * Tests that data is forwarded correctly (in frame order) to modules when the
194 * data is added through multiple handles in non-increasing order.
196 TEST_F(AnalysisDataTest, CallsModuleCorrectlyWithOutOfOrderFrames)
198 gmx::test::AnalysisDataTestInput input(inputdata);
199 gmx::AnalysisData data;
200 data.setColumns(input.columnCount());
202 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
203 ASSERT_NO_THROW(addStaticColumnCheckerModule(input, 1, 2, &data));
204 gmx::AnalysisDataHandle *handle1 = NULL;
205 gmx::AnalysisDataHandle *handle2 = NULL;
206 ASSERT_NO_THROW(handle1 = data.startData(NULL));
207 ASSERT_NO_THROW(handle2 = data.startData(NULL));
208 ASSERT_NO_THROW(presentDataFrame(input, 1, handle1));
209 ASSERT_NO_THROW(presentDataFrame(input, 0, handle2));
210 ASSERT_NO_THROW(presentDataFrame(input, 2, handle1));
211 ASSERT_NO_THROW(handle1->finishData());
212 ASSERT_NO_THROW(handle2->finishData());
216 * Tests that data can be accessed correctly from a module that requests
217 * storage using AbstractAnalysisData::requestStorage() with parameter -1.
219 TEST_F(AnalysisDataTest, FullStorageWorks)
221 gmx::test::AnalysisDataTestInput input(inputdata);
222 gmx::AnalysisData data;
223 data.setColumns(input.columnCount());
225 ASSERT_NO_THROW(addStaticStorageCheckerModule(input, -1, &data));
226 ASSERT_NO_THROW(presentAllData(input, &data));
230 * Tests that a data module can be added to an AnalysisData object after data
231 * has been added if all data is still available in storage.
233 TEST_F(AnalysisDataTest, CanAddModuleAfterStoredData)
235 gmx::test::AnalysisDataTestInput input(inputdata);
236 gmx::AnalysisData data;
237 data.setColumns(input.columnCount());
238 ASSERT_TRUE(data.requestStorage(-1));
240 ASSERT_NO_THROW(presentAllData(input, &data));
241 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
245 * Tests that data can be accessed correctly from a module that requests
246 * storage using AbstractAnalysisData::requestStorage() only for one frame.
248 TEST_F(AnalysisDataTest, LimitedStorageWorks)
250 gmx::test::AnalysisDataTestInput input(inputdata);
251 gmx::AnalysisData data;
252 data.setColumns(input.columnCount());
254 ASSERT_NO_THROW(addStaticStorageCheckerModule(input, 1, &data));
255 ASSERT_NO_THROW(presentAllData(input, &data));
258 // Input data for the tests below.
259 static const real multipointinputdata[] = {
260 1.0, 0.0, 1.0, 2.0, MPSTOP, 1.1, 2.1, 1.1, MPSTOP, 2.2, 1.2, 0.2, END_OF_FRAME,
261 2.0, 1.0, 1.0, 1.0, MPSTOP, 2.1, 1.1, 0.1, MPSTOP, 1.2, 0.2, 1.2, END_OF_FRAME,
262 3.0, 2.0, 0.0, 0.0, MPSTOP, 3.1, 2.1, 1.1, MPSTOP, 0.2, 2.2, 1.2, END_OF_FRAME,
267 * Tests that multipoint data is forwarded correctly to modules using two
268 * independent modules.
270 TEST_F(AnalysisDataTest, MultipointCallsModuleCorrectly)
272 gmx::test::AnalysisDataTestInput input(multipointinputdata);
273 gmx::AnalysisData data;
274 data.setColumns(input.columnCount(), true);
276 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
277 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
278 ASSERT_NO_THROW(presentAllData(input, &data));
282 * Tests that multipoint data is forwarded correctly to modules that are added
283 * using addColumnModule().
284 * Uses two independent modules.
286 TEST_F(AnalysisDataTest, MultipointCallsColumnModuleCorrectly)
288 gmx::test::AnalysisDataTestInput input(multipointinputdata);
289 gmx::AnalysisData data;
290 data.setColumns(input.columnCount(), true);
292 ASSERT_NO_THROW(addStaticColumnCheckerModule(input, 0, 2, &data));
293 ASSERT_NO_THROW(addStaticColumnCheckerModule(input, 2, 1, &data));
294 ASSERT_NO_THROW(presentAllData(input, &data));