From 01290898c042286d5fc839b30d004e369d4b3ce2 Mon Sep 17 00:00:00 2001
From: Sezer Karaca <sezerkaraca15@hotmail.com>
Date: Thu, 5 Mar 2015 16:13:41 +0100
Subject: [PATCH] First commit from Sezer, also added test for distributions

---
 Core/Algorithms/src/Distributions.cpp        |   1 +
 Tests/UnitTests/TestCore/DistributionsTest.h | 325 +++++++++++++++++++
 Tests/UnitTests/TestCore/main.cpp            |   1 +
 3 files changed, 327 insertions(+)
 create mode 100644 Tests/UnitTests/TestCore/DistributionsTest.h

diff --git a/Core/Algorithms/src/Distributions.cpp b/Core/Algorithms/src/Distributions.cpp
index 1296ce8ed7b..8249ecafa3d 100644
--- a/Core/Algorithms/src/Distributions.cpp
+++ b/Core/Algorithms/src/Distributions.cpp
@@ -107,6 +107,7 @@ bool DistributionGate::checkInitialization() const
 {
     bool result = true;
     if (m_max < m_min) result = false;
+    if(m_max == m_min) result = false;
     if (!result) SignalBadInitialization("DistributionGate");
     return result;
 }
diff --git a/Tests/UnitTests/TestCore/DistributionsTest.h b/Tests/UnitTests/TestCore/DistributionsTest.h
new file mode 100644
index 00000000000..b4b74cd086c
--- /dev/null
+++ b/Tests/UnitTests/TestCore/DistributionsTest.h
@@ -0,0 +1,325 @@
+#ifndef DISTRIBUTIONSTEST_H
+#define DISTRIBUTIONSTEST_H
+
+#include "Distributions.h"
+#include <cmath>
+
+class DistributionsTest : public ::testing::Test
+{
+
+protected:
+   DistributionsTest(){}
+    virtual ~DistributionsTest(){}
+};
+
+
+TEST_F(DistributionsTest, DistributionGateDefaultConstructor)
+{
+    DistributionGate * id1D = new DistributionGate();
+    EXPECT_EQ(0.5, id1D->getMean());
+    EXPECT_EQ(0.0, id1D->getMin());
+    EXPECT_EQ(1.0, id1D->getMax());
+    EXPECT_EQ(1.0, id1D->probabilityDensity(1));
+    EXPECT_EQ(0, id1D->probabilityDensity(3));
+    EXPECT_EQ("DistributionGate", id1D->getName());
+
+    std::vector<double> list1 = id1D->generateValueList(1, 0.0);
+    EXPECT_EQ(id1D->getMean(), list1[0]);
+
+    std::vector<double> list2 = id1D->generateValueList(2, 0.0);
+    EXPECT_EQ(0, list2[0]);
+    EXPECT_EQ(1, list2[1]);
+
+    delete id1D;
+}
+
+TEST_F(DistributionsTest, DistributionGateConstructor)
+{
+//    DistributionGate * id1D2 = new DistributionGate(1.0, 1.0);
+    EXPECT_THROW(DistributionGate(1.0, 1.0), ClassInitializationException);
+//    DistributionGate * id1D = new DistributionGate(1.0, 2.0);
+//    EXPECT_NO_THROW(id1D);
+//    EXPECT_EQ(1.5, id1D->getMean());
+//    EXPECT_EQ(1.0, id1D->getMin());
+//    EXPECT_EQ(2.0, id1D->getMax());
+//    EXPECT_EQ(1.0, id1D->probabilityDensity(1));
+//    EXPECT_EQ(0, id1D->probabilityDensity(3));
+//    EXPECT_EQ("DistributionGate", id1D->getName());
+
+//    std::vector<double> list1 = id1D->generateValueList(1, 0.0);
+//    EXPECT_EQ(id1D->getMean(), list1[0]);
+
+//    std::vector<double> list2 = id1D->generateValueList(2, 0.0);
+//    EXPECT_EQ(1, list2[0]);
+//    EXPECT_EQ(2, list2[1]);
+
+//    delete id1D;
+}
+
+TEST_F(DistributionsTest, DistributionGateClone)
+{
+    DistributionGate * id1D = new DistributionGate(2.0, 3.0);
+    DistributionGate * id1DClone = id1D->clone();
+    EXPECT_EQ(2.5, id1DClone->getMean());
+    EXPECT_EQ(2.0, id1DClone->getMin());
+    EXPECT_EQ(3.0, id1DClone->getMax());
+    EXPECT_EQ(1.0, id1DClone->probabilityDensity(2));
+    EXPECT_EQ(0, id1DClone->probabilityDensity(4));
+    EXPECT_EQ("DistributionGate", id1DClone->getName());
+
+    std::vector<double> list1 = id1D->generateValueList(1, 0.0);
+    EXPECT_EQ(id1D->getMean(), list1[0]);
+
+    std::vector<double> list2 = id1D->generateValueList(2, 0.0);
+    EXPECT_EQ(2, list2[0]);
+    EXPECT_EQ(3, list2[1]);
+
+    delete id1D;
+    delete id1DClone;
+}
+
+TEST_F(DistributionsTest, DistributionLorentzDefaultConstructer)
+{
+    DistributionLorentz * id1D = new DistributionLorentz();
+    EXPECT_EQ(0.0, id1D->getMean());
+    EXPECT_EQ(1.0, id1D->getHWHM());
+    EXPECT_EQ("DistributionLorentz", id1D->getName());
+    EXPECT_EQ(1/(2*M_PI), id1D->probabilityDensity(1.0));
+
+
+    std::vector<double> list1 = id1D->generateValueList(1, 0.0);
+    EXPECT_EQ(id1D->getMean(), list1[0]);
+
+    std::vector<double> list2 = id1D->generateValueList(2, 0.0);
+    EXPECT_EQ(-2, list2[0]);
+    EXPECT_EQ(2, list2[1]);
+
+    delete id1D;
+
+
+}
+
+TEST_F(DistributionsTest, DistributionLorentzConstructer)
+{
+    DistributionLorentz * id1D = new DistributionLorentz(1.0, 1.0);
+    EXPECT_EQ(1.0, id1D->getMean());
+    EXPECT_EQ(1.0, id1D->getHWHM());
+    EXPECT_EQ("DistributionLorentz", id1D->getName());
+    EXPECT_EQ(1.0/M_PI, id1D->probabilityDensity(1.0));
+
+
+    std::vector<double> list1 = id1D->generateValueList(1, 0.0);
+    EXPECT_EQ(id1D->getMean(), list1[0]);
+
+    std::vector<double> list2 = id1D->generateValueList(2, 0.0);
+    EXPECT_EQ(-1, list2[0]);
+    EXPECT_EQ(3, list2[1]);
+
+    delete id1D;
+
+
+}
+
+
+TEST_F(DistributionsTest, DistributionLorentzClone)
+{
+    DistributionLorentz * id1D = new DistributionLorentz(1.0, 2.0);
+    DistributionLorentz* id1DClone = id1D->clone();
+    EXPECT_EQ(1.0, id1DClone->getMean());
+    EXPECT_EQ(2.0, id1DClone->getHWHM());
+    EXPECT_EQ(2/(5*M_PI), id1DClone->probabilityDensity(2.0));
+    EXPECT_EQ("DistributionLorentz", id1DClone->getName());
+
+    std::vector<double> list1 = id1DClone->generateValueList(1, 0.0);
+    EXPECT_EQ(id1D->getMean(), list1[0]);
+
+    std::vector<double> list2 = id1DClone->generateValueList(2, 0.0);
+    EXPECT_EQ(-3, list2[0]);
+    EXPECT_EQ(5, list2[1]);
+
+    delete id1D;
+    delete id1DClone;
+}
+
+TEST_F(DistributionsTest, DistributionGaussianDefaultConstructor)
+{
+    DistributionGaussian* id1D = new DistributionGaussian();
+    EXPECT_EQ(0.0, id1D->getMean());
+    EXPECT_EQ(1.0, id1D->getStdDev());
+    EXPECT_EQ(std::exp(-1.0/2.0)/std::sqrt(2.0*M_PI), id1D->probabilityDensity(1.0));
+    EXPECT_EQ("DistributionGaussian", id1D->getName());
+
+    std::vector<double> list1 = id1D->generateValueList(1, 0.0);
+    EXPECT_EQ(id1D->getMean(), list1[0]);
+
+    std::vector<double> list2 = id1D->generateValueList(2, 0.0);
+    EXPECT_EQ(-2, list2[0]);
+    EXPECT_EQ(2, list2[1]);
+
+    delete id1D;
+}
+
+
+TEST_F(DistributionsTest, DistributionGaussianConstructor)
+{
+    DistributionGaussian* id1D = new DistributionGaussian(1.0, 1.0);
+    EXPECT_EQ(1.0, id1D->getMean());
+    EXPECT_EQ(1.0, id1D->getStdDev());
+    EXPECT_EQ(1/std::sqrt(2.0*M_PI), id1D->probabilityDensity(1.0));
+    EXPECT_EQ("DistributionGaussian", id1D->getName());
+
+    std::vector<double> list1 = id1D->generateValueList(1, 0.0);
+    EXPECT_EQ(id1D->getMean(), list1[0]);
+
+    std::vector<double> list2 = id1D->generateValueList(2, 0.0);
+    EXPECT_EQ(-1, list2[0]);
+    EXPECT_EQ(3, list2[1]);
+
+    delete id1D;
+
+}
+
+
+TEST_F(DistributionsTest, DistributionGaussianClone)
+{
+    DistributionGaussian* id1D = new DistributionGaussian(1.0, 1.0);
+    DistributionGaussian* id1DClone = id1D->clone();
+    EXPECT_EQ(1.0, id1DClone->getMean());
+    EXPECT_EQ(1.0, id1DClone->getStdDev());
+    EXPECT_EQ(1/std::sqrt(2.0*M_PI), id1DClone->probabilityDensity(1.0));
+    EXPECT_EQ("DistributionGaussian", id1DClone->getName());
+
+    std::vector<double> list1 = id1DClone->generateValueList(1, 0.0);
+    EXPECT_EQ(id1D->getMean(), list1[0]);
+
+    std::vector<double> list2 = id1DClone->generateValueList(2, 0.0);
+    EXPECT_EQ(-1, list2[0]);
+    EXPECT_EQ(3, list2[1]);
+
+    delete id1D;
+    delete id1DClone;
+
+}
+
+TEST_F(DistributionsTest, DistributionLogNormalConstructorWithOneParameter)
+{
+    DistributionLogNormal* id1D = new DistributionLogNormal(1.0);
+    EXPECT_EQ(1.0, id1D->getMedian());
+    EXPECT_EQ(1.0, id1D->getScalePar());
+    EXPECT_EQ(std::exp(0.5), id1D->getMean());
+    EXPECT_EQ(1.0/std::sqrt(2.0*M_PI), id1D->probabilityDensity(1.0));
+    EXPECT_EQ("DistributionLogNormal", id1D->getName());
+
+    std::vector<double> list1 = id1D->generateValueList(1, 0.0);
+    EXPECT_EQ(id1D->getMedian(), list1[0]);
+
+    std::vector<double> list2 = id1D->generateValueList(2, 0.0);
+    EXPECT_EQ(std::exp(-2), list2[0]);
+    EXPECT_EQ(std::exp(-2) + std::exp(2) - std::exp(-2), list2[1]);
+
+    delete id1D;
+}
+
+TEST_F(DistributionsTest, DistributionLogNormalConstructorWithTwoParameter)
+{
+    DistributionLogNormal* id1D = new DistributionLogNormal(1.0,1.0);
+    EXPECT_EQ(1.0, id1D->getMedian());
+    EXPECT_EQ(1.0, id1D->getScalePar());
+    EXPECT_EQ(std::exp(0.5), id1D->getMean());
+    EXPECT_EQ(1.0/std::sqrt(2.0*M_PI), id1D->probabilityDensity(1.0));
+    EXPECT_EQ("DistributionLogNormal", id1D->getName());
+
+    std::vector<double> list1 = id1D->generateValueList(1, 0.0);
+    EXPECT_EQ(id1D->getMedian(), list1[0]);
+
+    std::vector<double> list2 = id1D->generateValueList(2, 0.0);
+    EXPECT_EQ(std::exp(-2), list2[0]);
+    EXPECT_EQ(std::exp(-2) + std::exp(2) - std::exp(-2), list2[1]);
+
+    delete id1D;
+
+}
+
+TEST_F(DistributionsTest, DistributionLogNormalClone)
+{
+    DistributionLogNormal* id1D = new DistributionLogNormal(1.0, 1.0);
+    DistributionLogNormal* id1DClone = id1D->clone();
+    EXPECT_EQ(1.0, id1D->getMedian());
+    EXPECT_EQ(1.0, id1D->getScalePar());
+    EXPECT_EQ(std::exp(0.5), id1D->getMean());
+    EXPECT_EQ(1/std::sqrt(2.0*M_PI), id1D->probabilityDensity(1.0));
+    EXPECT_EQ("DistributionLogNormal", id1D->getName());
+
+    std::vector<double> list1 = id1D->generateValueList(1.0, 0.0);
+    EXPECT_EQ(id1D->getMedian(), list1[0]);
+
+    std::vector<double> list2 = id1D->generateValueList(2.0,0.0);
+    EXPECT_EQ(std::exp(-2), list2[0]);
+    EXPECT_EQ(std::exp(-2) + std::exp(2) - std::exp(-2), list2[1]);
+
+    delete id1D;
+    delete id1DClone;
+
+}
+
+TEST_F(DistributionsTest, DistributionCosineDefaultConstructor)
+{
+    DistributionCosine* id1D = new DistributionCosine();
+    EXPECT_EQ(0.0, id1D->getMean());
+    EXPECT_EQ(1.0, id1D->getSigma());
+    EXPECT_EQ((1.0+std::cos(1))/(2.0*M_PI), id1D->probabilityDensity(1.0));
+    EXPECT_EQ(0, id1D->probabilityDensity(100.0));
+    EXPECT_EQ("DistributionCosine", id1D->getName());
+
+    std::vector<double> list1 = id1D->generateValueList(1, 0.0);
+    EXPECT_EQ(id1D->getMean(), list1[0]);
+
+    std::vector<double> list2 = id1D->generateValueList(2, 0.0);
+    EXPECT_EQ(-M_PI, list2[0]);
+    EXPECT_EQ(M_PI, list2[1]);
+
+    delete id1D;
+}
+
+TEST_F(DistributionsTest, DistributionCosineConstructor)
+{
+    DistributionCosine* id1D = new DistributionCosine(1.0,1.0);
+    EXPECT_EQ(1.0, id1D->getMean());
+    EXPECT_EQ(1.0, id1D->getSigma());
+    EXPECT_EQ(2.0/(2.0*M_PI), id1D->probabilityDensity(1.0));
+    EXPECT_EQ(0, id1D->probabilityDensity(100.0));
+    EXPECT_EQ("DistributionCosine", id1D->getName());
+
+    std::vector<double> list1 = id1D->generateValueList(1, 0.0);
+    EXPECT_EQ(id1D->getMean(), list1[0]);
+
+    std::vector<double> list2 = id1D->generateValueList(2, 0.0);
+    EXPECT_EQ(1-M_PI, list2[0]);
+    EXPECT_EQ(1+M_PI, list2[1]);
+
+    delete id1D;
+}
+
+TEST_F(DistributionsTest, DistributionCosineClone)
+{
+    DistributionCosine* id1D = new DistributionCosine(1.0,1.0);
+    DistributionCosine* id1DClone = id1D->clone();
+    EXPECT_EQ(1.0, id1DClone->getMean());
+    EXPECT_EQ(1.0, id1DClone->getSigma());
+    EXPECT_EQ(2.0/(2.0*M_PI), id1DClone->probabilityDensity(1.0));
+    EXPECT_EQ(0, id1D->probabilityDensity(100.0));
+    EXPECT_EQ("DistributionCosine", id1DClone->getName());
+
+    std::vector<double> list1 = id1DClone->generateValueList(1, 0.0);
+    EXPECT_EQ(id1DClone->getMean(), list1[0]);
+
+    std::vector<double> list2 = id1DClone->generateValueList(2, 0.0);
+    EXPECT_EQ(1-M_PI, list2[0]);
+    EXPECT_EQ(1+M_PI, list2[1]);
+
+    delete id1D;
+    delete id1DClone;
+}
+
+
+#endif
diff --git a/Tests/UnitTests/TestCore/main.cpp b/Tests/UnitTests/TestCore/main.cpp
index 2a18d47d2f2..7933847ad5b 100644
--- a/Tests/UnitTests/TestCore/main.cpp
+++ b/Tests/UnitTests/TestCore/main.cpp
@@ -44,6 +44,7 @@
 #include "SpecularSimulationTest.h"
 #include "ParticleCoreShellTest.h"
 #include "ParameterDistributionTest.h"
+#include "DistributionsTest.h"
 
 struct ErrorStreamRedirect {
     ErrorStreamRedirect( std::streambuf * new_buffer )
-- 
GitLab