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 * Implements classes in datatest.h.
35 * \author Teemu Murtola <teemu.murtola@cbr.su.se>
36 * \ingroup module_testutils
40 #include <gmock/gmock.h>
41 #include <gtest/gtest.h>
43 #include "gromacs/analysisdata/analysisdata.h"
44 #include "gromacs/analysisdata/paralleloptions.h"
45 #include "gromacs/utility/gmxassert.h"
46 #include "gromacs/utility/stringutil.h"
48 #include "testutils/mock_datamodule.h"
49 #include "testutils/refdata.h"
57 /********************************************************************
58 * AnalysisDataTestInputPointSet
61 AnalysisDataTestInputPointSet::AnalysisDataTestInputPointSet()
66 /********************************************************************
67 * AnalysisDataTestInputFrame
70 AnalysisDataTestInputFrame::AnalysisDataTestInputFrame(int index, real x)
71 : index_(index), x_(x)
76 /********************************************************************
77 * AnalysisDataTestInput
80 void AnalysisDataTestInput::initFromArray(const real *data, size_t count)
84 for (size_t i = 0; i < count; ++i)
86 if (data[i] == MPSTOP)
92 for (size_t i = 0; i < count; )
94 frames_.push_back(AnalysisDataTestInputFrame(frames_.size(), data[i]));
95 AnalysisDataTestInputFrame &frame = frames_.back();
96 GMX_RELEASE_ASSERT(data[i] != END_OF_FRAME && data[i] != MPSTOP,
98 while (data[i] != END_OF_FRAME)
101 frame.points_.push_back(AnalysisDataTestInputPointSet());
102 AnalysisDataTestInputPointSet &points = frame.points_.back();
103 while (data[i] != MPSTOP && data[i] != END_OF_FRAME)
105 GMX_RELEASE_ASSERT(i < count,
106 "Premature end of data");
107 points.y_.push_back(data[i]);
110 size_t frameColumns = points.y_.size();
111 GMX_RELEASE_ASSERT(frameColumns > 0U, "Empty data point set");
112 GMX_RELEASE_ASSERT(!(!bMultipoint_ && columns > 0U && columns != frameColumns),
113 "Different frames have different number of columns");
114 if (columns < frameColumns)
116 columns = frameColumns;
121 GMX_RELEASE_ASSERT(!frames_.empty(), "Empty data");
122 columnCount_ = columns;
126 AnalysisDataTestInput::~AnalysisDataTestInput()
131 const AnalysisDataTestInputFrame &AnalysisDataTestInput::frame(int index) const
133 GMX_RELEASE_ASSERT(index >= 0 && index < frameCount(),
134 "Out-of-range frame index");
135 return frames_[index];
139 /********************************************************************
143 AnalysisDataTestFixture::AnalysisDataTestFixture()
148 void AnalysisDataTestFixture::presentAllData(const AnalysisDataTestInput &input,
151 gmx::AnalysisDataParallelOptions options;
152 gmx::AnalysisDataHandle handle = data->startData(options);
153 for (int row = 0; row < input.frameCount(); ++row)
155 presentDataFrame(input, row, handle);
156 EXPECT_EQ(row + 1, data->frameCount());
162 void AnalysisDataTestFixture::presentDataFrame(const AnalysisDataTestInput &input,
163 int row, AnalysisDataHandle handle)
165 const AnalysisDataTestInputFrame &frame = input.frame(row);
166 handle.startFrame(row, frame.x(), frame.dx());
167 for (int i = 0; i < frame.pointSetCount(); ++i)
169 const AnalysisDataTestInputPointSet &points = frame.points(i);
170 for (int j = 0; j < points.size(); ++j)
172 handle.setPoint(j, points.y(j), points.dy(j), points.present(j));
174 if (input.isMultipoint())
176 handle.finishPointSet();
179 handle.finishFrame();
184 AnalysisDataTestFixture::addStaticCheckerModule(const AnalysisDataTestInput &data,
185 AbstractAnalysisData *source)
187 MockAnalysisDataModulePointer module(new MockAnalysisDataModule(0));
188 module->setupStaticCheck(data, source);
189 source->addModule(module);
194 AnalysisDataTestFixture::addStaticColumnCheckerModule(const AnalysisDataTestInput &data,
196 AbstractAnalysisData *source)
198 MockAnalysisDataModulePointer module(new MockAnalysisDataModule(0));
199 module->setupStaticColumnCheck(data, firstcol, n, source);
200 source->addColumnModule(firstcol, n, module);
205 AnalysisDataTestFixture::addStaticStorageCheckerModule(const AnalysisDataTestInput &data,
207 AbstractAnalysisData *source)
209 MockAnalysisDataModulePointer module(new MockAnalysisDataModule(0));
210 module->setupStaticStorageCheck(data, storageCount, source);
211 source->addModule(module);
216 AnalysisDataTestFixture::addReferenceCheckerModule(TestReferenceChecker checker,
218 AbstractAnalysisData *source)
220 MockAnalysisDataModulePointer module(new MockAnalysisDataModule(0));
221 module->setupReferenceCheck(checker.checkCompound("AnalysisData", id), source);
222 source->addModule(module);
227 AnalysisDataTestFixture::addReferenceCheckerModule(const char *id,
228 AbstractAnalysisData *source)
230 addReferenceCheckerModule(data_.rootChecker(), id, source);