/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2011,2012,2013, by the GROMACS development team, led by
- * David van der Spoel, Berk Hess, Erik Lindahl, and including many
- * others, as listed in the AUTHORS file in the top-level source
- * directory and at http://www.gromacs.org.
+ * Copyright (c) 2011,2012,2013,2014, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
*
* GROMACS is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
#include "gromacs/analysisdata/paralleloptions.h"
#include "gromacs/utility/exceptions.h"
-#include "testutils/datatest.h"
-#include "testutils/mock_datamodule.h"
+#include "gromacs/analysisdata/tests/datatest.h"
+#include "gromacs/analysisdata/tests/mock_datamodule.h"
#include "testutils/testasserts.h"
using gmx::test::AnalysisDataTestInput;
TEST(AnalysisDataInitializationTest, BasicInitialization)
{
gmx::AnalysisData data;
+ EXPECT_EQ(1, data.dataSetCount());
+ EXPECT_EQ(0, data.columnCount(0));
EXPECT_EQ(0, data.columnCount());
EXPECT_FALSE(data.isMultipoint());
EXPECT_EQ(0, data.frameCount());
- data.setColumnCount(1);
+ data.setColumnCount(0, 1);
+ EXPECT_EQ(1, data.columnCount(0));
EXPECT_EQ(1, data.columnCount());
EXPECT_FALSE(data.isMultipoint());
- data.setColumnCount(3);
+ data.setDataSetCount(2);
+ EXPECT_EQ(2, data.dataSetCount());
+ data.setColumnCount(0, 3);
+ EXPECT_EQ(3, data.columnCount(0));
+ EXPECT_EQ(0, data.columnCount(1));
+ data.setColumnCount(1, 2);
+ EXPECT_EQ(3, data.columnCount(0));
+ EXPECT_EQ(2, data.columnCount(1));
+
+ data.setDataSetCount(1);
+ EXPECT_EQ(1, data.dataSetCount());
data.setMultipoint(true);
EXPECT_EQ(3, data.columnCount());
EXPECT_TRUE(data.isMultipoint());
- data.setColumnCount(1);
+ data.setColumnCount(0, 1);
EXPECT_EQ(1, data.columnCount());
EXPECT_TRUE(data.isMultipoint());
}
TEST(AnalysisDataInitializationTest, ChecksMultiColumnModules)
{
gmx::AnalysisData data;
- data.setColumnCount(2);
+ data.setColumnCount(0, 2);
MockAnalysisDataModulePointer mod1(new MockAnalysisDataModule(0));
EXPECT_THROW_GMX(data.addModule(mod1), gmx::APIError);
* Tests that checking for compatibility of modules with multipoint data
* works.
*/
-TEST(AnalysisDataInitializationTest, ChecksMultiPointModules)
+TEST(AnalysisDataInitializationTest, ChecksMultipointModules)
{
gmx::AnalysisData data;
- data.setColumnCount(1);
+ data.setColumnCount(0, 1);
data.setMultipoint(true);
MockAnalysisDataModulePointer mod1(new MockAnalysisDataModule(0));
EXPECT_NO_THROW_GMX(data.addModule(mod2));
}
+#if GTEST_HAS_TYPED_TEST
/********************************************************************
* Input data for tests below.
public:
static const AnalysisDataTestInput &get()
{
+#ifndef STATIC_ANON_NAMESPACE_BUG
static SimpleInputData singleton;
return singleton.data_;
+#else
+ static SimpleInputData singleton_analysisdata;
+ return singleton_analysisdata.data_;
+#endif
}
- SimpleInputData() : data_(3, false)
+ SimpleInputData() : data_(1, false)
{
+ data_.setColumnCount(0, 3);
data_.addFrameWithValues(1.0, 0.0, 1.0, 2.0);
data_.addFrameWithValues(2.0, 1.0, 1.0, 1.0);
data_.addFrameWithValues(3.0, 2.0, 0.0, 0.0);
AnalysisDataTestInput data_;
};
+// Input data with multiple data sets for gmx::AnalysisData tests.
+class DataSetsInputData
+{
+ public:
+ static const AnalysisDataTestInput &get()
+ {
+#ifndef STATIC_ANON_NAMESPACE_BUG
+ static DataSetsInputData singleton;
+ return singleton.data_;
+#else
+ static DataSetsInputData singleton_analysisdata;
+ return singleton_analysisdata.data_;
+#endif
+ }
+
+ DataSetsInputData() : data_(2, false)
+ {
+ using gmx::test::AnalysisDataTestInputFrame;
+ data_.setColumnCount(0, 3);
+ data_.setColumnCount(1, 2);
+ AnalysisDataTestInputFrame &frame1 = data_.addFrame(1.0);
+ frame1.addPointSetWithValues(0, 0, 0.0, 1.0, 2.0);
+ frame1.addPointSetWithValues(1, 0, 2.1, 1.1);
+ AnalysisDataTestInputFrame &frame2 = data_.addFrame(2.0);
+ frame2.addPointSetWithValues(0, 0, 1.0, 1.0, 1.0);
+ frame2.addPointSetWithValues(1, 0, 0.1, 2.1);
+ AnalysisDataTestInputFrame &frame3 = data_.addFrame(3.0);
+ frame3.addPointSetWithValues(0, 0, 2.0, 0.0, 0.0);
+ frame3.addPointSetWithValues(1, 0, 1.1, 1.1);
+ }
+
+ private:
+ AnalysisDataTestInput data_;
+};
+
// Input data for multipoint gmx::AnalysisData tests.
class MultipointInputData
{
public:
static const AnalysisDataTestInput &get()
{
+#ifndef STATIC_ANON_NAMESPACE_BUG
static MultipointInputData singleton;
return singleton.data_;
+#else
+ static MultipointInputData singleton_analysisdata;
+ return singleton_analysisdata.data_;
+#endif
+ }
+
+ MultipointInputData() : data_(1, true)
+ {
+ using gmx::test::AnalysisDataTestInputFrame;
+ data_.setColumnCount(0, 3);
+ AnalysisDataTestInputFrame &frame1 = data_.addFrame(1.0);
+ frame1.addPointSetWithValues(0, 0, 0.0, 1.0, 2.0);
+ frame1.addPointSetWithValues(0, 0, 1.1, 2.1, 1.1);
+ frame1.addPointSetWithValues(0, 0, 2.2, 1.2, 0.2);
+ AnalysisDataTestInputFrame &frame2 = data_.addFrame(2.0);
+ frame2.addPointSetWithValues(0, 1, 1.0, 1.0);
+ frame2.addPointSetWithValues(0, 0, 2.1, 1.1, 0.1);
+ frame2.addPointSetWithValues(0, 2, 1.2);
+ AnalysisDataTestInputFrame &frame3 = data_.addFrame(3.0);
+ frame3.addPointSetWithValues(0, 0, 2.0, 0.0, 0.0);
+ frame3.addPointSetWithValues(0, 0, 3.1, 2.1);
+ frame3.addPointSetWithValues(0, 1, 2.2, 1.2);
+ }
+
+ private:
+ AnalysisDataTestInput data_;
+};
+
+// Input data with multiple multipoint data sets for gmx::AnalysisData tests.
+class MultipointDataSetsInputData
+{
+ public:
+ static const AnalysisDataTestInput &get()
+ {
+#ifndef STATIC_ANON_NAMESPACE_BUG
+ static MultipointDataSetsInputData singleton;
+ return singleton.data_;
+#else
+ static MultipointDataSetsInputData singleton_analysisdata;
+ return singleton_analysisdata.data_;
+#endif
}
- MultipointInputData() : data_(3, true)
+ MultipointDataSetsInputData() : data_(2, true)
{
using gmx::test::AnalysisDataTestInputFrame;
+ data_.setColumnCount(0, 3);
+ data_.setColumnCount(1, 2);
AnalysisDataTestInputFrame &frame1 = data_.addFrame(1.0);
- frame1.addPointSetWithValues(0, 0.0, 1.0, 2.0);
- frame1.addPointSetWithValues(0, 1.1, 2.1, 1.1);
- frame1.addPointSetWithValues(0, 2.2, 1.2, 0.2);
+ frame1.addPointSetWithValues(0, 0, 0.0, 1.0, 2.0);
+ frame1.addPointSetWithValues(0, 1, 2.1, 1.1);
+ frame1.addPointSetWithValues(1, 0, 2.01, 1.01);
+ frame1.addPointSetWithValues(1, 1, 0.11);
AnalysisDataTestInputFrame &frame2 = data_.addFrame(2.0);
- frame2.addPointSetWithValues(1, 1.0, 1.0);
- frame2.addPointSetWithValues(0, 2.1, 1.1, 0.1);
- frame2.addPointSetWithValues(2, 1.2);
+ frame2.addPointSetWithValues(0, 0, 1.0, 1.0, 1.0);
+ frame2.addPointSetWithValues(0, 0, 0.1, 2.1);
+ frame2.addPointSetWithValues(1, 1, 1.01);
AnalysisDataTestInputFrame &frame3 = data_.addFrame(3.0);
- frame3.addPointSetWithValues(0, 2.0, 0.0, 0.0);
- frame3.addPointSetWithValues(0, 3.1, 2.1);
- frame3.addPointSetWithValues(1, 2.2, 1.2);
+ frame3.addPointSetWithValues(0, 0, 2.0, 0.0, 0.0);
+ frame3.addPointSetWithValues(0, 1, 1.1);
}
private:
{
AnalysisDataTestFixture::addStaticCheckerModule(input_, &data_);
}
+ void addStaticParallelCheckerModule()
+ {
+ AnalysisDataTestFixture::addStaticParallelCheckerModule(input_, &data_);
+ }
void addStaticColumnCheckerModule(int firstColumn, int columnCount)
{
AnalysisDataTestFixture::addStaticColumnCheckerModule(
input_, firstColumn, columnCount, &data_);
}
+ void addStaticStorageCheckerModule(int storageCount)
+ {
+ AnalysisDataTestFixture::addStaticStorageCheckerModule(
+ input_, storageCount, &data_);
+ }
void presentAllData()
{
AnalysisDataTestFixture::presentAllData(input_, &data_);
//! Test fixture for tests that are only applicable to multipoint data.
typedef AnalysisDataCommonTest<MultipointInputData> AnalysisDataMultipointTest;
//! List of input data types for tests applicable to all types of data.
-typedef ::testing::Types<SimpleInputData, MultipointInputData> AllInputDataTypes;
+typedef ::testing::Types<SimpleInputData,
+ DataSetsInputData,
+ MultipointInputData,
+ MultipointDataSetsInputData>
+ AllInputDataTypes;
TYPED_TEST_CASE(AnalysisDataCommonTest, AllInputDataTypes);
/*
ASSERT_NO_THROW_GMX(AnalysisDataTest::presentAllData());
}
+/*
+ * Tests that data is forwarded correctly to modules when there are only
+ * parallel modules.
+ */
+TYPED_TEST(AnalysisDataCommonTest, CallsParallelModuleCorrectly)
+{
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticParallelCheckerModule());
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticParallelCheckerModule());
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::presentAllData());
+}
+
+/*
+ * Tests that data is forwarded correctly to modules when there are both
+ * parallel and serial modules.
+ */
+TYPED_TEST(AnalysisDataCommonTest, CallsMixedModulesCorrectly)
+{
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticCheckerModule());
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticParallelCheckerModule());
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::presentAllData());
+}
+
/*
* Tests that data is forwarded correctly to modules that are added using
* addColumnModule().
* Tests that data is forwarded correctly (in frame order) to modules when the
* data is added through multiple handles in non-increasing order.
*/
-TEST_F(AnalysisDataSimpleTest, CallsModuleCorrectlyWithOutOfOrderFrames)
+TYPED_TEST(AnalysisDataCommonTest, CallsModuleCorrectlyWithOutOfOrderFrames)
{
- ASSERT_NO_THROW_GMX(addStaticCheckerModule());
- ASSERT_NO_THROW_GMX(addStaticColumnCheckerModule(1, 2));
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticCheckerModule());
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticParallelCheckerModule());
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticColumnCheckerModule(1, 2));
gmx::AnalysisDataHandle handle1;
gmx::AnalysisDataHandle handle2;
gmx::AnalysisDataParallelOptions options(2);
- ASSERT_NO_THROW_GMX(handle1 = data_.startData(options));
- ASSERT_NO_THROW_GMX(handle2 = data_.startData(options));
- ASSERT_NO_THROW_GMX(presentDataFrame(input_, 1, handle1));
- ASSERT_NO_THROW_GMX(presentDataFrame(input_, 0, handle2));
- ASSERT_NO_THROW_GMX(presentDataFrame(input_, 2, handle1));
+ ASSERT_NO_THROW_GMX(handle1 = this->data_.startData(options));
+ ASSERT_NO_THROW_GMX(handle2 = this->data_.startData(options));
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::presentDataFrame(this->input_, 1, handle1));
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::presentDataFrame(this->input_, 0, handle2));
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::presentDataFrame(this->input_, 2, handle1));
ASSERT_NO_THROW_GMX(handle1.finishData());
ASSERT_NO_THROW_GMX(handle2.finishData());
}
* Tests that data can be accessed correctly from a module that requests
* storage using AbstractAnalysisData::requestStorage() with parameter -1.
*/
-TEST_F(AnalysisDataSimpleTest, FullStorageWorks)
+TYPED_TEST(AnalysisDataCommonTest, FullStorageWorks)
{
- ASSERT_NO_THROW_GMX(addStaticStorageCheckerModule(input_, -1, &data_));
- ASSERT_NO_THROW_GMX(presentAllData());
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticStorageCheckerModule(-1));
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::presentAllData());
}
/*
* Tests that a data module can be added to an AnalysisData object after data
* has been added if all data is still available in storage.
*/
-TEST_F(AnalysisDataSimpleTest, CanAddModuleAfterStoredData)
+TYPED_TEST(AnalysisDataCommonTest, CanAddModuleAfterStoredData)
{
- ASSERT_TRUE(data_.requestStorage(-1));
+ ASSERT_TRUE(this->data_.requestStorage(-1));
- ASSERT_NO_THROW_GMX(presentAllData());
- ASSERT_NO_THROW_GMX(addStaticCheckerModule());
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::presentAllData());
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticCheckerModule());
}
/*
* Tests that data can be accessed correctly from a module that requests
* storage using AbstractAnalysisData::requestStorage() only for one frame.
*/
-TEST_F(AnalysisDataSimpleTest, LimitedStorageWorks)
+TYPED_TEST(AnalysisDataCommonTest, LimitedStorageWorks)
+{
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::addStaticStorageCheckerModule(1));
+ ASSERT_NO_THROW_GMX(AnalysisDataTest::presentAllData());
+}
+
+#else
+
+/* A dummy test that at least signals that something is missing if one runs the
+ * unit test executable itself.
+ */
+TEST(DISABLED_AnalysisDataCommonTest, GenericTests)
{
- ASSERT_NO_THROW_GMX(addStaticStorageCheckerModule(input_, 1, &data_));
- ASSERT_NO_THROW_GMX(presentAllData());
+ ADD_FAILURE()
+ << "Tests for generic AnalysisData functionality require support for "
+ << "Google Test typed tests, which was not available when the tests "
+ << "were compiled.";
}
+#endif
+
} // namespace