From 520f7fa2de2c1de097c850b73a49f9055301ec28 Mon Sep 17 00:00:00 2001 From: Patrick Niklaus Date: Tue, 28 Oct 2014 00:16:03 +0100 Subject: [PATCH] Add UnitTest for DP Conflicts: CMakeLists.txt --- CMakeLists.txt | 7 +- UnitTests/Algorithms/DouglasPeuckerTest.cpp | 83 +++++++++++++++++++++ UnitTests/algorithm_tests.cpp | 8 ++ 3 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 UnitTests/Algorithms/DouglasPeuckerTest.cpp create mode 100644 UnitTests/algorithm_tests.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 095cb6d64..81b72a558 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,7 +41,7 @@ add_custom_command(OUTPUT ${CMAKE_SOURCE_DIR}/Util/FingerPrint.cpp FingerPrint.c VERBATIM) add_custom_target(FingerPrintConfigure DEPENDS ${CMAKE_SOURCE_DIR}/Util/FingerPrint.cpp) -add_custom_target(tests DEPENDS datastructure-tests) +add_custom_target(tests DEPENDS datastructure-tests algorithm-tests) add_custom_target(benchmarks DEPENDS rtree-bench) set(BOOST_COMPONENTS date_time filesystem iostreams program_options regex system thread unit_test_framework) @@ -72,6 +72,7 @@ file(GLOB AlgorithmGlob Algorithms/*.cpp) file(GLOB HttpGlob Server/Http/*.cpp) file(GLOB LibOSRMGlob Library/*.cpp) file(GLOB DataStructureTestsGlob UnitTests/DataStructures/*.cpp DataStructures/HilbertValue.cpp) +file(GLOB AlgorithmTestsGlob UnitTests/Algorithms/*.cpp) set( OSRMSources @@ -93,6 +94,7 @@ add_executable(osrm-datastore datastore.cpp $ $ $ $) +add_executable(algorithm-tests EXCLUDE_FROM_ALL UnitTests/algorithm_tests.cpp ${AlgorithmTestsGlob} $ $ $) # Benchmarks add_executable(rtree-bench EXCLUDE_FROM_ALL Benchmarks/StaticRTreeBench.cpp $ $ $) @@ -195,6 +197,7 @@ target_link_libraries(osrm-prepare ${Boost_LIBRARIES}) target_link_libraries(osrm-routed ${Boost_LIBRARIES} ${OPTIONAL_SOCKET_LIBS} OSRM) target_link_libraries(osrm-datastore ${Boost_LIBRARIES}) target_link_libraries(datastructure-tests ${Boost_LIBRARIES}) +target_link_libraries(algorithm-tests ${Boost_LIBRARIES} ${OPTIONAL_SOCKET_LIBS} OSRM) target_link_libraries(rtree-bench ${Boost_LIBRARIES}) find_package(Threads REQUIRED) @@ -203,6 +206,7 @@ target_link_libraries(osrm-datastore ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries(osrm-prepare ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries(OSRM ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries(datastructure-tests ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries(algorithm-tests ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries(rtree-bench ${CMAKE_THREAD_LIBS_INIT}) find_package(TBB REQUIRED) @@ -214,6 +218,7 @@ target_link_libraries(osrm-extract ${TBB_LIBRARIES}) target_link_libraries(osrm-prepare ${TBB_LIBRARIES}) target_link_libraries(osrm-routed ${TBB_LIBRARIES}) target_link_libraries(datastructure-tests ${TBB_LIBRARIES}) +target_link_libraries(algorithm-tests ${TBB_LIBRARIES}) target_link_libraries(rtree-bench ${TBB_LIBRARIES}) include_directories(${TBB_INCLUDE_DIR}) diff --git a/UnitTests/Algorithms/DouglasPeuckerTest.cpp b/UnitTests/Algorithms/DouglasPeuckerTest.cpp new file mode 100644 index 000000000..76f0ba38c --- /dev/null +++ b/UnitTests/Algorithms/DouglasPeuckerTest.cpp @@ -0,0 +1,83 @@ +#include "../../Algorithms/DouglasPeucker.h" +#include "../../DataStructures/SegmentInformation.h" +#include "../../Include/osrm/Coordinate.h" + +#include +#include +#include + +#include + +BOOST_AUTO_TEST_SUITE(douglas_peucker) + +SegmentInformation getTestInfo(int lat, int lon, bool necessary) +{ + return SegmentInformation(FixedPointCoordinate(lat, lon), + 0, 0, 0, TurnInstruction::HeadOn, necessary, false, 0); +} + +BOOST_AUTO_TEST_CASE(all_necessary_test) +{ + /* + * x + * / \ + * x \ + * / \ + * x x + */ + std::vector info = { + getTestInfo(5, 5, true), + getTestInfo(6, 6, true), + getTestInfo(10, 10, true), + getTestInfo(5, 15, true) + }; + DouglasPeucker dp; + for (unsigned z = 0; z < 20; z++) + { + dp.Run(info, z); + for (const auto& i : info) + { + BOOST_CHECK_EQUAL(i.necessary, true); + } + } +} + +BOOST_AUTO_TEST_CASE(remove_second_node_test) +{ + DouglasPeucker dp; + for (unsigned z = 0; z < 19; z++) + { + /* + * x--x + * | \ + * x-x x + * | + * x + */ + std::vector info = { + getTestInfo(5 * COORDINATE_PRECISION, + 5 * COORDINATE_PRECISION, true), + getTestInfo(5 * COORDINATE_PRECISION, + 5 * COORDINATE_PRECISION + DOUGLAS_PEUCKER_THRESHOLDS[z], false), + getTestInfo(10 * COORDINATE_PRECISION, + 10 * COORDINATE_PRECISION, false), + getTestInfo(10 * COORDINATE_PRECISION, + 10 + COORDINATE_PRECISION + DOUGLAS_PEUCKER_THRESHOLDS[z] * 2, false), + getTestInfo(5 * COORDINATE_PRECISION, + 15 * COORDINATE_PRECISION, false), + getTestInfo(5 * COORDINATE_PRECISION + DOUGLAS_PEUCKER_THRESHOLDS[z], + 15 * COORDINATE_PRECISION, true), + }; + std::cout << "Threshold: " << DOUGLAS_PEUCKER_THRESHOLDS[z] << std::endl; + dp.Run(info, z); + std::cout << "z: " << z << std::endl; + BOOST_CHECK_EQUAL(info[0].necessary, true); + BOOST_CHECK_EQUAL(info[1].necessary, false); + BOOST_CHECK_EQUAL(info[2].necessary, true); + BOOST_CHECK_EQUAL(info[3].necessary, true); + BOOST_CHECK_EQUAL(info[4].necessary, false); + BOOST_CHECK_EQUAL(info[5].necessary, true); + } +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/UnitTests/algorithm_tests.cpp b/UnitTests/algorithm_tests.cpp new file mode 100644 index 000000000..3cfc46ad2 --- /dev/null +++ b/UnitTests/algorithm_tests.cpp @@ -0,0 +1,8 @@ +#define BOOST_TEST_MODULE algorithm tests + +#include + +/* + * This file will contain an automatically generated main function. + */ +