Code beautification with uncrustify
[alexxy/gromacs.git] / src / gromacs / trajectoryanalysis / tests / moduletest.cpp
1 /*
2  *
3  *                This source code is part of
4  *
5  *                 G   R   O   M   A   C   S
6  *
7  *          GROningen MAchine for Chemical Simulations
8  *
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.
13
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.
18  *
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.
25  *
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.
28  *
29  * For more info, check our website at http://www.gromacs.org
30  */
31 /*! \internal \file
32  * \brief
33  * Implements classes in moduletest.h.
34  *
35  * \author Teemu Murtola <teemu.murtola@cbr.su.se>
36  * \ingroup module_trajectoryanalysis
37  */
38 #include "moduletest.h"
39
40 #include <set>
41 #include <string>
42 #include <vector>
43
44 #include "gromacs/trajectoryanalysis/analysismodule.h"
45 #include "gromacs/trajectoryanalysis/cmdlinerunner.h"
46 #include "gromacs/utility/file.h"
47
48 #include "testutils/cmdlinetest.h"
49 #include "testutils/datatest.h"
50 #include "testutils/refdata.h"
51 #include "testutils/testfilemanager.h"
52
53 namespace gmx
54 {
55 namespace test
56 {
57
58 /********************************************************************
59  * AbstractTrajectoryAnalysisModuleTestFixture::Impl
60  */
61
62 class AbstractTrajectoryAnalysisModuleTestFixture::Impl
63 {
64     public:
65         struct OutputFileInfo
66         {
67             OutputFileInfo(const char *option, const std::string &path)
68                 : option(option), path(path)
69             {
70             }
71
72             std::string         option;
73             std::string         path;
74         };
75
76         typedef std::set<std::string>       DatasetNames;
77         typedef std::vector<OutputFileInfo> OutputFileList;
78
79         explicit Impl(AbstractTrajectoryAnalysisModuleTestFixture *parent);
80
81         TrajectoryAnalysisModule &module();
82         void ensureModuleCreated();
83
84         AbstractTrajectoryAnalysisModuleTestFixture    &parent_;
85         TrajectoryAnalysisModulePointer                 module_;
86         TestReferenceData                               data_;
87         CommandLine                                     cmdline_;
88         TestFileManager                                 tempFiles_;
89         DatasetNames                                    moduleDatasets_;
90         DatasetNames                                    outputDatasets_;
91         OutputFileList                                  outputFiles_;
92         bool                                            bDatasetsIncluded_;
93 };
94
95 AbstractTrajectoryAnalysisModuleTestFixture::Impl::Impl(
96         AbstractTrajectoryAnalysisModuleTestFixture *parent)
97     : parent_(*parent), bDatasetsIncluded_(false)
98 {
99     cmdline_.append("module");
100     cmdline_.append("-quiet");
101 }
102
103 TrajectoryAnalysisModule &
104 AbstractTrajectoryAnalysisModuleTestFixture::Impl::module()
105 {
106     ensureModuleCreated();
107     return *module_;
108 }
109
110 void
111 AbstractTrajectoryAnalysisModuleTestFixture::Impl::ensureModuleCreated()
112 {
113     if (module_.get() == NULL)
114     {
115         module_ = parent_.createModule();
116         const std::vector<std::string> &datasetNames(module_->datasetNames());
117         moduleDatasets_.clear();
118         moduleDatasets_.insert(datasetNames.begin(), datasetNames.end());
119         outputDatasets_ = moduleDatasets_;
120     }
121 }
122
123 /********************************************************************
124  * AbstractTrajectoryAnalysisModuleTestFixture
125  */
126
127 AbstractTrajectoryAnalysisModuleTestFixture::AbstractTrajectoryAnalysisModuleTestFixture()
128     : impl_(new Impl(this))
129 {
130 }
131
132 AbstractTrajectoryAnalysisModuleTestFixture::~AbstractTrajectoryAnalysisModuleTestFixture()
133 {
134 }
135
136 void
137 AbstractTrajectoryAnalysisModuleTestFixture::setTopology(const char *filename)
138 {
139     impl_->cmdline_.append("-s");
140     impl_->cmdline_.append(TestFileManager::getInputFilePath(filename));
141 }
142
143 void
144 AbstractTrajectoryAnalysisModuleTestFixture::setTrajectory(const char *filename)
145 {
146     impl_->cmdline_.append("-f");
147     impl_->cmdline_.append(TestFileManager::getInputFilePath(filename));
148 }
149
150 void
151 AbstractTrajectoryAnalysisModuleTestFixture::setOutputFile(const char *option,
152                                                            const char *filename)
153 {
154     std::string fullFilename = impl_->tempFiles_.getTemporaryFilePath(filename);
155     impl_->cmdline_.append(option);
156     impl_->cmdline_.append(fullFilename);
157     impl_->outputFiles_.push_back(Impl::OutputFileInfo(option, fullFilename));
158 }
159
160 void
161 AbstractTrajectoryAnalysisModuleTestFixture::includeDataset(const char *name)
162 {
163     impl_->ensureModuleCreated();
164     if (!impl_->bDatasetsIncluded_)
165     {
166         impl_->outputDatasets_.clear();
167     }
168     bool bFound = (impl_->moduleDatasets_.find(name) != impl_->moduleDatasets_.end());
169     GMX_RELEASE_ASSERT(bFound, "Attempted to include a non-existent dataset");
170     impl_->outputDatasets_.insert(name);
171 }
172
173 void
174 AbstractTrajectoryAnalysisModuleTestFixture::excludeDataset(const char *name)
175 {
176     impl_->ensureModuleCreated();
177     bool bFound = (impl_->outputDatasets_.erase(name) > 0);
178     GMX_RELEASE_ASSERT(bFound, "Attempted to exclude a non-existent dataset");
179 }
180
181 void
182 AbstractTrajectoryAnalysisModuleTestFixture::runTest(const CommandLine &args)
183 {
184     TrajectoryAnalysisModule &module = impl_->module();
185     // Skip first argument if it is the module name.
186     int firstArg = (args.arg(0)[0] == '-' ? 0 : 1);
187     for (int i = firstArg; i < args.argc(); ++i)
188     {
189         impl_->cmdline_.append(args.arg(i));
190     }
191
192     TestReferenceChecker rootChecker(impl_->data_.rootChecker());
193
194     rootChecker.checkString(args.toString(), "CommandLine");
195
196     if (!impl_->outputDatasets_.empty())
197     {
198         TestReferenceChecker               dataChecker(
199                 rootChecker.checkCompound("OutputData", "Data"));
200         Impl::DatasetNames::const_iterator dataset;
201         for (dataset = impl_->outputDatasets_.begin();
202              dataset != impl_->outputDatasets_.end();
203              ++dataset)
204         {
205             const char           *name    = dataset->c_str();
206             AbstractAnalysisData &dataset = module.datasetFromName(name);
207             AnalysisDataTestFixture::addReferenceCheckerModule(
208                     dataChecker, name, &dataset);
209         }
210     }
211
212     TrajectoryAnalysisCommandLineRunner runner(&module);
213     runner.setPrintCopyright(false);
214     int rc = 0;
215     EXPECT_NO_THROW(rc = runner.run(impl_->cmdline_.argc(), impl_->cmdline_.argv()));
216     EXPECT_EQ(0, rc);
217
218     if (!impl_->outputFiles_.empty())
219     {
220         TestReferenceChecker                 outputChecker(
221                 rootChecker.checkCompound("OutputFiles", "Files"));
222         Impl::OutputFileList::const_iterator outfile;
223         for (outfile = impl_->outputFiles_.begin();
224              outfile != impl_->outputFiles_.end();
225              ++outfile)
226         {
227             std::string output = File::readToString(outfile->path);
228             outputChecker.checkStringBlock(output, outfile->option.c_str());
229         }
230     }
231 }
232
233 } // namespace test
234 } // namespace gmx