From a3ceeccc2144e0fe8aa249a6a9aa7d9c7ca27338 Mon Sep 17 00:00:00 2001 From: Andrew Bell Date: Fri, 10 Aug 2018 15:10:31 -0400 Subject: [PATCH] Add test for voxelcenternearestneighbor. --- pdal/PointView.hpp | 5 ++ test/unit/CMakeLists.txt | 1 + test/unit/filters/VoxelTest.cpp | 86 +++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 test/unit/filters/VoxelTest.cpp diff --git a/pdal/PointView.hpp b/pdal/PointView.hpp index e585966f79..27fc79499c 100644 --- a/pdal/PointView.hpp +++ b/pdal/PointView.hpp @@ -68,6 +68,7 @@ typedef std::set PointViewSet; class PDAL_DLL PointView : public PointContainer { + FRIEND_TEST(VoxelTest, center); friend class Stage; friend class plang::Invocation; friend class PointIdxRef; @@ -327,6 +328,10 @@ class PDAL_DLL PointView : public PointContainer { m_temps.push(id); } void setSpatialReference(const SpatialReference& spatialRef) { m_spatialReference = spatialRef; } + + // For testing only. + PointId index(PointId id) const + { return m_index[id]; } }; struct PointViewLess diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index 79c3d848d4..7e1915e261 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -183,6 +183,7 @@ PDAL_ADD_TEST(pdal_filters_stats_test FILES filters/StatsFilterTest.cpp) PDAL_ADD_TEST(pdal_filters_transformation_test FILES filters/TransformationFilterTest.cpp) PDAL_ADD_TEST(pdal_filters_hexbin_test FILES filters/HexbinFilterTest.cpp) +PDAL_ADD_TEST(pdal_filters_voxel_test FILES filters/VoxelTest.cpp) PDAL_ADD_TEST(pdal_app_test FILES apps/AppTest.cpp) PDAL_ADD_TEST(pdal_app_plugin_test FILES apps/AppPluginTest.cpp) diff --git a/test/unit/filters/VoxelTest.cpp b/test/unit/filters/VoxelTest.cpp new file mode 100644 index 0000000000..52254352b3 --- /dev/null +++ b/test/unit/filters/VoxelTest.cpp @@ -0,0 +1,86 @@ +/****************************************************************************** +* Copyright (c) 2018, Hobu Inc. (info@hobu.co) +* +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following +* conditions are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided +* with the distribution. +* * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the +* names of its contributors may be used to endorse or promote +* products derived from this software without specific prior +* written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +* OF SUCH DAMAGE. +****************************************************************************/ + +#include + +#include + +#include "Support.hpp" + +namespace pdal +{ + +TEST(VoxelTest, center) +{ + StageFactory fac; + + Stage *reader = fac.createStage("readers.las"); + Options ro; + ro.add("filename", Support::datapath("las/autzen_trim.las")); + reader->setOptions(ro); + + Stage *filter = fac.createStage("filters.voxelcenternearestneighbor"); + Options fo; + fo.add("cell", 10); + filter->setOptions(fo); + filter->setInput(*reader); + + PointTable t; + filter->prepare(t); + PointViewSet set = filter->execute(t); + EXPECT_EQ(set.size(), 1U); + PointViewPtr v = *set.begin(); + EXPECT_EQ(v->size(), 7820U); + + PointId sums[] = { 39811200, 35547988, 38700040, 43845452, 52001563, + 69596800, 75166285, 50947904 }; + PointId sum; + PointId id; + size_t iter = 0; + for (id = 0; id < v->size(); ++id) + { + if (id % 1000 == 0) + { + if (id) + { + EXPECT_EQ(sums[iter++], sum); + } + sum = 0; + } + sum += v->index(id); + } + EXPECT_EQ(sums[iter], sum); +} + +} // namespace