Introduce gmxpre.h for truly global definitions
[alexxy/gromacs.git] / src / gromacs / analysisdata / tests / datatest.cpp
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
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.
8  *
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.
13  *
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.
18  *
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.
23  *
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.
31  *
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.
34  */
35 /*! \internal \file
36  * \brief
37  * Implements classes in datatest.h.
38  *
39  * \author Teemu Murtola <teemu.murtola@gmail.com>
40  * \ingroup module_analysisdata
41  */
42 #include "gmxpre.h"
43
44 #include "datatest.h"
45
46 #include <gmock/gmock.h>
47 #include <gtest/gtest.h>
48
49 #include "gromacs/analysisdata/analysisdata.h"
50 #include "gromacs/analysisdata/paralleloptions.h"
51 #include "gromacs/utility/gmxassert.h"
52 #include "gromacs/utility/stringutil.h"
53
54 #include "gromacs/analysisdata/tests/mock_datamodule.h"
55 #include "testutils/refdata.h"
56 #include "testutils/testasserts.h"
57
58 namespace gmx
59 {
60
61 namespace test
62 {
63
64 /********************************************************************
65  * AnalysisDataTestInputPointSet
66  */
67
68 AnalysisDataTestInputPointSet::AnalysisDataTestInputPointSet(
69         int index, int dataSetIndex, int firstColumn)
70     : index_(index), dataSetIndex_(dataSetIndex), firstColumn_(firstColumn)
71 {
72 }
73
74
75 /********************************************************************
76  * AnalysisDataTestInputFrame
77  */
78
79 AnalysisDataTestInputFrame::AnalysisDataTestInputFrame(int index, real x)
80     : index_(index), x_(x)
81 {
82 }
83
84 AnalysisDataTestInputPointSet &
85 AnalysisDataTestInputFrame::addPointSet(int dataSet, int firstColumn)
86 {
87     pointSets_.push_back(
88             AnalysisDataTestInputPointSet(pointSets_.size(),
89                                           dataSet, firstColumn));
90     return pointSets_.back();
91 }
92
93 void AnalysisDataTestInputFrame::addPointSetWithValues(
94         int dataSet, int firstColumn, real y1)
95 {
96     AnalysisDataTestInputPointSet &pointSet = addPointSet(dataSet, firstColumn);
97     pointSet.addValue(y1);
98 }
99
100 void AnalysisDataTestInputFrame::addPointSetWithValues(
101         int dataSet, int firstColumn, real y1, real y2)
102 {
103     AnalysisDataTestInputPointSet &pointSet = addPointSet(dataSet, firstColumn);
104     pointSet.addValue(y1);
105     pointSet.addValue(y2);
106 }
107
108 void AnalysisDataTestInputFrame::addPointSetWithValues(
109         int dataSet, int firstColumn, real y1, real y2, real y3)
110 {
111     AnalysisDataTestInputPointSet &pointSet = addPointSet(dataSet, firstColumn);
112     pointSet.addValue(y1);
113     pointSet.addValue(y2);
114     pointSet.addValue(y3);
115 }
116
117 void AnalysisDataTestInputFrame::addPointSetWithValueAndError(
118         int dataSet, int firstColumn, real y1, real e1)
119 {
120     AnalysisDataTestInputPointSet &pointSet = addPointSet(dataSet, firstColumn);
121     pointSet.addValueWithError(y1, e1);
122 }
123
124
125 /********************************************************************
126  * AnalysisDataTestInput
127  */
128
129 AnalysisDataTestInput::AnalysisDataTestInput(int dataSetCount, bool bMultipoint)
130     : columnCounts_(dataSetCount), bMultipoint_(bMultipoint)
131 {
132 }
133
134
135 AnalysisDataTestInput::~AnalysisDataTestInput()
136 {
137 }
138
139
140 const AnalysisDataTestInputFrame &AnalysisDataTestInput::frame(int index) const
141 {
142     GMX_RELEASE_ASSERT(index >= 0 && index < frameCount(),
143                        "Out-of-range frame index");
144     return frames_[index];
145 }
146
147
148 void AnalysisDataTestInput::setColumnCount(int dataSet, int columnCount)
149 {
150     GMX_RELEASE_ASSERT(dataSet >= 0 && dataSet < dataSetCount(),
151                        "Out-of-range data set index");
152     columnCounts_[dataSet] = columnCount;
153 }
154
155
156 AnalysisDataTestInputFrame &AnalysisDataTestInput::addFrame(real x)
157 {
158     frames_.push_back(AnalysisDataTestInputFrame(frames_.size(), x));
159     return frames_.back();
160 }
161
162 void AnalysisDataTestInput::addFrameWithValues(real x, real y1)
163 {
164     AnalysisDataTestInputFrame &frame = addFrame(x);
165     frame.addPointSetWithValues(0, 0, y1);
166 }
167
168 void AnalysisDataTestInput::addFrameWithValues(real x, real y1, real y2)
169 {
170     AnalysisDataTestInputFrame &frame = addFrame(x);
171     frame.addPointSetWithValues(0, 0, y1, y2);
172 }
173
174 void AnalysisDataTestInput::addFrameWithValues(real x, real y1, real y2, real y3)
175 {
176     AnalysisDataTestInputFrame &frame = addFrame(x);
177     frame.addPointSetWithValues(0, 0, y1, y2, y3);
178 }
179
180 void AnalysisDataTestInput::addFrameWithValueAndError(real x, real y1, real e1)
181 {
182     AnalysisDataTestInputFrame &frame = addFrame(x);
183     frame.addPointSetWithValueAndError(0, 0, y1, e1);
184 }
185
186
187 /********************************************************************
188  * AnalysisDataTest
189  */
190
191 AnalysisDataTestFixture::AnalysisDataTestFixture()
192 {
193 }
194
195
196 void AnalysisDataTestFixture::setupDataObject(const AnalysisDataTestInput &input,
197                                               AnalysisData                *data)
198 {
199     data->setDataSetCount(input.dataSetCount());
200     for (int i = 0; i < input.dataSetCount(); ++i)
201     {
202         data->setColumnCount(i, input.columnCount(i));
203     }
204     data->setMultipoint(input.isMultipoint());
205 }
206
207
208 void AnalysisDataTestFixture::presentAllData(const AnalysisDataTestInput &input,
209                                              AnalysisData                *data)
210 {
211     gmx::AnalysisDataParallelOptions options;
212     gmx::AnalysisDataHandle          handle = data->startData(options);
213     for (int row = 0; row < input.frameCount(); ++row)
214     {
215         presentDataFrame(input, row, handle);
216         EXPECT_EQ(row + 1, data->frameCount());
217     }
218     handle.finishData();
219 }
220
221
222 void AnalysisDataTestFixture::presentDataFrame(const AnalysisDataTestInput &input,
223                                                int row, AnalysisDataHandle handle)
224 {
225     const AnalysisDataTestInputFrame &frame = input.frame(row);
226     handle.startFrame(row, frame.x(), frame.dx());
227     for (int i = 0; i < frame.pointSetCount(); ++i)
228     {
229         const AnalysisDataTestInputPointSet &points = frame.pointSet(i);
230         handle.selectDataSet(points.dataSetIndex());
231         for (int j = 0; j < points.size(); ++j)
232         {
233             if (points.hasError(j))
234             {
235                 handle.setPoint(j + points.firstColumn(),
236                                 points.y(j), points.error(j), points.present(j));
237             }
238             else
239             {
240                 handle.setPoint(j + points.firstColumn(),
241                                 points.y(j), points.present(j));
242             }
243         }
244         if (input.isMultipoint())
245         {
246             handle.finishPointSet();
247         }
248     }
249     handle.finishFrame();
250 }
251
252
253 void
254 AnalysisDataTestFixture::addStaticCheckerModule(const AnalysisDataTestInput &data,
255                                                 AbstractAnalysisData        *source)
256 {
257     MockAnalysisDataModulePointer module(new MockAnalysisDataModule(0));
258     module->setupStaticCheck(data, source, false);
259     source->addModule(module);
260 }
261
262
263 void
264 AnalysisDataTestFixture::addStaticParallelCheckerModule(
265         const AnalysisDataTestInput &data,
266         AbstractAnalysisData        *source)
267 {
268     MockAnalysisDataModulePointer module(new MockAnalysisDataModule(0));
269     module->setupStaticCheck(data, source, true);
270     source->addModule(module);
271 }
272
273
274 void
275 AnalysisDataTestFixture::addStaticColumnCheckerModule(const AnalysisDataTestInput &data,
276                                                       int firstcol, int n,
277                                                       AbstractAnalysisData *source)
278 {
279     MockAnalysisDataModulePointer module(new MockAnalysisDataModule(0));
280     module->setupStaticColumnCheck(data, firstcol, n, source);
281     source->addColumnModule(firstcol, n, module);
282 }
283
284
285 void
286 AnalysisDataTestFixture::addStaticStorageCheckerModule(const AnalysisDataTestInput &data,
287                                                        int                          storageCount,
288                                                        AbstractAnalysisData        *source)
289 {
290     MockAnalysisDataModulePointer module(new MockAnalysisDataModule(0));
291     module->setupStaticStorageCheck(data, storageCount, source);
292     source->addModule(module);
293 }
294
295
296 void
297 AnalysisDataTestFixture::addReferenceCheckerModule(TestReferenceChecker          checker,
298                                                    const char                   *id,
299                                                    AbstractAnalysisData         *source,
300                                                    const FloatingPointTolerance &tolerance)
301 {
302     MockAnalysisDataModulePointer module(new MockAnalysisDataModule(0));
303     TestReferenceChecker          compoundChecker(checker.checkCompound("AnalysisData", id));
304     compoundChecker.setDefaultTolerance(tolerance);
305     module->setupReferenceCheck(compoundChecker, source);
306     source->addModule(module);
307 }
308
309
310 void
311 AnalysisDataTestFixture::addReferenceCheckerModule(const char           *id,
312                                                    AbstractAnalysisData *source)
313 {
314     addReferenceCheckerModule(data_.rootChecker(), id, source,
315                               defaultRealTolerance());
316 }
317
318 } // namespace test
319 } // namespace gmx