2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 2011,2012,2013,2014, by the GROMACS development team, led by
5 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6 * and including many others, as listed in the AUTHORS file in the
7 * top-level source directory and at http://www.gromacs.org.
9 * GROMACS is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public License
11 * as published by the Free Software Foundation; either version 2.1
12 * of the License, or (at your option) any later version.
14 * GROMACS 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 GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with GROMACS; if not, see
21 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 * If you want to redistribute modifications to GROMACS, please
25 * consider that scientific software is very special. Version
26 * control is crucial - bugs must be traceable. We will be happy to
27 * consider code for inclusion in the official distribution, but
28 * derived work must not be called official GROMACS. Details are found
29 * in the README & COPYING files - if they are missing, get the
30 * official version at http://www.gromacs.org.
32 * To help us fund GROMACS development, we humbly ask that you cite
33 * the research papers on the package. Check out http://www.gromacs.org.
37 * Tests for analysis data functionality.
39 * These tests check the functionality of gmx::AnalysisData, as well as classes
40 * used in its implementation: gmx::AbstractAnalysisData and
41 * gmx::AnalysisDataStorage.
42 * Most checking is done using gmx::test::AnalysisDataTestFixture and mock
43 * modules that implement gmx::AnalysisDataModuleInterface.
45 * \author Teemu Murtola <teemu.murtola@gmail.com>
46 * \ingroup module_analysisdata
48 #include <gmock/gmock.h>
49 #include <gtest/gtest.h>
51 #include "gromacs/analysisdata/analysisdata.h"
52 #include "gromacs/analysisdata/paralleloptions.h"
53 #include "gromacs/utility/exceptions.h"
55 #include "gromacs/analysisdata/tests/datatest.h"
56 #include "gromacs/analysisdata/tests/mock_datamodule.h"
57 #include "testutils/testasserts.h"
59 using gmx::test::AnalysisDataTestInput;
60 using gmx::test::MockAnalysisDataModule;
61 using gmx::test::MockAnalysisDataModulePointer;
66 /********************************************************************
67 * Tests for gmx::AnalysisData without any actual data.
71 * Tests that simple initialization works.
73 TEST(AnalysisDataInitializationTest, BasicInitialization)
75 gmx::AnalysisData data;
76 EXPECT_EQ(1, data.dataSetCount());
77 EXPECT_EQ(0, data.columnCount(0));
78 EXPECT_EQ(0, data.columnCount());
79 EXPECT_FALSE(data.isMultipoint());
80 EXPECT_EQ(0, data.frameCount());
82 data.setColumnCount(0, 1);
83 EXPECT_EQ(1, data.columnCount(0));
84 EXPECT_EQ(1, data.columnCount());
85 EXPECT_FALSE(data.isMultipoint());
87 data.setDataSetCount(2);
88 EXPECT_EQ(2, data.dataSetCount());
89 data.setColumnCount(0, 3);
90 EXPECT_EQ(3, data.columnCount(0));
91 EXPECT_EQ(0, data.columnCount(1));
92 data.setColumnCount(1, 2);
93 EXPECT_EQ(3, data.columnCount(0));
94 EXPECT_EQ(2, data.columnCount(1));
96 data.setDataSetCount(1);
97 EXPECT_EQ(1, data.dataSetCount());
98 data.setMultipoint(true);
99 EXPECT_EQ(3, data.columnCount());
100 EXPECT_TRUE(data.isMultipoint());
102 data.setColumnCount(0, 1);
103 EXPECT_EQ(1, data.columnCount());
104 EXPECT_TRUE(data.isMultipoint());
108 * Tests that checking for compatibility of modules with multicolumn data
111 TEST(AnalysisDataInitializationTest, ChecksMultiColumnModules)
113 gmx::AnalysisData data;
114 data.setColumnCount(0, 2);
116 MockAnalysisDataModulePointer mod1(new MockAnalysisDataModule(0));
117 EXPECT_THROW_GMX(data.addModule(mod1), gmx::APIError);
119 MockAnalysisDataModulePointer mod2(
120 new MockAnalysisDataModule(gmx::AnalysisDataModuleInterface::efAllowMulticolumn));
121 EXPECT_NO_THROW_GMX(data.addModule(mod2));
125 * Tests that checking for compatibility of modules with multipoint data
128 TEST(AnalysisDataInitializationTest, ChecksMultipointModules)
130 gmx::AnalysisData data;
131 data.setColumnCount(0, 1);
132 data.setMultipoint(true);
134 MockAnalysisDataModulePointer mod1(new MockAnalysisDataModule(0));
135 EXPECT_THROW_GMX(data.addModule(mod1), gmx::APIError);
137 MockAnalysisDataModulePointer mod2(
138 new MockAnalysisDataModule(gmx::AnalysisDataModuleInterface::efAllowMultipoint));
139 EXPECT_NO_THROW_GMX(data.addModule(mod2));
142 #if GTEST_HAS_TYPED_TEST
144 /********************************************************************
145 * Input data for tests below.
148 // Basic input data for gmx::AnalysisData tests.
149 class SimpleInputData
152 static const AnalysisDataTestInput &get()
154 #ifndef STATIC_ANON_NAMESPACE_BUG
155 static SimpleInputData singleton;
156 return singleton.data_;
158 static SimpleInputData singleton_analysisdata;
159 return singleton_analysisdata.data_;
163 SimpleInputData() : data_(1, false)
165 data_.setColumnCount(0, 3);
166 data_.addFrameWithValues(1.0, 0.0, 1.0, 2.0);
167 data_.addFrameWithValues(2.0, 1.0, 1.0, 1.0);
168 data_.addFrameWithValues(3.0, 2.0, 0.0, 0.0);
172 AnalysisDataTestInput data_;
175 // Input data with multiple data sets for gmx::AnalysisData tests.
176 class DataSetsInputData
179 static const AnalysisDataTestInput &get()
181 #ifndef STATIC_ANON_NAMESPACE_BUG
182 static DataSetsInputData singleton;
183 return singleton.data_;
185 static DataSetsInputData singleton_analysisdata;
186 return singleton_analysisdata.data_;
190 DataSetsInputData() : data_(2, false)
192 using gmx::test::AnalysisDataTestInputFrame;
193 data_.setColumnCount(0, 3);
194 data_.setColumnCount(1, 2);
195 AnalysisDataTestInputFrame &frame1 = data_.addFrame(1.0);
196 frame1.addPointSetWithValues(0, 0, 0.0, 1.0, 2.0);
197 frame1.addPointSetWithValues(1, 0, 2.1, 1.1);
198 AnalysisDataTestInputFrame &frame2 = data_.addFrame(2.0);
199 frame2.addPointSetWithValues(0, 0, 1.0, 1.0, 1.0);
200 frame2.addPointSetWithValues(1, 0, 0.1, 2.1);
201 AnalysisDataTestInputFrame &frame3 = data_.addFrame(3.0);
202 frame3.addPointSetWithValues(0, 0, 2.0, 0.0, 0.0);
203 frame3.addPointSetWithValues(1, 0, 1.1, 1.1);
207 AnalysisDataTestInput data_;
210 // Input data for multipoint gmx::AnalysisData tests.
211 class MultipointInputData
214 static const AnalysisDataTestInput &get()
216 #ifndef STATIC_ANON_NAMESPACE_BUG
217 static MultipointInputData singleton;
218 return singleton.data_;
220 static MultipointInputData singleton_analysisdata;
221 return singleton_analysisdata.data_;
225 MultipointInputData() : data_(1, true)
227 using gmx::test::AnalysisDataTestInputFrame;
228 data_.setColumnCount(0, 3);
229 AnalysisDataTestInputFrame &frame1 = data_.addFrame(1.0);
230 frame1.addPointSetWithValues(0, 0, 0.0, 1.0, 2.0);
231 frame1.addPointSetWithValues(0, 0, 1.1, 2.1, 1.1);
232 frame1.addPointSetWithValues(0, 0, 2.2, 1.2, 0.2);
233 AnalysisDataTestInputFrame &frame2 = data_.addFrame(2.0);
234 frame2.addPointSetWithValues(0, 1, 1.0, 1.0);
235 frame2.addPointSetWithValues(0, 0, 2.1, 1.1, 0.1);
236 frame2.addPointSetWithValues(0, 2, 1.2);
237 AnalysisDataTestInputFrame &frame3 = data_.addFrame(3.0);
238 frame3.addPointSetWithValues(0, 0, 2.0, 0.0, 0.0);
239 frame3.addPointSetWithValues(0, 0, 3.1, 2.1);
240 frame3.addPointSetWithValues(0, 1, 2.2, 1.2);
244 AnalysisDataTestInput data_;
247 // Input data with multiple multipoint data sets for gmx::AnalysisData tests.
248 class MultipointDataSetsInputData
251 static const AnalysisDataTestInput &get()
253 #ifndef STATIC_ANON_NAMESPACE_BUG
254 static MultipointDataSetsInputData singleton;
255 return singleton.data_;
257 static MultipointDataSetsInputData singleton_analysisdata;
258 return singleton_analysisdata.data_;
262 MultipointDataSetsInputData() : data_(2, true)
264 using gmx::test::AnalysisDataTestInputFrame;
265 data_.setColumnCount(0, 3);
266 data_.setColumnCount(1, 2);
267 AnalysisDataTestInputFrame &frame1 = data_.addFrame(1.0);
268 frame1.addPointSetWithValues(0, 0, 0.0, 1.0, 2.0);
269 frame1.addPointSetWithValues(0, 1, 2.1, 1.1);
270 frame1.addPointSetWithValues(1, 0, 2.01, 1.01);
271 frame1.addPointSetWithValues(1, 1, 0.11);
272 AnalysisDataTestInputFrame &frame2 = data_.addFrame(2.0);
273 frame2.addPointSetWithValues(0, 0, 1.0, 1.0, 1.0);
274 frame2.addPointSetWithValues(0, 0, 0.1, 2.1);
275 frame2.addPointSetWithValues(1, 1, 1.01);
276 AnalysisDataTestInputFrame &frame3 = data_.addFrame(3.0);
277 frame3.addPointSetWithValues(0, 0, 2.0, 0.0, 0.0);
278 frame3.addPointSetWithValues(0, 1, 1.1);
282 AnalysisDataTestInput data_;
285 /********************************************************************
286 * Tests for gmx::AnalysisData that require data.
289 using gmx::test::AnalysisDataTestFixture;
291 class AnalysisDataTest : public AnalysisDataTestFixture
294 explicit AnalysisDataTest(const AnalysisDataTestInput &input)
301 ASSERT_NO_THROW_GMX(setupDataObject(input_, &data_));
304 void addStaticCheckerModule()
306 AnalysisDataTestFixture::addStaticCheckerModule(input_, &data_);
308 void addStaticParallelCheckerModule()
310 AnalysisDataTestFixture::addStaticParallelCheckerModule(input_, &data_);
312 void addStaticColumnCheckerModule(int firstColumn, int columnCount)
314 AnalysisDataTestFixture::addStaticColumnCheckerModule(
315 input_, firstColumn, columnCount, &data_);
317 void addStaticStorageCheckerModule(int storageCount)
319 AnalysisDataTestFixture::addStaticStorageCheckerModule(
320 input_, storageCount, &data_);
322 void presentAllData()
324 AnalysisDataTestFixture::presentAllData(input_, &data_);
327 const AnalysisDataTestInput &input_;
328 gmx::AnalysisData data_;
331 template <class InputDataType>
332 class AnalysisDataCommonTest : public AnalysisDataTest
335 AnalysisDataCommonTest() : AnalysisDataTest(InputDataType::get())
340 //! Test fixture for tests that are only applicable to simple data.
341 typedef AnalysisDataCommonTest<SimpleInputData> AnalysisDataSimpleTest;
342 //! Test fixture for tests that are only applicable to multipoint data.
343 typedef AnalysisDataCommonTest<MultipointInputData> AnalysisDataMultipointTest;
344 //! List of input data types for tests applicable to all types of data.
345 typedef ::testing::Types<SimpleInputData,
348 MultipointDataSetsInputData>
350 TYPED_TEST_CASE(AnalysisDataCommonTest, AllInputDataTypes);
353 * Tests that data is forwarded correctly to modules using two independent
356 TYPED_TEST(AnalysisDataCommonTest, CallsModuleCorrectly)
358 ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticCheckerModule());
359 ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticCheckerModule());
360 ASSERT_NO_THROW_GMX(AnalysisDataTest::presentAllData());
364 * Tests that data is forwarded correctly to modules when there are only
367 TYPED_TEST(AnalysisDataCommonTest, CallsParallelModuleCorrectly)
369 ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticParallelCheckerModule());
370 ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticParallelCheckerModule());
371 ASSERT_NO_THROW_GMX(AnalysisDataTest::presentAllData());
375 * Tests that data is forwarded correctly to modules when there are both
376 * parallel and serial modules.
378 TYPED_TEST(AnalysisDataCommonTest, CallsMixedModulesCorrectly)
380 ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticCheckerModule());
381 ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticParallelCheckerModule());
382 ASSERT_NO_THROW_GMX(AnalysisDataTest::presentAllData());
386 * Tests that data is forwarded correctly to modules that are added using
388 * Uses two independent modules.
390 TYPED_TEST(AnalysisDataCommonTest, CallsColumnModuleCorrectly)
392 ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticColumnCheckerModule(0, 2));
393 ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticColumnCheckerModule(2, 1));
394 ASSERT_NO_THROW_GMX(AnalysisDataTest::presentAllData());
398 * Tests that data is forwarded correctly (in frame order) to modules when the
399 * data is added through multiple handles in non-increasing order.
401 TYPED_TEST(AnalysisDataCommonTest, CallsModuleCorrectlyWithOutOfOrderFrames)
403 ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticCheckerModule());
404 ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticParallelCheckerModule());
405 ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticColumnCheckerModule(1, 2));
406 gmx::AnalysisDataHandle handle1;
407 gmx::AnalysisDataHandle handle2;
408 gmx::AnalysisDataParallelOptions options(2);
409 ASSERT_NO_THROW_GMX(handle1 = this->data_.startData(options));
410 ASSERT_NO_THROW_GMX(handle2 = this->data_.startData(options));
411 ASSERT_NO_THROW_GMX(AnalysisDataTest::presentDataFrame(this->input_, 1, handle1));
412 ASSERT_NO_THROW_GMX(AnalysisDataTest::presentDataFrame(this->input_, 0, handle2));
413 ASSERT_NO_THROW_GMX(AnalysisDataTest::presentDataFrame(this->input_, 2, handle1));
414 ASSERT_NO_THROW_GMX(handle1.finishData());
415 ASSERT_NO_THROW_GMX(handle2.finishData());
419 * Tests that data can be accessed correctly from a module that requests
420 * storage using AbstractAnalysisData::requestStorage() with parameter -1.
422 TYPED_TEST(AnalysisDataCommonTest, FullStorageWorks)
424 ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticStorageCheckerModule(-1));
425 ASSERT_NO_THROW_GMX(AnalysisDataTest::presentAllData());
429 * Tests that a data module can be added to an AnalysisData object after data
430 * has been added if all data is still available in storage.
432 TYPED_TEST(AnalysisDataCommonTest, CanAddModuleAfterStoredData)
434 ASSERT_TRUE(this->data_.requestStorage(-1));
436 ASSERT_NO_THROW_GMX(AnalysisDataTest::presentAllData());
437 ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticCheckerModule());
441 * Tests that data can be accessed correctly from a module that requests
442 * storage using AbstractAnalysisData::requestStorage() only for one frame.
444 TYPED_TEST(AnalysisDataCommonTest, LimitedStorageWorks)
446 ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticStorageCheckerModule(1));
447 ASSERT_NO_THROW_GMX(AnalysisDataTest::presentAllData());
452 /* A dummy test that at least signals that something is missing if one runs the
453 * unit test executable itself.
455 TEST(DISABLED_AnalysisDataCommonTest, GenericTests)
458 << "Tests for generic AnalysisData functionality require support for "
459 << "Google Test typed tests, which was not available when the tests "