When the same test data is re-used for multiple test cases it is
wasteful to serialize that data many times. This functionality permits
test cases to choose their own refdata file name, perhaps derived from
the actual test name. This means the tests can run efficiently, don't
needlessly proliferate lots of data, and express directly in the code
that multiple test cases produce the same data.
Refs #4255
* See \ref page_refdata for more details.
*
* \author Teemu Murtola <teemu.murtola@gmail.com>
* See \ref page_refdata for more details.
*
* \author Teemu Murtola <teemu.murtola@gmail.com>
+ * \author Mark Abraham <mark.j.abraham@gmail.com>
* \inlibraryapi
* \ingroup module_testutils
*/
* \inlibraryapi
* \ingroup module_testutils
*/
* Initializes the reference data in the global mode.
*/
TestReferenceData();
* Initializes the reference data in the global mode.
*/
TestReferenceData();
+ /*! \brief Initializes the reference data in the global mode while
+ * providing the test name.
+ *
+ * Providing a name for the test, rather than using the default
+ * name generated by GoogleTest, is useful when many tests should
+ * share common reference data because e.g. they are
+ * value-parameterized over multiple equivalent implementations or
+ * run modes. The name should include a filename suffix
+ * e.g. `.xml` and refers to a file that will be found in the
+ * `refdata` subdirectory for the test case. */
+ explicit TestReferenceData(std::string testNameOverride);
/*! \brief
* Initializes the reference data in a specific mode.
*
/*! \brief
* Initializes the reference data in a specific mode.
*
* Implements classes and functions from refdata.h.
*
* \author Teemu Murtola <teemu.murtola@gmail.com>
* Implements classes and functions from refdata.h.
*
* \author Teemu Murtola <teemu.murtola@gmail.com>
+ * \author Mark Abraham <mark.j.abraham@gmail.com>
* \ingroup module_testutils
*/
#include "gmxpre.h"
* \ingroup module_testutils
*/
#include "gmxpre.h"
#include <algorithm>
#include <limits>
#include <algorithm>
#include <limits>
#include <string>
#include <gtest/gtest.h>
#include <string>
#include <gtest/gtest.h>
{
public:
//! Initializes a checker in the given mode.
{
public:
//! Initializes a checker in the given mode.
- TestReferenceDataImpl(ReferenceDataMode mode, bool bSelfTestMode);
+ TestReferenceDataImpl(ReferenceDataMode mode, bool bSelfTestMode, std::optional<std::string> testNameOverride);
//! Performs final reference data processing when test ends.
void onTestEnd(bool testPassed) const;
//! Performs final reference data processing when test ends.
void onTestEnd(bool testPassed) const;
}
//! Returns a reference to the global reference data object.
}
//! Returns a reference to the global reference data object.
-TestReferenceDataImplPointer initReferenceDataInstance()
+TestReferenceDataImplPointer initReferenceDataInstance(std::optional<std::string> testNameOverride)
{
GMX_RELEASE_ASSERT(!g_referenceData, "Test cannot create multiple TestReferenceData instances");
{
GMX_RELEASE_ASSERT(!g_referenceData, "Test cannot create multiple TestReferenceData instances");
- g_referenceData.reset(new internal::TestReferenceDataImpl(getReferenceDataMode(), false));
+ g_referenceData.reset(new internal::TestReferenceDataImpl(
+ getReferenceDataMode(), false, std::move(testNameOverride)));
return g_referenceData;
}
return g_referenceData;
}
g_referenceData->onTestEnd(true);
g_referenceData.reset();
}
g_referenceData->onTestEnd(true);
g_referenceData.reset();
}
- g_referenceData.reset(new internal::TestReferenceDataImpl(mode, true));
+ g_referenceData.reset(new internal::TestReferenceDataImpl(mode, true, std::nullopt));
return g_referenceData;
}
return g_referenceData;
}
-TestReferenceDataImpl::TestReferenceDataImpl(ReferenceDataMode mode, bool bSelfTestMode) :
+TestReferenceDataImpl::TestReferenceDataImpl(ReferenceDataMode mode,
+ bool bSelfTestMode,
+ std::optional<std::string> testNameOverride) :
updateMismatchingEntries_(false), bSelfTestMode_(bSelfTestMode), bInUse_(false)
{
const std::string dirname = bSelfTestMode ? TestFileManager::getGlobalOutputTempDirectory()
: TestFileManager::getInputDataDirectory();
updateMismatchingEntries_(false), bSelfTestMode_(bSelfTestMode), bInUse_(false)
{
const std::string dirname = bSelfTestMode ? TestFileManager::getGlobalOutputTempDirectory()
: TestFileManager::getInputDataDirectory();
- const std::string filename = TestFileManager::getTestSpecificFileName(".xml");
+ const std::string filename = testNameOverride.has_value()
+ ? testNameOverride.value()
+ : TestFileManager::getTestSpecificFileName(".xml");
fullFilename_ = Path::join(dirname, "refdata", filename);
switch (mode)
fullFilename_ = Path::join(dirname, "refdata", filename);
switch (mode)
-TestReferenceData::TestReferenceData() : impl_(initReferenceDataInstance()) {}
+TestReferenceData::TestReferenceData() : impl_(initReferenceDataInstance(std::nullopt)) {}
+TestReferenceData::TestReferenceData(std::string testNameOverride) :
+ impl_(initReferenceDataInstance(std::move(testNameOverride)))
+{
+}
+
TestReferenceData::TestReferenceData(ReferenceDataMode mode) :
impl_(initReferenceDataInstanceForSelfTest(mode))
{
TestReferenceData::TestReferenceData(ReferenceDataMode mode) :
impl_(initReferenceDataInstanceForSelfTest(mode))
{