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 moduletest.h.
35 * \author Teemu Murtola <teemu.murtola@cbr.su.se>
36 * \ingroup module_trajectoryanalysis
38 #include "moduletest.h"
44 #include "gromacs/trajectoryanalysis/analysismodule.h"
45 #include "gromacs/trajectoryanalysis/cmdlinerunner.h"
46 #include "gromacs/utility/file.h"
48 #include "testutils/cmdlinetest.h"
49 #include "testutils/datatest.h"
50 #include "testutils/refdata.h"
51 #include "testutils/testfilemanager.h"
58 /********************************************************************
59 * AbstractTrajectoryAnalysisModuleTestFixture::Impl
62 class AbstractTrajectoryAnalysisModuleTestFixture::Impl
67 OutputFileInfo(const char *option, const std::string &path)
68 : option(option), path(path)
76 typedef std::set<std::string> DatasetNames;
77 typedef std::vector<OutputFileInfo> OutputFileList;
79 explicit Impl(AbstractTrajectoryAnalysisModuleTestFixture *parent);
81 TrajectoryAnalysisModule &module();
82 void ensureModuleCreated();
84 AbstractTrajectoryAnalysisModuleTestFixture &parent_;
85 TrajectoryAnalysisModulePointer module_;
86 TestReferenceData data_;
88 TestFileManager tempFiles_;
89 DatasetNames moduleDatasets_;
90 DatasetNames outputDatasets_;
91 OutputFileList outputFiles_;
92 bool bDatasetsIncluded_;
95 AbstractTrajectoryAnalysisModuleTestFixture::Impl::Impl(
96 AbstractTrajectoryAnalysisModuleTestFixture *parent)
97 : parent_(*parent), bDatasetsIncluded_(false)
99 cmdline_.append("module");
100 cmdline_.append("-quiet");
103 TrajectoryAnalysisModule &
104 AbstractTrajectoryAnalysisModuleTestFixture::Impl::module()
106 ensureModuleCreated();
111 AbstractTrajectoryAnalysisModuleTestFixture::Impl::ensureModuleCreated()
113 if (module_.get() == NULL)
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_;
123 /********************************************************************
124 * AbstractTrajectoryAnalysisModuleTestFixture
127 AbstractTrajectoryAnalysisModuleTestFixture::AbstractTrajectoryAnalysisModuleTestFixture()
128 : impl_(new Impl(this))
132 AbstractTrajectoryAnalysisModuleTestFixture::~AbstractTrajectoryAnalysisModuleTestFixture()
137 AbstractTrajectoryAnalysisModuleTestFixture::setTopology(const char *filename)
139 impl_->cmdline_.append("-s");
140 impl_->cmdline_.append(TestFileManager::getInputFilePath(filename));
144 AbstractTrajectoryAnalysisModuleTestFixture::setTrajectory(const char *filename)
146 impl_->cmdline_.append("-f");
147 impl_->cmdline_.append(TestFileManager::getInputFilePath(filename));
151 AbstractTrajectoryAnalysisModuleTestFixture::setOutputFile(const char *option,
152 const char *filename)
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));
161 AbstractTrajectoryAnalysisModuleTestFixture::includeDataset(const char *name)
163 impl_->ensureModuleCreated();
164 if (!impl_->bDatasetsIncluded_)
166 impl_->outputDatasets_.clear();
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);
174 AbstractTrajectoryAnalysisModuleTestFixture::excludeDataset(const char *name)
176 impl_->ensureModuleCreated();
177 bool bFound = (impl_->outputDatasets_.erase(name) > 0);
178 GMX_RELEASE_ASSERT(bFound, "Attempted to exclude a non-existent dataset");
182 AbstractTrajectoryAnalysisModuleTestFixture::runTest(const CommandLine &args)
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)
189 impl_->cmdline_.append(args.arg(i));
192 TestReferenceChecker rootChecker(impl_->data_.rootChecker());
194 rootChecker.checkString(args.toString(), "CommandLine");
196 if (!impl_->outputDatasets_.empty())
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();
205 const char *name = dataset->c_str();
206 AbstractAnalysisData &dataset = module.datasetFromName(name);
207 AnalysisDataTestFixture::addReferenceCheckerModule(
208 dataChecker, name, &dataset);
212 TrajectoryAnalysisCommandLineRunner runner(&module);
213 runner.setPrintCopyright(false);
215 EXPECT_NO_THROW(rc = runner.run(impl_->cmdline_.argc(), impl_->cmdline_.argv()));
218 if (!impl_->outputFiles_.empty())
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();
227 std::string output = File::readToString(outfile->path);
228 outputChecker.checkStringBlock(output, outfile->option.c_str());