diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 7e787ba46b50a48d29ca3d5dd8d70f8116354d5d..4c921c290c5459bce2f48306843d307f2a6470c7 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -2,6 +2,9 @@ set(HEADERS ../src/swcio.hpp ../src/tree.hpp ../src/cell_tree.hpp + ../src/point.hpp + ../src/math.hpp + ../src/segment.hpp ) set(TEST_SOURCES @@ -11,6 +14,8 @@ set(TEST_SOURCES # unit tests test_swcio.cpp test_tree.cpp + test_point.cpp + test_segment.cpp # unit test driver main.cpp diff --git a/tests/test_point.cpp b/tests/test_point.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9fbb62a2fd6819caf1e1b97a2c62013d98886f24 --- /dev/null +++ b/tests/test_point.cpp @@ -0,0 +1,114 @@ +#include <limits> + +#include "gtest.h" + +#include "../src/point.hpp" + +TEST(point, construction) +{ + { + // default constructor + point<float> p; + // expect NaN, which returns false when comparing for equality + EXPECT_NE(p.x, p.x); + EXPECT_NE(p.y, p.y); + EXPECT_NE(p.z, p.z); + } + + { + // initializer list + point<float> p = {1, 2, 3}; + EXPECT_EQ(p.x, 1.); + EXPECT_EQ(p.y, 2.); + EXPECT_EQ(p.z, 3.); + } + + { + // explicit call to constructor + point<double> p1(1, 2, 3); + + EXPECT_EQ(p1.x, 1.); + EXPECT_EQ(p1.y, 2.); + EXPECT_EQ(p1.z, 3.); + + // copy constructor + auto p2 = p1; + + EXPECT_EQ(p1.x, p2.x); + EXPECT_EQ(p1.y, p2.y); + EXPECT_EQ(p1.z, p2.z); + } +} + +TEST(point, constexpr) +{ + // perform test using constexpr + constexpr point<double> p1(1, 2, 3); + constexpr point<double> p2(1, 2, 3); + + constexpr auto p = p1 + p2; + + static_assert(p.x == p1.x+p2.x, "failed x-component"); + static_assert(p.y == p1.y+p2.y, "failed y-component"); + static_assert(p.z == p1.z+p2.z, "failed z-component"); +} + +TEST(point, addition) +{ + // perform test using constexpr + point<double> p1(1, 2, 3); + point<double> p2(1, 2, 3); + + auto p = p1 + p2; + + EXPECT_EQ(p.x, 2); + EXPECT_EQ(p.y, 4); + EXPECT_EQ(p.z, 6); +} + +TEST(point, subtraction) +{ + // perform test using constexpr + point<double> p1(1, 2, 3); + point<double> p2(1, 2, 3); + + auto p = p1 - p2; + + EXPECT_EQ(p.x, 0); + EXPECT_EQ(p.y, 0); + EXPECT_EQ(p.z, 0); +} + +TEST(point, scalar_prod) +{ + // perform test using constexpr + point<double> p1(1, 2, 3); + + auto p = 0.5 * p1; + + EXPECT_EQ(p.x, 0.5); + EXPECT_EQ(p.y, 1.0); + EXPECT_EQ(p.z, 1.5); +} + +TEST(point, norm) +{ + // don't use constexpr, because the sqrt is not constexpr + point<double> p1(1, 1, 1); + point<double> p2(1, 2, 3); + + EXPECT_EQ(norm(p1), sqrt(3.)); + EXPECT_EQ(norm(p2), sqrt(1.+4.+9.)); +} + +TEST(point, dot) +{ + // perform test using constexpr + constexpr point<double> p1(1, -1, 1); + constexpr point<double> p2(1, 2, 3); + + static_assert(dot(p1,p2)==2., "unable to perform constexpr dot product"); + + EXPECT_EQ(dot(p1,p2), 2.); +} + diff --git a/tests/test_segment.cpp b/tests/test_segment.cpp new file mode 100644 index 0000000000000000000000000000000000000000..94dabca0b3f113124116dfa19b454aed98b47222 --- /dev/null +++ b/tests/test_segment.cpp @@ -0,0 +1,32 @@ +#include <limits> + +#include "gtest.h" + +#include "../src/segment.hpp" + +TEST(segments, sphere) +{ + using namespace nestmc; + + { + auto s = make_segment<spherical_segment>(1.0); + + EXPECT_EQ(s->volume(), nestmc::pi<double>()*4./3.); + EXPECT_EQ(s->area(), nestmc::pi<double>()*4.); + EXPECT_EQ(s->kind(), nestmc::segmentKind::soma); + } + + { + auto s = make_segment<spherical_segment>(1.0, point<double>(0., 1., 2.)); + + EXPECT_EQ(s->volume(), nestmc::pi<double>()*4./3.); + EXPECT_EQ(s->area(), nestmc::pi<double>()*4.); + EXPECT_EQ(s->kind(), nestmc::segmentKind::soma); + } +} + +TEST(segments, frustrum) +{ + { + } +}