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