diff --git a/CMakeLists.txt b/CMakeLists.txt index da56ae3f345689ce622e55fa401d8aec30456683..f14612a971e06329ea4304cfe4ffb7d58a0c275d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,7 @@ add_subdirectory(ThirdParty/gtest) add_subdirectory(Tests/UnitTests/TestCore) add_subdirectory(ThirdParty/RootMinimizers) add_subdirectory(Fit) +add_subdirectory(Tests/UnitTests/TestFit) add_subdirectory(Tests/FunctionalTests) # functional tests (make check) if(ROOT_FOUND AND BORNAGAIN_APP) diff --git a/Core/Tools/inc/BAConfigure.h b/Core/Tools/inc/BAConfigure.h new file mode 100644 index 0000000000000000000000000000000000000000..d7e39fbf6dfc3946d7e6eae827c01e0236b4ab00 --- /dev/null +++ b/Core/Tools/inc/BAConfigure.h @@ -0,0 +1,24 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file Tools/inc/BAConfigure.h +//! @brief Defines configuration variables +//! +//! @homepage http://apps.jcns.fz-juelich.de/BornAgain +//! @license GNU General Public License v3 or higher (see COPYING) +//! @copyright Forschungszentrum Jülich GmbH 2013 +//! @authors Scientific Computing Group at MLZ Garching +//! @authors C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke +// +// ************************************************************************** // + +#ifndef BACONFIGURE_H +#define BACONFIGURE_H + +/* Configuration file will be automatically regenerated by CMake */ + +#define BORNAGAIN_SOURCE_DIR "/home/mahadi/BornAgain" +#define BORNAGAIN_INSTALL_DIR "/usr/local" + +#endif diff --git a/Tests/UnitTests/TestFit/AttLimitsTest.h b/Tests/UnitTests/TestFit/AttLimitsTest.h new file mode 100644 index 0000000000000000000000000000000000000000..7acf045956db5cdeff3e1d73a15ab82416d694e8 --- /dev/null +++ b/Tests/UnitTests/TestFit/AttLimitsTest.h @@ -0,0 +1,138 @@ +#ifndef ATTLIMITSTEST_H +#define ATTLIMITSTEST_H + +#include "AttLimits.h" + +#include "gtest/gtest.h" + + +class AttLimitsTest : public ::testing::Test +{ + protected: + AttLimitsTest(){} + virtual ~AttLimitsTest(){} + +}; + + + +TEST_F(AttLimitsTest, AttLimitsInitial) +{ + AttLimits attLimits; + + EXPECT_FALSE(attLimits.hasLowerLimit()); + EXPECT_FALSE(attLimits.hasUpperLimit()); + EXPECT_FALSE(attLimits.hasLowerAndUpperLimits()); + EXPECT_FALSE(attLimits.isFixed()); +} + +TEST_F(AttLimitsTest, AttLimitsSetLimit) +{ + AttLimits attLimits; + + //set limit + attLimits.setLimits(-1.0,10.0); + EXPECT_TRUE(attLimits.hasLowerLimit()); + EXPECT_TRUE(attLimits.hasUpperLimit()); + EXPECT_TRUE(attLimits.hasLowerAndUpperLimits()); + EXPECT_FALSE(attLimits.isFixed()); + + //lower limit + EXPECT_EQ(-1.0,attLimits.getLowerLimit()); + + attLimits.removeLowerLimit(); + EXPECT_FALSE(attLimits.hasLowerAndUpperLimits()); + EXPECT_FALSE(attLimits.hasLowerLimit()); + EXPECT_EQ(0.0,attLimits.getLowerLimit()); + + attLimits.setLowerLimit(2.1); + EXPECT_TRUE(attLimits.hasLowerLimit()); + EXPECT_EQ(2.1,attLimits.getLowerLimit()); + + //upper limit + EXPECT_EQ(10.0,attLimits.getUpperLimit()); + + attLimits.removeUpperLimit(); + EXPECT_FALSE(attLimits.hasLowerAndUpperLimits()); + EXPECT_FALSE(attLimits.hasUpperLimit()); + EXPECT_EQ(0.0,attLimits.getUpperLimit()); + + attLimits.setUpperLimit(2.2); + EXPECT_TRUE(attLimits.hasUpperLimit()); + EXPECT_EQ(2.2,attLimits.getUpperLimit()); + + EXPECT_TRUE(attLimits.hasLowerAndUpperLimits()); + + //remove limit + attLimits.removeLimits(); + EXPECT_FALSE(attLimits.hasLowerLimit()); + EXPECT_FALSE(attLimits.hasUpperLimit()); + EXPECT_FALSE(attLimits.hasLowerAndUpperLimits()); + EXPECT_FALSE(attLimits.isFixed()); + +} + +TEST_F(AttLimitsTest, AttLimitsLowerLimited) +{ + AttLimits attLimits = AttLimits::lowerLimited(5.0); + EXPECT_TRUE(attLimits.hasLowerLimit()); + EXPECT_FALSE(attLimits.hasUpperLimit()); + EXPECT_FALSE(attLimits.hasLowerAndUpperLimits()); + EXPECT_FALSE(attLimits.isFixed()); + + EXPECT_EQ(5.0,attLimits.getLowerLimit()); + EXPECT_EQ(0.0,attLimits.getUpperLimit()); +} + +TEST_F(AttLimitsTest, AttLimitsUpperLimited) +{ + AttLimits attLimits = AttLimits::upperLimited(5.0); + EXPECT_FALSE(attLimits.hasLowerLimit()); + EXPECT_TRUE(attLimits.hasUpperLimit()); + EXPECT_FALSE(attLimits.hasLowerAndUpperLimits()); + EXPECT_FALSE(attLimits.isFixed()); + + EXPECT_EQ(0.0,attLimits.getLowerLimit()); + EXPECT_EQ(5.0,attLimits.getUpperLimit()); +} + +TEST_F(AttLimitsTest, AttLimitsLimited) +{ + AttLimits attLimits = AttLimits::limited(-10.0, 2.0); + EXPECT_TRUE(attLimits.hasLowerLimit()); + EXPECT_TRUE(attLimits.hasUpperLimit()); + EXPECT_TRUE(attLimits.hasLowerAndUpperLimits()); + EXPECT_FALSE(attLimits.isFixed()); + + EXPECT_EQ(-10.0,attLimits.getLowerLimit()); + EXPECT_EQ(2.0,attLimits.getUpperLimit()); +} + +TEST_F(AttLimitsTest, AttLimitsLimitless) +{ + AttLimits attLimits = AttLimits::limitless(); + + EXPECT_FALSE(attLimits.hasLowerLimit()); + EXPECT_FALSE(attLimits.hasUpperLimit()); + EXPECT_FALSE(attLimits.hasLowerAndUpperLimits()); + EXPECT_FALSE(attLimits.isFixed()); +} + +TEST_F(AttLimitsTest, AttLimitsFixed) +{ + AttLimits attLimits = AttLimits::fixed(); + + EXPECT_FALSE(attLimits.hasLowerLimit()); + EXPECT_FALSE(attLimits.hasUpperLimit()); + EXPECT_FALSE(attLimits.hasLowerAndUpperLimits()); + EXPECT_TRUE(attLimits.isFixed()); + + EXPECT_EQ(0.0,attLimits.getLowerLimit()); + EXPECT_EQ(0.0,attLimits.getUpperLimit()); + + attLimits.setFixed(false); + EXPECT_FALSE(attLimits.isFixed()); +} + + +#endif // ATTLIMITSTEST_H diff --git a/Tests/UnitTests/TestFit/CMakeLists.txt b/Tests/UnitTests/TestFit/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..396d5ac6542b2bcb9adfe97f7093f5f1a6a4178e --- /dev/null +++ b/Tests/UnitTests/TestFit/CMakeLists.txt @@ -0,0 +1,38 @@ +############################################################################ +# CMakeLists.txt file for building and running unit tests +############################################################################ + +enable_testing() + +file(GLOB include_files "*.h") + +add_executable( TestFit main.cpp ${include_files}) + +# dependencies +include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR}) +target_link_libraries(TestFit gtest) + +include_directories( + ${Boost_INCLUDE_DIRS} + ${BornAgainCore_INCLUDE_DIRS} + ${BornAgainFit_INCLUDE_DIRS} + ${EIGEN3_INCLUDE_DIR} +) + + +target_link_libraries(TestFit + ${BornAgainCore_LIBRARY} + ${BornAgainFit_LIBRARY} + ${Boost_LIBRARIES} +) + +# to build executable right in lib directory to not to have problems with finding libBornAgainCore.dll under Windows +set_property(TARGET TestFit PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) + +add_test( TestFit TestFit) # TestName ExeName + +# add execution of TestCore just after compilation +add_custom_command(TARGET TestFit POST_BUILD COMMAND TestFit) + + + diff --git a/Tests/UnitTests/TestFit/FitParameterLinkedTest.h b/Tests/UnitTests/TestFit/FitParameterLinkedTest.h new file mode 100644 index 0000000000000000000000000000000000000000..7fcd20affe136a3ae35e0422d9869f2e42c673d6 --- /dev/null +++ b/Tests/UnitTests/TestFit/FitParameterLinkedTest.h @@ -0,0 +1,100 @@ +#ifndef FITPARAMETERLINKEDTEST_H +#define FITPARAMETERLINKEDTEST_H + +#include "ParameterPool.h" +#include "FitParameterLinked.h" + +#include "gtest/gtest.h" + + +class FitParameterLinkedTest : public ::testing::Test +{ + protected: + FitParameterLinkedTest(){} + virtual ~FitParameterLinkedTest(){} + +}; + + + +TEST_F(FitParameterLinkedTest, FitParameterLinkedInitial) +{ + FitParameterLinked fitParameterLinked; + + EXPECT_EQ("", fitParameterLinked.getName()); + EXPECT_EQ(0.0, fitParameterLinked.getValue()); + EXPECT_EQ(0.0, fitParameterLinked.getStep()); + EXPECT_EQ(0.0, fitParameterLinked.getError()); + + + EXPECT_FALSE(fitParameterLinked.hasLowerLimit()); + EXPECT_FALSE(fitParameterLinked.hasUpperLimit()); + EXPECT_FALSE(fitParameterLinked.hasLowerAndUpperLimits()); + EXPECT_FALSE(fitParameterLinked.isFixed()); +} + +TEST_F(FitParameterLinkedTest, FitParameterLinkedWithValue) +{ + AttLimits attLimits = AttLimits::limited(-10.0, 2.0); + + FitParameterLinked fitParameter("FitPL", 2.0, 0.2, attLimits, 0.01); + + EXPECT_EQ("FitPL", fitParameter.getName()); + EXPECT_EQ(2.0, fitParameter.getValue()); + EXPECT_EQ(0.2, fitParameter.getStep()); + EXPECT_EQ(0.01, fitParameter.getError()); + + EXPECT_EQ(-10.0, fitParameter.getLowerLimit()); + EXPECT_EQ(2.0, fitParameter.getUpperLimit()); + +} + +TEST_F(FitParameterLinkedTest, FitParameterLinkedParamPool) +{ + FitParameterLinked fitParameterLinked; + + + double pValue1 = 1.0; + double pValue2 = 2.0; + double pValue3 = 3.0; + double pValue4 = 4.0; + double pValue5 = 5.0; + double pValue6 = 6.0; + + ParameterPool::parameter_t poolpar1(&pValue1); + ParameterPool::parameter_t poolpar2(&pValue2); + ParameterPool::parameter_t poolpar3(&pValue3); + ParameterPool::parameter_t poolpar4(&pValue4); + ParameterPool::parameter_t poolpar5(&pValue5); + ParameterPool::parameter_t poolpar6(&pValue6); + + fitParameterLinked.addParameter(poolpar1); + fitParameterLinked.addParameter(poolpar2); + fitParameterLinked.addParameter(poolpar3); + + fitParameterLinked.setValue(11.2); + EXPECT_EQ(11.2, fitParameterLinked.getValue()); + EXPECT_EQ(11.2, pValue1); + EXPECT_EQ(11.2, pValue2); + EXPECT_EQ(11.2, pValue3); + + + ParameterPool m_pool; + m_pool.addParameter("par4",poolpar4); + m_pool.addParameter("par5",poolpar5); + m_pool.addParameter("par6",poolpar6); + + fitParameterLinked.addMatchedParametersFromPool(&m_pool,"par4"); + fitParameterLinked.setValue(2.3); + + EXPECT_EQ(2.3, fitParameterLinked.getValue()); + EXPECT_EQ(2.3, pValue1); + EXPECT_EQ(2.3, pValue2); + EXPECT_EQ(2.3, pValue3); + EXPECT_EQ(2.3, pValue4); + + +} + + +#endif //FITPARAMETERLINKEDTEST_H diff --git a/Tests/UnitTests/TestFit/FitParameterTest.h b/Tests/UnitTests/TestFit/FitParameterTest.h new file mode 100644 index 0000000000000000000000000000000000000000..5b16e320530c61804679cda59945f0b3ab9f6403 --- /dev/null +++ b/Tests/UnitTests/TestFit/FitParameterTest.h @@ -0,0 +1,77 @@ +#ifndef FITPARAMETERTEST_H +#define FITPARAMETERTEST_H + +#include "FitParameter.h" + +#include "gtest/gtest.h" + + +class FitParameterTest : public ::testing::Test +{ + protected: + FitParameterTest(){} + virtual ~FitParameterTest(){} + +}; + + + +TEST_F(FitParameterTest, FitParameterInitial) +{ + FitParameter fitParameter; + + EXPECT_EQ("", fitParameter.getName()); + EXPECT_EQ(0.0, fitParameter.getValue()); + EXPECT_EQ(0.0, fitParameter.getStep()); + EXPECT_EQ(0.0, fitParameter.getError()); + + + EXPECT_FALSE(fitParameter.hasLowerLimit()); + EXPECT_FALSE(fitParameter.hasUpperLimit()); + EXPECT_FALSE(fitParameter.hasLowerAndUpperLimits()); + EXPECT_FALSE(fitParameter.isFixed()); +} + +TEST_F(FitParameterTest, FitParameterSetValue) +{ + FitParameter fitParameter; + fitParameter.setValue(-1.0); + fitParameter.setStep(0.1); + fitParameter.setError(1.2); + + EXPECT_EQ(-1.0, fitParameter.getValue()); + EXPECT_EQ(0.1, fitParameter.getStep()); + EXPECT_EQ(1.2, fitParameter.getError()); +} + + +TEST_F(FitParameterTest, FitParameterWithValue) +{ + AttLimits attLimits = AttLimits::limited(-10.0, 2.0); + + FitParameter fitParameter("FitP", 2.0, 0.2, attLimits, 0.01); + + EXPECT_EQ("FitP", fitParameter.getName()); + EXPECT_EQ(2.0, fitParameter.getValue()); + EXPECT_EQ(0.2, fitParameter.getStep()); + EXPECT_EQ(0.01, fitParameter.getError()); + + + EXPECT_TRUE(fitParameter.hasLowerLimit()); + EXPECT_TRUE(fitParameter.hasUpperLimit()); + EXPECT_TRUE(fitParameter.hasLowerAndUpperLimits()); + EXPECT_FALSE(fitParameter.isFixed()); + EXPECT_EQ(-10.0, fitParameter.getLowerLimit()); + EXPECT_EQ(2.0, fitParameter.getUpperLimit()); + + + fitParameter.setValue(-1.0); + fitParameter.setStep(0.1); + fitParameter.setError(1.2); + + EXPECT_EQ(-1.0, fitParameter.getValue()); + EXPECT_EQ(0.1, fitParameter.getStep()); + EXPECT_EQ(1.2, fitParameter.getError()); +} + +#endif //FITPARAMETERTEST_H diff --git a/Tests/UnitTests/TestFit/main.cpp b/Tests/UnitTests/TestFit/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..af2495f06ab145937ee5d4a9da056375887ede59 --- /dev/null +++ b/Tests/UnitTests/TestFit/main.cpp @@ -0,0 +1,35 @@ +#ifdef _MSC_VER +#define _VARIADIC_MAX 10 +#endif +#include "gtest/gtest.h" + +#include "AttLimitsTest.h" +#include "FitParameterTest.h" +#include "FitParameterLinkedTest.h" + +struct ErrorStreamRedirect { + ErrorStreamRedirect( std::streambuf * new_buffer ) + : old( std::cerr.rdbuf( new_buffer ) ) + { } + + ~ErrorStreamRedirect( ) { + std::cerr.rdbuf( old ); + } + +private: + std::streambuf * old; +}; + +int main(int argc, char** argv) +{ + ::testing::InitGoogleTest(&argc, argv); + + // redirect std::cerr stream + std::stringstream oss; + ErrorStreamRedirect redirecter( oss.rdbuf() ); + (void)redirecter; + + // run all google tests + return RUN_ALL_TESTS(); +} +