Merge commit '6eb4f090f98f6b17a23c57768c16b7716b6c9cbd' as 'third_party/libosmium'
This commit is contained in:
+242
@@ -0,0 +1,242 @@
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# CMake Config
|
||||
#
|
||||
# Libosmium unit tests
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
message(STATUS "Configuring unit tests")
|
||||
|
||||
include(CMakeParseArguments)
|
||||
include_directories(include)
|
||||
|
||||
add_library(testlib STATIC test_main.cpp)
|
||||
|
||||
set(ALL_TESTS "")
|
||||
|
||||
# Otherwise GCC throws a lot of warnings for REQUIRE(...) from Catch v.1.2.1
|
||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
add_definitions(-Wno-parentheses)
|
||||
endif()
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# Define function for adding tests
|
||||
#
|
||||
# add_unit_tests(group name [ENABLE_IF bool] [LIBS libs] [LABELS labels])
|
||||
#
|
||||
# group - test group (directory)
|
||||
# name - name of test
|
||||
# bool - boolean variable telling whether the test should be run (optional)
|
||||
# libs - lib or libs that should be used when compiling test (optional)
|
||||
# labels - additional labels this test should get (optional)
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
function(add_unit_test _tgroup _tname)
|
||||
set(_testid "${_tgroup}_${_tname}")
|
||||
set(_tpath "${_tgroup}/${_tname}")
|
||||
|
||||
set(ALL_TESTS "${ALL_TESTS};${_tpath}" PARENT_SCOPE)
|
||||
|
||||
cmake_parse_arguments(_param "" "ENABLE_IF" "LIBS;LABELS" ${ARGN})
|
||||
|
||||
if(Osmium_DEBUG)
|
||||
message("${_testid} ENABLE_IF=[${_param_ENABLE_IF}] LIBS=[${_param_LIBS}] LABELS=[${_param_LABELS}]")
|
||||
endif()
|
||||
|
||||
if((NOT(DEFINED _param_ENABLE_IF)) OR (_param_ENABLE_IF))
|
||||
if(Osmium_DEBUG)
|
||||
message("Adding test: ${_tpath}")
|
||||
endif()
|
||||
add_executable(${_testid} t/${_tpath}.cpp)
|
||||
target_link_libraries(${_testid} testlib)
|
||||
|
||||
if(DEFINED _param_LIBS)
|
||||
if(Osmium_DEBUG)
|
||||
message(" Adding libs: ${_param_LIBS}")
|
||||
endif()
|
||||
target_link_libraries(${_testid} ${_param_LIBS})
|
||||
if(_param_LIBS MATCHES "lpthread")
|
||||
set_pthread_on_target(${_testid})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_test(NAME ${_testid}
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
COMMAND ${_testid}
|
||||
)
|
||||
|
||||
set(_labels "unit;fast;${_tgroup}")
|
||||
if(DEFINED _param_LABELS)
|
||||
if(Osmium_DEBUG)
|
||||
message(" Adding labels: ${_param_LABELS}")
|
||||
endif()
|
||||
set(_labels "${_labels};${_param_LABELS}")
|
||||
endif()
|
||||
|
||||
set_tests_properties(${_testid} PROPERTIES
|
||||
LABELS "${_labels}"
|
||||
ENVIRONMENT "OSMIUM_TEST_DATA_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
)
|
||||
else()
|
||||
message("Skipped test ${_tpath} because a dependency was not found")
|
||||
set(OSMIUM_SKIPPED_TESTS
|
||||
"${OSMIUM_SKIPPED_TESTS} ${_tpath}"
|
||||
CACHE STRING "Tests that were skipped because of missing dependecies")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# Prepare some variables so querying it for tests work properly.
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
if(NOT GEOS_FOUND)
|
||||
set(GEOS_FOUND FALSE)
|
||||
endif()
|
||||
|
||||
if(NOT PROJ_FOUND)
|
||||
set(PROJ_FOUND FALSE)
|
||||
endif()
|
||||
|
||||
if(NOT SPARSEHASH_FOUND)
|
||||
set(SPARSEHASH_FOUND FALSE)
|
||||
endif()
|
||||
|
||||
if(NOT BZIP2_FOUND)
|
||||
set(BZIP2_FOUND FALSE)
|
||||
endif()
|
||||
|
||||
if(NOT Threads_FOUND)
|
||||
set(Threads_FOUND FALSE)
|
||||
endif()
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# Add all tests.
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
add_unit_test(area test_area_id)
|
||||
add_unit_test(area test_assembler)
|
||||
add_unit_test(area test_node_ref_segment)
|
||||
|
||||
add_unit_test(osm test_area)
|
||||
add_unit_test(osm test_box)
|
||||
add_unit_test(osm test_changeset)
|
||||
add_unit_test(osm test_crc)
|
||||
add_unit_test(osm test_entity_bits)
|
||||
add_unit_test(osm test_location)
|
||||
add_unit_test(osm test_node)
|
||||
add_unit_test(osm test_node_ref)
|
||||
add_unit_test(osm test_object_comparisons)
|
||||
add_unit_test(osm test_relation)
|
||||
add_unit_test(osm test_timestamp)
|
||||
add_unit_test(osm test_types_from_string)
|
||||
add_unit_test(osm test_way)
|
||||
|
||||
add_unit_test(memory test_buffer_basics)
|
||||
add_unit_test(memory test_buffer_node)
|
||||
add_unit_test(memory test_buffer_purge)
|
||||
add_unit_test(memory test_callback_buffer)
|
||||
add_unit_test(memory test_item)
|
||||
add_unit_test(memory test_type_is_compatible)
|
||||
|
||||
add_unit_test(builder test_attr)
|
||||
add_unit_test(builder test_object_builder)
|
||||
|
||||
add_unit_test(geom test_coordinates)
|
||||
add_unit_test(geom test_crs ENABLE_IF ${PROJ_FOUND} LIBS ${PROJ_LIBRARY})
|
||||
add_unit_test(geom test_exception)
|
||||
add_unit_test(geom test_factory_with_projection ENABLE_IF ${PROJ_FOUND} LIBS ${PROJ_LIBRARY})
|
||||
add_unit_test(geom test_geojson)
|
||||
add_unit_test(geom test_geos ENABLE_IF ${GEOS_FOUND} LIBS ${GEOS_LIBRARY})
|
||||
add_unit_test(geom test_mercator)
|
||||
add_unit_test(geom test_ogr ENABLE_IF ${GDAL_FOUND} LIBS ${GDAL_LIBRARY})
|
||||
add_unit_test(geom test_ogr_wkb ENABLE_IF ${GDAL_FOUND} LIBS ${GDAL_LIBRARY})
|
||||
add_unit_test(geom test_projection ENABLE_IF ${PROJ_FOUND} LIBS ${PROJ_LIBRARY})
|
||||
add_unit_test(geom test_tile)
|
||||
add_unit_test(geom test_wkb)
|
||||
add_unit_test(geom test_wkt)
|
||||
|
||||
add_unit_test(handler test_check_order_handler)
|
||||
add_unit_test(handler test_dynamic_handler)
|
||||
|
||||
add_unit_test(index test_id_set)
|
||||
add_unit_test(index test_id_to_location ENABLE_IF ${SPARSEHASH_FOUND})
|
||||
add_unit_test(index test_file_based_index)
|
||||
add_unit_test(index test_object_pointer_collection)
|
||||
add_unit_test(index test_relations_map)
|
||||
|
||||
add_unit_test(io test_compression_factory)
|
||||
add_unit_test(io test_bzip2 ENABLE_IF ${BZIP2_FOUND} LIBS ${BZIP2_LIBRARIES})
|
||||
add_unit_test(io test_file_formats)
|
||||
add_unit_test(io test_reader LIBS "${OSMIUM_XML_LIBRARIES};${OSMIUM_PBF_LIBRARIES}")
|
||||
add_unit_test(io test_reader_fileformat ENABLE_IF ${Threads_FOUND} LIBS ${CMAKE_THREAD_LIBS_INIT})
|
||||
add_unit_test(io test_reader_with_mock_decompression ENABLE_IF ${Threads_FOUND} LIBS ${OSMIUM_XML_LIBRARIES})
|
||||
add_unit_test(io test_reader_with_mock_parser ENABLE_IF ${Threads_FOUND} LIBS ${CMAKE_THREAD_LIBS_INIT})
|
||||
add_unit_test(io test_opl_parser ENABLE_IF ${Threads_FOUND} LIBS ${CMAKE_THREAD_LIBS_INIT})
|
||||
add_unit_test(io test_output_utils)
|
||||
add_unit_test(io test_output_iterator ENABLE_IF ${Threads_FOUND} LIBS ${CMAKE_THREAD_LIBS_INIT})
|
||||
add_unit_test(io test_string_table)
|
||||
add_unit_test(io test_writer ENABLE_IF ${Threads_FOUND} LIBS ${OSMIUM_XML_LIBRARIES})
|
||||
add_unit_test(io test_writer_with_mock_compression ENABLE_IF ${Threads_FOUND} LIBS ${OSMIUM_XML_LIBRARIES})
|
||||
add_unit_test(io test_writer_with_mock_encoder ENABLE_IF ${Threads_FOUND} LIBS ${OSMIUM_XML_LIBRARIES})
|
||||
|
||||
add_unit_test(relations test_members_database)
|
||||
add_unit_test(relations test_read_relations ENABLE_IF ${Threads_FOUND} LIBS ${OSMIUM_XML_LIBRARIES})
|
||||
add_unit_test(relations test_relations_database)
|
||||
add_unit_test(relations test_relations_manager ENABLE_IF ${Threads_FOUND} LIBS ${OSMIUM_XML_LIBRARIES})
|
||||
|
||||
add_unit_test(storage test_item_stash)
|
||||
|
||||
add_unit_test(tags test_filter)
|
||||
add_unit_test(tags test_operators)
|
||||
add_unit_test(tags test_tag_list)
|
||||
add_unit_test(tags test_tag_matcher)
|
||||
add_unit_test(tags test_tags_filter)
|
||||
|
||||
add_unit_test(thread test_pool ENABLE_IF ${Threads_FOUND} LIBS ${CMAKE_THREAD_LIBS_INIT})
|
||||
add_unit_test(thread test_util ENABLE_IF ${Threads_FOUND} LIBS ${CMAKE_THREAD_LIBS_INIT})
|
||||
|
||||
add_unit_test(util test_cast_with_assert)
|
||||
add_unit_test(util test_config)
|
||||
add_unit_test(util test_delta)
|
||||
add_unit_test(util test_double)
|
||||
add_unit_test(util test_file)
|
||||
add_unit_test(util test_memory)
|
||||
add_unit_test(util test_memory_mapping)
|
||||
add_unit_test(util test_minmax)
|
||||
add_unit_test(util test_options)
|
||||
add_unit_test(util test_string)
|
||||
add_unit_test(util test_string_matcher)
|
||||
add_unit_test(util test_timer_disabled)
|
||||
add_unit_test(util test_timer_enabled)
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# Check that all tests available in test/t/*/test_*.cpp are run.
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
file(GLOB TESTS_IN_DIR RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/t" t/*/test_*.cpp)
|
||||
|
||||
foreach(file ${TESTS_IN_DIR})
|
||||
string(REPLACE ".cpp" "" out1 ${file})
|
||||
string(REPLACE "//" "/" tname ${out1})
|
||||
list(FIND ALL_TESTS ${tname} found)
|
||||
if(${found} EQUAL -1)
|
||||
message(WARNING "Test '${tname}' not found in cmake config. It will not be run!")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
message(STATUS "Configuring unit tests - done")
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
Vendored
+5
@@ -0,0 +1,5 @@
|
||||
Osmium uses Catch (https://github.com/philsquared/Catch/) for its unit tests.
|
||||
|
||||
Only one header file is needed (catch.hpp) which can be downloaded from
|
||||
http://builds.catch-lib.net/ and put into the include directory.
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
multipolygon.qgs~
|
||||
@@ -0,0 +1,126 @@
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# CMake Config
|
||||
#
|
||||
# Libosmium data tests
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
message(STATUS "Configuring data tests")
|
||||
|
||||
if(NOT GDAL_FOUND OR NOT EXPAT_FOUND)
|
||||
message(STATUS "Sorry, building data tests needs GDAL and Expat")
|
||||
message(STATUS "Configuring data tests - failed")
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Looking for osm-testdata")
|
||||
find_path(OSM_TESTDATA grid/data/all.osm HINT ../../../osm-testdata)
|
||||
if(OSM_TESTDATA STREQUAL "OSM_TESTDATA-NOTFOUND")
|
||||
message(STATUS "Looking for osm-testdata - not found (data tests disabled)")
|
||||
message(STATUS "Configuring data tests - failed")
|
||||
return()
|
||||
endif()
|
||||
message(STATUS "Looking for osm-testdata - found")
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
include_directories("include")
|
||||
include_directories("../include")
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# testcases
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
file(GLOB TESTCASE_CPPS testcases/*.cpp)
|
||||
add_executable(testdata-testcases testdata-testcases.cpp ${TESTCASE_CPPS})
|
||||
set_pthread_on_target(testdata-testcases)
|
||||
target_link_libraries(testdata-testcases
|
||||
${OSMIUM_XML_LIBRARIES}
|
||||
)
|
||||
add_test(NAME testdata-testcases
|
||||
COMMAND testdata-testcases
|
||||
)
|
||||
set_tests_properties(testdata-testcases PROPERTIES
|
||||
ENVIRONMENT "TESTCASES_DIR=${OSM_TESTDATA}/grid/data"
|
||||
LABELS "data;fast")
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# xml
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
add_executable(testdata-xml testdata-xml.cpp)
|
||||
set_pthread_on_target(testdata-xml)
|
||||
target_link_libraries(testdata-xml
|
||||
${OSMIUM_XML_LIBRARIES}
|
||||
)
|
||||
add_test(NAME testdata-xml
|
||||
COMMAND testdata-xml
|
||||
)
|
||||
set_tests_properties(testdata-xml PROPERTIES
|
||||
ENVIRONMENT "TESTDIR=${OSM_TESTDATA}/xml/data"
|
||||
LABELS "data;fast")
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# overview
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
add_executable(testdata-overview testdata-overview.cpp)
|
||||
set_pthread_on_target(testdata-overview)
|
||||
target_link_libraries(testdata-overview
|
||||
${OSMIUM_XML_LIBRARIES}
|
||||
${GDAL_LIBRARIES}
|
||||
)
|
||||
add_test(NAME testdata-overview
|
||||
COMMAND testdata-overview ${OSM_TESTDATA}/grid/data/all.osm
|
||||
)
|
||||
set_tests_properties(testdata-overview PROPERTIES
|
||||
LABELS "data;slow")
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# multipolygon
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
find_program(RUBY ruby)
|
||||
if(RUBY)
|
||||
find_package(Gem COMPONENTS json)
|
||||
endif()
|
||||
|
||||
find_program(SPATIALITE spatialite)
|
||||
|
||||
if(RUBY AND GEM_json_FOUND AND SPATIALITE)
|
||||
add_executable(testdata-multipolygon testdata-multipolygon.cpp)
|
||||
set_pthread_on_target(testdata-multipolygon)
|
||||
target_link_libraries(testdata-multipolygon
|
||||
${OSMIUM_XML_LIBRARIES}
|
||||
${GDAL_LIBRARIES}
|
||||
)
|
||||
|
||||
add_test(NAME testdata-multipolygon
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-D OSM_TESTDATA=${OSM_TESTDATA}
|
||||
-D RUBY=${RUBY}
|
||||
-P ${CMAKE_CURRENT_SOURCE_DIR}/run-testdata-multipolygon.cmake)
|
||||
|
||||
set_tests_properties(testdata-multipolygon PROPERTIES LABELS "data;slow")
|
||||
configure_file(multipolygon.qgs ${CMAKE_CURRENT_BINARY_DIR}/multipolygon.qgs @ONLY)
|
||||
else()
|
||||
message(WARNING "Disabled testdata-multipolygon test because 'ruby' and/or 'json' ruby gem and/or 'spatialite' was not found")
|
||||
endif()
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
message(STATUS "Configuring data tests - done")
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
# OSM Testdata
|
||||
|
||||
This directory contains software that can be used with the osm-testdata
|
||||
repository at https://github.com/osmcode/osm-testdata . To use it, clone
|
||||
the `osm-testdata` repository in the same directory where you cloned the
|
||||
`libosmium` repository.
|
||||
|
||||
Tests will be built if the CMake option `BUILD_DATA_TESTS` is set and run as
|
||||
part of the `ctest` run.
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
#ifndef CHECK_BASICS_HANDLER_HPP
|
||||
#define CHECK_BASICS_HANDLER_HPP
|
||||
|
||||
#include <iostream>
|
||||
#include <unordered_set>
|
||||
|
||||
#include <osmium/handler.hpp>
|
||||
#include <osmium/osm.hpp>
|
||||
|
||||
/**
|
||||
* Check some basics of the input data:
|
||||
*
|
||||
* 1. Correct number of nodes, ways, and relations
|
||||
* 2. Correct ID space used by nodes, ways, and relations
|
||||
* 3. No ID used more than once
|
||||
*/
|
||||
class CheckBasicsHandler : public osmium::handler::Handler {
|
||||
|
||||
// Lower bound for the id range allowed in this test.
|
||||
int m_id_range;
|
||||
|
||||
// In the beginning these contains the number of nodes, ways, and relations
|
||||
// supposedly in the data.osm file. They will be decremented on each object
|
||||
// and have to be 0 at the end.
|
||||
int m_num_nodes;
|
||||
int m_num_ways;
|
||||
int m_num_relations;
|
||||
|
||||
// All IDs encountered in the data.osm file will be stored in this set and
|
||||
// checked for duplicates.
|
||||
std::unordered_set<osmium::object_id_type> m_ids;
|
||||
|
||||
// Check id is in range [min, max] and that it isn't more than once in input.
|
||||
void id_check(osmium::object_id_type id, osmium::object_id_type min, osmium::object_id_type max) {
|
||||
if (id < m_id_range + min || id > m_id_range + max) {
|
||||
std::cerr << " id " << id << " out of range for this test case\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
auto r = m_ids.insert(id);
|
||||
if (!r.second) {
|
||||
std::cerr << " id " << id << " contained twice in data.osm\n";
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
static const int ids_per_testcase = 1000;
|
||||
|
||||
CheckBasicsHandler(int testcase, int nodes, int ways, int relations) :
|
||||
osmium::handler::Handler(),
|
||||
m_id_range(testcase * ids_per_testcase),
|
||||
m_num_nodes(nodes),
|
||||
m_num_ways(ways),
|
||||
m_num_relations(relations) {
|
||||
}
|
||||
|
||||
~CheckBasicsHandler() {
|
||||
if (m_num_nodes != 0) {
|
||||
std::cerr << " wrong number of nodes in data.osm\n";
|
||||
exit(1);
|
||||
}
|
||||
if (m_num_ways != 0) {
|
||||
std::cerr << " wrong number of ways in data.osm\n";
|
||||
exit(1);
|
||||
}
|
||||
if (m_num_relations != 0) {
|
||||
std::cerr << " wrong number of relations in data.osm\n";
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
void node(const osmium::Node& node) {
|
||||
id_check(node.id(), 0, 799);
|
||||
--m_num_nodes;
|
||||
}
|
||||
|
||||
void way(const osmium::Way& way) {
|
||||
id_check(way.id(), 800, 899);
|
||||
--m_num_ways;
|
||||
}
|
||||
|
||||
void relations(const osmium::Relation& relation) {
|
||||
id_check(relation.id(), 900, 999);
|
||||
--m_num_relations;
|
||||
}
|
||||
|
||||
}; // CheckBasicsHandler
|
||||
|
||||
|
||||
#endif // CHECK_BASICS_HANDLER_HPP
|
||||
@@ -0,0 +1,86 @@
|
||||
#ifndef CHECK_WKT_HANDLER_HPP
|
||||
#define CHECK_WKT_HANDLER_HPP
|
||||
|
||||
#include <cassert>
|
||||
#include <fstream>
|
||||
#include <map>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
#include <osmium/handler.hpp>
|
||||
#include <osmium/osm.hpp>
|
||||
#include <osmium/osm/types.hpp>
|
||||
|
||||
class CheckWKTHandler : public osmium::handler::Handler {
|
||||
|
||||
std::map<osmium::object_id_type, std::string> m_geometries;
|
||||
osmium::geom::WKTFactory<> m_factory;
|
||||
|
||||
void read_wkt_file(const std::string& filename) {
|
||||
std::ifstream in(filename, std::ifstream::in);
|
||||
if (in) {
|
||||
osmium::object_id_type id;
|
||||
std::string line;
|
||||
while (std::getline(in, line)) {
|
||||
size_t pos = line.find_first_of(' ');
|
||||
|
||||
if (pos == std::string::npos) {
|
||||
std::cerr << filename << " not formatted correctly\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
std::string id_str = line.substr(0, pos);
|
||||
std::istringstream iss(id_str);
|
||||
iss >> id;
|
||||
|
||||
if (m_geometries.find(id) != m_geometries.end()) {
|
||||
std::cerr << filename + " contains id " << id << "twice\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
m_geometries[id] = line.substr(pos+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
CheckWKTHandler(const std::string& dirname, int test_id) :
|
||||
osmium::handler::Handler() {
|
||||
|
||||
std::string filename = dirname + "/" + std::to_string(test_id / 100) + "/" + std::to_string(test_id) + "/";
|
||||
read_wkt_file(filename + "nodes.wkt");
|
||||
read_wkt_file(filename + "ways.wkt");
|
||||
}
|
||||
|
||||
~CheckWKTHandler() {
|
||||
if (!m_geometries.empty()) {
|
||||
for (const auto& geom : m_geometries) {
|
||||
std::cerr << "geometry id " << geom.first << " not in data.osm.\n";
|
||||
}
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
void node(const osmium::Node& node) {
|
||||
const std::string wkt = m_geometries[node.id()];
|
||||
assert(wkt != "" && "Missing geometry for node in nodes.wkt");
|
||||
|
||||
std::string this_wkt = m_factory.create_point(node.location());
|
||||
assert(wkt == this_wkt && "wkt geometries don't match");
|
||||
m_geometries.erase(node.id());
|
||||
}
|
||||
|
||||
void way(const osmium::Way& way) {
|
||||
const std::string wkt = m_geometries[way.id()];
|
||||
assert(wkt != "" && "Missing geometry for way in ways.wkt");
|
||||
|
||||
std::string this_wkt = m_factory.create_linestring(way);
|
||||
assert(wkt == this_wkt && "wkt geometries don't match");
|
||||
m_geometries.erase(way.id());
|
||||
}
|
||||
|
||||
}; // CheckWKTHandler
|
||||
|
||||
|
||||
#endif // CHECK_WKT_HANDLER_HPP
|
||||
@@ -0,0 +1,22 @@
|
||||
#ifndef COMMON_HPP
|
||||
#define COMMON_HPP
|
||||
|
||||
#include <osmium/index/map/dummy.hpp>
|
||||
#include <osmium/index/map/sparse_mem_array.hpp>
|
||||
|
||||
#include <osmium/geom/wkt.hpp>
|
||||
#include <osmium/handler.hpp>
|
||||
#include <osmium/handler/node_locations_for_ways.hpp>
|
||||
#include <osmium/io/xml_input.hpp>
|
||||
#include <osmium/visitor.hpp>
|
||||
|
||||
using index_neg_type = osmium::index::map::Dummy<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
using index_pos_type = osmium::index::map::SparseMemArray<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
using location_handler_type = osmium::handler::NodeLocationsForWays<index_pos_type, index_neg_type>;
|
||||
|
||||
#include "check_basics_handler.hpp"
|
||||
#include "check_wkt_handler.hpp"
|
||||
|
||||
#include "testdata-testcases.hpp"
|
||||
|
||||
#endif // COMMON_HPP
|
||||
@@ -0,0 +1,10 @@
|
||||
#ifndef TESTDATA_TESTCASES_HPP
|
||||
#define TESTDATA_TESTCASES_HPP
|
||||
|
||||
#include <catch.hpp>
|
||||
|
||||
#include <string>
|
||||
|
||||
extern std::string dirname;
|
||||
|
||||
#endif // TESTDATA_TESTCASES_HPP
|
||||
+1213
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,46 @@
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# Helper script that runs the 'multipolygon' test.
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
# Remove files that might be left over from previous run
|
||||
file(REMOVE multipolygon.db multipolygon-tests.json)
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# Create multipolygons from test data.
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/testdata-multipolygon
|
||||
${OSM_TESTDATA}/grid/data/all.osm
|
||||
RESULT_VARIABLE _result
|
||||
OUTPUT_FILE multipolygon.log
|
||||
ERROR_FILE multipolygon.log
|
||||
)
|
||||
|
||||
if(_result)
|
||||
message(FATAL_ERROR "Error running testdata-multipolygon command")
|
||||
endif()
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# Compare created multipolygons with reference data.
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
execute_process(
|
||||
COMMAND ${RUBY} ${OSM_TESTDATA}/bin/compare-areas.rb
|
||||
${OSM_TESTDATA}/grid/data/tests.json
|
||||
multipolygon-tests.json
|
||||
RESULT_VARIABLE _result
|
||||
)
|
||||
|
||||
if(_result)
|
||||
message(FATAL_ERROR "Error running compare-areas command")
|
||||
endif()
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
@@ -0,0 +1,46 @@
|
||||
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <stdexcept>
|
||||
|
||||
#include "common.hpp"
|
||||
|
||||
class TestHandler100 : public osmium::handler::Handler {
|
||||
|
||||
public:
|
||||
|
||||
TestHandler100() :
|
||||
osmium::handler::Handler() {
|
||||
}
|
||||
|
||||
void node(const osmium::Node& node) {
|
||||
constexpr const double epsilon = 0.00000001;
|
||||
if (node.id() == 100000) {
|
||||
REQUIRE(node.version() == 1);
|
||||
REQUIRE(node.timestamp() == osmium::Timestamp{"2014-01-01T00:00:00Z"});
|
||||
REQUIRE(node.uid() == 1);
|
||||
REQUIRE(!std::strcmp(node.user(), "test"));
|
||||
REQUIRE(node.changeset() == 1);
|
||||
REQUIRE(std::abs(node.location().lon() - 1.02) < epsilon);
|
||||
REQUIRE(std::abs(node.location().lat() - 1.02) < epsilon);
|
||||
} else {
|
||||
throw std::runtime_error{"Unknown ID"};
|
||||
}
|
||||
}
|
||||
|
||||
}; // class TestHandler100
|
||||
|
||||
TEST_CASE("100") {
|
||||
|
||||
SECTION("test 100") {
|
||||
osmium::io::Reader reader{dirname + "/1/100/data.osm"};
|
||||
|
||||
CheckBasicsHandler check_basics_handler{100, 1, 0, 0};
|
||||
CheckWKTHandler check_wkt_handler{dirname, 100};
|
||||
TestHandler100 test_handler;
|
||||
|
||||
osmium::apply(reader, check_basics_handler, check_wkt_handler, test_handler);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
|
||||
#include <cmath>
|
||||
#include <stdexcept>
|
||||
|
||||
#include "common.hpp"
|
||||
|
||||
class TestHandler101 : public osmium::handler::Handler {
|
||||
|
||||
public:
|
||||
|
||||
TestHandler101() :
|
||||
osmium::handler::Handler() {
|
||||
}
|
||||
|
||||
void node(const osmium::Node& node) {
|
||||
constexpr const double epsilon = 0.00000001;
|
||||
if (node.id() == 101000) {
|
||||
REQUIRE(node.version() == 1);
|
||||
REQUIRE(std::abs(node.location().lon() - 1.12) < epsilon);
|
||||
REQUIRE(std::abs(node.location().lat() - 1.02) < epsilon);
|
||||
} else if (node.id() == 101001) {
|
||||
REQUIRE(node.version() == 1);
|
||||
REQUIRE(std::abs(node.location().lon() - 1.12) < epsilon);
|
||||
REQUIRE(std::abs(node.location().lat() - 1.03) < epsilon);
|
||||
} else if (node.id() == 101002) {
|
||||
} else if (node.id() == 101003) {
|
||||
} else {
|
||||
throw std::runtime_error{"Unknown ID"};
|
||||
}
|
||||
}
|
||||
|
||||
}; // class TestHandler101
|
||||
|
||||
TEST_CASE("101") {
|
||||
|
||||
SECTION("test 101") {
|
||||
osmium::io::Reader reader{dirname + "/1/101/data.osm"};
|
||||
|
||||
CheckBasicsHandler check_basics_handler{101, 4, 0, 0};
|
||||
CheckWKTHandler check_wkt_handler{dirname, 101};
|
||||
TestHandler101 test_handler;
|
||||
|
||||
osmium::apply(reader, check_basics_handler, check_wkt_handler, test_handler);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <stdexcept>
|
||||
|
||||
#include "common.hpp"
|
||||
|
||||
class TestHandler110 : public osmium::handler::Handler {
|
||||
|
||||
public:
|
||||
|
||||
TestHandler110() :
|
||||
osmium::handler::Handler() {
|
||||
}
|
||||
|
||||
void node(const osmium::Node& node) {
|
||||
constexpr const double epsilon = 0.00000001;
|
||||
if (node.id() == 110000) {
|
||||
REQUIRE(std::abs(node.location().lon() - 1.02) < epsilon);
|
||||
REQUIRE(std::abs(node.location().lat() - 1.12) < epsilon);
|
||||
} else if (node.id() == 110001) {
|
||||
REQUIRE(std::abs(node.location().lon() - 1.07) < epsilon);
|
||||
REQUIRE(std::abs(node.location().lat() - 1.13) < epsilon);
|
||||
} else {
|
||||
throw std::runtime_error{"Unknown ID"};
|
||||
}
|
||||
}
|
||||
|
||||
void way(const osmium::Way& way) {
|
||||
if (way.id() == 110800) {
|
||||
REQUIRE(way.version() == 1);
|
||||
REQUIRE(way.nodes().size() == 2);
|
||||
REQUIRE(!way.is_closed());
|
||||
|
||||
const char *test_id = way.tags().get_value_by_key("test:id");
|
||||
REQUIRE(test_id);
|
||||
REQUIRE(!std::strcmp(test_id, "110"));
|
||||
} else {
|
||||
throw std::runtime_error{"Unknown ID"};
|
||||
}
|
||||
}
|
||||
|
||||
}; // class TestHandler110
|
||||
|
||||
TEST_CASE("110") {
|
||||
|
||||
SECTION("test 110") {
|
||||
osmium::io::Reader reader(dirname + "/1/110/data.osm");
|
||||
|
||||
index_pos_type index_pos;
|
||||
index_neg_type index_neg;
|
||||
location_handler_type location_handler(index_pos, index_neg);
|
||||
location_handler.ignore_errors();
|
||||
|
||||
CheckBasicsHandler check_basics_handler(110, 2, 1, 0);
|
||||
CheckWKTHandler check_wkt_handler(dirname, 110);
|
||||
TestHandler110 test_handler;
|
||||
|
||||
osmium::apply(reader, location_handler, check_basics_handler, check_wkt_handler, test_handler);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
#include <gdalcpp.hpp>
|
||||
|
||||
#include <osmium/index/map/sparse_mem_array.hpp>
|
||||
|
||||
#include <osmium/area/assembler_legacy.hpp>
|
||||
#include <osmium/area/multipolygon_collector.hpp>
|
||||
#include <osmium/area/problem_reporter_ogr.hpp>
|
||||
#include <osmium/geom/ogr.hpp>
|
||||
#include <osmium/geom/wkt.hpp>
|
||||
#include <osmium/handler.hpp>
|
||||
#include <osmium/handler/node_locations_for_ways.hpp>
|
||||
#include <osmium/io/xml_input.hpp>
|
||||
#include <osmium/visitor.hpp>
|
||||
|
||||
using index_type = osmium::index::map::SparseMemArray<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
using location_handler_type = osmium::handler::NodeLocationsForWays<index_type>;
|
||||
|
||||
struct less_charptr {
|
||||
|
||||
bool operator()(const char* a, const char* b) const noexcept {
|
||||
return std::strcmp(a, b) < 0;
|
||||
}
|
||||
|
||||
}; // less_charptr
|
||||
|
||||
using tagmap_type = std::map<const char*, const char*, less_charptr>;
|
||||
|
||||
tagmap_type create_map(const osmium::TagList& taglist) {
|
||||
tagmap_type map;
|
||||
|
||||
for (auto& tag : taglist) {
|
||||
map[tag.key()] = tag.value();
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
class TestHandler : public osmium::handler::Handler {
|
||||
|
||||
gdalcpp::Layer m_layer_point;
|
||||
gdalcpp::Layer m_layer_lines;
|
||||
gdalcpp::Layer m_layer_mpoly;
|
||||
|
||||
osmium::geom::OGRFactory<> m_ogr_factory;
|
||||
osmium::geom::WKTFactory<> m_wkt_factory;
|
||||
|
||||
std::ofstream m_out;
|
||||
|
||||
bool m_first_out{true};
|
||||
|
||||
public:
|
||||
|
||||
explicit TestHandler(gdalcpp::Dataset& dataset) :
|
||||
m_layer_point(dataset, "points", wkbPoint),
|
||||
m_layer_lines(dataset, "lines", wkbLineString),
|
||||
m_layer_mpoly(dataset, "multipolygons", wkbMultiPolygon),
|
||||
m_out("multipolygon-tests.json") {
|
||||
|
||||
m_layer_point.add_field("id", OFTReal, 10);
|
||||
m_layer_point.add_field("type", OFTString, 30);
|
||||
|
||||
m_layer_lines.add_field("id", OFTReal, 10);
|
||||
m_layer_lines.add_field("type", OFTString, 30);
|
||||
|
||||
m_layer_mpoly.add_field("id", OFTReal, 10);
|
||||
m_layer_mpoly.add_field("from_type", OFTString, 1);
|
||||
}
|
||||
|
||||
~TestHandler() {
|
||||
m_out << "\n]\n";
|
||||
}
|
||||
|
||||
void node(const osmium::Node& node) {
|
||||
gdalcpp::Feature feature{m_layer_point, m_ogr_factory.create_point(node)};
|
||||
feature.set_field("id", static_cast<double>(node.id()));
|
||||
feature.set_field("type", node.tags().get_value_by_key("type"));
|
||||
feature.add_to_layer();
|
||||
}
|
||||
|
||||
void way(const osmium::Way& way) {
|
||||
try {
|
||||
gdalcpp::Feature feature{m_layer_lines, m_ogr_factory.create_linestring(way)};
|
||||
feature.set_field("id", static_cast<double>(way.id()));
|
||||
feature.set_field("type", way.tags().get_value_by_key("type"));
|
||||
feature.add_to_layer();
|
||||
} catch (const osmium::geometry_error&) {
|
||||
std::cerr << "Ignoring illegal geometry for way " << way.id() << ".\n";
|
||||
}
|
||||
}
|
||||
|
||||
void area(const osmium::Area& area) {
|
||||
if (m_first_out) {
|
||||
m_out << "[\n";
|
||||
m_first_out = false;
|
||||
} else {
|
||||
m_out << ",\n";
|
||||
}
|
||||
m_out << "{\n \"test_id\": " << (area.orig_id() / 1000) << ",\n \"area_id\": " << area.id() << ",\n \"from_id\": " << area.orig_id() << ",\n \"from_type\": \"" << (area.from_way() ? "way" : "relation") << "\",\n \"wkt\": \"";
|
||||
try {
|
||||
const std::string wkt = m_wkt_factory.create_multipolygon(area);
|
||||
m_out << wkt << "\",\n \"tags\": {";
|
||||
|
||||
const auto tagmap = create_map(area.tags());
|
||||
bool first = true;
|
||||
for (auto& tag : tagmap) {
|
||||
if (first) {
|
||||
first = false;
|
||||
} else {
|
||||
m_out << ", ";
|
||||
}
|
||||
m_out << '"' << tag.first << "\": \"" << tag.second << '"';
|
||||
}
|
||||
m_out << "}\n}";
|
||||
} catch (const osmium::geometry_error&) {
|
||||
m_out << "INVALID\"\n}";
|
||||
}
|
||||
try {
|
||||
gdalcpp::Feature feature{m_layer_mpoly, m_ogr_factory.create_multipolygon(area)};
|
||||
feature.set_field("id", static_cast<double>(area.orig_id()));
|
||||
|
||||
std::string from_type;
|
||||
if (area.from_way()) {
|
||||
from_type = "w";
|
||||
} else {
|
||||
from_type = "r";
|
||||
}
|
||||
feature.set_field("from_type", from_type.c_str());
|
||||
feature.add_to_layer();
|
||||
} catch (const osmium::geometry_error&) {
|
||||
std::cerr << "Ignoring illegal geometry for area " << area.id() << " created from " << (area.from_way() ? "way" : "relation") << " with id=" << area.orig_id() << ".\n";
|
||||
}
|
||||
}
|
||||
|
||||
}; // class TestHandler
|
||||
|
||||
/* ================================================== */
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
if (argc != 2) {
|
||||
std::cerr << "Usage: " << argv[0] << " INFILE\n";
|
||||
std::exit(1);
|
||||
}
|
||||
|
||||
const std::string output_format{"SQLite"};
|
||||
const std::string input_filename{argv[1]};
|
||||
const std::string output_filename{"multipolygon.db"};
|
||||
|
||||
CPLSetConfigOption("OGR_SQLITE_SYNCHRONOUS", "FALSE");
|
||||
gdalcpp::Dataset dataset{output_format, output_filename, gdalcpp::SRS{}, {"SPATIALITE=TRUE"}};
|
||||
|
||||
osmium::area::ProblemReporterOGR problem_reporter{dataset};
|
||||
osmium::area::AssemblerLegacy::config_type assembler_config;
|
||||
assembler_config.problem_reporter = &problem_reporter;
|
||||
assembler_config.check_roles = true;
|
||||
assembler_config.create_empty_areas = true;
|
||||
assembler_config.debug_level = 2;
|
||||
osmium::area::MultipolygonCollector<osmium::area::AssemblerLegacy> collector{assembler_config};
|
||||
|
||||
std::cerr << "Pass 1...\n";
|
||||
osmium::io::Reader reader1{input_filename};
|
||||
collector.read_relations(reader1);
|
||||
reader1.close();
|
||||
std::cerr << "Pass 1 done\n";
|
||||
|
||||
index_type index;
|
||||
location_handler_type location_handler{index};
|
||||
location_handler.ignore_errors();
|
||||
|
||||
TestHandler test_handler{dataset};
|
||||
|
||||
std::cerr << "Pass 2...\n";
|
||||
osmium::io::Reader reader2{input_filename};
|
||||
osmium::apply(reader2, location_handler, test_handler, collector.handler([&test_handler](const osmium::memory::Buffer& area_buffer) {
|
||||
osmium::apply(area_buffer, test_handler);
|
||||
}));
|
||||
reader2.close();
|
||||
std::cerr << "Pass 2 done\n";
|
||||
}
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
/* The code in this file is released into the Public Domain. */
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
#include <gdalcpp.hpp>
|
||||
|
||||
#include <osmium/index/map/sparse_mem_array.hpp>
|
||||
|
||||
#include <osmium/geom/ogr.hpp>
|
||||
#include <osmium/handler.hpp>
|
||||
#include <osmium/handler/node_locations_for_ways.hpp>
|
||||
#include <osmium/io/xml_input.hpp>
|
||||
#include <osmium/visitor.hpp>
|
||||
|
||||
using index_type = osmium::index::map::SparseMemArray<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
using location_handler_type = osmium::handler::NodeLocationsForWays<index_type>;
|
||||
|
||||
class TestOverviewHandler : public osmium::handler::Handler {
|
||||
|
||||
gdalcpp::Layer m_layer_nodes;
|
||||
gdalcpp::Layer m_layer_labels;
|
||||
gdalcpp::Layer m_layer_ways;
|
||||
|
||||
osmium::geom::OGRFactory<> m_factory;
|
||||
|
||||
public:
|
||||
|
||||
explicit TestOverviewHandler(gdalcpp::Dataset& dataset) :
|
||||
m_layer_nodes(dataset, "nodes", wkbPoint),
|
||||
m_layer_labels(dataset, "labels", wkbPoint),
|
||||
m_layer_ways(dataset, "ways", wkbLineString) {
|
||||
|
||||
m_layer_nodes.add_field("id", OFTReal, 10);
|
||||
|
||||
m_layer_labels.add_field("id", OFTReal, 10);
|
||||
m_layer_labels.add_field("label", OFTString, 30);
|
||||
|
||||
m_layer_ways.add_field("id", OFTReal, 10);
|
||||
m_layer_ways.add_field("test", OFTInteger, 3);
|
||||
}
|
||||
|
||||
void node(const osmium::Node& node) {
|
||||
const char* label = node.tags().get_value_by_key("label");
|
||||
if (label) {
|
||||
gdalcpp::Feature feature(m_layer_labels, m_factory.create_point(node));
|
||||
feature.set_field("id", static_cast<double>(node.id()));
|
||||
feature.set_field("label", label);
|
||||
feature.add_to_layer();
|
||||
} else {
|
||||
gdalcpp::Feature feature(m_layer_nodes, m_factory.create_point(node));
|
||||
feature.set_field("id", static_cast<double>(node.id()));
|
||||
feature.add_to_layer();
|
||||
}
|
||||
}
|
||||
|
||||
void way(const osmium::Way& way) {
|
||||
try {
|
||||
gdalcpp::Feature feature(m_layer_ways, m_factory.create_linestring(way));
|
||||
feature.set_field("id", static_cast<double>(way.id()));
|
||||
|
||||
const char* test = way.tags().get_value_by_key("test");
|
||||
if (test) {
|
||||
feature.set_field("test", test);
|
||||
}
|
||||
|
||||
feature.add_to_layer();
|
||||
} catch (const osmium::geometry_error&) {
|
||||
std::cerr << "Ignoring illegal geometry for way " << way.id() << ".\n";
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/* ================================================== */
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
if (argc != 2) {
|
||||
std::cerr << "Usage: " << argv[0] << " INFILE\n";
|
||||
std::exit(1);
|
||||
}
|
||||
|
||||
const std::string output_format{"SQLite"};
|
||||
const std::string input_filename{argv[1]};
|
||||
const std::string output_filename{"testdata-overview.db"};
|
||||
::unlink(output_filename.c_str());
|
||||
|
||||
CPLSetConfigOption("OGR_SQLITE_SYNCHRONOUS", "FALSE");
|
||||
gdalcpp::Dataset dataset{output_format, output_filename, gdalcpp::SRS{}, {"SPATIALITE=TRUE"}};
|
||||
|
||||
osmium::io::Reader reader{input_filename};
|
||||
|
||||
index_type index;
|
||||
location_handler_type location_handler{index};
|
||||
location_handler.ignore_errors();
|
||||
|
||||
TestOverviewHandler handler{dataset};
|
||||
|
||||
osmium::apply(reader, location_handler, handler);
|
||||
reader.close();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
#define CATCH_CONFIG_RUNNER
|
||||
|
||||
#include "testdata-testcases.hpp"
|
||||
|
||||
std::string dirname;
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
const char* testcases_dir = getenv("TESTCASES_DIR");
|
||||
if (testcases_dir) {
|
||||
dirname = testcases_dir;
|
||||
std::cerr << "Running tests from '" << dirname << "' (from TESTCASES_DIR environment variable)\n";
|
||||
} else {
|
||||
std::cerr << "Please set TESTCASES_DIR environment variable.\n";
|
||||
std::exit(1);
|
||||
}
|
||||
|
||||
return Catch::Session().run(argc, argv);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,514 @@
|
||||
/* The code in this file is released into the Public Domain. */
|
||||
|
||||
#define CATCH_CONFIG_MAIN
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <cassert>
|
||||
#include <cstdlib>
|
||||
#include <future>
|
||||
#include <iostream>
|
||||
#include <iterator>
|
||||
#include <string>
|
||||
|
||||
#include <osmium/io/detail/queue_util.hpp>
|
||||
#include <osmium/io/xml_input.hpp>
|
||||
#include <osmium/io/gzip_compression.hpp>
|
||||
#include <osmium/visitor.hpp>
|
||||
|
||||
static std::string S_(const char* s) {
|
||||
return std::string{s};
|
||||
}
|
||||
|
||||
static std::string filename(const char* test_id, const char* suffix = "osm") {
|
||||
const char* testdir = getenv("TESTDIR");
|
||||
if (!testdir) {
|
||||
std::cerr << "You have to set TESTDIR environment variable before running testdata-xml\n";
|
||||
std::exit(2);
|
||||
}
|
||||
|
||||
std::string f;
|
||||
f += testdir;
|
||||
f += "/";
|
||||
f += test_id;
|
||||
f += "/data.";
|
||||
f += suffix;
|
||||
return f;
|
||||
}
|
||||
|
||||
struct header_buffer_type {
|
||||
osmium::io::Header header;
|
||||
osmium::memory::Buffer buffer;
|
||||
};
|
||||
|
||||
// =============================================
|
||||
|
||||
// The following helper functions are used to call different parts of the
|
||||
// Osmium internals used to read and parse XML files. This way those parts
|
||||
// can be tested individually. These function can not be used in normal
|
||||
// operations, because they make certain assumptions, for instance that
|
||||
// file contents fit into small buffers.
|
||||
|
||||
static std::string read_file(const char* test_id) {
|
||||
const int fd = osmium::io::detail::open_for_reading(filename(test_id));
|
||||
assert(fd >= 0);
|
||||
|
||||
std::string input(10000, '\0');
|
||||
const auto n = ::read(fd, reinterpret_cast<unsigned char*>(const_cast<char*>(input.data())), 10000);
|
||||
assert(n >= 0);
|
||||
input.resize(static_cast<std::string::size_type>(n));
|
||||
|
||||
close(fd);
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
static std::string read_gz_file(const char* test_id, const char* suffix) {
|
||||
const int fd = osmium::io::detail::open_for_reading(filename(test_id, suffix));
|
||||
assert(fd >= 0);
|
||||
|
||||
osmium::io::GzipDecompressor gzip_decompressor{fd};
|
||||
const std::string input = gzip_decompressor.read();
|
||||
gzip_decompressor.close();
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
// cppcheck-suppress passedByValue
|
||||
static header_buffer_type parse_xml(std::string input) {
|
||||
osmium::thread::Pool pool;
|
||||
osmium::io::detail::future_string_queue_type input_queue;
|
||||
osmium::io::detail::future_buffer_queue_type output_queue;
|
||||
std::promise<osmium::io::Header> header_promise;
|
||||
std::future<osmium::io::Header> header_future = header_promise.get_future();
|
||||
|
||||
osmium::io::detail::add_to_queue(input_queue, std::move(input));
|
||||
osmium::io::detail::add_to_queue(input_queue, std::string{});
|
||||
|
||||
osmium::io::detail::parser_arguments args = {
|
||||
pool,
|
||||
input_queue,
|
||||
output_queue,
|
||||
header_promise,
|
||||
osmium::osm_entity_bits::all,
|
||||
osmium::io::read_meta::yes
|
||||
};
|
||||
osmium::io::detail::XMLParser parser{args};
|
||||
parser.parse();
|
||||
|
||||
header_buffer_type result;
|
||||
result.header = header_future.get();
|
||||
std::future<osmium::memory::Buffer> future_buffer;
|
||||
output_queue.wait_and_pop(future_buffer);
|
||||
result.buffer = future_buffer.get();
|
||||
|
||||
if (result.buffer) {
|
||||
std::future<osmium::memory::Buffer> future_buffer2;
|
||||
output_queue.wait_and_pop(future_buffer2);
|
||||
assert(!future_buffer2.get());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static header_buffer_type read_xml(const char* test_id) {
|
||||
const std::string input = read_file(test_id);
|
||||
return parse_xml(input);
|
||||
}
|
||||
|
||||
// =============================================
|
||||
|
||||
TEST_CASE("Reading OSM XML 100: Direct") {
|
||||
header_buffer_type r = read_xml("100-correct_but_no_data");
|
||||
|
||||
REQUIRE(r.header.get("generator") == "testdata");
|
||||
REQUIRE(0 == r.buffer.committed());
|
||||
REQUIRE(! r.buffer);
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 100: Using Reader") {
|
||||
osmium::io::Reader reader{filename("100-correct_but_no_data")};
|
||||
|
||||
const osmium::io::Header header{reader.header()};
|
||||
REQUIRE(header.get("generator") == "testdata");
|
||||
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
REQUIRE(0 == buffer.committed());
|
||||
REQUIRE(! buffer);
|
||||
reader.close();
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 100: Using Reader asking for header only") {
|
||||
osmium::io::Reader reader{filename("100-correct_but_no_data"), osmium::osm_entity_bits::nothing};
|
||||
|
||||
const osmium::io::Header header{reader.header()};
|
||||
REQUIRE(header.get("generator") == "testdata");
|
||||
reader.close();
|
||||
}
|
||||
|
||||
// =============================================
|
||||
|
||||
TEST_CASE("Reading OSM XML 101: Direct") {
|
||||
REQUIRE_THROWS_AS(read_xml("101-missing_version"), osmium::format_version_error);
|
||||
try {
|
||||
read_xml("101-missing_version");
|
||||
} catch (const osmium::format_version_error& e) {
|
||||
REQUIRE(e.version.empty());
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 101: Using Reader") {
|
||||
REQUIRE_THROWS_AS([](){
|
||||
osmium::io::Reader reader{filename("101-missing_version")};
|
||||
const osmium::io::Header header{reader.header()};
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
reader.close();
|
||||
}(), osmium::format_version_error);
|
||||
}
|
||||
|
||||
// =============================================
|
||||
|
||||
TEST_CASE("Reading OSM XML 102: Direct") {
|
||||
REQUIRE_THROWS_AS(read_xml("102-wrong_version"), osmium::format_version_error);
|
||||
try {
|
||||
read_xml("102-wrong_version");
|
||||
} catch (const osmium::format_version_error& e) {
|
||||
REQUIRE(e.version == "0.1");
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 102: Using Reader") {
|
||||
REQUIRE_THROWS_AS([](){
|
||||
osmium::io::Reader reader{filename("102-wrong_version")};
|
||||
|
||||
const osmium::io::Header header{reader.header()};
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
reader.close();
|
||||
}(), osmium::format_version_error);
|
||||
}
|
||||
|
||||
// =============================================
|
||||
|
||||
TEST_CASE("Reading OSM XML 103: Direct") {
|
||||
REQUIRE_THROWS_AS(read_xml("103-old_version"), osmium::format_version_error);
|
||||
try {
|
||||
read_xml("103-old_version");
|
||||
} catch (const osmium::format_version_error& e) {
|
||||
REQUIRE(e.version == "0.5");
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 103: Using Reader") {
|
||||
REQUIRE_THROWS_AS([](){
|
||||
osmium::io::Reader reader{filename("103-old_version")};
|
||||
const osmium::io::Header header{reader.header()};
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
reader.close();
|
||||
}(), osmium::format_version_error);
|
||||
}
|
||||
|
||||
// =============================================
|
||||
|
||||
TEST_CASE("Reading OSM XML 104: Direct") {
|
||||
REQUIRE_THROWS_AS(read_xml("104-empty_file"), osmium::xml_error);
|
||||
try {
|
||||
read_xml("104-empty_file");
|
||||
} catch (const osmium::xml_error& e) {
|
||||
REQUIRE(e.line == 1);
|
||||
REQUIRE(e.column == 0);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 104: Using Reader") {
|
||||
REQUIRE_THROWS_AS([](){
|
||||
osmium::io::Reader reader{filename("104-empty_file")};
|
||||
const osmium::io::Header header{reader.header()};
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
reader.close();
|
||||
}(), osmium::xml_error);
|
||||
}
|
||||
|
||||
// =============================================
|
||||
|
||||
TEST_CASE("Reading OSM XML 105: Direct") {
|
||||
REQUIRE_THROWS_AS(read_xml("105-incomplete_xml_file"), osmium::xml_error);
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 105: Using Reader") {
|
||||
REQUIRE_THROWS_AS([](){
|
||||
osmium::io::Reader reader{filename("105-incomplete_xml_file")};
|
||||
const osmium::io::Header header{reader.header()};
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
reader.close();
|
||||
}(), osmium::xml_error);
|
||||
}
|
||||
|
||||
// =============================================
|
||||
|
||||
TEST_CASE("Reading OSM XML 120: Direct") {
|
||||
std::string data = read_gz_file("120-correct_gzip_file_without_data", "osm.gz");
|
||||
|
||||
REQUIRE(data.size() == 102);
|
||||
|
||||
header_buffer_type r = parse_xml(data);
|
||||
REQUIRE(r.header.get("generator") == "testdata");
|
||||
REQUIRE(0 == r.buffer.committed());
|
||||
REQUIRE(! r.buffer);
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 120: Using Reader") {
|
||||
osmium::io::Reader reader{filename("120-correct_gzip_file_without_data", "osm.gz")};
|
||||
|
||||
const osmium::io::Header header{reader.header()};
|
||||
REQUIRE(header.get("generator") == "testdata");
|
||||
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
REQUIRE(0 == buffer.committed());
|
||||
REQUIRE(! buffer);
|
||||
reader.close();
|
||||
}
|
||||
|
||||
// =============================================
|
||||
|
||||
TEST_CASE("Reading OSM XML 121: Direct") {
|
||||
REQUIRE_THROWS_AS(read_gz_file("121-truncated_gzip_file", "osm.gz"), osmium::gzip_error);
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 121: Using Reader") {
|
||||
// can throw osmium::gzip_error or osmium::xml_error
|
||||
REQUIRE_THROWS([](){
|
||||
osmium::io::Reader reader{filename("121-truncated_gzip_file", "osm.gz")};
|
||||
const osmium::io::Header header{reader.header()};
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
reader.close();
|
||||
}());
|
||||
}
|
||||
|
||||
// =============================================
|
||||
|
||||
TEST_CASE("Reading OSM XML 122: Direct") {
|
||||
REQUIRE_THROWS_AS(read_xml("122-no_osm_element"), osmium::xml_error);
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 122: Using Reader") {
|
||||
REQUIRE_THROWS_AS([](){
|
||||
osmium::io::Reader reader{filename("122-no_osm_element")};
|
||||
const osmium::io::Header header{reader.header()};
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
reader.close();
|
||||
}(), osmium::xml_error);
|
||||
}
|
||||
|
||||
// =============================================
|
||||
|
||||
TEST_CASE("Reading OSM XML 140: Using Reader") {
|
||||
osmium::io::Reader reader{filename("140-unicode")};
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
reader.close();
|
||||
|
||||
int count = 0;
|
||||
for (const auto& node : buffer.select<osmium::Node>()) {
|
||||
++count;
|
||||
REQUIRE(node.id() == count);
|
||||
const osmium::TagList& t = node.tags();
|
||||
|
||||
const char* uc = t["unicode_char"];
|
||||
|
||||
const auto len = atoi(t["unicode_utf8_length"]);
|
||||
REQUIRE(len == strlen(uc));
|
||||
|
||||
REQUIRE(S_(uc) == t["unicode_xml"]);
|
||||
|
||||
// workaround for missing support for u8 string literals on Windows
|
||||
#if !defined(_MSC_VER)
|
||||
switch (count) {
|
||||
case 1:
|
||||
REQUIRE(S_(uc) == u8"a");
|
||||
break;
|
||||
case 2:
|
||||
REQUIRE(S_(uc) == u8"\u00e4");
|
||||
break;
|
||||
case 3:
|
||||
REQUIRE(S_(uc) == u8"\u30dc");
|
||||
break;
|
||||
case 4:
|
||||
REQUIRE(S_(uc) == u8"\U0001d11e");
|
||||
break;
|
||||
case 5:
|
||||
REQUIRE(S_(uc) == u8"\U0001f6eb");
|
||||
break;
|
||||
default:
|
||||
REQUIRE(false); // should not be here
|
||||
}
|
||||
#endif
|
||||
}
|
||||
REQUIRE(count == 5);
|
||||
}
|
||||
|
||||
// =============================================
|
||||
|
||||
TEST_CASE("Reading OSM XML 141: Using Reader") {
|
||||
osmium::io::Reader reader{filename("141-entities")};
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
reader.close();
|
||||
REQUIRE(buffer.committed() > 0);
|
||||
REQUIRE(buffer.get<osmium::memory::Item>(0).type() == osmium::item_type::node);
|
||||
|
||||
const osmium::Node& node = buffer.get<osmium::Node>(0);
|
||||
const osmium::TagList& tags = node.tags();
|
||||
|
||||
REQUIRE(S_(tags["less-than"]) == "<");
|
||||
REQUIRE(S_(tags["greater-than"]) == ">");
|
||||
REQUIRE(S_(tags["apostrophe"]) == "'");
|
||||
REQUIRE(S_(tags["ampersand"]) == "&");
|
||||
REQUIRE(S_(tags["quote"]) == "\"");
|
||||
}
|
||||
|
||||
// =============================================
|
||||
|
||||
TEST_CASE("Reading OSM XML 142: Using Reader to read nodes") {
|
||||
osmium::io::Reader reader{filename("142-whitespace")};
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
reader.close();
|
||||
|
||||
int count = 0;
|
||||
for (const auto& node : buffer.select<osmium::Node>()) {
|
||||
++count;
|
||||
REQUIRE(node.id() == count);
|
||||
REQUIRE(node.tags().size() == 1);
|
||||
const osmium::Tag& tag = *(node.tags().begin());
|
||||
|
||||
switch (count) {
|
||||
case 1:
|
||||
REQUIRE(S_(node.user()) == "user name");
|
||||
REQUIRE(S_(tag.key()) == "key with space");
|
||||
REQUIRE(S_(tag.value()) == "value with space");
|
||||
break;
|
||||
case 2:
|
||||
REQUIRE(S_(node.user()) == "line\nfeed");
|
||||
REQUIRE(S_(tag.key()) == "key with\nlinefeed");
|
||||
REQUIRE(S_(tag.value()) == "value with\nlinefeed");
|
||||
break;
|
||||
case 3:
|
||||
REQUIRE(S_(node.user()) == "carriage\rreturn");
|
||||
REQUIRE(S_(tag.key()) == "key with\rcarriage\rreturn");
|
||||
REQUIRE(S_(tag.value()) == "value with\rcarriage\rreturn");
|
||||
break;
|
||||
case 4:
|
||||
REQUIRE(S_(node.user()) == "tab\tulator");
|
||||
REQUIRE(S_(tag.key()) == "key with\ttab");
|
||||
REQUIRE(S_(tag.value()) == "value with\ttab");
|
||||
break;
|
||||
case 5:
|
||||
REQUIRE(S_(node.user()) == "unencoded linefeed");
|
||||
REQUIRE(S_(tag.key()) == "key with unencoded linefeed");
|
||||
REQUIRE(S_(tag.value()) == "value with unencoded linefeed");
|
||||
break;
|
||||
default:
|
||||
REQUIRE(false); // should not be here
|
||||
}
|
||||
}
|
||||
REQUIRE(count == 5);
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 142: Using Reader to read relation") {
|
||||
osmium::io::Reader reader{filename("142-whitespace")};
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
reader.close();
|
||||
|
||||
auto it = buffer.select<osmium::Relation>().begin();
|
||||
REQUIRE(it != buffer.select<osmium::Relation>().end());
|
||||
REQUIRE(it->id() == 21);
|
||||
const auto& members = it->members();
|
||||
REQUIRE(members.size() == 5);
|
||||
|
||||
int count = 0;
|
||||
for (const auto& member : members) {
|
||||
++count;
|
||||
switch (count) {
|
||||
case 1:
|
||||
REQUIRE(S_(member.role()) == "role with whitespace");
|
||||
break;
|
||||
case 2:
|
||||
REQUIRE(S_(member.role()) == "role with\nlinefeed");
|
||||
break;
|
||||
case 3:
|
||||
REQUIRE(S_(member.role()) == "role with\rcarriage\rreturn");
|
||||
break;
|
||||
case 4:
|
||||
REQUIRE(S_(member.role()) == "role with\ttab");
|
||||
break;
|
||||
case 5:
|
||||
REQUIRE(S_(member.role()) == "role with unencoded linefeed");
|
||||
break;
|
||||
default:
|
||||
REQUIRE(false); // should not be here
|
||||
}
|
||||
}
|
||||
REQUIRE(count == 5);
|
||||
}
|
||||
|
||||
|
||||
// =============================================
|
||||
|
||||
TEST_CASE("Reading OSM XML 200: Direct") {
|
||||
header_buffer_type r = read_xml("200-nodes");
|
||||
|
||||
REQUIRE(r.header.get("generator") == "testdata");
|
||||
REQUIRE(r.buffer.committed() > 0);
|
||||
REQUIRE(r.buffer.get<osmium::memory::Item>(0).type() == osmium::item_type::node);
|
||||
REQUIRE(r.buffer.get<osmium::Node>(0).id() == 36966060);
|
||||
REQUIRE(std::distance(r.buffer.begin(), r.buffer.end()) == 3);
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 200: Using Reader") {
|
||||
osmium::io::Reader reader{filename("200-nodes")};
|
||||
|
||||
const osmium::io::Header header{reader.header()};
|
||||
REQUIRE(header.get("generator") == "testdata");
|
||||
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
REQUIRE(buffer.committed() > 0);
|
||||
REQUIRE(buffer.get<osmium::memory::Item>(0).type() == osmium::item_type::node);
|
||||
REQUIRE(buffer.get<osmium::Node>(0).id() == 36966060);
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 3);
|
||||
reader.close();
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 200: Using Reader asking for nodes") {
|
||||
osmium::io::Reader reader{filename("200-nodes"), osmium::osm_entity_bits::node};
|
||||
|
||||
const osmium::io::Header header{reader.header()};
|
||||
REQUIRE(header.get("generator") == "testdata");
|
||||
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
REQUIRE(buffer.committed() > 0);
|
||||
REQUIRE(buffer.get<osmium::memory::Item>(0).type() == osmium::item_type::node);
|
||||
REQUIRE(buffer.get<osmium::Node>(0).id() == 36966060);
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 3);
|
||||
reader.close();
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 200: Using Reader asking for header only") {
|
||||
osmium::io::Reader reader{filename("200-nodes"), osmium::osm_entity_bits::nothing};
|
||||
|
||||
const osmium::io::Header header{reader.header()};
|
||||
REQUIRE(header.get("generator") == "testdata");
|
||||
|
||||
REQUIRE_FALSE(reader.read());
|
||||
REQUIRE_THROWS(reader.read());
|
||||
|
||||
reader.close();
|
||||
}
|
||||
|
||||
TEST_CASE("Reading OSM XML 200: Using Reader asking for ways") {
|
||||
osmium::io::Reader reader{filename("200-nodes"), osmium::osm_entity_bits::way};
|
||||
|
||||
const osmium::io::Header header{reader.header()};
|
||||
REQUIRE(header.get("generator") == "testdata");
|
||||
|
||||
osmium::memory::Buffer buffer = reader.read();
|
||||
REQUIRE(0 == buffer.committed());
|
||||
REQUIRE(! buffer);
|
||||
reader.close();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# CMake Config
|
||||
#
|
||||
# Libosmium example tests
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
message(STATUS "Configuring example tests")
|
||||
|
||||
set(EXAMPLE_TESTS
|
||||
amenity_list
|
||||
area_test
|
||||
change_tags
|
||||
convert
|
||||
count
|
||||
create_pois
|
||||
debug
|
||||
dump_internal
|
||||
filter_discussions
|
||||
index_lookup
|
||||
location_cache
|
||||
pub_names
|
||||
read
|
||||
read_with_progress
|
||||
road_length
|
||||
tiles
|
||||
)
|
||||
|
||||
# This is the list of all tests that are in the repository. It should be the
|
||||
# same as the configured list above, if not we'll find out about that below
|
||||
# and create a fatal error.
|
||||
file(GLOB _dirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/t ${CMAKE_CURRENT_SOURCE_DIR}/t/*)
|
||||
|
||||
foreach(_dir ${EXAMPLE_TESTS})
|
||||
message(STATUS " adding test: ${_dir}")
|
||||
add_subdirectory("t/${_dir}")
|
||||
list(REMOVE_ITEM _dirs ${_dir})
|
||||
endforeach()
|
||||
|
||||
if(NOT ${_dirs} STREQUAL "")
|
||||
message(FATAL_ERROR "Found example tests that are not configured: ${_dirs}")
|
||||
endif()
|
||||
|
||||
message(STATUS "Configuring example tests - done")
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
add_test(NAME examples_amenity_list_node
|
||||
COMMAND osmium_amenity_list ${CMAKE_CURRENT_SOURCE_DIR}/node.osm)
|
||||
|
||||
set_tests_properties(examples_amenity_list_node PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION " 8\\.8721, 53\\.0966 post_office")
|
||||
|
||||
add_test(NAME examples_amenity_list_area
|
||||
COMMAND osmium_amenity_list ${CMAKE_CURRENT_SOURCE_DIR}/area.osm)
|
||||
|
||||
set_tests_properties(examples_amenity_list_area PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION " 8\\.5839, 53\\.5602 restaurant")
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6">
|
||||
<node id="2791512283" visible="true" version="1" changeset="21695983" timestamp="2014-04-14T20:45:22Z" user="Gerd Taddicken" uid="25464" lat="53.5601034" lon="8.5840408"/>
|
||||
<node id="2791512284" visible="true" version="1" changeset="21695983" timestamp="2014-04-14T20:45:22Z" user="Gerd Taddicken" uid="25464" lat="53.5601127" lon="8.5837753"/>
|
||||
<node id="2791512287" visible="true" version="1" changeset="21695983" timestamp="2014-04-14T20:45:22Z" user="Gerd Taddicken" uid="25464" lat="53.5602544" lon="8.5837933"/>
|
||||
<node id="2791512289" visible="true" version="1" changeset="21695983" timestamp="2014-04-14T20:45:22Z" user="Gerd Taddicken" uid="25464" lat="53.5602464" lon="8.5840476"/>
|
||||
<way id="274425514" visible="true" version="4" changeset="41519398" timestamp="2016-08-17T19:16:40Z" user="Lutalica_1974" uid="2096672">
|
||||
<nd ref="2791512283"/>
|
||||
<nd ref="2791512284"/>
|
||||
<nd ref="2791512287"/>
|
||||
<nd ref="2791512289"/>
|
||||
<nd ref="2791512283"/>
|
||||
<tag k="amenity" v="restaurant"/>
|
||||
<tag k="building" v="house"/>
|
||||
<tag k="cuisine" v="american"/>
|
||||
<tag k="name" v="Seamen's Club"/>
|
||||
</way>
|
||||
</osm>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6">
|
||||
<node id="24960505" version="5" timestamp="2013-02-28T23:26:39Z" uid="715371" user="cracklinrain" changeset="15203542" lat="53.096629" lon="8.8720536">
|
||||
<tag k="amenity" v="post_office"/>
|
||||
<tag k="wheelchair" v="yes"/>
|
||||
</node>
|
||||
</osm>
|
||||
@@ -0,0 +1,25 @@
|
||||
|
||||
add_test(NAME examples_area_test_help
|
||||
COMMAND osmium_area_test -h)
|
||||
|
||||
set_tests_properties(examples_area_test_help PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^osmium_area_test .* OSMFILE")
|
||||
|
||||
add_test(NAME examples_area_test_data
|
||||
COMMAND osmium_area_test ${CMAKE_CURRENT_SOURCE_DIR}/data.osm)
|
||||
|
||||
set_tests_properties(examples_area_test_data PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "\nWarning! Some member ways missing for these multipolygon relations: 701901\n$")
|
||||
|
||||
add_test(NAME examples_area_test_dump
|
||||
COMMAND osmium_area_test -o ${CMAKE_CURRENT_SOURCE_DIR}/data.osm)
|
||||
|
||||
set_tests_properties(examples_area_test_dump PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION " id=1403801")
|
||||
|
||||
add_test(NAME examples_area_test_wkt
|
||||
COMMAND osmium_area_test -w ${CMAKE_CURRENT_SOURCE_DIR}/data.osm)
|
||||
|
||||
set_tests_properties(examples_area_test_wkt PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "MULTIPOLYGON\\(\\(\\(7.11 1.01,7.14 1.01,7.14 1.04,7.11 1.04,7.11 1.01\\)\\)\\)\n")
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6" generator="testdata" upload="false">
|
||||
<node id="701000" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.11" lat="1.01"/>
|
||||
<node id="701001" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.11" lat="1.04"/>
|
||||
<node id="701002" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.14" lat="1.04"/>
|
||||
<node id="701003" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.14" lat="1.01"/>
|
||||
<way id="701800" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<nd ref="701000"/>
|
||||
<nd ref="701001"/>
|
||||
<nd ref="701002"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
</way>
|
||||
<way id="701801" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<nd ref="701002"/>
|
||||
<nd ref="701003"/>
|
||||
<nd ref="701000"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
</way>
|
||||
<relation id="701900" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<member type="way" ref="701800" role="outer"/>
|
||||
<member type="way" ref="701801" role="outer"/>
|
||||
<tag k="type" v="multipolygon"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
<tag k="landuse" v="forest"/>
|
||||
</relation>
|
||||
<relation id="701901" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<member type="way" ref="701802" role="outer"/> <!-- missing member -->
|
||||
<tag k="type" v="multipolygon"/>
|
||||
<tag k="landuse" v="forest"/>
|
||||
</relation>
|
||||
</osm>
|
||||
@@ -0,0 +1 @@
|
||||
result.osm text eol=lf
|
||||
@@ -0,0 +1,9 @@
|
||||
|
||||
add_test(NAME examples_change_tags
|
||||
COMMAND osmium_change_tags ${CMAKE_CURRENT_SOURCE_DIR}/data.osm ${CMAKE_CURRENT_BINARY_DIR}/result.osm)
|
||||
|
||||
add_test(NAME examples_change_tags_compare
|
||||
COMMAND ${CMAKE_COMMAND} -E compare_files ${CMAKE_CURRENT_SOURCE_DIR}/result.osm ${CMAKE_CURRENT_BINARY_DIR}/result.osm)
|
||||
|
||||
set_tests_properties(examples_change_tags_compare PROPERTIES DEPENDS example_change_tags)
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6" generator="testdata" upload="false">
|
||||
<node id="10" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lat="1.01" lon="7.11">
|
||||
<tag k="created_by" v="some editor"/>
|
||||
</node>
|
||||
<node id="11" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lat="1.04" lon="7.11"/>
|
||||
<node id="12" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lat="1.04" lon="7.14"/>
|
||||
<way id="20" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<nd ref="10"/>
|
||||
<nd ref="11"/>
|
||||
<nd ref="12"/>
|
||||
<tag k="created_by" v="some editor"/>
|
||||
<tag k="landuse" v="forest"/>
|
||||
<tag k="name" v="Example Forest"/>
|
||||
</way>
|
||||
<relation id="30" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<tag k="created_by" v="some editor"/>
|
||||
<tag k="note" v=" relation without members"/>
|
||||
</relation>
|
||||
</osm>
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6" generator="osmium_change_tags">
|
||||
<node id="10" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lat="1.01" lon="7.11"/>
|
||||
<node id="11" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lat="1.04" lon="7.11"/>
|
||||
<node id="12" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lat="1.04" lon="7.14"/>
|
||||
<way id="20" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<nd ref="10"/>
|
||||
<nd ref="11"/>
|
||||
<nd ref="12"/>
|
||||
<tag k="natural" v="wood"/>
|
||||
<tag k="name" v="Example Forest"/>
|
||||
</way>
|
||||
<relation id="30" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<tag k="note" v=" relation without members"/>
|
||||
</relation>
|
||||
</osm>
|
||||
@@ -0,0 +1,46 @@
|
||||
|
||||
add_test(NAME examples_convert_help
|
||||
COMMAND osmium_convert -h)
|
||||
|
||||
set_tests_properties(examples_convert_help PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^osmium_convert .*OUTFILE")
|
||||
|
||||
|
||||
add_test(NAME examples_convert_xml_debug
|
||||
COMMAND osmium_convert -t debug ${CMAKE_CURRENT_SOURCE_DIR}/data.osm)
|
||||
|
||||
set_tests_properties(examples_convert_xml_debug PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "node 701000\n version: 1 visible")
|
||||
|
||||
|
||||
add_test(NAME examples_convert_xml_opl
|
||||
COMMAND osmium_convert -f osm -t opl ${CMAKE_CURRENT_SOURCE_DIR}/data.osm)
|
||||
|
||||
set_tests_properties(examples_convert_xml_opl PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "n701001 v1 dV c1 t2014-01-01T00:00:00Z i1 utest T x7.11 y1.04")
|
||||
|
||||
|
||||
add_test(NAME examples_convert_xml_pbf
|
||||
COMMAND osmium_convert -t pbf ${CMAKE_CURRENT_SOURCE_DIR}/data.osm -)
|
||||
|
||||
|
||||
add_test(NAME examples_convert_xml_xml
|
||||
COMMAND osmium_convert -t xml ${CMAKE_CURRENT_SOURCE_DIR}/data.osm)
|
||||
|
||||
set_tests_properties(examples_convert_xml_xml PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "<node id=\"701001\" ")
|
||||
|
||||
# Should give a warning when converting from history to non-history file
|
||||
add_test(NAME examples_convert_osh_xml
|
||||
COMMAND osmium_convert -f osh -t osm ${CMAKE_CURRENT_SOURCE_DIR}/data.osm)
|
||||
|
||||
set_tests_properties(examples_convert_osh_xml PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "Warning! You are converting from an OSM file")
|
||||
|
||||
# Should fail when an unknown command line option is used
|
||||
add_test(NAME examples_convert_unknown_option
|
||||
COMMAND osmium_convert --unknown)
|
||||
|
||||
set_tests_properties(examples_convert_unknown_option PROPERTIES
|
||||
WILL_FAIL true)
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6" generator="testdata" upload="false">
|
||||
<node id="701000" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.11" lat="1.01"/>
|
||||
<node id="701001" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.11" lat="1.04"/>
|
||||
<node id="701002" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.14" lat="1.04"/>
|
||||
<node id="701003" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.14" lat="1.01"/>
|
||||
<way id="701800" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<nd ref="701000"/>
|
||||
<nd ref="701001"/>
|
||||
<nd ref="701002"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
</way>
|
||||
<way id="701801" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<nd ref="701002"/>
|
||||
<nd ref="701003"/>
|
||||
<nd ref="701000"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
</way>
|
||||
<relation id="701900" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<member type="way" ref="701800" role="outer"/>
|
||||
<member type="way" ref="701801" role="outer"/>
|
||||
<tag k="type" v="multipolygon"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
<tag k="landuse" v="forest"/>
|
||||
</relation>
|
||||
<relation id="701901" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<member type="way" ref="701802" role="outer"/> <!-- missing member -->
|
||||
<tag k="type" v="multipolygon"/>
|
||||
<tag k="landuse" v="forest"/>
|
||||
</relation>
|
||||
</osm>
|
||||
@@ -0,0 +1,8 @@
|
||||
|
||||
add_test(NAME examples_count
|
||||
COMMAND osmium_count ${CMAKE_CURRENT_SOURCE_DIR}/data.osm)
|
||||
|
||||
set_tests_properties(examples_count PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^Nodes: 2\nWays: 1\nRelations: 1\n\nMemory used:"
|
||||
)
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<osm version="0.6">
|
||||
<node id="1" version="1" changeset="1" timestamp="2000-01-01T10:11:12Z" user="test" uid="1" lat="51.0271601" lon="13.7252197"/>
|
||||
<node id="2" version="1" changeset="1" timestamp="2000-01-01T10:11:12Z" user="test" uid="1" lat="51.0288568" lon="13.7248159"/>
|
||||
<way id="10" version="1" changeset="1" timestamp="2000-01-01T10:11:12Z" user="test" uid="1">
|
||||
<nd ref="1"/>
|
||||
<nd ref="2"/>
|
||||
</way>
|
||||
<relation id="20" version="1" changeset="1" timestamp="2000-01-01T10:11:12Z" user="test" uid="1">
|
||||
<member type="way" ref="10" role=""/>
|
||||
</relation>
|
||||
</osm>
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
add_test(NAME examples_create_pois_okay
|
||||
COMMAND osmium_create_pois -)
|
||||
|
||||
set_tests_properties(examples_create_pois_okay PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^n-1 v1 dV c0 t....-..-..T..:..:..Z i0 u Tamenity=post_box x1\\.23 y3\\.45\nn-2 v1 dV c0 t....-..-..T..:..:..Z i0 u Tamenity=restaurant,name=Chez%20%OSM x1\\.24 y3\\.46\n$"
|
||||
)
|
||||
|
||||
add_test(NAME examples_create_pois_unknown_file_type
|
||||
COMMAND osmium_create_pois foo)
|
||||
|
||||
set_tests_properties(examples_create_pois_unknown_file_type PROPERTIES WILL_FAIL true)
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
|
||||
add_test(NAME examples_debug_all
|
||||
COMMAND osmium_debug ${CMAKE_CURRENT_SOURCE_DIR}/data.osm)
|
||||
|
||||
set_tests_properties(examples_debug_all PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION " id=1\n.* id=2\n.* id=10\n.* id=20\n"
|
||||
)
|
||||
|
||||
|
||||
add_test(NAME examples_debug_nodes
|
||||
COMMAND osmium_debug ${CMAKE_CURRENT_SOURCE_DIR}/data.osm n)
|
||||
|
||||
set_tests_properties(examples_debug_nodes PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "id=1\n.* id=2\n"
|
||||
)
|
||||
|
||||
set_tests_properties(examples_debug_nodes PROPERTIES
|
||||
FAIL_REGULAR_EXPRESSION "id=10\n"
|
||||
)
|
||||
|
||||
|
||||
add_test(NAME examples_debug_ways
|
||||
COMMAND osmium_debug ${CMAKE_CURRENT_SOURCE_DIR}/data.osm w)
|
||||
|
||||
set_tests_properties(examples_debug_ways PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION " id=10\n"
|
||||
)
|
||||
|
||||
set_tests_properties(examples_debug_ways PROPERTIES
|
||||
FAIL_REGULAR_EXPRESSION "id=20\n"
|
||||
)
|
||||
|
||||
|
||||
add_test(NAME examples_debug_relations
|
||||
COMMAND osmium_debug ${CMAKE_CURRENT_SOURCE_DIR}/data.osm r)
|
||||
|
||||
set_tests_properties(examples_debug_relations PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION " id=20\n"
|
||||
)
|
||||
|
||||
set_tests_properties(examples_debug_relations PROPERTIES
|
||||
FAIL_REGULAR_EXPRESSION "id=10\n"
|
||||
)
|
||||
|
||||
add_test(NAME examples_debug_changesets
|
||||
COMMAND osmium_debug ${CMAKE_CURRENT_SOURCE_DIR}/changesets.osm c)
|
||||
|
||||
set_tests_properties(examples_debug_changesets PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION " id=15449962\n"
|
||||
)
|
||||
|
||||
set_tests_properties(examples_debug_changesets PROPERTIES
|
||||
FAIL_REGULAR_EXPRESSION "id=10\n"
|
||||
)
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6" generator="Osmosis 0.41">
|
||||
<changeset id="15449962" created_at="2013-03-22T02:10:17Z" num_changes="140" closed_at="2013-03-22T02:10:24Z" open="false" min_lon="106.8146927" min_lat="-6.1207748" max_lon="106.8212512" max_lat="-6.1133246" user="Vivianecahen" uid="1241761">
|
||||
<tag k="comment" v="Adding Initial buildings and roads"/>
|
||||
<tag k="created_by" v="JOSM/1.5 (5697 en)"/>
|
||||
</changeset>
|
||||
</osm>
|
||||
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<osm version="0.6">
|
||||
<bounds minlon="13.7248159" minlat="51.0271601" maxlon="13.7252197" maxlat="51.0288568"/>
|
||||
<node id="1" version="1" changeset="1" timestamp="2000-01-01T10:11:12Z" user="test" uid="1" lat="51.0271601" lon="13.7252197"/>
|
||||
<node id="2" version="1" changeset="1" timestamp="2000-01-01T10:11:12Z" user="test" uid="1" lat="51.0288568" lon="13.7248159"/>
|
||||
<way id="10" version="1" changeset="1" timestamp="2000-01-01T10:11:12Z" user="test" uid="1">
|
||||
<nd ref="1"/>
|
||||
<nd ref="2"/>
|
||||
</way>
|
||||
<relation id="20" version="1" changeset="1" timestamp="2000-01-01T10:11:12Z" user="test" uid="1">
|
||||
<member type="way" ref="10" role=""/>
|
||||
</relation>
|
||||
</osm>
|
||||
@@ -0,0 +1,36 @@
|
||||
|
||||
add_test(NAME examples_dump_internal
|
||||
COMMAND osmium_dump_internal ${CMAKE_CURRENT_SOURCE_DIR}/data.osm ${CMAKE_CURRENT_BINARY_DIR}/out)
|
||||
|
||||
|
||||
add_test(NAME examples_dump_internal_index_nodes
|
||||
COMMAND osmium_index_lookup --list=${CMAKE_CURRENT_BINARY_DIR}/out/nodes.idx --type=offset --dump)
|
||||
|
||||
set_tests_properties(examples_dump_internal_index_nodes PROPERTIES
|
||||
DEPENDS examples_dump_internal
|
||||
PASS_REGULAR_EXPRESSION "^701000 .*\n701001 .*\n")
|
||||
|
||||
|
||||
add_test(NAME examples_dump_internal_index_ways
|
||||
COMMAND osmium_index_lookup --list=${CMAKE_CURRENT_BINARY_DIR}/out/ways.idx --type=offset --dump)
|
||||
|
||||
set_tests_properties(examples_dump_internal_index_ways PROPERTIES
|
||||
DEPENDS examples_dump_internal
|
||||
PASS_REGULAR_EXPRESSION "^701800 .*\n701801 .*\n")
|
||||
|
||||
|
||||
add_test(NAME examples_dump_internal_map_node2way_dump
|
||||
COMMAND osmium_index_lookup --list=${CMAKE_CURRENT_BINARY_DIR}/out/node2way.map --type=id --dump)
|
||||
|
||||
set_tests_properties(examples_dump_internal_map_node2way_dump PROPERTIES
|
||||
DEPENDS examples_dump_internal
|
||||
PASS_REGULAR_EXPRESSION "^701000 701800\n701000 701801\n701001 701800\n")
|
||||
|
||||
|
||||
add_test(NAME examples_dump_internal_map_node2way_search
|
||||
COMMAND osmium_index_lookup --list=${CMAKE_CURRENT_BINARY_DIR}/out/node2way.map --type=id --search=701002)
|
||||
|
||||
set_tests_properties(examples_dump_internal_map_node2way_search PROPERTIES
|
||||
DEPENDS examples_dump_internal
|
||||
PASS_REGULAR_EXPRESSION "^701002 701800\n701002 701801\n$")
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6" generator="testdata" upload="false">
|
||||
<node id="701000" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.11" lat="1.01"/>
|
||||
<node id="701001" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.11" lat="1.04"/>
|
||||
<node id="701002" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.14" lat="1.04"/>
|
||||
<node id="701003" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.14" lat="1.01"/>
|
||||
<way id="701800" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<nd ref="701000"/>
|
||||
<nd ref="701001"/>
|
||||
<nd ref="701002"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
</way>
|
||||
<way id="701801" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<nd ref="701002"/>
|
||||
<nd ref="701003"/>
|
||||
<nd ref="701000"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
</way>
|
||||
<relation id="701900" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<member type="way" ref="701800" role="outer"/>
|
||||
<member type="way" ref="701801" role="outer"/>
|
||||
<tag k="type" v="multipolygon"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
<tag k="landuse" v="forest"/>
|
||||
</relation>
|
||||
<relation id="701901" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<member type="way" ref="701802" role="outer"/> <!-- missing member -->
|
||||
<tag k="type" v="multipolygon"/>
|
||||
<tag k="landuse" v="forest"/>
|
||||
</relation>
|
||||
</osm>
|
||||
@@ -0,0 +1,10 @@
|
||||
|
||||
add_test(NAME examples_filter_discussions
|
||||
COMMAND osmium_filter_discussions ${CMAKE_CURRENT_SOURCE_DIR}/changesets.osm -)
|
||||
|
||||
set_tests_properties(examples_filter_discussions PROPERTIES
|
||||
FAIL_REGULAR_EXPRESSION "<changeset id=\"402757\"")
|
||||
|
||||
set_tests_properties(examples_filter_discussions PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "<changeset id=\"402758\"")
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6" generator="Osmosis 0.41">
|
||||
<changeset id="402757" created_at="2008-12-15T12:57:57Z" closed_at="2008-12-15T14:00:54Z" open="false" user="mrettig" uid="38842" min_lat="50.8899870" min_lon="8.0981539" max_lat="50.9508652" max_lon="8.1665031" num_changes="33" comments_count="0"/>
|
||||
<changeset id="402758" created_at="2008-07-05T11:17:12Z" closed_at="2008-07-05T12:17:12Z" open="false" user="Jaycos" uid="45048" min_lat="51.7305590" min_lon="6.5904108" max_lat="51.7305590" max_lon="6.5904108" num_changes="1" comments_count="1">
|
||||
<discussion>
|
||||
<comment uid="123" user="foobar" date="2008-07-05T11:17:13Z">
|
||||
<text>fake comment</text>
|
||||
</comment>
|
||||
</discussion>
|
||||
</changeset>
|
||||
</osm>
|
||||
@@ -0,0 +1,46 @@
|
||||
|
||||
add_test(NAME examples_index_lookup_help
|
||||
COMMAND osmium_index_lookup -h)
|
||||
|
||||
set_tests_properties(examples_index_lookup_help PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^Usage: osmium_index_lookup")
|
||||
|
||||
# Fails with message if index file doesn't exist
|
||||
add_test(NAME examples_index_lookup_no_file
|
||||
COMMAND osmium_index_lookup --list=file_does_not_exist --type=location --dump)
|
||||
|
||||
set_tests_properties(examples_index_lookup_no_file PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^Can not open file")
|
||||
|
||||
|
||||
# Fails with message if --type option is not used
|
||||
add_test(NAME examples_index_lookup_no_type_option
|
||||
COMMAND osmium_index_lookup --list=file_does_not_exist --dump)
|
||||
|
||||
set_tests_properties(examples_index_lookup_no_type_option PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^Need --type argument.")
|
||||
|
||||
|
||||
# Fails with message if --type option is used with unknown type
|
||||
add_test(NAME examples_index_lookup_unknown_type
|
||||
COMMAND osmium_index_lookup --list=file_does_not_exist --type=UNKNOWN --dump)
|
||||
|
||||
set_tests_properties(examples_index_lookup_unknown_type PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^Unknown type 'UNKNOWN'")
|
||||
|
||||
|
||||
# Fails with message when combining options --array and --list
|
||||
add_test(NAME examples_index_lookup_array_list
|
||||
COMMAND osmium_index_lookup --list=a --array=b)
|
||||
|
||||
set_tests_properties(examples_index_lookup_array_list PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^Need option --array or --list, but not both\n$")
|
||||
|
||||
|
||||
# Fails with message when combining options --dump and --search
|
||||
add_test(NAME examples_index_lookup_dump_search
|
||||
COMMAND osmium_index_lookup --list=x --dump --search=123)
|
||||
|
||||
set_tests_properties(examples_index_lookup_dump_search PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "Need option --dump or --search, but not both")
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
|
||||
add_test(NAME examples_location_cache_create
|
||||
COMMAND osmium_location_cache_create ${CMAKE_CURRENT_SOURCE_DIR}/data.osm ${CMAKE_CURRENT_BINARY_DIR}/locations.idx)
|
||||
|
||||
|
||||
# Fails with message if index file doesn't exist
|
||||
add_test(NAME examples_location_cache_no_file
|
||||
COMMAND osmium_location_cache_use ${CMAKE_CURRENT_SOURCE_DIR}/way.osm ${CMAKE_CURRENT_BINARY_DIR}/file_does_not_exist)
|
||||
|
||||
set_tests_properties(examples_location_cache_no_file PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "Can not open location cache file")
|
||||
|
||||
|
||||
add_test(NAME examples_location_cache_use
|
||||
COMMAND osmium_location_cache_use ${CMAKE_CURRENT_SOURCE_DIR}/way.osm ${CMAKE_CURRENT_BINARY_DIR}/locations.idx)
|
||||
|
||||
set_tests_properties(examples_location_cache_use PROPERTIES
|
||||
DEPENDS examples_location_cache_create
|
||||
PASS_REGULAR_EXPRESSION "^way 20\n node 10 \\(7.11,1.01\\)\n node 11 \\(7.11,1.04\\)\n node 12 \\(7.14,1.04\\)\n$")
|
||||
|
||||
|
||||
add_test(NAME examples_location_cache_dump
|
||||
COMMAND osmium_index_lookup --list=${CMAKE_CURRENT_BINARY_DIR}/locations.idx --type=location --dump)
|
||||
|
||||
set_tests_properties(examples_location_cache_dump PROPERTIES
|
||||
DEPENDS examples_location_cache_create
|
||||
PASS_REGULAR_EXPRESSION "^10 \\(7.11,1.01\\)\n11 \\(7.11,1.04\\)\n12 \\(7.14,1.04\\)\n13 \\(7.14,1.01\\)\n$")
|
||||
|
||||
|
||||
add_test(NAME examples_location_cache_search
|
||||
COMMAND osmium_index_lookup --list=${CMAKE_CURRENT_BINARY_DIR}/locations.idx --type=location --search=12)
|
||||
|
||||
set_tests_properties(examples_location_cache_search PROPERTIES
|
||||
DEPENDS examples_location_cache_create
|
||||
PASS_REGULAR_EXPRESSION "^12 \\(7.14,1.04\\)\n$")
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6" generator="testdata" upload="false">
|
||||
<node id="10" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.11" lat="1.01"/>
|
||||
<node id="11" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.11" lat="1.04"/>
|
||||
<node id="12" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.14" lat="1.04"/>
|
||||
<node id="13" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.14" lat="1.01"/>
|
||||
</osm>
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6" generator="testdata" upload="false">
|
||||
<way id="20" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<nd ref="10"/>
|
||||
<nd ref="11"/>
|
||||
<nd ref="12"/>
|
||||
<tag k="highway" v="primary"/>
|
||||
</way>
|
||||
</osm>
|
||||
@@ -0,0 +1,21 @@
|
||||
|
||||
add_test(NAME examples_pub_names_node
|
||||
COMMAND osmium_pub_names ${CMAKE_CURRENT_SOURCE_DIR}/pub-node.osm)
|
||||
set_tests_properties(examples_pub_names_node PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^Im Holze\n$")
|
||||
|
||||
add_test(NAME examples_pub_names_way
|
||||
COMMAND osmium_pub_names ${CMAKE_CURRENT_SOURCE_DIR}/pub-way.osm)
|
||||
set_tests_properties(examples_pub_names_way PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^Vereinsheim\n$")
|
||||
|
||||
add_test(NAME examples_pub_names_noname
|
||||
COMMAND osmium_pub_names ${CMAKE_CURRENT_SOURCE_DIR}/pub-noname.osm)
|
||||
set_tests_properties(examples_pub_names_noname PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^pub with unknown name\n$")
|
||||
|
||||
add_test(NAME examples_pub_names_addr
|
||||
COMMAND osmium_pub_names ${CMAKE_CURRENT_SOURCE_DIR}/pub-addr.osm)
|
||||
set_tests_properties(examples_pub_names_addr PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^Im Holze\n addr:city: Bremen\n")
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6">
|
||||
<node id="167199652" version="3" timestamp="2010-12-27T13:15:02Z" uid="57645" user="KartoGrapHiti" changeset="6777507" lat="53.0526516" lon="8.8919477">
|
||||
<tag k="addr:city" v="Bremen"/>
|
||||
<tag k="addr:housenumber" v="28"/>
|
||||
<tag k="addr:street" v="Kleine Westerholzstraße"/>
|
||||
<tag k="amenity" v="pub"/>
|
||||
<tag k="name" v="Im Holze"/>
|
||||
</node>
|
||||
</osm>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6">
|
||||
<node id="167199652" version="3" timestamp="2010-12-27T13:15:02Z" uid="57645" user="KartoGrapHiti" changeset="6777507" lat="53.0526516" lon="8.8919477">
|
||||
<tag k="amenity" v="pub"/>
|
||||
<tag k="name" v="Im Holze"/>
|
||||
</node>
|
||||
</osm>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6">
|
||||
<node id="167199652" version="3" timestamp="2010-12-27T13:15:02Z" uid="57645" user="KartoGrapHiti" changeset="6777507" lat="53.0526516" lon="8.8919477">
|
||||
<tag k="amenity" v="pub"/>
|
||||
</node>
|
||||
</osm>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6">
|
||||
<node id="498785553" version="4" timestamp="2012-08-05T19:02:18Z" uid="342705" user="KonB" changeset="12624818" lat="53.5657289" lon="8.5727548"/>
|
||||
<node id="498785555" version="4" timestamp="2012-08-05T19:02:18Z" uid="342705" user="KonB" changeset="12624818" lat="53.5657308" lon="8.5730408"/>
|
||||
<node id="498785556" version="4" timestamp="2012-08-05T19:02:18Z" uid="342705" user="KonB" changeset="12624818" lat="53.5656184" lon="8.5730429"/>
|
||||
<node id="498785558" version="4" timestamp="2012-08-05T19:02:18Z" uid="342705" user="KonB" changeset="12624818" lat="53.5656176" lon="8.5729218"/>
|
||||
<node id="498785560" version="4" timestamp="2012-08-05T19:02:18Z" uid="342705" user="KonB" changeset="12624818" lat="53.5654994" lon="8.572924"/>
|
||||
<node id="498785561" version="4" timestamp="2012-08-05T19:02:18Z" uid="342705" user="KonB" changeset="12624818" lat="53.5654983" lon="8.5727591"/>
|
||||
<way id="40948654" version="2" timestamp="2009-09-17T09:27:41Z" uid="42429" user="42429" changeset="2509937">
|
||||
<nd ref="498785553"/>
|
||||
<nd ref="498785555"/>
|
||||
<nd ref="498785556"/>
|
||||
<nd ref="498785558"/>
|
||||
<nd ref="498785560"/>
|
||||
<nd ref="498785561"/>
|
||||
<nd ref="498785553"/>
|
||||
<tag k="name" v="Vereinsheim"/>
|
||||
<tag k="amenity" v="pub"/>
|
||||
<tag k="building" v="yes"/>
|
||||
</way>
|
||||
</osm>
|
||||
@@ -0,0 +1,4 @@
|
||||
|
||||
add_test(NAME examples_read
|
||||
COMMAND osmium_read ${CMAKE_CURRENT_SOURCE_DIR}/data.osm)
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6" generator="testdata" upload="false">
|
||||
<node id="701000" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.11" lat="1.01"/>
|
||||
<node id="701001" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.11" lat="1.04"/>
|
||||
<node id="701002" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.14" lat="1.04"/>
|
||||
<node id="701003" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.14" lat="1.01"/>
|
||||
<way id="701800" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<nd ref="701000"/>
|
||||
<nd ref="701001"/>
|
||||
<nd ref="701002"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
</way>
|
||||
<way id="701801" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<nd ref="701002"/>
|
||||
<nd ref="701003"/>
|
||||
<nd ref="701000"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
</way>
|
||||
<relation id="701900" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<member type="way" ref="701800" role="outer"/>
|
||||
<member type="way" ref="701801" role="outer"/>
|
||||
<tag k="type" v="multipolygon"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
<tag k="landuse" v="forest"/>
|
||||
</relation>
|
||||
</osm>
|
||||
@@ -0,0 +1,4 @@
|
||||
|
||||
add_test(NAME examples_read_with_progress
|
||||
COMMAND osmium_read_with_progress ${CMAKE_CURRENT_SOURCE_DIR}/data.osm)
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6" generator="testdata" upload="false">
|
||||
<node id="701000" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.11" lat="1.01"/>
|
||||
<node id="701001" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.11" lat="1.04"/>
|
||||
<node id="701002" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.14" lat="1.04"/>
|
||||
<node id="701003" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.14" lat="1.01"/>
|
||||
<way id="701800" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<nd ref="701000"/>
|
||||
<nd ref="701001"/>
|
||||
<nd ref="701002"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
</way>
|
||||
<way id="701801" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<nd ref="701002"/>
|
||||
<nd ref="701003"/>
|
||||
<nd ref="701000"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
</way>
|
||||
<relation id="701900" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
|
||||
<member type="way" ref="701800" role="outer"/>
|
||||
<member type="way" ref="701801" role="outer"/>
|
||||
<tag k="type" v="multipolygon"/>
|
||||
<tag k="test:section" v="mp-geom"/>
|
||||
<tag k="test:id" v="701"/>
|
||||
<tag k="landuse" v="forest"/>
|
||||
</relation>
|
||||
</osm>
|
||||
@@ -0,0 +1,8 @@
|
||||
|
||||
add_test(NAME examples_road_length
|
||||
COMMAND osmium_road_length ${CMAKE_CURRENT_SOURCE_DIR}/road.osm)
|
||||
|
||||
set_tests_properties(examples_road_length PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^Length: 0\\.405.*km\n$"
|
||||
)
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<osm version="0.6" generator="CGImap 0.3.3 (31041 thorn-01.openstreetmap.org)" copyright="OpenStreetMap and contributors" attribution="http://www.openstreetmap.org/copyright" license="http://opendatacommons.org/licenses/odbl/1-0/">
|
||||
<node id="5599384" visible="true" version="5" changeset="829716" timestamp="2009-03-18T17:16:26Z" user="burts" uid="97529" lat="51.0271601" lon="13.7252197"/>
|
||||
<node id="250384970" visible="true" version="3" changeset="855544" timestamp="2009-01-30T21:58:37Z" user="saftl" uid="7989" lat="51.0288568" lon="13.7248159">
|
||||
<tag k="created_by" v="JOSM"/>
|
||||
</node>
|
||||
<node id="250996316" visible="true" version="5" changeset="838711" timestamp="2009-03-21T13:10:39Z" user="burts" uid="97529" lat="51.0274683" lon="13.7251464"/>
|
||||
<node id="250996321" visible="true" version="3" changeset="855544" timestamp="2009-01-30T21:59:14Z" user="saftl" uid="7989" lat="51.0284283" lon="13.7249179">
|
||||
<tag k="created_by" v="JOSM"/>
|
||||
</node>
|
||||
<node id="252587568" visible="true" version="3" changeset="855544" timestamp="2009-01-30T21:58:45Z" user="saftl" uid="7989" lat="51.0275477" lon="13.7251275">
|
||||
<tag k="created_by" v="JOSM"/>
|
||||
</node>
|
||||
<node id="5599381" visible="true" version="6" changeset="15768585" timestamp="2013-04-18T01:20:26Z" user="Wolle DD" uid="1161559" lat="51.0307642" lon="13.7243263"/>
|
||||
<node id="1122039499" visible="true" version="2" changeset="26063898" timestamp="2014-10-14T04:09:11Z" user="Seandebasti" uid="550560" lat="51.0285248" lon="13.7248970"/>
|
||||
<node id="1122039521" visible="true" version="2" changeset="12753110" timestamp="2012-08-16T17:03:47Z" user="TEAM_CN_TUD" uid="716608" lat="51.0277456" lon="13.7250806"/>
|
||||
<node id="5599382" visible="true" version="6" changeset="8191054" timestamp="2011-05-19T16:19:51Z" user="stw1701" uid="102899" lat="51.0297991" lon="13.7245892"/>
|
||||
<node id="1299329303" visible="true" version="1" changeset="8242335" timestamp="2011-05-25T07:46:01Z" user="bigbug21" uid="15748" lat="51.0290875" lon="13.7247628"/>
|
||||
<node id="1868844753" visible="true" version="2" changeset="13260925" timestamp="2012-09-26T15:26:31Z" user="TEAM_CN_TUD" uid="716608" lat="51.0289617" lon="13.7247917"/>
|
||||
<node id="1868844765" visible="true" version="2" changeset="13260925" timestamp="2012-09-26T15:26:31Z" user="TEAM_CN_TUD" uid="716608" lat="51.0292872" lon="13.7247140"/>
|
||||
<node id="1868844782" visible="true" version="2" changeset="13260925" timestamp="2012-09-26T15:26:31Z" user="TEAM_CN_TUD" uid="716608" lat="51.0295717" lon="13.7246429"/>
|
||||
<node id="1922091528" visible="true" version="2" changeset="13260925" timestamp="2012-09-26T15:26:31Z" user="TEAM_CN_TUD" uid="716608" lat="51.0281700" lon="13.7249813"/>
|
||||
<node id="1953249124" visible="true" version="1" changeset="13418280" timestamp="2012-10-08T20:18:35Z" user="TEAM_CN_TUD" uid="716608" lat="51.0292437" lon="13.7247246"/>
|
||||
<node id="2015120752" visible="true" version="1" changeset="13883494" timestamp="2012-11-15T14:22:31Z" user="TEAM_CN_TUD" uid="716608" lat="51.0293536" lon="13.7246974"/>
|
||||
<node id="2056871900" visible="true" version="1" changeset="14207491" timestamp="2012-12-09T00:03:11Z" user="bigbug21" uid="15748" lat="51.0305821" lon="13.7243895"/>
|
||||
<node id="2458246647" visible="true" version="1" changeset="17836591" timestamp="2013-09-14T17:05:06Z" user="bigbug21" uid="15748" lat="51.0295979" lon="13.7246367"/>
|
||||
<node id="250384969" visible="true" version="4" changeset="17857555" timestamp="2013-09-15T20:17:55Z" user="4b696d" uid="1420318" lat="51.0282021" lon="13.7249734"/>
|
||||
<node id="3128723784" visible="true" version="1" changeset="26063898" timestamp="2014-10-14T04:09:07Z" user="Seandebasti" uid="550560" lat="51.0281018" lon="13.7249973"/>
|
||||
<way id="4428564" visible="true" version="21" changeset="26063898" timestamp="2014-10-14T04:09:13Z" user="Seandebasti" uid="550560">
|
||||
<nd ref="5599381"/>
|
||||
<nd ref="2056871900"/>
|
||||
<nd ref="5599382"/>
|
||||
<nd ref="2458246647"/>
|
||||
<nd ref="1868844782"/>
|
||||
<nd ref="2015120752"/>
|
||||
<nd ref="1868844765"/>
|
||||
<nd ref="1953249124"/>
|
||||
<nd ref="1299329303"/>
|
||||
<nd ref="1868844753"/>
|
||||
<nd ref="250384970"/>
|
||||
<nd ref="1122039499"/>
|
||||
<nd ref="250996321"/>
|
||||
<nd ref="250384969"/>
|
||||
<nd ref="1922091528"/>
|
||||
<nd ref="3128723784"/>
|
||||
<nd ref="1122039521"/>
|
||||
<nd ref="252587568"/>
|
||||
<nd ref="250996316"/>
|
||||
<nd ref="5599384"/>
|
||||
<tag k="highway" v="residential"/>
|
||||
<tag k="lit" v="yes"/>
|
||||
<tag k="maxspeed" v="30"/>
|
||||
<tag k="name" v="Helmholtzstraße"/>
|
||||
<tag k="postal_code" v="01069"/>
|
||||
<tag k="sidewalk" v="both"/>
|
||||
<tag k="smoothness" v="good"/>
|
||||
<tag k="surface" v="asphalt"/>
|
||||
</way>
|
||||
</osm>
|
||||
@@ -0,0 +1,18 @@
|
||||
|
||||
add_test(NAME examples_tiles_zoom_too_large
|
||||
COMMAND osmium_tiles 50 1 1)
|
||||
|
||||
set_tests_properties(examples_tiles_zoom_too_large PROPERTIES WILL_FAIL true)
|
||||
|
||||
add_test(NAME examples_tiles_location_invalid
|
||||
COMMAND osmium_tiles 1 200 200)
|
||||
|
||||
set_tests_properties(examples_tiles_location_invalid PROPERTIES WILL_FAIL true)
|
||||
|
||||
add_test(NAME examples_tiles_okay
|
||||
COMMAND osmium_tiles 8 55.3 11.7)
|
||||
|
||||
set_tests_properties(examples_tiles_okay PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "^WGS84: lon=55.3 lat=11.7\nMercator: x=.*\nTile: zoom=8 x=167 y=119\n$"
|
||||
)
|
||||
|
||||
+11618
File diff suppressed because it is too large
Load Diff
+18
@@ -0,0 +1,18 @@
|
||||
|
||||
#include <cstdlib>
|
||||
#include <string>
|
||||
|
||||
inline std::string with_data_dir(const char* filename) {
|
||||
const char* data_dir = getenv("OSMIUM_TEST_DATA_DIR");
|
||||
|
||||
std::string result;
|
||||
if (data_dir) {
|
||||
result = data_dir;
|
||||
result += '/';
|
||||
}
|
||||
|
||||
result += filename;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* mkstemp.c
|
||||
*
|
||||
* Provides a trivial replacement for the POSIX `mkstemp()' function,
|
||||
* suitable for use in MinGW (Win32) applications.
|
||||
*
|
||||
* This file is part of the MinGW32 package set.
|
||||
*
|
||||
* Contributed by Keith Marshall <keithmarshall@users.sourceforge.net>
|
||||
* Patched to VS2013 by alex85k
|
||||
* THIS SOFTWARE IS NOT COPYRIGHTED
|
||||
*
|
||||
* This source code is offered for use in the public domain. You may
|
||||
* use, modify or distribute it freely.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful but
|
||||
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
|
||||
* DISCLAIMED. This includes but is not limited to warranties of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*/
|
||||
|
||||
#ifndef WIN_MKSTEMP_H
|
||||
#define WIN_MKSTEMP_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <share.h>
|
||||
|
||||
inline int mkstemp( char *templ )
|
||||
{
|
||||
int maxtry = 26, rtn = -1;
|
||||
|
||||
while( maxtry-- && (rtn < 0) )
|
||||
{
|
||||
char *r = _mktemp( templ );
|
||||
if( r == NULL )
|
||||
return -1;
|
||||
rtn = sopen( r, O_RDWR | O_CREAT | O_EXCL | O_BINARY, SH_DENYRW, 0600 );
|
||||
}
|
||||
return rtn;
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,22 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/osm/area.hpp>
|
||||
|
||||
TEST_CASE("object_id to area_id conversion") {
|
||||
REQUIRE( 46 == osmium::object_id_to_area_id( 23, osmium::item_type::way));
|
||||
REQUIRE( 47 == osmium::object_id_to_area_id( 23, osmium::item_type::relation));
|
||||
REQUIRE( 0 == osmium::object_id_to_area_id( 0, osmium::item_type::way));
|
||||
REQUIRE( 1 == osmium::object_id_to_area_id( 0, osmium::item_type::relation));
|
||||
REQUIRE(-24 == osmium::object_id_to_area_id(-12, osmium::item_type::way));
|
||||
REQUIRE(-25 == osmium::object_id_to_area_id(-12, osmium::item_type::relation));
|
||||
}
|
||||
|
||||
TEST_CASE("area_id to object_id conversion") {
|
||||
REQUIRE( 23 == osmium::area_id_to_object_id( 46));
|
||||
REQUIRE( 23 == osmium::area_id_to_object_id( 47));
|
||||
REQUIRE( 0 == osmium::area_id_to_object_id( 0));
|
||||
REQUIRE( 0 == osmium::area_id_to_object_id( 1));
|
||||
REQUIRE(-12 == osmium::area_id_to_object_id(-24));
|
||||
REQUIRE(-12 == osmium::area_id_to_object_id(-25));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/area/assembler.hpp>
|
||||
#include <osmium/builder/attr.hpp>
|
||||
#include <osmium/memory/buffer.hpp>
|
||||
#include <osmium/osm/area.hpp>
|
||||
|
||||
using namespace osmium::builder::attr;
|
||||
|
||||
TEST_CASE("Build area from way") {
|
||||
osmium::memory::Buffer buffer{10240};
|
||||
|
||||
const auto wpos = osmium::builder::add_way(buffer,
|
||||
_id(1),
|
||||
_nodes({
|
||||
{1, {1.0, 1.0}},
|
||||
{2, {1.0, 2.0}},
|
||||
{3, {2.0, 2.0}},
|
||||
{4, {2.0, 1.0}},
|
||||
{1, {1.0, 1.0}}
|
||||
})
|
||||
);
|
||||
|
||||
osmium::area::AssemblerConfig config;
|
||||
osmium::area::Assembler assembler{config};
|
||||
|
||||
osmium::memory::Buffer area_buffer{10240};
|
||||
REQUIRE(assembler(buffer.get<osmium::Way>(wpos), area_buffer));
|
||||
|
||||
const auto& area = area_buffer.get<osmium::Area>(0);
|
||||
REQUIRE(area.from_way());
|
||||
REQUIRE(area.id() == 2);
|
||||
|
||||
const auto it = area.outer_rings().begin();
|
||||
REQUIRE(it != area.outer_rings().end());
|
||||
REQUIRE(it->size() == 5);
|
||||
|
||||
const auto& s = assembler.stats();
|
||||
REQUIRE(s.area_simple_case == 1);
|
||||
REQUIRE(s.from_ways == 1);
|
||||
REQUIRE(s.nodes == 4);
|
||||
REQUIRE(s.duplicate_nodes == 0);
|
||||
REQUIRE(s.invalid_locations == 0);
|
||||
}
|
||||
|
||||
TEST_CASE("Build area from way with duplicate nodes") {
|
||||
osmium::memory::Buffer buffer{10240};
|
||||
|
||||
const auto wpos = osmium::builder::add_way(buffer,
|
||||
_id(1),
|
||||
_nodes({
|
||||
{1, {1.0, 1.0}},
|
||||
{2, {1.0, 2.0}},
|
||||
{3, {2.0, 2.0}},
|
||||
{3, {2.0, 2.0}},
|
||||
{4, {2.0, 1.0}},
|
||||
{1, {1.0, 1.0}}
|
||||
})
|
||||
);
|
||||
|
||||
osmium::area::AssemblerConfig config;
|
||||
osmium::area::Assembler assembler{config};
|
||||
|
||||
osmium::memory::Buffer area_buffer{10240};
|
||||
REQUIRE(assembler(buffer.get<osmium::Way>(wpos), area_buffer));
|
||||
|
||||
const auto& area = area_buffer.get<osmium::Area>(0);
|
||||
REQUIRE(area.from_way());
|
||||
REQUIRE(area.id() == 2);
|
||||
|
||||
const auto it = area.outer_rings().begin();
|
||||
REQUIRE(it != area.outer_rings().end());
|
||||
REQUIRE(it->size() == 5);
|
||||
|
||||
const auto& s = assembler.stats();
|
||||
REQUIRE(s.area_simple_case == 1);
|
||||
REQUIRE(s.from_ways == 1);
|
||||
REQUIRE(s.nodes == 4);
|
||||
REQUIRE(s.duplicate_nodes == 1);
|
||||
REQUIRE(s.invalid_locations == 0);
|
||||
}
|
||||
|
||||
TEST_CASE("Build area from way with invalid location") {
|
||||
osmium::memory::Buffer buffer{10240};
|
||||
|
||||
const auto wpos = osmium::builder::add_way(buffer,
|
||||
_id(1),
|
||||
_nodes({
|
||||
{1, {1.0, 1.0}},
|
||||
{2, {1.0, 2.0}},
|
||||
{3},
|
||||
{4, {2.0, 1.0}},
|
||||
{1, {1.0, 1.0}}
|
||||
})
|
||||
);
|
||||
|
||||
osmium::area::AssemblerConfig config;
|
||||
osmium::area::Assembler assembler{config};
|
||||
|
||||
osmium::memory::Buffer area_buffer{10240};
|
||||
REQUIRE_FALSE(assembler(buffer.get<osmium::Way>(wpos), area_buffer));
|
||||
|
||||
const auto& s = assembler.stats();
|
||||
REQUIRE(s.duplicate_nodes == 0);
|
||||
REQUIRE(s.invalid_locations == 1);
|
||||
}
|
||||
|
||||
TEST_CASE("Build area from way with ignored invalid location") {
|
||||
osmium::memory::Buffer buffer{10240};
|
||||
|
||||
const auto wpos = osmium::builder::add_way(buffer,
|
||||
_id(1),
|
||||
_nodes({
|
||||
{1, {1.0, 1.0}},
|
||||
{2, {1.0, 2.0}},
|
||||
{3},
|
||||
{4, {2.0, 1.0}},
|
||||
{1, {1.0, 1.0}}
|
||||
})
|
||||
);
|
||||
|
||||
osmium::area::AssemblerConfig config;
|
||||
config.ignore_invalid_locations = true;
|
||||
osmium::area::Assembler assembler{config};
|
||||
|
||||
osmium::memory::Buffer area_buffer{10240};
|
||||
REQUIRE(assembler(buffer.get<osmium::Way>(wpos), area_buffer));
|
||||
|
||||
const auto& area = area_buffer.get<osmium::Area>(0);
|
||||
REQUIRE(area.from_way());
|
||||
REQUIRE(area.id() == 2);
|
||||
|
||||
const auto it = area.outer_rings().begin();
|
||||
REQUIRE(it != area.outer_rings().end());
|
||||
REQUIRE(it->size() == 4);
|
||||
|
||||
const auto& s = assembler.stats();
|
||||
REQUIRE(s.area_simple_case == 1);
|
||||
REQUIRE(s.from_ways == 1);
|
||||
REQUIRE(s.nodes == 3);
|
||||
REQUIRE(s.invalid_locations == 1);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,205 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/area/detail/node_ref_segment.hpp>
|
||||
|
||||
using osmium::area::detail::NodeRefSegment;
|
||||
using osmium::area::detail::role_type;
|
||||
|
||||
TEST_CASE("Default construction of NodeRefSegment") {
|
||||
NodeRefSegment s;
|
||||
REQUIRE(s.first().ref() == 0);
|
||||
REQUIRE(s.first().location() == osmium::Location());
|
||||
REQUIRE(s.second().ref() == 0);
|
||||
REQUIRE(s.second().location() == osmium::Location());
|
||||
}
|
||||
|
||||
TEST_CASE("Construction of NodeRefSegment with NodeRefs") {
|
||||
osmium::NodeRef nr1{1, {1.2, 3.4}};
|
||||
osmium::NodeRef nr2{2, {1.4, 3.1}};
|
||||
osmium::NodeRef nr3{3, {1.2, 3.6}};
|
||||
osmium::NodeRef nr4{4, {1.2, 3.7}};
|
||||
|
||||
NodeRefSegment s1{nr1, nr2, role_type::unknown, nullptr};
|
||||
REQUIRE(s1.first().ref() == 1);
|
||||
REQUIRE(s1.second().ref() == 2);
|
||||
|
||||
NodeRefSegment s2{nr2, nr3, role_type::unknown, nullptr};
|
||||
REQUIRE(s2.first().ref() == 3);
|
||||
REQUIRE(s2.second().ref() == 2);
|
||||
|
||||
NodeRefSegment s3{nr3, nr4, role_type::unknown, nullptr};
|
||||
REQUIRE(s3.first().ref() == 3);
|
||||
REQUIRE(s3.second().ref() == 4);
|
||||
}
|
||||
|
||||
TEST_CASE("Intersection of NodeRefSegments") {
|
||||
NodeRefSegment s1{{ 1, {0.0, 0.0}}, { 2, {2.0, 2.0}}, role_type::unknown, nullptr};
|
||||
NodeRefSegment s2{{ 3, {0.0, 2.0}}, { 4, {2.0, 0.0}}, role_type::unknown, nullptr};
|
||||
NodeRefSegment s3{{ 5, {2.0, 0.0}}, { 6, {4.0, 2.0}}, role_type::unknown, nullptr};
|
||||
NodeRefSegment s4{{ 7, {1.0, 0.0}}, { 8, {3.0, 2.0}}, role_type::unknown, nullptr};
|
||||
NodeRefSegment s5{{ 9, {0.0, 4.0}}, {10, {4.0, 0.0}}, role_type::unknown, nullptr};
|
||||
NodeRefSegment s6{{11, {0.0, 0.0}}, {12, {1.0, 1.0}}, role_type::unknown, nullptr};
|
||||
NodeRefSegment s7{{13, {1.0, 1.0}}, {14, {3.0, 3.0}}, role_type::unknown, nullptr};
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s2) == osmium::Location(1.0, 1.0));
|
||||
REQUIRE(calculate_intersection(s2, s1) == osmium::Location(1.0, 1.0));
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s3) == osmium::Location());
|
||||
REQUIRE(calculate_intersection(s3, s1) == osmium::Location());
|
||||
|
||||
REQUIRE(calculate_intersection(s2, s3) == osmium::Location());
|
||||
REQUIRE(calculate_intersection(s3, s2) == osmium::Location());
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s4) == osmium::Location());
|
||||
REQUIRE(calculate_intersection(s4, s1) == osmium::Location());
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s5) == osmium::Location(2.0, 2.0));
|
||||
REQUIRE(calculate_intersection(s5, s1) == osmium::Location(2.0, 2.0));
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s6) == osmium::Location(1.0, 1.0));
|
||||
REQUIRE(calculate_intersection(s6, s1) == osmium::Location(1.0, 1.0));
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s7) == osmium::Location(1.0, 1.0));
|
||||
REQUIRE(calculate_intersection(s7, s1) == osmium::Location(1.0, 1.0));
|
||||
|
||||
REQUIRE(calculate_intersection(s6, s7) == osmium::Location());
|
||||
REQUIRE(calculate_intersection(s7, s6) == osmium::Location());
|
||||
}
|
||||
|
||||
TEST_CASE("Intersection of collinear NodeRefSegments") {
|
||||
NodeRefSegment s1{{ 1, {0.0, 0.0}}, { 2, {2.0, 0.0}}, role_type::unknown, nullptr}; // *---*
|
||||
NodeRefSegment s2{{ 3, {2.0, 0.0}}, { 4, {4.0, 0.0}}, role_type::unknown, nullptr}; // *---*
|
||||
NodeRefSegment s3{{ 5, {0.0, 0.0}}, { 6, {1.0, 0.0}}, role_type::unknown, nullptr}; // *-*
|
||||
NodeRefSegment s4{{ 7, {1.0, 0.0}}, { 8, {2.0, 0.0}}, role_type::unknown, nullptr}; // *-*
|
||||
NodeRefSegment s5{{ 9, {1.0, 0.0}}, {10, {3.0, 0.0}}, role_type::unknown, nullptr}; // *---*
|
||||
NodeRefSegment s6{{11, {0.0, 0.0}}, {12, {4.0, 0.0}}, role_type::unknown, nullptr}; // *-------*
|
||||
NodeRefSegment s7{{13, {0.0, 0.0}}, {14, {5.0, 0.0}}, role_type::unknown, nullptr}; // *---------*
|
||||
NodeRefSegment s8{{13, {1.0, 0.0}}, {14, {5.0, 0.0}}, role_type::unknown, nullptr}; // *-------*
|
||||
NodeRefSegment s9{{13, {3.0, 0.0}}, {14, {4.0, 0.0}}, role_type::unknown, nullptr}; // *-*
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s1) == osmium::Location());
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s2) == osmium::Location());
|
||||
REQUIRE(calculate_intersection(s2, s1) == osmium::Location());
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s3) == osmium::Location(1.0, 0.0));
|
||||
REQUIRE(calculate_intersection(s3, s1) == osmium::Location(1.0, 0.0));
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s4) == osmium::Location(1.0, 0.0));
|
||||
REQUIRE(calculate_intersection(s4, s1) == osmium::Location(1.0, 0.0));
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s5) == osmium::Location(1.0, 0.0));
|
||||
REQUIRE(calculate_intersection(s5, s1) == osmium::Location(1.0, 0.0));
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s6) == osmium::Location(2.0, 0.0));
|
||||
REQUIRE(calculate_intersection(s6, s1) == osmium::Location(2.0, 0.0));
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s7) == osmium::Location(2.0, 0.0));
|
||||
REQUIRE(calculate_intersection(s7, s1) == osmium::Location(2.0, 0.0));
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s8) == osmium::Location(1.0, 0.0));
|
||||
REQUIRE(calculate_intersection(s8, s1) == osmium::Location(1.0, 0.0));
|
||||
|
||||
REQUIRE(calculate_intersection(s1, s9) == osmium::Location());
|
||||
REQUIRE(calculate_intersection(s9, s1) == osmium::Location());
|
||||
|
||||
REQUIRE(calculate_intersection(s5, s6) == osmium::Location(1.0, 0.0));
|
||||
REQUIRE(calculate_intersection(s6, s5) == osmium::Location(1.0, 0.0));
|
||||
|
||||
REQUIRE(calculate_intersection(s7, s8) == osmium::Location(1.0, 0.0));
|
||||
REQUIRE(calculate_intersection(s8, s7) == osmium::Location(1.0, 0.0));
|
||||
}
|
||||
|
||||
TEST_CASE("Intersection of very long NodeRefSegments") {
|
||||
NodeRefSegment s1{{1, {90.0, 90.0}}, {2, {-90.0, -90.0}}, role_type::unknown, nullptr};
|
||||
NodeRefSegment s2{{1, {-90.0, 90.0}}, {2, {90.0, -90.0}}, role_type::unknown, nullptr};
|
||||
REQUIRE(calculate_intersection(s1, s2) == osmium::Location(0.0, 0.0));
|
||||
|
||||
NodeRefSegment s3{{1, {-90.0, -90.0}}, {2, {90.0, 90.0}}, role_type::unknown, nullptr};
|
||||
NodeRefSegment s4{{1, {-90.0, 90.0}}, {2, {90.0, -90.0}}, role_type::unknown, nullptr};
|
||||
REQUIRE(calculate_intersection(s3, s4) == osmium::Location(0.0, 0.0));
|
||||
|
||||
NodeRefSegment s5{{1, {-90.00000001, -90.0}}, {2, {90.0, 90.0}}, role_type::unknown, nullptr};
|
||||
NodeRefSegment s6{{1, {-90.0, 90.0}}, {2, {90.0, -90.0}}, role_type::unknown, nullptr};
|
||||
REQUIRE(calculate_intersection(s5, s6) == osmium::Location(0.0, 0.0));
|
||||
}
|
||||
|
||||
TEST_CASE("Ordering of NodeRefSegements") {
|
||||
osmium::NodeRef node_ref1{1, {1.0, 3.0}};
|
||||
osmium::NodeRef node_ref2{2, {1.4, 2.9}};
|
||||
osmium::NodeRef node_ref3{3, {1.2, 3.0}};
|
||||
osmium::NodeRef node_ref4{4, {1.2, 3.3}};
|
||||
|
||||
REQUIRE(node_ref1 < node_ref2);
|
||||
REQUIRE(node_ref2 < node_ref3);
|
||||
REQUIRE(node_ref1 < node_ref3);
|
||||
REQUIRE(node_ref1 >= node_ref1);
|
||||
|
||||
REQUIRE( osmium::location_less()(node_ref1, node_ref2));
|
||||
REQUIRE_FALSE(osmium::location_less()(node_ref2, node_ref3));
|
||||
REQUIRE( osmium::location_less()(node_ref1, node_ref3));
|
||||
REQUIRE( osmium::location_less()(node_ref3, node_ref4));
|
||||
REQUIRE_FALSE(osmium::location_less()(node_ref1, node_ref1));
|
||||
}
|
||||
|
||||
TEST_CASE("More ordering of NodeRefSegments") {
|
||||
osmium::NodeRef nr0{0, {0.0, 0.0}};
|
||||
osmium::NodeRef nr1{1, {1.0, 0.0}};
|
||||
osmium::NodeRef nr2{2, {0.0, 1.0}};
|
||||
osmium::NodeRef nr3{3, {2.0, 0.0}};
|
||||
osmium::NodeRef nr4{4, {0.0, 2.0}};
|
||||
osmium::NodeRef nr5{5, {1.0, 1.0}};
|
||||
osmium::NodeRef nr6{6, {2.0, 2.0}};
|
||||
osmium::NodeRef nr7{6, {1.0, 2.0}};
|
||||
|
||||
NodeRefSegment s1{nr0, nr1, role_type::unknown, nullptr};
|
||||
NodeRefSegment s2{nr0, nr2, role_type::unknown, nullptr};
|
||||
NodeRefSegment s3{nr0, nr3, role_type::unknown, nullptr};
|
||||
NodeRefSegment s4{nr0, nr4, role_type::unknown, nullptr};
|
||||
NodeRefSegment s5{nr0, nr5, role_type::unknown, nullptr};
|
||||
NodeRefSegment s6{nr0, nr6, role_type::unknown, nullptr};
|
||||
NodeRefSegment s7{nr0, nr7, role_type::unknown, nullptr};
|
||||
|
||||
// s1
|
||||
REQUIRE_FALSE(s1 < s1);
|
||||
REQUIRE(s2 < s1);
|
||||
REQUIRE(s1 < s3);
|
||||
REQUIRE(s4 < s1);
|
||||
REQUIRE(s5 < s1);
|
||||
REQUIRE(s6 < s1);
|
||||
REQUIRE(s7 < s1);
|
||||
|
||||
// s2
|
||||
REQUIRE_FALSE(s2 < s2);
|
||||
REQUIRE(s2 < s3);
|
||||
REQUIRE(s2 < s4);
|
||||
REQUIRE(s2 < s5);
|
||||
REQUIRE(s2 < s6);
|
||||
REQUIRE(s2 < s7);
|
||||
|
||||
// s3
|
||||
REQUIRE_FALSE(s3 < s3);
|
||||
REQUIRE(s4 < s3);
|
||||
REQUIRE(s5 < s3);
|
||||
REQUIRE(s6 < s3);
|
||||
REQUIRE(s7 < s3);
|
||||
|
||||
// s4
|
||||
REQUIRE_FALSE(s4 < s4);
|
||||
REQUIRE(s4 < s5);
|
||||
REQUIRE(s4 < s6);
|
||||
REQUIRE(s4 < s7);
|
||||
|
||||
// s5
|
||||
REQUIRE_FALSE(s5 < s5);
|
||||
REQUIRE(s5 < s6);
|
||||
REQUIRE(s7 < s5);
|
||||
|
||||
// s6
|
||||
REQUIRE_FALSE(s6 < s6);
|
||||
REQUIRE(s7 < s6);
|
||||
|
||||
// s7
|
||||
REQUIRE_FALSE(s7 < s7);
|
||||
}
|
||||
|
||||
+567
@@ -0,0 +1,567 @@
|
||||
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <cstdint>
|
||||
#include <initializer_list>
|
||||
#include <string>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include <osmium/builder/attr.hpp>
|
||||
#include <osmium/memory/buffer.hpp>
|
||||
#include <osmium/osm.hpp>
|
||||
#include <osmium/osm/types.hpp>
|
||||
|
||||
TEST_CASE("create node using builders") {
|
||||
|
||||
using namespace osmium::builder::attr;
|
||||
|
||||
osmium::memory::Buffer buffer{1024 * 10};
|
||||
|
||||
SECTION("add node with only id") {
|
||||
const auto pos = osmium::builder::add_node(buffer, _id(22));
|
||||
|
||||
const auto& node = buffer.get<osmium::Node>(pos);
|
||||
|
||||
REQUIRE(node.id() == 22);
|
||||
REQUIRE(node.version() == 0);
|
||||
REQUIRE(node.timestamp() == osmium::Timestamp{});
|
||||
REQUIRE(node.changeset() == 0);
|
||||
REQUIRE(node.uid() == 0);
|
||||
REQUIRE(std::string(node.user()) == "");
|
||||
REQUIRE(node.location() == osmium::Location{});
|
||||
REQUIRE(node.tags().size() == 0);
|
||||
}
|
||||
|
||||
SECTION("add node with complete info but no tags") {
|
||||
const osmium::Location loc{3.14, 1.59};
|
||||
const auto pos = osmium::builder::add_node(buffer,
|
||||
_id(1),
|
||||
_version(17),
|
||||
_timestamp(osmium::Timestamp{"2015-01-01T10:20:30Z"}),
|
||||
_cid(21),
|
||||
_uid(222),
|
||||
_location(loc),
|
||||
_user("foo")
|
||||
);
|
||||
|
||||
const auto& node = buffer.get<osmium::Node>(pos);
|
||||
|
||||
REQUIRE(node.id() == 1);
|
||||
REQUIRE(node.version() == 17);
|
||||
REQUIRE(node.timestamp() == osmium::Timestamp{"2015-01-01T10:20:30Z"});
|
||||
REQUIRE(node.changeset() == 21);
|
||||
REQUIRE(node.uid() == 222);
|
||||
REQUIRE(std::string(node.user()) == "foo");
|
||||
REQUIRE(node.location() == loc);
|
||||
REQUIRE(node.tags().size() == 0);
|
||||
REQUIRE(std::distance(node.cbegin(), node.cend()) == 0);
|
||||
}
|
||||
|
||||
SECTION("visible/deleted flag") {
|
||||
osmium::builder::add_node(buffer, _id(1), _deleted());
|
||||
osmium::builder::add_node(buffer, _id(2), _deleted(true));
|
||||
osmium::builder::add_node(buffer, _id(3), _deleted(false));
|
||||
osmium::builder::add_node(buffer, _id(4), _visible());
|
||||
osmium::builder::add_node(buffer, _id(5), _visible(true));
|
||||
osmium::builder::add_node(buffer, _id(6), _visible(false));
|
||||
|
||||
auto it = buffer.select<osmium::Node>().cbegin();
|
||||
REQUIRE_FALSE(it++->visible());
|
||||
REQUIRE_FALSE(it++->visible());
|
||||
REQUIRE(it++->visible());
|
||||
REQUIRE(it++->visible());
|
||||
REQUIRE(it++->visible());
|
||||
REQUIRE_FALSE(it++->visible());
|
||||
REQUIRE(it == buffer.select<osmium::Node>().cend());
|
||||
}
|
||||
|
||||
SECTION("order of attributes doesn't matter") {
|
||||
const osmium::Location loc{3.14, 1.59};
|
||||
const auto pos = osmium::builder::add_node(buffer,
|
||||
_timestamp("2015-01-01T10:20:30Z"),
|
||||
_version(17),
|
||||
_cid(21),
|
||||
_uid(222),
|
||||
_user(std::string("foo")),
|
||||
_id(1),
|
||||
_location(3.14, 1.59)
|
||||
);
|
||||
|
||||
const auto& node = buffer.get<osmium::Node>(pos);
|
||||
|
||||
REQUIRE(node.id() == 1);
|
||||
REQUIRE(node.version() == 17);
|
||||
REQUIRE(node.timestamp() == osmium::Timestamp{"2015-01-01T10:20:30Z"});
|
||||
REQUIRE(node.changeset() == 21);
|
||||
REQUIRE(node.uid() == 222);
|
||||
REQUIRE(std::string(node.user()) == "foo");
|
||||
REQUIRE(node.location() == loc);
|
||||
REQUIRE(node.tags().size() == 0);
|
||||
}
|
||||
|
||||
SECTION("add tags using _tag") {
|
||||
std::pair<const char*, const char*> t1 = {"name", "Node Inn"};
|
||||
std::pair<std::string, std::string> t2 = {"phone", "+1-123-555-4567"};
|
||||
|
||||
const auto pos = osmium::builder::add_node(buffer,
|
||||
_id(2),
|
||||
_tag("amenity", "restaurant"),
|
||||
_tag(t1),
|
||||
_tag(t2),
|
||||
_tag(std::string{"cuisine"}, std::string{"italian"})
|
||||
);
|
||||
|
||||
const auto& node = buffer.get<osmium::Node>(pos);
|
||||
|
||||
REQUIRE(node.id() == 2);
|
||||
REQUIRE(node.tags().size() == 4);
|
||||
REQUIRE(std::distance(node.cbegin(), node.cend()) == 1);
|
||||
|
||||
auto it = node.tags().cbegin();
|
||||
REQUIRE(std::string(it->key()) == "amenity");
|
||||
REQUIRE(std::string(it->value()) == "restaurant");
|
||||
++it;
|
||||
REQUIRE(std::string(it->key()) == "name");
|
||||
REQUIRE(std::string(it->value()) == "Node Inn");
|
||||
++it;
|
||||
REQUIRE(std::string(it->key()) == "phone");
|
||||
REQUIRE(std::string(it->value()) == "+1-123-555-4567");
|
||||
++it;
|
||||
REQUIRE(std::string(it->key()) == "cuisine");
|
||||
REQUIRE(std::string(it->value()) == "italian");
|
||||
++it;
|
||||
REQUIRE(it == node.tags().cend());
|
||||
}
|
||||
|
||||
SECTION("add tags using _tags from initializer list") {
|
||||
const auto pos = osmium::builder::add_node(buffer,
|
||||
_id(3),
|
||||
_tags({{"amenity", "post_box"}})
|
||||
);
|
||||
|
||||
const auto& node = buffer.get<osmium::Node>(pos);
|
||||
|
||||
REQUIRE(node.id() == 3);
|
||||
REQUIRE(node.tags().size() == 1);
|
||||
|
||||
auto it = node.tags().cbegin();
|
||||
REQUIRE(std::string(it->key()) == "amenity");
|
||||
REQUIRE(std::string(it->value()) == "post_box");
|
||||
++it;
|
||||
REQUIRE(it == node.tags().cend());
|
||||
REQUIRE(std::distance(node.cbegin(), node.cend()) == 1);
|
||||
}
|
||||
|
||||
SECTION("add tags using _tags from TagList") {
|
||||
const auto pos1 = osmium::builder::add_node(buffer,
|
||||
_id(3),
|
||||
_tag("a", "d"),
|
||||
_tag("b", "e"),
|
||||
_tag("c", "f")
|
||||
);
|
||||
|
||||
const auto& node1 = buffer.get<osmium::Node>(pos1);
|
||||
|
||||
const auto pos2 = osmium::builder::add_node(buffer,
|
||||
_id(4),
|
||||
_tags(node1.tags())
|
||||
);
|
||||
|
||||
const auto& node2 = buffer.get<osmium::Node>(pos2);
|
||||
|
||||
REQUIRE(node2.id() == 4);
|
||||
REQUIRE(node2.tags().size() == 3);
|
||||
|
||||
auto it = node2.tags().cbegin();
|
||||
REQUIRE(std::string(it++->key()) == "a");
|
||||
REQUIRE(std::string(it++->key()) == "b");
|
||||
REQUIRE(std::string(it++->key()) == "c");
|
||||
REQUIRE(it == node2.tags().cend());
|
||||
REQUIRE(std::distance(node2.cbegin(), node2.cend()) == 1);
|
||||
}
|
||||
|
||||
SECTION("add tags using mixed tag sources") {
|
||||
const std::vector<pair_of_cstrings> tags = {
|
||||
{"t5", "t5"},
|
||||
{"t6", "t6"}
|
||||
};
|
||||
|
||||
const auto pos = osmium::builder::add_node(buffer,
|
||||
_id(4),
|
||||
_tag("t1", "t1"),
|
||||
_tags({{"t2", "t2"}, {"t3", "t3"}}),
|
||||
_tag("t4", "t4"),
|
||||
_tags(tags)
|
||||
);
|
||||
|
||||
const auto& node = buffer.get<osmium::Node>(pos);
|
||||
|
||||
REQUIRE(node.id() == 4);
|
||||
REQUIRE(node.tags().size() == 6);
|
||||
|
||||
auto it = node.tags().cbegin();
|
||||
REQUIRE(std::string(it->key()) == "t1");
|
||||
++it;
|
||||
REQUIRE(std::string(it->key()) == "t2");
|
||||
++it;
|
||||
REQUIRE(std::string(it->key()) == "t3");
|
||||
++it;
|
||||
REQUIRE(std::string(it->key()) == "t4");
|
||||
++it;
|
||||
REQUIRE(std::string(it->key()) == "t5");
|
||||
++it;
|
||||
REQUIRE(std::string(it->key()) == "t6");
|
||||
++it;
|
||||
REQUIRE(it == node.tags().cend());
|
||||
REQUIRE(std::distance(node.cbegin(), node.cend()) == 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TEST_CASE("create way using builders") {
|
||||
|
||||
using namespace osmium::builder::attr;
|
||||
|
||||
osmium::memory::Buffer buffer{1024 * 10};
|
||||
|
||||
SECTION("add way without nodes") {
|
||||
const auto pos = osmium::builder::add_way(buffer,
|
||||
_id(999),
|
||||
_cid(21),
|
||||
_uid(222),
|
||||
_user("foo")
|
||||
);
|
||||
|
||||
const auto& way = buffer.get<osmium::Way>(pos);
|
||||
|
||||
REQUIRE(way.id() == 999);
|
||||
REQUIRE(way.version() == 0);
|
||||
REQUIRE(way.timestamp() == osmium::Timestamp{});
|
||||
REQUIRE(way.changeset() == 21);
|
||||
REQUIRE(way.uid() == 222);
|
||||
REQUIRE(std::string(way.user()) == "foo");
|
||||
REQUIRE(way.tags().size() == 0);
|
||||
REQUIRE(way.nodes().size() == 0);
|
||||
REQUIRE(std::distance(way.cbegin(), way.cend()) == 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TEST_CASE("create way with nodes") {
|
||||
std::vector<osmium::NodeRef> nrvec = {
|
||||
{ 1, osmium::Location{1.1, 0.1} },
|
||||
{ 2, osmium::Location{2.2, 0.2} },
|
||||
{ 4, osmium::Location{4.4, 0.4} },
|
||||
{ 8, osmium::Location{8.8, 0.8} }
|
||||
};
|
||||
|
||||
using namespace osmium::builder::attr;
|
||||
|
||||
osmium::memory::Buffer wbuffer{1024 * 10};
|
||||
osmium::builder::add_way(wbuffer,
|
||||
_id(1),
|
||||
_nodes({1, 2, 4, 8})
|
||||
);
|
||||
|
||||
const osmium::NodeRefList& nodes = wbuffer.get<osmium::Way>(0).nodes();
|
||||
|
||||
osmium::memory::Buffer buffer{1024 * 10};
|
||||
|
||||
SECTION("add nodes using an OSM object id or NodeRef") {
|
||||
osmium::builder::add_way(buffer,
|
||||
_id(1),
|
||||
_node(1),
|
||||
_node(2),
|
||||
_node(osmium::NodeRef{4}),
|
||||
_node(8)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
SECTION("add nodes using iterator list with object ids") {
|
||||
osmium::builder::add_way(buffer,
|
||||
_id(1),
|
||||
_nodes({1, 2, 4, 8})
|
||||
);
|
||||
}
|
||||
|
||||
SECTION("add way with nodes in initializer_list of NodeRefs") {
|
||||
osmium::builder::add_way(buffer,
|
||||
_id(1),
|
||||
_nodes({
|
||||
{ 1, {1.1, 0.1} },
|
||||
{ 2, {2.2, 0.2} },
|
||||
{ 4, {4.4, 0.4} },
|
||||
{ 8, {8.8, 0.8} }
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
SECTION("add nodes using WayNodeList") {
|
||||
osmium::builder::add_way(buffer,
|
||||
_id(1),
|
||||
_nodes(nodes)
|
||||
);
|
||||
}
|
||||
|
||||
SECTION("add nodes using vector of OSM object ids") {
|
||||
const std::vector<osmium::object_id_type> some_nodes = {
|
||||
1, 2, 4, 8
|
||||
};
|
||||
|
||||
osmium::builder::add_way(buffer,
|
||||
_id(1),
|
||||
_nodes(some_nodes)
|
||||
);
|
||||
}
|
||||
|
||||
SECTION("add nodes using vector of NodeRefs") {
|
||||
osmium::builder::add_way(buffer,
|
||||
_id(1),
|
||||
_nodes(nrvec)
|
||||
);
|
||||
}
|
||||
|
||||
SECTION("add nodes using different means together") {
|
||||
osmium::builder::add_way(buffer,
|
||||
_id(1),
|
||||
_node(1),
|
||||
_nodes({2, 4}),
|
||||
_node(8)
|
||||
);
|
||||
}
|
||||
|
||||
SECTION("add nodes using different means together") {
|
||||
osmium::builder::add_way(buffer,
|
||||
_id(1),
|
||||
_nodes(nodes.begin(), nodes.begin() + 1),
|
||||
_nodes({2, 4, 8})
|
||||
);
|
||||
}
|
||||
|
||||
const auto& way = buffer.get<osmium::Way>(0);
|
||||
|
||||
REQUIRE(way.id() == 1);
|
||||
REQUIRE(way.nodes().size() == 4);
|
||||
REQUIRE(std::distance(way.cbegin(), way.cend()) == 1);
|
||||
|
||||
auto it = way.nodes().cbegin();
|
||||
|
||||
REQUIRE(it->ref() == 1);
|
||||
if (it->location().valid()) {
|
||||
REQUIRE(*it == nrvec[0]);
|
||||
}
|
||||
it++;
|
||||
|
||||
REQUIRE(it->ref() == 2);
|
||||
if (it->location().valid()) {
|
||||
REQUIRE(*it == nrvec[1]);
|
||||
}
|
||||
it++;
|
||||
|
||||
REQUIRE(it->ref() == 4);
|
||||
if (it->location().valid()) {
|
||||
REQUIRE(*it == nrvec[2]);
|
||||
}
|
||||
it++;
|
||||
|
||||
REQUIRE(it->ref() == 8);
|
||||
if (it->location().valid()) {
|
||||
REQUIRE(*it == nrvec[3]);
|
||||
}
|
||||
it++;
|
||||
|
||||
REQUIRE(it == way.nodes().cend());
|
||||
}
|
||||
|
||||
TEST_CASE("create relation using builders") {
|
||||
|
||||
using namespace osmium::builder::attr;
|
||||
|
||||
osmium::memory::Buffer buffer{1024 * 10};
|
||||
|
||||
SECTION("create relation") {
|
||||
osmium::builder::attr::member_type m{osmium::item_type::way, 113, "inner"};
|
||||
|
||||
osmium::builder::add_relation(buffer,
|
||||
_id(123),
|
||||
_member(osmium::item_type::node, 123, ""),
|
||||
_member(osmium::item_type::node, 132),
|
||||
_member(osmium::item_type::way, 111, "outer"),
|
||||
_member(osmium::builder::attr::member_type{osmium::item_type::way, 112, "inner"}),
|
||||
_member(m)
|
||||
);
|
||||
|
||||
const auto& relation = buffer.get<osmium::Relation>(0);
|
||||
|
||||
REQUIRE(relation.id() == 123);
|
||||
REQUIRE(relation.members().size() == 5);
|
||||
REQUIRE(std::distance(relation.cbegin(), relation.cend()) == 1);
|
||||
|
||||
auto it = relation.members().begin();
|
||||
|
||||
REQUIRE(it->type() == osmium::item_type::node);
|
||||
REQUIRE(it->ref() == 123);
|
||||
REQUIRE(std::string(it->role()) == "");
|
||||
++it;
|
||||
|
||||
REQUIRE(it->type() == osmium::item_type::node);
|
||||
REQUIRE(it->ref() == 132);
|
||||
REQUIRE(std::string(it->role()) == "");
|
||||
++it;
|
||||
|
||||
REQUIRE(it->type() == osmium::item_type::way);
|
||||
REQUIRE(it->ref() == 111);
|
||||
REQUIRE(std::string(it->role()) == "outer");
|
||||
++it;
|
||||
|
||||
REQUIRE(it->type() == osmium::item_type::way);
|
||||
REQUIRE(it->ref() == 112);
|
||||
REQUIRE(std::string(it->role()) == "inner");
|
||||
++it;
|
||||
|
||||
REQUIRE(it->type() == osmium::item_type::way);
|
||||
REQUIRE(it->ref() == 113);
|
||||
REQUIRE(std::string(it->role()) == "inner");
|
||||
++it;
|
||||
|
||||
REQUIRE(it == relation.members().end());
|
||||
}
|
||||
|
||||
SECTION("create relation member from existing relation member") {
|
||||
osmium::builder::add_relation(buffer,
|
||||
_id(123),
|
||||
_member(osmium::item_type::way, 111, "outer"),
|
||||
_member(osmium::item_type::way, 112, "inner")
|
||||
);
|
||||
|
||||
const auto& relation1 = buffer.get<osmium::Relation>(0);
|
||||
|
||||
const auto pos = osmium::builder::add_relation(buffer,
|
||||
_id(124),
|
||||
_member(*relation1.members().begin()),
|
||||
_members(std::next(relation1.members().begin()), relation1.members().end())
|
||||
);
|
||||
|
||||
const auto& relation = buffer.get<osmium::Relation>(pos);
|
||||
|
||||
REQUIRE(relation.id() == 124);
|
||||
REQUIRE(relation.members().size() == 2);
|
||||
|
||||
auto it = relation.members().begin();
|
||||
|
||||
REQUIRE(it->type() == osmium::item_type::way);
|
||||
REQUIRE(it->ref() == 111);
|
||||
REQUIRE(std::string(it->role()) == "outer");
|
||||
++it;
|
||||
|
||||
REQUIRE(it->type() == osmium::item_type::way);
|
||||
REQUIRE(it->ref() == 112);
|
||||
REQUIRE(std::string(it->role()) == "inner");
|
||||
++it;
|
||||
|
||||
REQUIRE(it == relation.members().end());
|
||||
}
|
||||
|
||||
SECTION("create relation with members from initializer list") {
|
||||
const auto pos = osmium::builder::add_relation(buffer,
|
||||
_id(123),
|
||||
_members({
|
||||
{osmium::item_type::node, 123, ""},
|
||||
{osmium::item_type::way, 111, "outer"}
|
||||
})
|
||||
);
|
||||
|
||||
const auto& relation = buffer.get<osmium::Relation>(pos);
|
||||
|
||||
REQUIRE(relation.id() == 123);
|
||||
REQUIRE(relation.members().size() == 2);
|
||||
REQUIRE(std::distance(relation.cbegin(), relation.cend()) == 1);
|
||||
|
||||
auto it = relation.members().begin();
|
||||
REQUIRE(it->type() == osmium::item_type::node);
|
||||
REQUIRE(it->ref() == 123);
|
||||
REQUIRE(std::string(it->role()) == "");
|
||||
++it;
|
||||
REQUIRE(it->type() == osmium::item_type::way);
|
||||
REQUIRE(it->ref() == 111);
|
||||
REQUIRE(std::string(it->role()) == "outer");
|
||||
++it;
|
||||
REQUIRE(it == relation.members().end());
|
||||
}
|
||||
|
||||
SECTION("create relation with members from iterators and some tags") {
|
||||
const std::vector<member_type> members = {
|
||||
{osmium::item_type::node, 123},
|
||||
{osmium::item_type::way, 111, "outer"}
|
||||
};
|
||||
|
||||
SECTION("using iterators") {
|
||||
osmium::builder::add_relation(buffer,
|
||||
_id(123),
|
||||
_members(members.begin(), members.end()),
|
||||
_tag("a", "x"),
|
||||
_tag("b", "y")
|
||||
);
|
||||
}
|
||||
SECTION("using container") {
|
||||
osmium::builder::add_relation(buffer,
|
||||
_id(123),
|
||||
_members(members),
|
||||
_tag("a", "x"),
|
||||
_tag("b", "y")
|
||||
);
|
||||
}
|
||||
|
||||
const auto& relation = buffer.get<osmium::Relation>(0);
|
||||
|
||||
REQUIRE(relation.id() == 123);
|
||||
REQUIRE(relation.members().size() == 2);
|
||||
REQUIRE(relation.tags().size() == 2);
|
||||
REQUIRE(std::distance(relation.cbegin(), relation.cend()) == 2);
|
||||
|
||||
auto it = relation.members().begin();
|
||||
REQUIRE(it->type() == osmium::item_type::node);
|
||||
REQUIRE(it->ref() == 123);
|
||||
REQUIRE(std::string(it->role()) == "");
|
||||
++it;
|
||||
REQUIRE(it->type() == osmium::item_type::way);
|
||||
REQUIRE(it->ref() == 111);
|
||||
REQUIRE(std::string(it->role()) == "outer");
|
||||
++it;
|
||||
REQUIRE(it == relation.members().end());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TEST_CASE("create area using builders") {
|
||||
|
||||
using namespace osmium::builder::attr;
|
||||
|
||||
osmium::memory::Buffer buffer{1024 * 10};
|
||||
|
||||
SECTION("add area without rings") {
|
||||
const auto pos = osmium::builder::add_area(buffer,
|
||||
_id(999),
|
||||
_cid(21),
|
||||
_uid(222),
|
||||
_user("foo"),
|
||||
_tag("landuse", "residential")
|
||||
);
|
||||
|
||||
const auto& area = buffer.get<osmium::Area>(pos);
|
||||
|
||||
REQUIRE(area.id() == 999);
|
||||
REQUIRE(area.version() == 0);
|
||||
REQUIRE(area.timestamp() == osmium::Timestamp{});
|
||||
REQUIRE(area.changeset() == 21);
|
||||
REQUIRE(area.uid() == 222);
|
||||
REQUIRE(std::string(area.user()) == "foo");
|
||||
REQUIRE(area.tags().size() == 1);
|
||||
REQUIRE(std::distance(area.cbegin(), area.cend()) == 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,444 @@
|
||||
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/builder/osm_object_builder.hpp>
|
||||
#include <osmium/memory/buffer.hpp>
|
||||
#include <osmium/osm.hpp>
|
||||
|
||||
TEST_CASE("create objects using builder") {
|
||||
osmium::memory::Buffer buffer{1024 * 10};
|
||||
std::string user;
|
||||
|
||||
SECTION("complete node with tags") {
|
||||
SECTION("user length 0") {
|
||||
user = "";
|
||||
}
|
||||
SECTION("user length 1") {
|
||||
user = "1";
|
||||
}
|
||||
SECTION("user length 2") {
|
||||
user = "12";
|
||||
}
|
||||
SECTION("user length 3") {
|
||||
user = "123";
|
||||
}
|
||||
SECTION("user length 4") {
|
||||
user = "1234";
|
||||
}
|
||||
SECTION("user length 5") {
|
||||
user = "12345";
|
||||
}
|
||||
SECTION("user length 6") {
|
||||
user = "123456";
|
||||
}
|
||||
SECTION("user length 7") {
|
||||
user = "1234567";
|
||||
}
|
||||
SECTION("user length 8") {
|
||||
user = "12345678";
|
||||
}
|
||||
SECTION("user length 9") {
|
||||
user = "123456789";
|
||||
}
|
||||
SECTION("user length 10") {
|
||||
user = "1234567890";
|
||||
}
|
||||
SECTION("user length 11") {
|
||||
user = "12345678901";
|
||||
}
|
||||
SECTION("user length 12") {
|
||||
user = "123456789012";
|
||||
}
|
||||
SECTION("user length 13") {
|
||||
user = "1234567890123";
|
||||
}
|
||||
SECTION("user length 14") {
|
||||
user = "12345678901234";
|
||||
}
|
||||
SECTION("user length 15") {
|
||||
user = "123456789012345";
|
||||
}
|
||||
SECTION("user length 16") {
|
||||
user = "1234567890123456";
|
||||
}
|
||||
SECTION("user length 17") {
|
||||
user = "12345678901234567";
|
||||
}
|
||||
SECTION("user length 18") {
|
||||
user = "123456789012345678";
|
||||
}
|
||||
|
||||
const osmium::Location loc{1.2, 3.4};
|
||||
|
||||
{
|
||||
osmium::builder::NodeBuilder builder{buffer};
|
||||
|
||||
builder.set_id(17)
|
||||
.set_visible(true)
|
||||
.set_version(1)
|
||||
.set_changeset(123)
|
||||
.set_uid(555)
|
||||
.set_timestamp("2015-07-01T00:00:01Z")
|
||||
.set_location(loc)
|
||||
.set_user(user);
|
||||
|
||||
builder.add_tags({{"highway", "primary"}, {"oneway", "yes"}});
|
||||
}
|
||||
|
||||
const auto& node = buffer.get<osmium::Node>(buffer.commit());
|
||||
|
||||
REQUIRE(node.id() == 17);
|
||||
REQUIRE(node.version() == 1);
|
||||
REQUIRE(node.changeset() == 123);
|
||||
REQUIRE(node.uid() == 555);
|
||||
REQUIRE(node.timestamp() == osmium::Timestamp{"2015-07-01T00:00:01Z"});
|
||||
REQUIRE(node.location() == loc);
|
||||
|
||||
REQUIRE(user == node.user());
|
||||
|
||||
REQUIRE(node.tags().size() == 2);
|
||||
}
|
||||
|
||||
SECTION("complete way with tags") {
|
||||
SECTION("user length 0") {
|
||||
user = "";
|
||||
}
|
||||
SECTION("user length 1") {
|
||||
user = "1";
|
||||
}
|
||||
SECTION("user length 2") {
|
||||
user = "12";
|
||||
}
|
||||
SECTION("user length 3") {
|
||||
user = "123";
|
||||
}
|
||||
SECTION("user length 4") {
|
||||
user = "1234";
|
||||
}
|
||||
SECTION("user length 5") {
|
||||
user = "12345";
|
||||
}
|
||||
SECTION("user length 6") {
|
||||
user = "123456";
|
||||
}
|
||||
SECTION("user length 7") {
|
||||
user = "1234567";
|
||||
}
|
||||
SECTION("user length 8") {
|
||||
user = "12345678";
|
||||
}
|
||||
SECTION("user length 9") {
|
||||
user = "123456789";
|
||||
}
|
||||
SECTION("user length 10") {
|
||||
user = "1234567890";
|
||||
}
|
||||
SECTION("user length 11") {
|
||||
user = "12345678901";
|
||||
}
|
||||
SECTION("user length 12") {
|
||||
user = "123456789012";
|
||||
}
|
||||
SECTION("user length 13") {
|
||||
user = "1234567890123";
|
||||
}
|
||||
SECTION("user length 14") {
|
||||
user = "12345678901234";
|
||||
}
|
||||
SECTION("user length 15") {
|
||||
user = "123456789012345";
|
||||
}
|
||||
SECTION("user length 16") {
|
||||
user = "1234567890123456";
|
||||
}
|
||||
SECTION("user length 17") {
|
||||
user = "12345678901234567";
|
||||
}
|
||||
SECTION("user length 18") {
|
||||
user = "123456789012345678";
|
||||
}
|
||||
|
||||
{
|
||||
osmium::builder::WayBuilder builder{buffer};
|
||||
|
||||
builder.set_id(17)
|
||||
.set_visible(true)
|
||||
.set_version(1)
|
||||
.set_changeset(123)
|
||||
.set_uid(555)
|
||||
.set_timestamp("2015-07-01T00:00:01Z")
|
||||
.set_user(user);
|
||||
|
||||
builder.add_tags({{"highway", "primary"}, {"oneway", "yes"}});
|
||||
}
|
||||
|
||||
const auto& way = buffer.get<osmium::Way>(buffer.commit());
|
||||
|
||||
REQUIRE(way.id() == 17);
|
||||
REQUIRE(way.version() == 1);
|
||||
REQUIRE(way.changeset() == 123);
|
||||
REQUIRE(way.uid() == 555);
|
||||
REQUIRE(way.timestamp() == osmium::Timestamp{"2015-07-01T00:00:01Z"});
|
||||
|
||||
REQUIRE(user == way.user());
|
||||
|
||||
REQUIRE(way.tags().size() == 2);
|
||||
}
|
||||
|
||||
SECTION("complete relation with tags") {
|
||||
SECTION("user length 0") {
|
||||
user = "";
|
||||
}
|
||||
SECTION("user length 1") {
|
||||
user = "1";
|
||||
}
|
||||
SECTION("user length 2") {
|
||||
user = "12";
|
||||
}
|
||||
SECTION("user length 3") {
|
||||
user = "123";
|
||||
}
|
||||
SECTION("user length 4") {
|
||||
user = "1234";
|
||||
}
|
||||
SECTION("user length 5") {
|
||||
user = "12345";
|
||||
}
|
||||
SECTION("user length 6") {
|
||||
user = "123456";
|
||||
}
|
||||
SECTION("user length 7") {
|
||||
user = "1234567";
|
||||
}
|
||||
SECTION("user length 8") {
|
||||
user = "12345678";
|
||||
}
|
||||
SECTION("user length 9") {
|
||||
user = "123456789";
|
||||
}
|
||||
SECTION("user length 10") {
|
||||
user = "1234567890";
|
||||
}
|
||||
SECTION("user length 11") {
|
||||
user = "12345678901";
|
||||
}
|
||||
SECTION("user length 12") {
|
||||
user = "123456789012";
|
||||
}
|
||||
SECTION("user length 13") {
|
||||
user = "1234567890123";
|
||||
}
|
||||
SECTION("user length 14") {
|
||||
user = "12345678901234";
|
||||
}
|
||||
SECTION("user length 15") {
|
||||
user = "123456789012345";
|
||||
}
|
||||
SECTION("user length 16") {
|
||||
user = "1234567890123456";
|
||||
}
|
||||
SECTION("user length 17") {
|
||||
user = "12345678901234567";
|
||||
}
|
||||
SECTION("user length 18") {
|
||||
user = "123456789012345678";
|
||||
}
|
||||
|
||||
{
|
||||
osmium::builder::RelationBuilder builder{buffer};
|
||||
|
||||
builder.set_id(17)
|
||||
.set_visible(true)
|
||||
.set_version(1)
|
||||
.set_changeset(123)
|
||||
.set_uid(555)
|
||||
.set_timestamp("2015-07-01T00:00:01Z")
|
||||
.set_user(user);
|
||||
|
||||
builder.add_tags({{"highway", "primary"}, {"oneway", "yes"}});
|
||||
}
|
||||
|
||||
const auto& relation = buffer.get<osmium::Relation>(buffer.commit());
|
||||
|
||||
REQUIRE(relation.id() == 17);
|
||||
REQUIRE(relation.version() == 1);
|
||||
REQUIRE(relation.changeset() == 123);
|
||||
REQUIRE(relation.uid() == 555);
|
||||
REQUIRE(relation.timestamp() == osmium::Timestamp{"2015-07-01T00:00:01Z"});
|
||||
|
||||
REQUIRE(user == relation.user());
|
||||
|
||||
REQUIRE(relation.tags().size() == 2);
|
||||
}
|
||||
|
||||
SECTION("complete changeset with tags") {
|
||||
const osmium::Location bl{-1.2, -3.4};
|
||||
const osmium::Location tr{1.2, 3.4};
|
||||
|
||||
SECTION("user length 0") {
|
||||
user = "";
|
||||
}
|
||||
SECTION("user length 1") {
|
||||
user = "1";
|
||||
}
|
||||
SECTION("user length 2") {
|
||||
user = "12";
|
||||
}
|
||||
SECTION("user length 3") {
|
||||
user = "123";
|
||||
}
|
||||
SECTION("user length 4") {
|
||||
user = "1234";
|
||||
}
|
||||
SECTION("user length 5") {
|
||||
user = "12345";
|
||||
}
|
||||
SECTION("user length 6") {
|
||||
user = "123456";
|
||||
}
|
||||
SECTION("user length 7") {
|
||||
user = "1234567";
|
||||
}
|
||||
SECTION("user length 8") {
|
||||
user = "12345678";
|
||||
}
|
||||
SECTION("user length 9") {
|
||||
user = "123456789";
|
||||
}
|
||||
SECTION("user length 10") {
|
||||
user = "1234567890";
|
||||
}
|
||||
SECTION("user length 11") {
|
||||
user = "12345678901";
|
||||
}
|
||||
SECTION("user length 12") {
|
||||
user = "123456789012";
|
||||
}
|
||||
SECTION("user length 13") {
|
||||
user = "1234567890123";
|
||||
}
|
||||
SECTION("user length 14") {
|
||||
user = "12345678901234";
|
||||
}
|
||||
SECTION("user length 15") {
|
||||
user = "123456789012345";
|
||||
}
|
||||
SECTION("user length 16") {
|
||||
user = "1234567890123456";
|
||||
}
|
||||
SECTION("user length 17") {
|
||||
user = "12345678901234567";
|
||||
}
|
||||
SECTION("user length 18") {
|
||||
user = "123456789012345678";
|
||||
}
|
||||
|
||||
{
|
||||
osmium::builder::ChangesetBuilder builder{buffer};
|
||||
|
||||
builder.set_id(17)
|
||||
.set_uid(222)
|
||||
.set_created_at(osmium::Timestamp{"2016-07-03T01:23:45Z"})
|
||||
.set_closed_at(osmium::Timestamp{"2016-07-03T01:23:48Z"})
|
||||
.set_num_changes(3)
|
||||
.set_num_comments(2)
|
||||
.set_bounds(osmium::Box{bl, tr})
|
||||
.set_user(user);
|
||||
}
|
||||
|
||||
const auto& changeset = buffer.get<osmium::Changeset>(buffer.commit());
|
||||
|
||||
REQUIRE(changeset.id() == 17);
|
||||
REQUIRE(changeset.uid() == 222);
|
||||
REQUIRE(changeset.created_at() == osmium::Timestamp{"2016-07-03T01:23:45Z"});
|
||||
REQUIRE(changeset.closed_at() == osmium::Timestamp{"2016-07-03T01:23:48Z"});
|
||||
REQUIRE(changeset.num_changes() == 3);
|
||||
REQUIRE(changeset.num_comments() == 2);
|
||||
|
||||
const auto& box = changeset.bounds();
|
||||
REQUIRE(box.bottom_left() == bl);
|
||||
REQUIRE(box.top_right() == tr);
|
||||
|
||||
REQUIRE(user == changeset.user());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TEST_CASE("no call to set_user on node") {
|
||||
osmium::memory::Buffer buffer{1024 * 10};
|
||||
|
||||
{
|
||||
osmium::builder::NodeBuilder builder{buffer};
|
||||
}
|
||||
|
||||
const auto& node = buffer.get<osmium::Node>(buffer.commit());
|
||||
|
||||
REQUIRE(*node.user() == '\0');
|
||||
}
|
||||
|
||||
TEST_CASE("set_user with length on node") {
|
||||
osmium::memory::Buffer buffer{1024 * 10};
|
||||
std::string user = "userx";
|
||||
|
||||
{
|
||||
osmium::builder::NodeBuilder builder{buffer};
|
||||
builder.set_user(user.c_str(), 4);
|
||||
}
|
||||
|
||||
const auto& node = buffer.get<osmium::Node>(buffer.commit());
|
||||
|
||||
REQUIRE(std::string{"user"} == node.user());
|
||||
}
|
||||
|
||||
TEST_CASE("no call to set_user on way") {
|
||||
osmium::memory::Buffer buffer{1024 * 10};
|
||||
|
||||
{
|
||||
osmium::builder::WayBuilder builder{buffer};
|
||||
}
|
||||
|
||||
const auto& way = buffer.get<osmium::Way>(buffer.commit());
|
||||
|
||||
REQUIRE(*way.user() == '\0');
|
||||
}
|
||||
|
||||
TEST_CASE("set_user with length on way") {
|
||||
osmium::memory::Buffer buffer{1024 * 10};
|
||||
std::string user = "userx";
|
||||
|
||||
{
|
||||
osmium::builder::WayBuilder builder{buffer};
|
||||
builder.set_user(user.c_str(), 4);
|
||||
}
|
||||
|
||||
const auto& way = buffer.get<osmium::Way>(buffer.commit());
|
||||
|
||||
REQUIRE(std::string{"user"} == way.user());
|
||||
}
|
||||
|
||||
TEST_CASE("no call to set_user on changeset") {
|
||||
osmium::memory::Buffer buffer{1024 * 10};
|
||||
|
||||
{
|
||||
osmium::builder::ChangesetBuilder builder{buffer};
|
||||
}
|
||||
|
||||
const auto& changeset = buffer.get<osmium::Changeset>(buffer.commit());
|
||||
|
||||
REQUIRE(*changeset.user() == '\0');
|
||||
}
|
||||
|
||||
TEST_CASE("set_user with length on changeset") {
|
||||
osmium::memory::Buffer buffer{1024 * 10};
|
||||
std::string user = "userx";
|
||||
|
||||
{
|
||||
osmium::builder::ChangesetBuilder builder{buffer};
|
||||
builder.set_user(user.c_str(), 4);
|
||||
}
|
||||
|
||||
const auto& changeset = buffer.get<osmium::Changeset>(buffer.commit());
|
||||
|
||||
REQUIRE(std::string{"user"} == changeset.user());
|
||||
}
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
|
||||
#include <osmium/builder/attr.hpp>
|
||||
#include <osmium/memory/buffer.hpp>
|
||||
#include <osmium/osm/area.hpp>
|
||||
|
||||
using namespace osmium::builder::attr;
|
||||
|
||||
inline const osmium::Area& create_test_area_1outer_0inner(osmium::memory::Buffer& buffer) {
|
||||
osmium::builder::add_area(buffer,
|
||||
_user("foo"),
|
||||
_tag("building", "true"),
|
||||
_outer_ring({
|
||||
{1, {3.2, 4.2}},
|
||||
{2, {3.5, 4.7}},
|
||||
{3, {3.6, 4.9}},
|
||||
{1, {3.2, 4.2}}
|
||||
})
|
||||
);
|
||||
|
||||
return buffer.get<osmium::Area>(0);
|
||||
}
|
||||
|
||||
inline const osmium::Area& create_test_area_1outer_1inner(osmium::memory::Buffer& buffer) {
|
||||
osmium::builder::add_area(buffer,
|
||||
_user("foo"),
|
||||
_tag("building", "true"),
|
||||
_outer_ring({
|
||||
{1, {0.1, 0.1}},
|
||||
{2, {9.1, 0.1}},
|
||||
{3, {9.1, 9.1}},
|
||||
{4, {0.1, 9.1}},
|
||||
{1, {0.1, 0.1}}
|
||||
}),
|
||||
_inner_ring({
|
||||
{5, {1.0, 1.0}},
|
||||
{6, {8.0, 1.0}},
|
||||
{7, {8.0, 8.0}},
|
||||
{8, {1.0, 8.0}},
|
||||
{5, {1.0, 1.0}}
|
||||
})
|
||||
);
|
||||
|
||||
return buffer.get<osmium::Area>(0);
|
||||
}
|
||||
|
||||
inline const osmium::Area& create_test_area_2outer_2inner(osmium::memory::Buffer& buffer) {
|
||||
osmium::builder::add_area(buffer,
|
||||
_user("foo"),
|
||||
_tag("building", "true"),
|
||||
_outer_ring({
|
||||
{1, {0.1, 0.1}},
|
||||
{2, {9.1, 0.1}},
|
||||
{3, {9.1, 9.1}},
|
||||
{4, {0.1, 9.1}},
|
||||
{1, {0.1, 0.1}}
|
||||
}),
|
||||
_inner_ring({
|
||||
{5, {1.0, 1.0}},
|
||||
{6, {4.0, 1.0}},
|
||||
{7, {4.0, 4.0}},
|
||||
{8, {1.0, 4.0}},
|
||||
{5, {1.0, 1.0}}
|
||||
}),
|
||||
_inner_ring({
|
||||
{10, {5.0, 5.0}},
|
||||
{11, {5.0, 7.0}},
|
||||
{12, {7.0, 7.0}},
|
||||
{10, {5.0, 5.0}}
|
||||
}),
|
||||
_outer_ring({
|
||||
{100, {10.0, 10.0}},
|
||||
{101, {11.0, 10.0}},
|
||||
{102, {11.0, 11.0}},
|
||||
{103, {10.0, 11.0}},
|
||||
{100, {10.0, 10.0}}
|
||||
})
|
||||
);
|
||||
|
||||
return buffer.get<osmium::Area>(0);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/geom/coordinates.hpp>
|
||||
|
||||
TEST_CASE("Default constructed coordinates are invalid") {
|
||||
const osmium::geom::Coordinates c;
|
||||
REQUIRE_FALSE(c.valid());
|
||||
}
|
||||
|
||||
TEST_CASE("Coordinates constructed from doubles are valid") {
|
||||
const osmium::geom::Coordinates c{1.2, 3.4};
|
||||
REQUIRE(c.valid());
|
||||
REQUIRE(c.x == Approx(1.2));
|
||||
REQUIRE(c.y == Approx(3.4));
|
||||
}
|
||||
|
||||
TEST_CASE("Coordinates constructed from a location are valid") {
|
||||
const osmium::Location loc{1.2, 3.4};
|
||||
const osmium::geom::Coordinates c{loc};
|
||||
REQUIRE(c.valid());
|
||||
REQUIRE(c.x == Approx(1.2));
|
||||
REQUIRE(c.y == Approx(3.4));
|
||||
}
|
||||
|
||||
TEST_CASE("Comparing coordinates") {
|
||||
const osmium::geom::Coordinates ci1;
|
||||
const osmium::geom::Coordinates ci2;
|
||||
const osmium::geom::Coordinates cv1{1.2, 3.4};
|
||||
const osmium::geom::Coordinates cv2{1.2, 3.4};
|
||||
const osmium::geom::Coordinates cv3{2.1, 4.3};
|
||||
REQUIRE(ci1 == ci2);
|
||||
REQUIRE_FALSE(ci1 == cv1);
|
||||
REQUIRE(cv1 == cv2);
|
||||
REQUIRE_FALSE(cv1 == cv3);
|
||||
}
|
||||
|
||||
TEST_CASE("Write coordinates to string") {
|
||||
const osmium::geom::Coordinates c{0.1234567, 1.89898989};
|
||||
std::string out;
|
||||
|
||||
SECTION("precision 7") {
|
||||
c.append_to_string(out, ',', 7);
|
||||
REQUIRE(out == "0.1234567,1.8989899");
|
||||
}
|
||||
|
||||
SECTION("precision 3") {
|
||||
c.append_to_string(out, ',', 3);
|
||||
REQUIRE(out == "0.123,1.899");
|
||||
}
|
||||
|
||||
SECTION("with prefix and suffix") {
|
||||
c.append_to_string(out, '(', ',', ')', 3);
|
||||
REQUIRE(out == "(0.123,1.899)");
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("Write invalid coordinates to string") {
|
||||
const osmium::geom::Coordinates c;
|
||||
std::string out;
|
||||
|
||||
SECTION("with infix only") {
|
||||
c.append_to_string(out, ',', 7);
|
||||
REQUIRE(out == "invalid");
|
||||
}
|
||||
|
||||
SECTION("with prefix and suffix") {
|
||||
c.append_to_string(out, '(', ',', ')', 3);
|
||||
REQUIRE(out == "(invalid)");
|
||||
}
|
||||
}
|
||||
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/geom/projection.hpp>
|
||||
|
||||
TEST_CASE("CRS") {
|
||||
const osmium::geom::CRS wgs84{4326};
|
||||
const osmium::geom::CRS mercator{3857};
|
||||
|
||||
const osmium::geom::Coordinates c{osmium::geom::deg_to_rad(1.2), osmium::geom::deg_to_rad(3.4)};
|
||||
const auto ct = osmium::geom::transform(wgs84, mercator, c);
|
||||
const auto c2 = osmium::geom::transform(mercator, wgs84, ct);
|
||||
|
||||
REQUIRE(c.x == Approx(c2.x));
|
||||
REQUIRE(c.y == Approx(c2.y));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <osmium/geom/factory.hpp>
|
||||
|
||||
TEST_CASE("Geometry exception") {
|
||||
|
||||
osmium::geometry_error e{"some error message", "node", 17};
|
||||
REQUIRE(e.id() == 17);
|
||||
REQUIRE(std::string{e.what()} == "some error message (node_id=17)");
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/geom/mercator_projection.hpp>
|
||||
#include <osmium/geom/projection.hpp>
|
||||
#include <osmium/geom/wkb.hpp>
|
||||
#include <osmium/geom/wkt.hpp>
|
||||
|
||||
TEST_CASE("Projection using MercatorProjection class to WKT") {
|
||||
osmium::geom::WKTFactory<osmium::geom::MercatorProjection> factory{2};
|
||||
|
||||
const std::string wkt{factory.create_point(osmium::Location{3.2, 4.2})};
|
||||
REQUIRE(wkt == "POINT(356222.37 467961.14)");
|
||||
}
|
||||
|
||||
TEST_CASE("Projection using Projection class to WKT") {
|
||||
osmium::geom::WKTFactory<osmium::geom::Projection> factory{osmium::geom::Projection{3857}, 2};
|
||||
|
||||
const std::string wkt{factory.create_point(osmium::Location{3.2, 4.2})};
|
||||
REQUIRE(wkt == "POINT(356222.37 467961.14)");
|
||||
}
|
||||
|
||||
+147
@@ -0,0 +1,147 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/geom/geojson.hpp>
|
||||
|
||||
#include "area_helper.hpp"
|
||||
#include "wnl_helper.hpp"
|
||||
|
||||
TEST_CASE("GeoJSON point geometry") {
|
||||
osmium::geom::GeoJSONFactory<> factory;
|
||||
|
||||
SECTION("point") {
|
||||
const std::string json{factory.create_point(osmium::Location{3.2, 4.2})};
|
||||
REQUIRE(std::string{"{\"type\":\"Point\",\"coordinates\":[3.2,4.2]}"} == json);
|
||||
}
|
||||
|
||||
SECTION("empty_point") {
|
||||
REQUIRE_THROWS_AS(factory.create_point(osmium::Location{}), const osmium::invalid_location&);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TEST_CASE("GeoJSON linestring geometry") {
|
||||
osmium::geom::GeoJSONFactory<> factory;
|
||||
osmium::memory::Buffer buffer{1000};
|
||||
|
||||
SECTION("linestring, default") {
|
||||
const auto& wnl = create_test_wnl_okay(buffer);
|
||||
const std::string json{factory.create_linestring(wnl)};
|
||||
REQUIRE(std::string{"{\"type\":\"LineString\",\"coordinates\":[[3.2,4.2],[3.5,4.7],[3.6,4.9]]}"} == json);
|
||||
}
|
||||
|
||||
SECTION("linestring, unique, backwards") {
|
||||
const auto& wnl = create_test_wnl_okay(buffer);
|
||||
const std::string json{factory.create_linestring(wnl, osmium::geom::use_nodes::unique, osmium::geom::direction::backward)};
|
||||
REQUIRE(std::string{"{\"type\":\"LineString\",\"coordinates\":[[3.6,4.9],[3.5,4.7],[3.2,4.2]]}"} == json);
|
||||
}
|
||||
|
||||
SECTION("linestring, all") {
|
||||
const auto& wnl = create_test_wnl_okay(buffer);
|
||||
const std::string json{factory.create_linestring(wnl, osmium::geom::use_nodes::all)};
|
||||
REQUIRE(std::string{"{\"type\":\"LineString\",\"coordinates\":[[3.2,4.2],[3.5,4.7],[3.5,4.7],[3.6,4.9]]}"} == json);
|
||||
}
|
||||
|
||||
SECTION("linestring, all, backwards") {
|
||||
const auto& wnl = create_test_wnl_okay(buffer);
|
||||
const std::string json{factory.create_linestring(wnl, osmium::geom::use_nodes::all, osmium::geom::direction::backward)};
|
||||
REQUIRE(std::string{"{\"type\":\"LineString\",\"coordinates\":[[3.6,4.9],[3.5,4.7],[3.5,4.7],[3.2,4.2]]}"} == json);
|
||||
}
|
||||
|
||||
SECTION("empty_linestring") {
|
||||
const auto& wnl = create_test_wnl_empty(buffer);
|
||||
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl), const osmium::geometry_error&);
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl, osmium::geom::use_nodes::unique, osmium::geom::direction::backward), const osmium::geometry_error&);
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl, osmium::geom::use_nodes::all), const osmium::geometry_error&);
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl, osmium::geom::use_nodes::all, osmium::geom::direction::backward), const osmium::geometry_error&);
|
||||
}
|
||||
|
||||
SECTION("linestring with two same locations") {
|
||||
const auto& wnl = create_test_wnl_same_location(buffer);
|
||||
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl), const osmium::geometry_error&);
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl, osmium::geom::use_nodes::unique, osmium::geom::direction::backward), const osmium::geometry_error&);
|
||||
|
||||
{
|
||||
const std::string json{factory.create_linestring(wnl, osmium::geom::use_nodes::all)};
|
||||
REQUIRE(std::string{"{\"type\":\"LineString\",\"coordinates\":[[3.5,4.7],[3.5,4.7]]}"} == json);
|
||||
}
|
||||
|
||||
{
|
||||
const std::string json{factory.create_linestring(wnl, osmium::geom::use_nodes::all, osmium::geom::direction::backward)};
|
||||
REQUIRE(std::string{"{\"type\":\"LineString\",\"coordinates\":[[3.5,4.7],[3.5,4.7]]}"} == json);
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("linestring with undefined location") {
|
||||
const auto& wnl = create_test_wnl_undefined_location(buffer);
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl), const osmium::invalid_location&);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TEST_CASE("GeoJSON area geometry") {
|
||||
osmium::geom::GeoJSONFactory<> factory;
|
||||
osmium::memory::Buffer buffer{1000};
|
||||
|
||||
SECTION("area_1outer_0inner") {
|
||||
const osmium::Area& area = create_test_area_1outer_0inner(buffer);
|
||||
|
||||
REQUIRE_FALSE(area.is_multipolygon());
|
||||
REQUIRE(std::distance(area.cbegin(), area.cend()) == 2);
|
||||
REQUIRE(area.subitems<osmium::OuterRing>().size() == area.num_rings().first);
|
||||
|
||||
std::string json{factory.create_multipolygon(area)};
|
||||
REQUIRE(std::string{"{\"type\":\"MultiPolygon\",\"coordinates\":[[[[3.2,4.2],[3.5,4.7],[3.6,4.9],[3.2,4.2]]]]}"} == json);
|
||||
}
|
||||
|
||||
SECTION("area_1outer_1inner") {
|
||||
const osmium::Area& area = create_test_area_1outer_1inner(buffer);
|
||||
|
||||
REQUIRE_FALSE(area.is_multipolygon());
|
||||
REQUIRE(std::distance(area.cbegin(), area.cend()) == 3);
|
||||
REQUIRE(area.subitems<osmium::OuterRing>().size() == area.num_rings().first);
|
||||
REQUIRE(area.subitems<osmium::InnerRing>().size() == area.num_rings().second);
|
||||
|
||||
std::string json{factory.create_multipolygon(area)};
|
||||
REQUIRE(std::string{"{\"type\":\"MultiPolygon\",\"coordinates\":[[[[0.1,0.1],[9.1,0.1],[9.1,9.1],[0.1,9.1],[0.1,0.1]],[[1,1],[8,1],[8,8],[1,8],[1,1]]]]}"} == json);
|
||||
}
|
||||
|
||||
SECTION("area_2outer_2inner") {
|
||||
const osmium::Area& area = create_test_area_2outer_2inner(buffer);
|
||||
|
||||
REQUIRE(area.is_multipolygon());
|
||||
REQUIRE(std::distance(area.cbegin(), area.cend()) == 5);
|
||||
REQUIRE(area.subitems<osmium::OuterRing>().size() == area.num_rings().first);
|
||||
REQUIRE(area.subitems<osmium::InnerRing>().size() == area.num_rings().second);
|
||||
|
||||
int outer_ring=0;
|
||||
int inner_ring=0;
|
||||
for (const auto& outer : area.outer_rings()) {
|
||||
if (outer_ring == 0) {
|
||||
REQUIRE(outer.front().ref() == 1);
|
||||
} else if (outer_ring == 1) {
|
||||
REQUIRE(outer.front().ref() == 100);
|
||||
} else {
|
||||
REQUIRE(false);
|
||||
}
|
||||
for (const auto& inner : area.inner_rings(outer)) {
|
||||
if (outer_ring == 0 && inner_ring == 0) {
|
||||
REQUIRE(inner.front().ref() == 5);
|
||||
} else if (outer_ring == 0 && inner_ring == 1) {
|
||||
REQUIRE(inner.front().ref() == 10);
|
||||
} else {
|
||||
REQUIRE(false);
|
||||
}
|
||||
++inner_ring;
|
||||
}
|
||||
inner_ring = 0;
|
||||
++outer_ring;
|
||||
}
|
||||
|
||||
std::string json{factory.create_multipolygon(area)};
|
||||
REQUIRE(std::string{"{\"type\":\"MultiPolygon\",\"coordinates\":[[[[0.1,0.1],[9.1,0.1],[9.1,9.1],[0.1,9.1],[0.1,0.1]],[[1,1],[4,1],[4,4],[1,4],[1,1]],[[5,5],[5,7],[7,7],[5,5]]],[[[10,10],[11,10],[11,11],[10,11],[10,10]]]]}"} == json);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+152
@@ -0,0 +1,152 @@
|
||||
|
||||
#include <osmium/geom/geos.hpp>
|
||||
|
||||
#ifdef OSMIUM_WITH_GEOS
|
||||
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/geom/mercator_projection.hpp>
|
||||
|
||||
#include "area_helper.hpp"
|
||||
#include "wnl_helper.hpp"
|
||||
|
||||
TEST_CASE("GEOS geometry factory - create point") {
|
||||
osmium::geom::GEOSFactory<> factory;
|
||||
|
||||
const std::unique_ptr<geos::geom::Point> point{factory.create_point(osmium::Location{3.2, 4.2})};
|
||||
REQUIRE(3.2 == point->getX());
|
||||
REQUIRE(4.2 == point->getY());
|
||||
REQUIRE(4326 == point->getSRID());
|
||||
}
|
||||
|
||||
TEST_CASE("GEOS geometry factory - create point in web mercator") {
|
||||
osmium::geom::GEOSFactory<osmium::geom::MercatorProjection> factory;
|
||||
|
||||
const std::unique_ptr<geos::geom::Point> point{factory.create_point(osmium::Location{3.2, 4.2})};
|
||||
REQUIRE(Approx(356222.3705384755l) == point->getX());
|
||||
REQUIRE(Approx(467961.143605213l) == point->getY());
|
||||
REQUIRE(3857 == point->getSRID());
|
||||
}
|
||||
|
||||
TEST_CASE("GEOS geometry factory - create point with externally created GEOS factory") {
|
||||
geos::geom::GeometryFactory geos_factory;
|
||||
osmium::geom::GEOSFactory<> factory{geos_factory};
|
||||
|
||||
const std::unique_ptr<geos::geom::Point> point{factory.create_point(osmium::Location{3.2, 4.2})};
|
||||
REQUIRE(3.2 == point->getX());
|
||||
REQUIRE(4.2 == point->getY());
|
||||
REQUIRE(0 == point->getSRID());
|
||||
}
|
||||
|
||||
TEST_CASE("GEOS geometry factory - can not create from invalid location") {
|
||||
osmium::geom::GEOSFactory<> factory;
|
||||
|
||||
REQUIRE_THROWS_AS(factory.create_point(osmium::Location{}), const osmium::invalid_location&);
|
||||
}
|
||||
|
||||
TEST_CASE("GEOS geometry factory - create linestring") {
|
||||
osmium::geom::GEOSFactory<> factory;
|
||||
|
||||
osmium::memory::Buffer buffer{10000};
|
||||
const auto& wnl = create_test_wnl_okay(buffer);
|
||||
|
||||
SECTION("from way node list") {
|
||||
const std::unique_ptr<geos::geom::LineString> linestring{factory.create_linestring(wnl)};
|
||||
REQUIRE(3 == linestring->getNumPoints());
|
||||
|
||||
const auto p0 = std::unique_ptr<geos::geom::Point>(linestring->getPointN(0));
|
||||
REQUIRE(3.2 == p0->getX());
|
||||
const auto p2 = std::unique_ptr<geos::geom::Point>(linestring->getPointN(2));
|
||||
REQUIRE(3.6 == p2->getX());
|
||||
}
|
||||
|
||||
SECTION("without duplicates and backwards") {
|
||||
const std::unique_ptr<geos::geom::LineString> linestring{factory.create_linestring(wnl, osmium::geom::use_nodes::unique, osmium::geom::direction::backward)};
|
||||
REQUIRE(3 == linestring->getNumPoints());
|
||||
const auto p0 = std::unique_ptr<geos::geom::Point>(linestring->getPointN(0));
|
||||
REQUIRE(3.6 == p0->getX());
|
||||
const auto p2 = std::unique_ptr<geos::geom::Point>(linestring->getPointN(2));
|
||||
REQUIRE(3.2 == p2->getX());
|
||||
}
|
||||
|
||||
SECTION("with duplicates") {
|
||||
const std::unique_ptr<geos::geom::LineString> linestring{factory.create_linestring(wnl, osmium::geom::use_nodes::all)};
|
||||
REQUIRE(4 == linestring->getNumPoints());
|
||||
const auto p0 = std::unique_ptr<geos::geom::Point>(linestring->getPointN(0));
|
||||
REQUIRE(3.2 == p0->getX());
|
||||
}
|
||||
|
||||
SECTION("with duplicates and backwards") {
|
||||
const std::unique_ptr<geos::geom::LineString> linestring{factory.create_linestring(wnl, osmium::geom::use_nodes::all, osmium::geom::direction::backward)};
|
||||
REQUIRE(4 == linestring->getNumPoints());
|
||||
const auto p0 = std::unique_ptr<geos::geom::Point>(linestring->getPointN(0));
|
||||
REQUIRE(3.6 == p0->getX());
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("GEOS geometry factory - create area with one outer and no inner rings") {
|
||||
osmium::geom::GEOSFactory<> factory;
|
||||
|
||||
osmium::memory::Buffer buffer{10000};
|
||||
const osmium::Area& area = create_test_area_1outer_0inner(buffer);
|
||||
|
||||
const std::unique_ptr<geos::geom::MultiPolygon> mp{factory.create_multipolygon(area)};
|
||||
REQUIRE(1 == mp->getNumGeometries());
|
||||
|
||||
const geos::geom::Polygon* p0 = dynamic_cast<const geos::geom::Polygon*>(mp->getGeometryN(0));
|
||||
REQUIRE(p0);
|
||||
REQUIRE(0 == p0->getNumInteriorRing());
|
||||
|
||||
const geos::geom::LineString* l0e = p0->getExteriorRing();
|
||||
REQUIRE(4 == l0e->getNumPoints());
|
||||
|
||||
const auto l0e_p0 = std::unique_ptr<geos::geom::Point>(l0e->getPointN(1));
|
||||
REQUIRE(3.5 == l0e_p0->getX());
|
||||
}
|
||||
|
||||
TEST_CASE("GEOS geometry factory - create area with one outer and one inner ring") {
|
||||
osmium::geom::GEOSFactory<> factory;
|
||||
|
||||
osmium::memory::Buffer buffer{10000};
|
||||
const osmium::Area& area = create_test_area_1outer_1inner(buffer);
|
||||
|
||||
const std::unique_ptr<geos::geom::MultiPolygon> mp{factory.create_multipolygon(area)};
|
||||
REQUIRE(1 == mp->getNumGeometries());
|
||||
|
||||
const geos::geom::Polygon* p0 = dynamic_cast<const geos::geom::Polygon*>(mp->getGeometryN(0));
|
||||
REQUIRE(p0);
|
||||
REQUIRE(1 == p0->getNumInteriorRing());
|
||||
|
||||
const geos::geom::LineString* l0e = p0->getExteriorRing();
|
||||
REQUIRE(5 == l0e->getNumPoints());
|
||||
|
||||
const geos::geom::LineString* l0i0 = p0->getInteriorRingN(0);
|
||||
REQUIRE(5 == l0i0->getNumPoints());
|
||||
}
|
||||
|
||||
TEST_CASE("GEOS geometry factory - create area with two outer and two inner rings") {
|
||||
osmium::geom::GEOSFactory<> factory;
|
||||
|
||||
osmium::memory::Buffer buffer{10000};
|
||||
const osmium::Area& area = create_test_area_2outer_2inner(buffer);
|
||||
|
||||
const std::unique_ptr<geos::geom::MultiPolygon> mp{factory.create_multipolygon(area)};
|
||||
REQUIRE(2 == mp->getNumGeometries());
|
||||
|
||||
const geos::geom::Polygon* p0 = dynamic_cast<const geos::geom::Polygon*>(mp->getGeometryN(0));
|
||||
REQUIRE(p0);
|
||||
REQUIRE(2 == p0->getNumInteriorRing());
|
||||
|
||||
const geos::geom::LineString* l0e = p0->getExteriorRing();
|
||||
REQUIRE(5 == l0e->getNumPoints());
|
||||
|
||||
const geos::geom::Polygon* p1 = dynamic_cast<const geos::geom::Polygon*>(mp->getGeometryN(1));
|
||||
REQUIRE(p1);
|
||||
REQUIRE(0 == p1->getNumInteriorRing());
|
||||
|
||||
const geos::geom::LineString* l1e = p1->getExteriorRing();
|
||||
REQUIRE(5 == l1e->getNumPoints());
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/geom/mercator_projection.hpp>
|
||||
|
||||
TEST_CASE("Mercator projection") {
|
||||
const osmium::geom::MercatorProjection projection;
|
||||
REQUIRE(3857 == projection.epsg());
|
||||
REQUIRE("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs" == projection.proj_string());
|
||||
}
|
||||
|
||||
TEST_CASE("Low level mercator functions") {
|
||||
const osmium::geom::Coordinates c1{17.839, -3.249};
|
||||
const osmium::geom::Coordinates r1 = osmium::geom::mercator_to_lonlat(osmium::geom::lonlat_to_mercator(c1));
|
||||
REQUIRE(r1.x == Approx(c1.x).epsilon(0.000001));
|
||||
REQUIRE(r1.y == Approx(c1.y).epsilon(0.000001));
|
||||
|
||||
const osmium::geom::Coordinates c2{-89.2, 15.915};
|
||||
const osmium::geom::Coordinates r2 = osmium::geom::mercator_to_lonlat(osmium::geom::lonlat_to_mercator(c2));
|
||||
REQUIRE(r2.x == Approx(c2.x).epsilon(0.000001));
|
||||
REQUIRE(r2.y == Approx(c2.y).epsilon(0.000001));
|
||||
|
||||
const osmium::geom::Coordinates c3{180.0, 85.0};
|
||||
const osmium::geom::Coordinates r3 = osmium::geom::mercator_to_lonlat(osmium::geom::lonlat_to_mercator(c3));
|
||||
REQUIRE(r3.x == Approx(c3.x).epsilon(0.000001));
|
||||
REQUIRE(r3.y == Approx(c3.y).epsilon(0.000001));
|
||||
}
|
||||
|
||||
TEST_CASE("Mercator bounds") {
|
||||
const osmium::Location mmax{180.0, osmium::geom::MERCATOR_MAX_LAT};
|
||||
const osmium::geom::Coordinates c = osmium::geom::lonlat_to_mercator(mmax);
|
||||
REQUIRE(c.x == Approx(c.y).epsilon(0.001));
|
||||
REQUIRE(osmium::geom::detail::y_to_lat(osmium::geom::detail::lon_to_x(180.0)) == Approx(osmium::geom::MERCATOR_MAX_LAT).epsilon(0.0000001));
|
||||
}
|
||||
|
||||
+119
@@ -0,0 +1,119 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/geom/ogr.hpp>
|
||||
|
||||
#include "area_helper.hpp"
|
||||
#include "wnl_helper.hpp"
|
||||
|
||||
TEST_CASE("OGR point geometry") {
|
||||
osmium::geom::OGRFactory<> factory;
|
||||
|
||||
SECTION("point") {
|
||||
std::unique_ptr<OGRPoint> point{factory.create_point(osmium::Location{3.2, 4.2})};
|
||||
REQUIRE(3.2 == point->getX());
|
||||
REQUIRE(4.2 == point->getY());
|
||||
}
|
||||
|
||||
SECTION("empty_point") {
|
||||
REQUIRE_THROWS_AS(factory.create_point(osmium::Location()), const osmium::invalid_location&);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TEST_CASE("OGR linestring geometry") {
|
||||
osmium::geom::OGRFactory<> factory;
|
||||
osmium::memory::Buffer buffer{10000};
|
||||
const auto& wnl = create_test_wnl_okay(buffer);
|
||||
|
||||
SECTION("linestring, default") {
|
||||
std::unique_ptr<OGRLineString> linestring{factory.create_linestring(wnl)};
|
||||
REQUIRE(3 == linestring->getNumPoints());
|
||||
|
||||
REQUIRE(3.2 == linestring->getX(0));
|
||||
REQUIRE(3.6 == linestring->getX(2));
|
||||
}
|
||||
|
||||
SECTION("linestring, unique nodes, backwards") {
|
||||
std::unique_ptr<OGRLineString> linestring{factory.create_linestring(wnl, osmium::geom::use_nodes::unique, osmium::geom::direction::backward)};
|
||||
REQUIRE(3 == linestring->getNumPoints());
|
||||
|
||||
REQUIRE(3.6 == linestring->getX(0));
|
||||
REQUIRE(3.2 == linestring->getX(2));
|
||||
}
|
||||
|
||||
SECTION("linestring, all nodes") {
|
||||
std::unique_ptr<OGRLineString> linestring{factory.create_linestring(wnl, osmium::geom::use_nodes::all)};
|
||||
REQUIRE(4 == linestring->getNumPoints());
|
||||
|
||||
REQUIRE(3.2 == linestring->getX(0));
|
||||
}
|
||||
|
||||
SECTION("linestring, all nodes, backwards") {
|
||||
std::unique_ptr<OGRLineString> linestring{factory.create_linestring(wnl, osmium::geom::use_nodes::all, osmium::geom::direction::backward)};
|
||||
REQUIRE(4 == linestring->getNumPoints());
|
||||
|
||||
REQUIRE(3.6 == linestring->getX(0));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TEST_CASE("OGR area geometry") {
|
||||
osmium::geom::OGRFactory<> factory;
|
||||
osmium::memory::Buffer buffer{10000};
|
||||
|
||||
SECTION("area_1outer_0inner") {
|
||||
const osmium::Area& area = create_test_area_1outer_0inner(buffer);
|
||||
|
||||
std::unique_ptr<OGRMultiPolygon> mp {factory.create_multipolygon(area)};
|
||||
REQUIRE(1 == mp->getNumGeometries());
|
||||
|
||||
const OGRPolygon* p0 = dynamic_cast<const OGRPolygon*>(mp->getGeometryRef(0));
|
||||
REQUIRE(p0);
|
||||
REQUIRE(0 == p0->getNumInteriorRings());
|
||||
|
||||
const OGRLineString* l0e = p0->getExteriorRing();
|
||||
REQUIRE(4 == l0e->getNumPoints());
|
||||
|
||||
REQUIRE(3.5 == l0e->getX(1));
|
||||
}
|
||||
|
||||
SECTION("area_1outer_1inner") {
|
||||
const osmium::Area& area = create_test_area_1outer_1inner(buffer);
|
||||
|
||||
std::unique_ptr<OGRMultiPolygon> mp {factory.create_multipolygon(area)};
|
||||
REQUIRE(1 == mp->getNumGeometries());
|
||||
|
||||
const OGRPolygon* p0 = dynamic_cast<const OGRPolygon*>(mp->getGeometryRef(0));
|
||||
REQUIRE(p0);
|
||||
REQUIRE(1 == p0->getNumInteriorRings());
|
||||
|
||||
const OGRLineString* l0e = p0->getExteriorRing();
|
||||
REQUIRE(5 == l0e->getNumPoints());
|
||||
|
||||
const OGRLineString* l0i0 = p0->getInteriorRing(0);
|
||||
REQUIRE(5 == l0i0->getNumPoints());
|
||||
}
|
||||
|
||||
SECTION("area_2outer_2inner") {
|
||||
const osmium::Area& area = create_test_area_2outer_2inner(buffer);
|
||||
|
||||
std::unique_ptr<OGRMultiPolygon> mp {factory.create_multipolygon(area)};
|
||||
REQUIRE(2 == mp->getNumGeometries());
|
||||
|
||||
const OGRPolygon* p0 = dynamic_cast<const OGRPolygon*>(mp->getGeometryRef(0));
|
||||
REQUIRE(p0);
|
||||
REQUIRE(2 == p0->getNumInteriorRings());
|
||||
|
||||
const OGRLineString* l0e = p0->getExteriorRing();
|
||||
REQUIRE(5 == l0e->getNumPoints());
|
||||
|
||||
const OGRPolygon* p1 = dynamic_cast<const OGRPolygon*>(mp->getGeometryRef(1));
|
||||
REQUIRE(p1);
|
||||
REQUIRE(0 == p1->getNumInteriorRings());
|
||||
|
||||
const OGRLineString* l1e = p1->getExteriorRing();
|
||||
REQUIRE(5 == l1e->getNumPoints());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <memory>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
#include <osmium/geom/ogr.hpp>
|
||||
#include <osmium/geom/wkb.hpp>
|
||||
#include <osmium/util/endian.hpp>
|
||||
|
||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
|
||||
#include "area_helper.hpp"
|
||||
#include "wnl_helper.hpp"
|
||||
|
||||
std::string to_wkb(const OGRGeometry* geometry) {
|
||||
std::string buffer;
|
||||
buffer.resize(geometry->WkbSize());
|
||||
|
||||
geometry->exportToWkb(wkbNDR, const_cast<unsigned char*>(reinterpret_cast<const unsigned char*>(buffer.data())));
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
TEST_CASE("compare WKB point against GDAL/OGR") {
|
||||
osmium::geom::WKBFactory<> wkb_factory{osmium::geom::wkb_type::wkb};
|
||||
osmium::geom::OGRFactory<> ogr_factory;
|
||||
|
||||
osmium::Location loc{3.2, 4.2};
|
||||
const std::string wkb{wkb_factory.create_point(loc)};
|
||||
const std::unique_ptr<OGRPoint> geometry = ogr_factory.create_point(loc);
|
||||
REQUIRE(to_wkb(geometry.get()) == wkb);
|
||||
}
|
||||
|
||||
TEST_CASE("compare WKB linestring against GDAL/OGR") {
|
||||
osmium::geom::WKBFactory<> wkb_factory{osmium::geom::wkb_type::wkb};
|
||||
osmium::geom::OGRFactory<> ogr_factory;
|
||||
osmium::memory::Buffer buffer{10000};
|
||||
|
||||
const auto& wnl = create_test_wnl_okay(buffer);
|
||||
|
||||
SECTION("linestring") {
|
||||
const std::string wkb{wkb_factory.create_linestring(wnl)};
|
||||
const std::unique_ptr<OGRLineString> geometry = ogr_factory.create_linestring(wnl);
|
||||
REQUIRE(to_wkb(geometry.get()) == wkb);
|
||||
}
|
||||
|
||||
SECTION("linestring, unique nodes, backwards") {
|
||||
const std::string wkb{wkb_factory.create_linestring(wnl, osmium::geom::use_nodes::unique, osmium::geom::direction::backward)};
|
||||
const std::unique_ptr<OGRLineString> geometry = ogr_factory.create_linestring(wnl, osmium::geom::use_nodes::unique, osmium::geom::direction::backward);
|
||||
REQUIRE(to_wkb(geometry.get()) == wkb);
|
||||
}
|
||||
|
||||
SECTION("linestring, all nodes, forwards") {
|
||||
const std::string wkb{wkb_factory.create_linestring(wnl, osmium::geom::use_nodes::all)};
|
||||
const std::unique_ptr<OGRLineString> geometry = ogr_factory.create_linestring(wnl, osmium::geom::use_nodes::all);
|
||||
REQUIRE(to_wkb(geometry.get()) == wkb);
|
||||
}
|
||||
|
||||
SECTION("linestring, all nodes, backwards") {
|
||||
const std::string wkb{wkb_factory.create_linestring(wnl, osmium::geom::use_nodes::all, osmium::geom::direction::backward)};
|
||||
const std::unique_ptr<OGRLineString> geometry = ogr_factory.create_linestring(wnl, osmium::geom::use_nodes::all, osmium::geom::direction::backward);
|
||||
REQUIRE(to_wkb(geometry.get()) == wkb);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TEST_CASE("compare WKB area against GDAL/OGR") {
|
||||
osmium::geom::WKBFactory<> wkb_factory{osmium::geom::wkb_type::wkb};
|
||||
osmium::geom::OGRFactory<> ogr_factory;
|
||||
osmium::memory::Buffer buffer{10000};
|
||||
|
||||
SECTION("area_1outer_0inner") {
|
||||
const osmium::Area& area = create_test_area_1outer_0inner(buffer);
|
||||
|
||||
const std::string wkb{wkb_factory.create_multipolygon(area)};
|
||||
const std::unique_ptr<OGRMultiPolygon> geometry = ogr_factory.create_multipolygon(area);
|
||||
REQUIRE(to_wkb(geometry.get()) == wkb);
|
||||
}
|
||||
|
||||
SECTION("area_1outer_1inner") {
|
||||
const osmium::Area& area = create_test_area_1outer_1inner(buffer);
|
||||
|
||||
const std::string wkb{wkb_factory.create_multipolygon(area)};
|
||||
const std::unique_ptr<OGRMultiPolygon> geometry = ogr_factory.create_multipolygon(area);
|
||||
REQUIRE(to_wkb(geometry.get()) == wkb);
|
||||
}
|
||||
|
||||
SECTION("area_2outer_2inner") {
|
||||
const osmium::Area& area = create_test_area_2outer_2inner(buffer);
|
||||
|
||||
const std::string wkb{wkb_factory.create_multipolygon(area)};
|
||||
const std::unique_ptr<OGRMultiPolygon> geometry = ogr_factory.create_multipolygon(area);
|
||||
REQUIRE(to_wkb(geometry.get()) == wkb);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <random>
|
||||
|
||||
#include <osmium/geom/factory.hpp>
|
||||
#include <osmium/geom/mercator_projection.hpp>
|
||||
#include <osmium/geom/projection.hpp>
|
||||
|
||||
TEST_CASE("Indentity Projection") {
|
||||
osmium::geom::IdentityProjection projection;
|
||||
REQUIRE(4326 == projection.epsg());
|
||||
REQUIRE("+proj=longlat +datum=WGS84 +no_defs" == projection.proj_string());
|
||||
}
|
||||
|
||||
TEST_CASE("Projection 4326") {
|
||||
osmium::geom::Projection projection{4326};
|
||||
REQUIRE(4326 == projection.epsg());
|
||||
REQUIRE("+init=epsg:4326" == projection.proj_string());
|
||||
|
||||
const osmium::Location loc{1.0, 2.0};
|
||||
const osmium::geom::Coordinates c{1.0, 2.0};
|
||||
REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001));
|
||||
REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001));
|
||||
}
|
||||
|
||||
TEST_CASE("Projection 4326 from init string") {
|
||||
osmium::geom::Projection projection{"+init=epsg:4326"};
|
||||
REQUIRE(-1 == projection.epsg());
|
||||
REQUIRE("+init=epsg:4326" == projection.proj_string());
|
||||
|
||||
const osmium::Location loc{1.0, 2.0};
|
||||
const osmium::geom::Coordinates c{1.0, 2.0};
|
||||
REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001));
|
||||
REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001));
|
||||
}
|
||||
|
||||
TEST_CASE("Creating projection from unknown init string") {
|
||||
REQUIRE_THROWS_AS(osmium::geom::Projection{"abc"}, const osmium::projection_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("Creating projection from unknown EPSG code") {
|
||||
REQUIRE_THROWS_AS(osmium::geom::Projection{9999999}, const osmium::projection_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("Projection 3857") {
|
||||
osmium::geom::Projection projection{3857};
|
||||
REQUIRE(3857 == projection.epsg());
|
||||
REQUIRE("+init=epsg:3857" == projection.proj_string());
|
||||
|
||||
SECTION("Zero coordinates") {
|
||||
const osmium::Location loc{0.0, 0.0};
|
||||
const osmium::geom::Coordinates c{0.0, 0.0};
|
||||
REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001));
|
||||
REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001));
|
||||
}
|
||||
|
||||
SECTION("Max longitude") {
|
||||
const osmium::Location loc{180.0, 0.0};
|
||||
const osmium::geom::Coordinates c{20037508.34, 0.0};
|
||||
REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001));
|
||||
REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001));
|
||||
}
|
||||
|
||||
SECTION("Min longitude") {
|
||||
const osmium::Location loc{-180.0, 0.0};
|
||||
const osmium::geom::Coordinates c{-20037508.34, 0.0};
|
||||
REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001));
|
||||
REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001));
|
||||
}
|
||||
|
||||
SECTION("Max latitude") {
|
||||
const osmium::Location loc{0.0, 85.0511288};
|
||||
const osmium::geom::Coordinates c{0.0, 20037508.34};
|
||||
REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001));
|
||||
REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001));
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("MercatorProjection") {
|
||||
osmium::geom::MercatorProjection projection;
|
||||
|
||||
SECTION("Zero coordinates") {
|
||||
const osmium::Location loc{0.0, 0.0};
|
||||
const osmium::geom::Coordinates c{0.0, 0.0};
|
||||
REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001));
|
||||
REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001));
|
||||
}
|
||||
|
||||
SECTION("Max longitude") {
|
||||
const osmium::Location loc{180.0, 0.0};
|
||||
const osmium::geom::Coordinates c{20037508.34, 0.0};
|
||||
REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001));
|
||||
REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001));
|
||||
}
|
||||
|
||||
SECTION("Min longitude") {
|
||||
const osmium::Location loc{-180.0, 0.0};
|
||||
const osmium::geom::Coordinates c{-20037508.34, 0.0};
|
||||
REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001));
|
||||
REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001));
|
||||
}
|
||||
|
||||
SECTION("Max latitude") {
|
||||
const osmium::Location loc{0.0, 85.0511288};
|
||||
const osmium::geom::Coordinates c{0.0, 20037508.34};
|
||||
REQUIRE(projection(loc).x == Approx(c.x).epsilon(0.00001));
|
||||
REQUIRE(projection(loc).y == Approx(c.y).epsilon(0.00001));
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("Compare mercator implementations") {
|
||||
osmium::geom::MercatorProjection projection_merc;
|
||||
osmium::geom::Projection projection_3857{3857};
|
||||
|
||||
SECTION("random coordinates") {
|
||||
std::random_device rd;
|
||||
std::mt19937 gen{rd()};
|
||||
std::uniform_real_distribution<> dis_x{-180.0, 180.0};
|
||||
std::uniform_real_distribution<> dis_y{-90.0, 90.0};
|
||||
|
||||
for (int n = 0; n < 10000; ++n) {
|
||||
const osmium::Location loc{dis_x(gen), dis_y(gen)};
|
||||
REQUIRE(projection_merc(loc).x == Approx(projection_3857(loc).x).epsilon(0.00001));
|
||||
REQUIRE(projection_merc(loc).y == Approx(projection_3857(loc).y).epsilon(0.00001));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+143
@@ -0,0 +1,143 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <sstream>
|
||||
|
||||
#include <osmium/geom/tile.hpp>
|
||||
|
||||
#include "test_tile_data.hpp"
|
||||
|
||||
TEST_CASE("Helper functions") {
|
||||
REQUIRE(osmium::geom::num_tiles_in_zoom(0) == 1);
|
||||
REQUIRE(osmium::geom::num_tiles_in_zoom(1) == 2);
|
||||
REQUIRE(osmium::geom::num_tiles_in_zoom(12) == 4096);
|
||||
|
||||
REQUIRE(osmium::geom::tile_extent_in_zoom(1) == osmium::geom::detail::max_coordinate_epsg3857);
|
||||
}
|
||||
|
||||
TEST_CASE("Tile from x0.0 y0.0 at zoom 0") {
|
||||
osmium::Location l{0.0, 0.0};
|
||||
|
||||
osmium::geom::Tile t{0, l};
|
||||
|
||||
REQUIRE(t.x == 0);
|
||||
REQUIRE(t.y == 0);
|
||||
REQUIRE(t.z == 0);
|
||||
REQUIRE(t.valid());
|
||||
}
|
||||
|
||||
TEST_CASE("Tile from x180.0 y90.0 at zoom 0") {
|
||||
osmium::Location l{180.0, 90.0};
|
||||
|
||||
osmium::geom::Tile t{0, l};
|
||||
|
||||
REQUIRE(t.x == 0);
|
||||
REQUIRE(t.y == 0);
|
||||
REQUIRE(t.z == 0);
|
||||
REQUIRE(t.valid());
|
||||
}
|
||||
|
||||
TEST_CASE("Tile from x180.0 y90.0 at zoom 4") {
|
||||
osmium::Location l{180.0, 90.0};
|
||||
|
||||
osmium::geom::Tile t{4, l};
|
||||
|
||||
REQUIRE(t.x == (1 << 4) - 1);
|
||||
REQUIRE(t.y == 0);
|
||||
REQUIRE(t.z == 4);
|
||||
REQUIRE(t.valid());
|
||||
}
|
||||
|
||||
TEST_CASE("Tile from x0.0 y0.0 at zoom 4") {
|
||||
osmium::Location l{0.0, 0.0};
|
||||
|
||||
osmium::geom::Tile t{4, l};
|
||||
|
||||
const auto n = 1 << (4-1);
|
||||
REQUIRE(t.x == n);
|
||||
REQUIRE(t.y == n);
|
||||
REQUIRE(t.z == 4);
|
||||
REQUIRE(t.valid());
|
||||
}
|
||||
|
||||
TEST_CASE("Tile from max values at zoom 4") {
|
||||
osmium::geom::Tile t{4u, 15u, 15u};
|
||||
REQUIRE(t.valid());
|
||||
}
|
||||
|
||||
TEST_CASE("Tile from max values at zoom 30") {
|
||||
osmium::geom::Tile t{30u, (1u<<30) - 1, (1u<<30) - 1};
|
||||
REQUIRE(t.valid());
|
||||
}
|
||||
|
||||
TEST_CASE("Tile from coordinates") {
|
||||
osmium::geom::Coordinates c{9.99312, 53.55078};
|
||||
osmium::geom::Tile t{12, osmium::geom::lonlat_to_mercator(c)};
|
||||
REQUIRE(t.valid());
|
||||
REQUIRE(t.x == 2161);
|
||||
REQUIRE(t.y == 1323);
|
||||
}
|
||||
|
||||
TEST_CASE("Tile equality") {
|
||||
osmium::geom::Tile a{4, 3, 4};
|
||||
osmium::geom::Tile b{4, 3, 4};
|
||||
osmium::geom::Tile c{4, 4, 3};
|
||||
REQUIRE(a == b);
|
||||
REQUIRE(a != c);
|
||||
REQUIRE(b != c);
|
||||
}
|
||||
|
||||
TEST_CASE("Tile order") {
|
||||
osmium::geom::Tile a{4, 3, 4};
|
||||
osmium::geom::Tile b{6, 3, 4};
|
||||
osmium::geom::Tile c{6, 4, 3};
|
||||
osmium::geom::Tile d{6, 4, 2};
|
||||
REQUIRE(a < b);
|
||||
REQUIRE(a < c);
|
||||
REQUIRE(b < c);
|
||||
REQUIRE(d < c);
|
||||
}
|
||||
|
||||
TEST_CASE("Check a random list of tiles") {
|
||||
std::istringstream input_data(s);
|
||||
while (input_data) {
|
||||
double lon, lat;
|
||||
uint32_t x, y, zoom;
|
||||
input_data >> lon;
|
||||
input_data >> lat;
|
||||
input_data >> x;
|
||||
input_data >> y;
|
||||
input_data >> zoom;
|
||||
|
||||
osmium::Location l{lon, lat};
|
||||
osmium::geom::Tile t{zoom, l};
|
||||
REQUIRE(t.x == x);
|
||||
REQUIRE(t.y == y);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("Invalid tiles") {
|
||||
osmium::geom::Tile tile{0, 0, 0};
|
||||
|
||||
REQUIRE(tile.valid());
|
||||
|
||||
SECTION("Zoom level out of bounds") {
|
||||
tile.z = 100;
|
||||
}
|
||||
SECTION("x out of bounds") {
|
||||
tile.x = 1;
|
||||
}
|
||||
SECTION("y out of bounds") {
|
||||
tile.y = 1;
|
||||
}
|
||||
SECTION("x out of bounds") {
|
||||
tile.z = 4;
|
||||
tile.x = 100;
|
||||
}
|
||||
SECTION("y out of bounds") {
|
||||
tile.z = 4;
|
||||
tile.y = 100;
|
||||
}
|
||||
|
||||
REQUIRE_FALSE(tile.valid());
|
||||
}
|
||||
|
||||
@@ -0,0 +1,477 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
static std::string s = R"(127.4864358 16.8380041 223904 118630 18
|
||||
163.1103174 39.4760232 121 48 7
|
||||
-4.1372725 -22.5105386 31 36 6
|
||||
98.7193066 -36.2312406 1 1 1
|
||||
63.5773661 -13.47636 21 17 5
|
||||
-88.4518148 37.9805485 260 395 10
|
||||
-14.5903133 -28.2989812 3763 4767 13
|
||||
-13.4971239 -34.4080035 14 19 5
|
||||
-169.156223 -64.0900356 3 93 7
|
||||
27.1473191 -4.1993125 4713 4191 13
|
||||
-160.9733129 54.3684314 13 81 8
|
||||
129.0194139 14.2576156 439 235 9
|
||||
-69.5085993 -56.8253221 10057 22700 15
|
||||
-77.8387486 18.1961517 1162 1837 12
|
||||
-76.2695325 -18.2494296 147 282 9
|
||||
-91.594905 7.6698071 1 3 3
|
||||
-116.7926741 -20.6060813 179 571 10
|
||||
109.0552776 -1.9947569 52620 33131 16
|
||||
-156.1846426 -79.3817554 33 449 9
|
||||
-95.3403755 -27.8978407 1 4 3
|
||||
-55.1827573 -73.2293796 44 103 7
|
||||
-108.5207885 -48.0099293 50 167 8
|
||||
23.7540108 -15.3395164 9273 8898 14
|
||||
-155.6662842 -68.3295899 0 0 0
|
||||
75.8139119 30.9914252 363 209 9
|
||||
-135.8034544 64.7242469 0 1 2
|
||||
-48.743352 70.9392876 23 13 6
|
||||
-38.6968026 7.7867812 0 0 0
|
||||
-18.5234838 11.8557704 29395 30594 16
|
||||
-152.5632568 19.4069834 78 455 10
|
||||
-63.2089431 -80.5909713 0 0 0
|
||||
-94.1255611 -81.2028822 244 930 10
|
||||
175.0862205 -33.0865142 3 2 2
|
||||
-179.6241926 -37.0256609 1 625 10
|
||||
135.6783824 -38.6011643 459739 323170 19
|
||||
-139.6407533 -83.2495209 0 7 3
|
||||
-14.1336447 -56.5465949 58 88 7
|
||||
-30.7414568 -32.9543731 26 38 6
|
||||
10.3306861 73.2444693 1082 399 11
|
||||
-84.8379263 29.2363222 16 26 6
|
||||
-94.0685822 -39.5503996 7821 20309 15
|
||||
-86.5944356 -41.7491891 265 642 10
|
||||
11.9182172 -80.5613703 34937 58784 16
|
||||
91.8773752 -32.1741317 0 0 0
|
||||
126.2879157 20.5759564 1742 904 11
|
||||
-160.7743029 -47.3192128 27999 340565 19
|
||||
-4.2449045 -50.3288332 31 42 6
|
||||
-66.6857158 61.4380757 10 9 5
|
||||
169.7372317 -74.3365704 3 3 2
|
||||
87.4815328 75.6218888 95 21 7
|
||||
60.3544927 28.3165267 0 0 0
|
||||
-48.9614619 -59.3292497 2 5 3
|
||||
-123.2935018 -59.5454886 80 362 9
|
||||
-31.5909316 -14.8985476 13 17 5
|
||||
58.1862173 59.0957666 2710 1209 12
|
||||
-72.8881665 -2.2648849 1218 2073 12
|
||||
-33.7267461 8.6006817 106512 124785 18
|
||||
175.723181 46.4929742 7 2 3
|
||||
-127.1963326 76.0328786 0 0 0
|
||||
-161.7444367 -26.7634497 13293 151310 18
|
||||
-163.976298 -8.1169845 91 1070 11
|
||||
63.7757109 5.6049418 2 1 2
|
||||
12.7012434 22.1157713 70160 57276 17
|
||||
19.5832849 -25.0284049 1135 1171 11
|
||||
-22.6619642 54.8831276 111 81 8
|
||||
78.7736907 24.0919863 5888 3530 13
|
||||
121.9003045 -64.6256685 107 94 7
|
||||
-64.8766793 61.6655916 81 71 8
|
||||
113.0498445 -70.0016518 416 397 9
|
||||
-51.5116259 68.1532424 46781 31217 17
|
||||
-89.9005747 87.9523248 512 0 11
|
||||
59.2536822 -75.1520493 10 13 4
|
||||
17.375372 74.9259262 287448 93371 19
|
||||
75.6426945 8.4808632 186153 124873 18
|
||||
144.89589 75.1647661 14786 2875 14
|
||||
174.4350898 -29.268169 258091 153376 18
|
||||
-91.8773113 50.6182166 0 0 0
|
||||
5.3822308 45.1391794 134991 94156 18
|
||||
43.0978373 -10.0764237 324909 276895 19
|
||||
55.6682917 -40.9015342 21451 20470 15
|
||||
-37.584032 52.253723 6 5 4
|
||||
131.0141997 29.0271798 28309 13621 15
|
||||
69.8830721 -86.8548645 363918 524287 19
|
||||
-107.7917548 -76.9626654 26290 110787 17
|
||||
-57.1736642 49.9345991 2 2 3
|
||||
165.5170226 -84.9735363 982 1021 10
|
||||
-139.7208984 -73.8754873 1 12 4
|
||||
-154.5959463 -10.596718 4 33 6
|
||||
-106.4164918 36.5042686 3348 6405 14
|
||||
-92.9688259 -11.2262505 0 2 2
|
||||
138.2722283 8.1109779 7 3 3
|
||||
123.1389319 -40.3505677 862 637 10
|
||||
-171.4780435 24.9112482 0 13 5
|
||||
89.3668763 -63.1809434 392293 381781 19
|
||||
-79.6906176 -13.376312 9130 17612 15
|
||||
133.1329522 -28.9032634 445 298 9
|
||||
115.0369496 70.6965823 6 1 3
|
||||
-74.8926697 -78.9770185 2391 7144 13
|
||||
51.9175766 73.0184277 164 50 8
|
||||
178.1319784 43.7111421 509 186 9
|
||||
162.4098389 61.1595443 0 0 0
|
||||
7.6241126 -75.6182944 2 3 2
|
||||
172.8902767 28.5068027 125 53 7
|
||||
156.4030739 -76.7309238 478 431 9
|
||||
-131.3963189 62.2039684 1 2 3
|
||||
34.6057088 -36.2933264 2441 2491 12
|
||||
-3.3896413 -48.2734347 15 20 5
|
||||
83.528842 -48.219886 2998 2675 12
|
||||
16.6000512 -31.6322244 17894 19421 15
|
||||
-18.2425749 21.0749052 14 14 5
|
||||
35.6035336 46.9916228 78498 46105 17
|
||||
-109.3453091 -34.2312523 12 38 6
|
||||
88.4909962 58.6104749 47 19 6
|
||||
-129.7372783 21.7408241 571 1794 12
|
||||
25.7269392 -40.1240139 1 1 1
|
||||
26.3829579 5.248998 37570 31811 16
|
||||
141.1768247 -41.4653038 14617 10269 14
|
||||
151.3788752 -38.0160512 241302 161042 18
|
||||
-92.7471483 -35.391745 15883 39664 16
|
||||
142.5902623 -14.1023743 28 17 5
|
||||
179.3461485 -86.7573357 3 3 2
|
||||
-40.9746194 61.5689546 790 576 11
|
||||
128.6399735 -54.8895009 56186 44772 16
|
||||
-141.391583 -63.8272 0 2 2
|
||||
-3.5004218 19.3089998 4016 3648 13
|
||||
16.138208 -42.7868627 1 1 1
|
||||
78.502315 -18.91667 2 2 2
|
||||
-44.6311826 -15.7483106 98572 142686 18
|
||||
-120.431941 -39.3431529 0 0 0
|
||||
-70.4915024 25.4763412 9967 13984 15
|
||||
118.0711114 -66.5691073 211 192 8
|
||||
-114.945538 38.1764389 0 0 0
|
||||
142.991315 -46.3378741 14699 10577 14
|
||||
34.2770562 -84.7173756 312063 518834 19
|
||||
109.5563415 -85.9138266 105424 131071 17
|
||||
-171.8032643 70.1948223 0 3 4
|
||||
-90.8434294 89.7252122 126 0 9
|
||||
163.5677082 -53.9885419 3 2 2
|
||||
128.884016 -63.0732584 112461 95358 17
|
||||
116.5348575 -56.1616143 843 705 10
|
||||
-171.5770602 37.9225943 11 197 9
|
||||
48.1396653 -49.3932234 5191 5392 13
|
||||
-157.6786731 15.3895763 32507 239456 19
|
||||
15.7385145 -37.1364397 1113 1251 11
|
||||
137.5179466 61.2025671 1 0 1
|
||||
-70.4767722 42.9798424 19938 24086 16
|
||||
27.8867901 43.4642562 9461 5991 14
|
||||
68.5677462 -84.9560937 11312 16334 14
|
||||
-56.790151 -67.124147 179437 395476 19
|
||||
108.850832 43.3493384 26291 11996 15
|
||||
-139.0655153 8.2673118 1 7 4
|
||||
59.3726661 83.3857699 21788 1515 15
|
||||
-158.4718709 -12.2313178 1 17 5
|
||||
30.358316 -83.020501 2393 3871 12
|
||||
-169.9667863 71.1152107 1 13 6
|
||||
-89.9418297 -7.7258969 131156 273429 19
|
||||
-16.5050312 47.1843923 116 89 8
|
||||
-151.9641886 -36.3579042 5103 39881 16
|
||||
169.7406916 60.0950674 62 18 6
|
||||
32.6694543 -1.8435981 2 2 2
|
||||
97.7880811 77.5295169 50569 9674 16
|
||||
87.7554889 -85.6741368 389947 524287 19
|
||||
-19.0174909 29.1940122 0 0 1
|
||||
-86.6180019 82.6445919 1 0 2
|
||||
-50.1997802 -21.1913243 1476 2294 12
|
||||
73.8710121 75.2201385 5 1 3
|
||||
41.7434624 79.1410045 322937 65770 19
|
||||
-122.4312562 -68.4513916 10 48 6
|
||||
-54.6116448 -23.1761137 1 2 2
|
||||
-35.8774263 -51.5317442 102 170 8
|
||||
179.2976644 -76.2729885 127 107 7
|
||||
-111.6934402 -85.2696836 1 7 3
|
||||
-24.2137947 28.4102025 3 3 3
|
||||
-168.0816395 -64.0317696 16 375 9
|
||||
43.2514876 6.4266793 2540 1974 12
|
||||
25.5877932 49.3486828 4 2 3
|
||||
-133.3671657 -25.0795973 8 36 6
|
||||
-140.2002274 -37.3713396 452 2507 12
|
||||
73.6326557 -21.9898207 360 288 9
|
||||
-83.0901448 -69.1893461 2205 6305 13
|
||||
-32.83227 -11.1061854 3348 4350 13
|
||||
-151.8897244 14.6891958 0 0 0
|
||||
-118.1125151 82.3085937 704 288 12
|
||||
119.9903922 1.4884267 53 31 6
|
||||
-116.9455865 -48.1971821 0 2 2
|
||||
111.4279587 -52.6024326 828 688 10
|
||||
-78.9207774 28.6183104 147207 218615 19
|
||||
45.1367631 24.1416251 40 27 6
|
||||
115.0905685 7.2971256 6714 3929 13
|
||||
-58.0837371 -55.4033522 43 87 7
|
||||
-44.6785779 83.0751777 6158 877 14
|
||||
80.2002966 84.3087089 2960 91 12
|
||||
-167.3118039 -59.2698371 72 1445 11
|
||||
139.9974902 -74.5994693 455 419 9
|
||||
-27.5858357 -36.1890547 6936 9960 14
|
||||
68.8572424 20.2096749 353 226 9
|
||||
-168.7172825 69.1607462 2053 15104 16
|
||||
62.1361934 74.6007777 44079 11896 16
|
||||
-102.9645124 65.3735325 112191 135144 19
|
||||
178.8434887 18.6231394 65325 29316 16
|
||||
-138.0494072 -80.3786289 29 228 8
|
||||
33.3858934 62.9029909 155382 71699 18
|
||||
-1.6915643 74.737228 1 0 2
|
||||
18.2680756 6.6441482 1 0 1
|
||||
34.0511738 -28.6862516 2 2 2
|
||||
-24.0705994 -0.6026568 28386 32877 16
|
||||
-176.8765092 -14.3252022 568 35403 16
|
||||
154.6553417 -79.7390666 1903 1809 11
|
||||
151.6055263 59.552346 14 4 4
|
||||
-101.7681729 45.3498263 113933 187876 19
|
||||
-52.3703658 -89.8260406 181 511 9
|
||||
-85.7937259 16.5632413 2143 3713 13
|
||||
114.7030999 6.6846014 104 61 7
|
||||
13.6027861 88.6863877 2 0 2
|
||||
60.5726928 38.256536 43794 25219 16
|
||||
141.0903381 -35.4468007 7306 4959 13
|
||||
-38.8182454 -55.2332792 200 350 9
|
||||
179.7818018 -79.6600052 523970 462627 19
|
||||
-45.2102175 82.7381225 196301 32058 19
|
||||
-36.5811826 -35.3991346 0 0 0
|
||||
-26.7719575 -75.7014102 223154 435372 19
|
||||
77.3451937 -65.4613594 1 1 1
|
||||
-37.3286225 38.3250599 51945 50407 17
|
||||
70.8235495 35.3870419 365288 206979 19
|
||||
99.8381373 -83.4101655 1 1 1
|
||||
25.8851923 67.415543 9370 3991 14
|
||||
-12.3393758 68.5972027 7 3 4
|
||||
-142.9400273 -36.2904852 1 9 4
|
||||
110.085689 -50.9514972 422467 348655 19
|
||||
121.5093657 53.9939447 54888 21044 16
|
||||
151.1307841 -33.0798435 58 38 6
|
||||
100.4346499 -57.0129759 6 5 3
|
||||
114.0564882 63.4987339 428250 141474 19
|
||||
-17.3978586 19.2981593 57 57 7
|
||||
-129.101039 -66.3423574 579 3067 12
|
||||
117.6639917 14.0568892 433504 241463 19
|
||||
97.7014577 69.1261732 202216 60490 18
|
||||
-174.7931333 81.4174709 7583 46045 19
|
||||
47.205341 -48.8608019 20680 21495 15
|
||||
167.416796 -7.5063098 247 133 8
|
||||
63.6744589 21.3392888 0 0 0
|
||||
-106.0719817 33.8353547 53832 104862 18
|
||||
-48.4051268 27.0438152 191648 221209 19
|
||||
64.5675545 -27.0683253 5 4 3
|
||||
110.7800249 -35.8217841 0 0 0
|
||||
164.8954138 81.9558801 31393 2538 15
|
||||
-54.4595565 -23.0128432 357 579 10
|
||||
43.2542709 67.694011 2540 989 12
|
||||
137.6537233 -78.7052092 28913 28450 15
|
||||
76.9271563 -60.0777348 0 0 0
|
||||
-145.0240216 47.3869213 6367 22947 16
|
||||
136.2328853 -73.4534547 3598 3304 12
|
||||
48.8047148 74.3001023 81 23 7
|
||||
-144.6978756 33.6270048 200 820 11
|
||||
64.6723407 -37.196427 21 19 5
|
||||
-58.3356482 -19.0812366 22148 36307 16
|
||||
19.611535 -31.3013119 0 0 0
|
||||
-63.8923439 -25.9560287 1 2 2
|
||||
-152.5288047 -30.9747477 0 1 1
|
||||
-99.8509683 -69.0258965 7295 25181 15
|
||||
-22.9015207 -21.0915082 13 17 5
|
||||
161.4402438 61.1430241 15539 4652 14
|
||||
-102.9499976 -1.2629414 1 4 3
|
||||
-159.7995801 51.1570142 14 85 8
|
||||
10.5265485 -86.8526122 67 127 7
|
||||
47.1581041 -73.1628608 646 823 10
|
||||
2.7577906 -66.3257104 66540 98133 17
|
||||
96.9653593 -9.8258675 6 4 3
|
||||
-55.4199846 25.3325116 2834 3499 13
|
||||
-47.3590106 59.5085133 2 2 3
|
||||
179.1441501 22.1324479 7 3 3
|
||||
16.2649007 47.8480398 4 2 3
|
||||
-27.8373963 -0.3926597 27700 32839 16
|
||||
-99.7938802 -48.8013068 912 2685 12
|
||||
133.4858024 28.457146 3 1 2
|
||||
-174.7621207 -25.8318084 238 9409 14
|
||||
106.856378 19.640472 203 113 8
|
||||
31.4361995 -80.2488406 76981 116886 17
|
||||
148.6539554 -70.0347611 116 99 7
|
||||
45.1821773 17.5961595 80 57 7
|
||||
-30.3630114 71.3238998 54481 27877 17
|
||||
106.547704 44.9731358 6520 2947 13
|
||||
-132.8057564 23.3928795 67 221 9
|
||||
116.6455816 -10.1097592 52 33 6
|
||||
172.5512559 -53.2307289 3 2 2
|
||||
-114.2084519 42.834332 2994 6030 14
|
||||
91.0172087 87.6025 1 0 1
|
||||
-101.666812 -84.7858729 7130 32495 15
|
||||
-14.8074931 68.3277393 0 0 0
|
||||
140.3354277 -7.8709618 14 8 4
|
||||
-130.4961987 -69.4777523 9011 50594 16
|
||||
-121.239479 1.0896367 1 3 3
|
||||
-141.2241052 3.4495348 56471 257117 19
|
||||
42.6041377 -19.1328846 2532 2269 12
|
||||
141.3750885 -1.8110503 468036 264781 19
|
||||
-26.545021 -30.9641274 218 302 9
|
||||
87.6154866 10.1978751 5 3 3
|
||||
88.002559 -33.4108714 762 612 10
|
||||
170.9910642 -7.1925019 3993 2130 12
|
||||
-66.5680487 -88.1144993 165197 524287 19
|
||||
-71.5925378 45.720316 0 0 0
|
||||
-16.457642 57.1688038 930 625 11
|
||||
20.8379624 -11.1485568 35 33 6
|
||||
-72.9399538 -16.6504502 1 2 2
|
||||
52.8746845 -71.5213577 10598 12927 14
|
||||
93.2392918 12.5073156 48 29 6
|
||||
-3.7803834 73.7748237 128319 49794 18
|
||||
93.5713795 -38.8308882 24 19 5
|
||||
87.3474619 -6.9970464 23 16 5
|
||||
161.2199467 48.5612779 30 11 5
|
||||
87.343969 -31.3153618 47 37 6
|
||||
60.5318627 58.0869948 42 19 6
|
||||
161.4388458 42.7612385 1 0 1
|
||||
14.1262999 -26.2101142 4 4 3
|
||||
-135.776346 -21.4248586 503 2297 12
|
||||
-100.3980364 82.0236388 1 0 3
|
||||
-55.8093833 -87.2455194 0 0 0
|
||||
-15.6397352 64.454076 935 540 11
|
||||
131.5974423 39.1251372 110 48 7
|
||||
56.8045509 27.5658629 168 107 8
|
||||
146.3634996 14.9287416 3 1 2
|
||||
51.5699041 74.0370231 82 23 7
|
||||
29.3100901 33.7208834 152414 104963 18
|
||||
19.0622442 1.6781772 141 126 8
|
||||
-22.2575472 73.6467471 114864 50126 18
|
||||
125.0208495 47.8533914 3470 1426 12
|
||||
-92.4804503 29.8409387 995 1691 12
|
||||
113.6362202 86.1158625 0 0 0
|
||||
113.6203756 28.4267778 26 13 5
|
||||
124.472202 25.8347062 13856 6974 14
|
||||
79.3654306 -33.7864728 46 38 6
|
||||
-121.169233 -66.7642843 2 12 4
|
||||
179.5816311 1.0182064 0 0 0
|
||||
179.1123794 53.367624 0 0 0
|
||||
-25.6611689 32.6575586 14048 13236 15
|
||||
92.3370554 58.8306651 12 4 4
|
||||
142.2756448 63.6603101 3 1 2
|
||||
-162.8914282 -84.54406 6229 129034 17
|
||||
-54.0759935 53.1086102 0 0 0
|
||||
9.1647045 -39.4876873 34436 40604 16
|
||||
59.3708822 -43.9789068 10894 10425 14
|
||||
-16.6397572 46.5985252 929 723 11
|
||||
-36.1053642 -67.6882841 0 1 1
|
||||
-82.5851985 -69.5277766 4 12 4
|
||||
117.0059969 -63.2697116 432546 382068 19
|
||||
127.9740251 85.5341901 112129 0 17
|
||||
-13.9255265 59.7720207 120931 76457 18
|
||||
-167.7778382 41.7974194 69 761 11
|
||||
-100.1217856 -70.5624949 454 1599 11
|
||||
-42.4790343 -2.0016191 25034 33132 16
|
||||
-8.0782317 65.9680074 30 16 6
|
||||
-37.0481466 -55.2856125 203 350 9
|
||||
149.074382 16.7121888 58 28 6
|
||||
-53.1010518 -15.8492068 0 0 0
|
||||
50.8517919 -30.8366257 42025 38674 16
|
||||
-175.0355994 77.1929422 0 4 5
|
||||
-33.3221217 72.5636809 6 3 4
|
||||
-139.9201802 52.3400823 7296 21546 16
|
||||
86.0299659 23.4535286 1513 886 11
|
||||
105.6297238 -50.5521342 25998 21733 15
|
||||
104.2700533 36.5417507 206999 102450 18
|
||||
58.5238253 84.0320186 86843 3912 17
|
||||
-121.9177826 65.4393267 1321 2108 13
|
||||
-152.689211 57.4112922 39774 159515 19
|
||||
94.2583831 80.8625455 6240 801 13
|
||||
118.8199874 -37.6116567 53 39 6
|
||||
5.787144 7.0599251 4227 3934 13
|
||||
152.1682213 11.778732 236 119 8
|
||||
37.4503636 64.311498 2474 1084 12
|
||||
35.2616139 -59.8196291 38 45 6
|
||||
-20.2808572 -26.9983008 29075 37875 16
|
||||
-88.8541607 -20.4896703 66370 146320 18
|
||||
125.7726709 41.2603793 27 11 5
|
||||
-55.4322696 22.1767236 11338 14313 15
|
||||
-38.2393439 -56.4681037 6 11 4
|
||||
-139.4517643 -81.3621632 3 29 5
|
||||
-146.7954207 -74.6050826 6044 53642 16
|
||||
161.6654898 -71.7313805 15549 12957 14
|
||||
-85.4720514 -73.177675 2 6 3
|
||||
-25.7457381 -42.9842376 13 20 5
|
||||
-2.0766311 51.0142455 0 0 1
|
||||
-82.9179334 1.4865326 8836 16248 15
|
||||
140.5661302 61.5056993 28 9 5
|
||||
-30.2614099 35.5786378 54518 51659 17
|
||||
-49.2072142 -38.6965571 0 1 1
|
||||
124.6587534 9.5039576 433 242 9
|
||||
-113.4516741 81.4585593 24229 11410 17
|
||||
-4.5134723 68.229217 3 1 3
|
||||
75.4838529 -44.997406 2906 2622 12
|
||||
6.4715239 28.6900832 8486 6828 14
|
||||
91.9187555 -24.8192643 6187 4679 13
|
||||
-28.2510181 -42.6238777 26 40 6
|
||||
-151.1042237 -21.4553189 2630 18384 15
|
||||
-149.6272551 0.4235911 1382 8172 14
|
||||
-51.9171488 74.630423 0 0 0
|
||||
-36.5660117 37.242858 101 99 8
|
||||
91.7136677 -30.9077617 772 604 10
|
||||
61.6846009 -85.9378164 5 7 3
|
||||
11.3772008 69.40183 34839 14980 16
|
||||
82.6825938 9.4496443 11954 7759 14
|
||||
61.8446231 -40.0114106 2751 2545 12
|
||||
-51.6223196 -11.7880324 5 8 4
|
||||
113.0309076 -73.4376173 13336 13217 14
|
||||
-169.3808275 -72.7209175 0 25 5
|
||||
-98.5653414 -80.0893122 231 910 10
|
||||
-20.4653707 29.9801495 3 3 3
|
||||
78.9156686 2.599349 0 0 0
|
||||
76.0635255 -71.0823347 2913 3216 12
|
||||
-26.1185551 22.3616029 28013 28589 16
|
||||
177.8803853 -56.3662368 4071 2828 12
|
||||
-157.7926463 78.4998022 15 34 8
|
||||
168.6834344 -34.5535211 7934 4934 13
|
||||
-77.208013 -44.0964079 0 1 1
|
||||
-56.6162078 28.1240365 10 13 5
|
||||
8.6548899 72.178831 137374 53767 18
|
||||
-27.9342497 8.2525327 1 1 2
|
||||
91.6356971 -13.5230128 6181 4406 13
|
||||
-161.9980398 -75.4443511 0 13 4
|
||||
46.8556576 -27.1078679 5162 4737 13
|
||||
147.2806954 -48.1491071 465 334 9
|
||||
-168.2679875 -29.0171568 0 2 2
|
||||
10.0251187 -3.144812 8 8 4
|
||||
109.0281873 81.9713348 26307 2528 15
|
||||
-129.6281276 -36.9614028 73359 320148 19
|
||||
7.3831244 -18.3270273 2132 2260 12
|
||||
-34.4625217 53.2837646 52988 42524 17
|
||||
129.8855275 -26.30807 3525 2358 12
|
||||
-69.6374195 -45.7769025 10045 21081 15
|
||||
59.9868336 50.3716565 43688 22120 16
|
||||
126.4653338 -75.607391 1743 1698 11
|
||||
-34.6459616 53.2502443 51 41 7
|
||||
152.2415169 -71.7528837 1 1 1
|
||||
-83.2126752 32.6685119 35239 52939 17
|
||||
178.6388805 70.5727365 31 7 5
|
||||
-153.5646223 -81.9491561 2 29 5
|
||||
178.2668159 11.8222247 0 0 0
|
||||
-27.136902 18.4287365 6 7 4
|
||||
-104.7744923 -64.7769211 54777 193540 18
|
||||
58.2318889 9.5897974 2710 1938 12
|
||||
138.9707487 -65.2734433 14516 12149 14
|
||||
-115.29331 -84.3402223 2944 16033 14
|
||||
-66.3487123 -81.8340211 20 58 6
|
||||
76.1802855 40.4007156 364 193 9
|
||||
-77.5026834 -30.653231 145 301 9
|
||||
-52.6095007 -79.7155889 11595 28942 15
|
||||
-2.5594899 -31.6276806 7 9 4
|
||||
-58.6267217 41.4851391 2 2 3
|
||||
-0.7245205 -70.7329433 509 801 10
|
||||
161.2822996 -79.0311957 124257 114418 17
|
||||
144.8720197 80.1059269 14785 1811 14
|
||||
159.3764075 -23.5100054 0 0 0
|
||||
82.3109493 -7.0673699 95504 68115 17
|
||||
94.3931949 63.0474034 97 34 7
|
||||
87.4523391 -73.2690527 3043 3297 12
|
||||
101.4256455 -0.8267694 12 8 4
|
||||
-112.7666152 -82.3670281 12239 61007 16
|
||||
-82.0948447 -38.0810449 8 19 5
|
||||
113.2906728 -19.193243 104 70 7
|
||||
16.953131 78.402684 35 8 6
|
||||
-81.7974685 -53.9596787 34 86 7
|
||||
69.8051889 58.1416894 181902 78760 18
|
||||
-9.2435464 -53.4296594 3 5 3
|
||||
30.0415066 11.4884737 4 3 3
|
||||
125.2704157 -69.6324197 54 49 6
|
||||
-41.2060435 63.8501787 789 548 11
|
||||
120.407662 -4.9889504 6835 4209 13
|
||||
92.0345558 -8.0809262 24761 17121 15
|
||||
127.1061722 83.1311204 6988 428 13
|
||||
-178.9414629 64.0086678 770 69897 18
|
||||
49.0743035 -4.3000419 10425 8387 14
|
||||
-45.109002 -55.1435498 1534 2803 12
|
||||
3.2795498 75.95918 32 10 6
|
||||
)";
|
||||
|
||||
+139
@@ -0,0 +1,139 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/geom/mercator_projection.hpp>
|
||||
#include <osmium/geom/wkb.hpp>
|
||||
#include <osmium/util/endian.hpp>
|
||||
|
||||
#include "wnl_helper.hpp"
|
||||
|
||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
|
||||
TEST_CASE("WKB geometry factory (byte-order-dependant), points") {
|
||||
const osmium::Location loc{3.2, 4.2};
|
||||
|
||||
SECTION("point") {
|
||||
osmium::geom::WKBFactory<> factory{osmium::geom::wkb_type::wkb, osmium::geom::out_type::hex};
|
||||
|
||||
const std::string wkb{factory.create_point(loc)};
|
||||
REQUIRE(wkb == "01010000009A99999999990940CDCCCCCCCCCC1040");
|
||||
}
|
||||
|
||||
SECTION("point in ewkb") {
|
||||
osmium::geom::WKBFactory<> factory{osmium::geom::wkb_type::ewkb, osmium::geom::out_type::hex};
|
||||
|
||||
const std::string wkb{factory.create_point(loc)};
|
||||
REQUIRE(wkb == "0101000020E61000009A99999999990940CDCCCCCCCCCC1040");
|
||||
}
|
||||
|
||||
#ifndef OSMIUM_USE_SLOW_MERCATOR_PROJECTION
|
||||
SECTION("point in web mercator") {
|
||||
osmium::geom::WKBFactory<osmium::geom::MercatorProjection> factory{osmium::geom::wkb_type::wkb, osmium::geom::out_type::hex};
|
||||
|
||||
const std::string wkb{factory.create_point(loc)};
|
||||
REQUIRE(wkb == "010100000028706E7BF9BD1541D6A90093E48F1C41");
|
||||
}
|
||||
|
||||
SECTION("point in ewkb in web mercator") {
|
||||
osmium::geom::WKBFactory<osmium::geom::MercatorProjection> factory{osmium::geom::wkb_type::ewkb, osmium::geom::out_type::hex};
|
||||
|
||||
const std::string wkb{factory.create_point(loc)};
|
||||
REQUIRE(wkb == "0101000020110F000028706E7BF9BD1541D6A90093E48F1C41");
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
TEST_CASE("WKB geometry factory (byte-order-dependant)") {
|
||||
|
||||
osmium::memory::Buffer buffer{10000};
|
||||
|
||||
SECTION("linestring") {
|
||||
osmium::geom::WKBFactory<> factory{osmium::geom::wkb_type::wkb, osmium::geom::out_type::hex};
|
||||
const auto& wnl = create_test_wnl_okay(buffer);
|
||||
|
||||
{
|
||||
const std::string wkb{factory.create_linestring(wnl)};
|
||||
REQUIRE(wkb == "0102000000030000009A99999999990940CDCCCCCCCCCC10400000000000000C40CDCCCCCCCCCC1240CDCCCCCCCCCC0C409A99999999991340");
|
||||
}
|
||||
|
||||
{
|
||||
const std::string wkb{factory.create_linestring(wnl, osmium::geom::use_nodes::unique, osmium::geom::direction::backward)};
|
||||
REQUIRE(wkb == "010200000003000000CDCCCCCCCCCC0C409A999999999913400000000000000C40CDCCCCCCCCCC12409A99999999990940CDCCCCCCCCCC1040");
|
||||
}
|
||||
|
||||
{
|
||||
const std::string wkb{factory.create_linestring(wnl, osmium::geom::use_nodes::all)};
|
||||
REQUIRE(wkb == "0102000000040000009A99999999990940CDCCCCCCCCCC10400000000000000C40CDCCCCCCCCCC12400000000000000C40CDCCCCCCCCCC1240CDCCCCCCCCCC0C409A99999999991340");
|
||||
}
|
||||
|
||||
{
|
||||
const std::string wkb{factory.create_linestring(wnl, osmium::geom::use_nodes::all, osmium::geom::direction::backward)};
|
||||
REQUIRE(wkb == "010200000004000000CDCCCCCCCCCC0C409A999999999913400000000000000C40CDCCCCCCCCCC12400000000000000C40CDCCCCCCCCCC12409A99999999990940CDCCCCCCCCCC1040");
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("linestring as ewkb") {
|
||||
osmium::geom::WKBFactory<> factory{osmium::geom::wkb_type::ewkb, osmium::geom::out_type::hex};
|
||||
|
||||
const auto& wnl = create_test_wnl_okay(buffer);
|
||||
|
||||
const std::string ewkb{factory.create_linestring(wnl)};
|
||||
REQUIRE(ewkb == "0102000020E6100000030000009A99999999990940CDCCCCCCCCCC10400000000000000C40CDCCCCCCCCCC1240CDCCCCCCCCCC0C409A99999999991340");
|
||||
}
|
||||
|
||||
SECTION("linestring with two same locations") {
|
||||
osmium::geom::WKBFactory<> factory{osmium::geom::wkb_type::wkb, osmium::geom::out_type::hex};
|
||||
|
||||
const auto& wnl = create_test_wnl_same_location(buffer);
|
||||
|
||||
SECTION("unique forwards (default)") {
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl), const osmium::geometry_error&);
|
||||
}
|
||||
|
||||
SECTION("unique backwards") {
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl, osmium::geom::use_nodes::unique, osmium::geom::direction::backward), const osmium::geometry_error&);
|
||||
}
|
||||
|
||||
SECTION("all forwards") {
|
||||
const std::string wkb{factory.create_linestring(wnl, osmium::geom::use_nodes::all)};
|
||||
REQUIRE(wkb == "0102000000020000000000000000000C40CDCCCCCCCCCC12400000000000000C40CDCCCCCCCCCC1240");
|
||||
}
|
||||
|
||||
SECTION("all backwards") {
|
||||
const std::string wkb{factory.create_linestring(wnl, osmium::geom::use_nodes::all, osmium::geom::direction::backward)};
|
||||
REQUIRE(wkb == "0102000000020000000000000000000C40CDCCCCCCCCCC12400000000000000C40CDCCCCCCCCCC1240");
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("linestring with undefined location") {
|
||||
osmium::geom::WKBFactory<> factory{osmium::geom::wkb_type::wkb, osmium::geom::out_type::hex};
|
||||
|
||||
const auto& wnl = create_test_wnl_undefined_location(buffer);
|
||||
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl), const osmium::invalid_location&);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
TEST_CASE("WKB geometry (byte-order-independent)") {
|
||||
|
||||
osmium::geom::WKBFactory<> factory{osmium::geom::wkb_type::wkb, osmium::geom::out_type::hex};
|
||||
|
||||
SECTION("empty point") {
|
||||
REQUIRE_THROWS_AS(factory.create_point(osmium::Location{}), const osmium::invalid_location&);
|
||||
}
|
||||
|
||||
SECTION("empty linestring") {
|
||||
osmium::memory::Buffer buffer{10000};
|
||||
const auto& wnl = create_test_wnl_empty(buffer);
|
||||
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl), const osmium::geometry_error&);
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl, osmium::geom::use_nodes::unique, osmium::geom::direction::backward), const osmium::geometry_error&);
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl, osmium::geom::use_nodes::all), const osmium::geometry_error&);
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl, osmium::geom::use_nodes::all, osmium::geom::direction::backward), const osmium::geometry_error&);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/geom/mercator_projection.hpp>
|
||||
#include <osmium/geom/wkt.hpp>
|
||||
|
||||
#include "area_helper.hpp"
|
||||
#include "wnl_helper.hpp"
|
||||
|
||||
TEST_CASE("WKT geometry for point") {
|
||||
const osmium::geom::WKTFactory<> factory;
|
||||
const std::string wkt{factory.create_point(osmium::Location{3.2, 4.2})};
|
||||
REQUIRE(wkt == "POINT(3.2 4.2)");
|
||||
}
|
||||
|
||||
TEST_CASE("WKT geometry for empty point") {
|
||||
const osmium::geom::WKTFactory<> factory;
|
||||
REQUIRE_THROWS_AS(factory.create_point(osmium::Location()), const osmium::invalid_location&);
|
||||
}
|
||||
|
||||
TEST_CASE("WKT geometry for point in ekwt") {
|
||||
const osmium::geom::WKTFactory<> factory{7, osmium::geom::wkt_type::ewkt};
|
||||
|
||||
const std::string wkt{factory.create_point(osmium::Location{3.2, 4.2})};
|
||||
REQUIRE(wkt == "SRID=4326;POINT(3.2 4.2)");
|
||||
}
|
||||
|
||||
TEST_CASE("WKT geometry for point in ekwt in web mercator") {
|
||||
const osmium::geom::WKTFactory<osmium::geom::MercatorProjection> factory{2, osmium::geom::wkt_type::ewkt};
|
||||
|
||||
const std::string wkt{factory.create_point(osmium::Location{3.2, 4.2})};
|
||||
REQUIRE(wkt == "SRID=3857;POINT(356222.37 467961.14)");
|
||||
}
|
||||
|
||||
TEST_CASE("WKT geometry factory") {
|
||||
osmium::geom::WKTFactory<> factory;
|
||||
|
||||
osmium::memory::Buffer buffer{10000};
|
||||
|
||||
SECTION("linestring") {
|
||||
const auto& wnl = create_test_wnl_okay(buffer);
|
||||
|
||||
SECTION("unique forwards (default)") {
|
||||
const std::string wkt{factory.create_linestring(wnl)};
|
||||
REQUIRE(wkt == "LINESTRING(3.2 4.2,3.5 4.7,3.6 4.9)");
|
||||
}
|
||||
|
||||
SECTION("unique backwards") {
|
||||
const std::string wkt{factory.create_linestring(wnl, osmium::geom::use_nodes::unique, osmium::geom::direction::backward)};
|
||||
REQUIRE(wkt == "LINESTRING(3.6 4.9,3.5 4.7,3.2 4.2)");
|
||||
}
|
||||
|
||||
SECTION("all forwards") {
|
||||
const std::string wkt{factory.create_linestring(wnl, osmium::geom::use_nodes::all)};
|
||||
REQUIRE(wkt == "LINESTRING(3.2 4.2,3.5 4.7,3.5 4.7,3.6 4.9)");
|
||||
}
|
||||
|
||||
SECTION("all backwards") {
|
||||
const std::string wkt{factory.create_linestring(wnl, osmium::geom::use_nodes::all, osmium::geom::direction::backward)};
|
||||
REQUIRE(wkt == "LINESTRING(3.6 4.9,3.5 4.7,3.5 4.7,3.2 4.2)");
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("empty linestring") {
|
||||
const auto& wnl = create_test_wnl_empty(buffer);
|
||||
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl), const osmium::geometry_error&);
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl, osmium::geom::use_nodes::unique, osmium::geom::direction::backward), const osmium::geometry_error&);
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl, osmium::geom::use_nodes::all), const osmium::geometry_error&);
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl, osmium::geom::use_nodes::all, osmium::geom::direction::backward), const osmium::geometry_error&);
|
||||
}
|
||||
|
||||
SECTION("linestring with two same locations") {
|
||||
const auto& wnl = create_test_wnl_same_location(buffer);
|
||||
|
||||
SECTION("unique forwards") {
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl), const osmium::geometry_error&);
|
||||
|
||||
try {
|
||||
factory.create_linestring(wnl);
|
||||
} catch (const osmium::geometry_error& e) {
|
||||
REQUIRE(e.id() == 0);
|
||||
REQUIRE(std::string(e.what()) == "need at least two points for linestring");
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("unique backwards") {
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl, osmium::geom::use_nodes::unique, osmium::geom::direction::backward), const osmium::geometry_error&);
|
||||
}
|
||||
|
||||
SECTION("all forwards") {
|
||||
const std::string wkt{factory.create_linestring(wnl, osmium::geom::use_nodes::all)};
|
||||
REQUIRE(wkt == "LINESTRING(3.5 4.7,3.5 4.7)");
|
||||
}
|
||||
|
||||
SECTION("all backwards") {
|
||||
const std::string wkt{factory.create_linestring(wnl, osmium::geom::use_nodes::all, osmium::geom::direction::backward)};
|
||||
REQUIRE(wkt == "LINESTRING(3.5 4.7,3.5 4.7)");
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("linestring with undefined location") {
|
||||
const auto& wnl = create_test_wnl_undefined_location(buffer);
|
||||
|
||||
REQUIRE_THROWS_AS(factory.create_linestring(wnl), const osmium::invalid_location&);
|
||||
}
|
||||
|
||||
SECTION("area with one outer and no inner rings") {
|
||||
const osmium::Area& area = create_test_area_1outer_0inner(buffer);
|
||||
|
||||
const std::string wkt{factory.create_multipolygon(area)};
|
||||
REQUIRE(wkt == "MULTIPOLYGON(((3.2 4.2,3.5 4.7,3.6 4.9,3.2 4.2)))");
|
||||
}
|
||||
|
||||
SECTION("area with one outer and one inner ring") {
|
||||
const osmium::Area& area = create_test_area_1outer_1inner(buffer);
|
||||
|
||||
const std::string wkt{factory.create_multipolygon(area)};
|
||||
REQUIRE(wkt == "MULTIPOLYGON(((0.1 0.1,9.1 0.1,9.1 9.1,0.1 9.1,0.1 0.1),(1 1,8 1,8 8,1 8,1 1)))");
|
||||
}
|
||||
|
||||
SECTION("area with two outer and two inner rings") {
|
||||
const osmium::Area& area = create_test_area_2outer_2inner(buffer);
|
||||
|
||||
const std::string wkt{factory.create_multipolygon(area)};
|
||||
REQUIRE(wkt == "MULTIPOLYGON(((0.1 0.1,9.1 0.1,9.1 9.1,0.1 9.1,0.1 0.1),(1 1,4 1,4 4,1 4,1 1),(5 5,5 7,7 7,5 5)),((10 10,11 10,11 11,10 11,10 10)))");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
|
||||
#include <osmium/builder/attr.hpp>
|
||||
#include <osmium/memory/buffer.hpp>
|
||||
#include <osmium/osm/node_ref_list.hpp>
|
||||
|
||||
using namespace osmium::builder::attr;
|
||||
|
||||
inline const osmium::WayNodeList& create_test_wnl_okay(osmium::memory::Buffer& buffer) {
|
||||
const auto pos = osmium::builder::add_way_node_list(buffer, _nodes({
|
||||
{1, {3.2, 4.2}},
|
||||
{3, {3.5, 4.7}},
|
||||
{4, {3.5, 4.7}},
|
||||
{2, {3.6, 4.9}}
|
||||
}));
|
||||
|
||||
return buffer.get<osmium::WayNodeList>(pos);
|
||||
}
|
||||
|
||||
inline const osmium::WayNodeList& create_test_wnl_empty(osmium::memory::Buffer& buffer) {
|
||||
{
|
||||
osmium::builder::WayNodeListBuilder wnl_builder(buffer);
|
||||
}
|
||||
|
||||
return buffer.get<osmium::WayNodeList>(buffer.commit());
|
||||
}
|
||||
|
||||
inline const osmium::WayNodeList& create_test_wnl_same_location(osmium::memory::Buffer& buffer) {
|
||||
const auto pos = osmium::builder::add_way_node_list(buffer, _nodes({
|
||||
{1, {3.5, 4.7}},
|
||||
{2, {3.5, 4.7}}
|
||||
}));
|
||||
|
||||
return buffer.get<osmium::WayNodeList>(pos);
|
||||
}
|
||||
|
||||
inline const osmium::WayNodeList& create_test_wnl_undefined_location(osmium::memory::Buffer& buffer) {
|
||||
const auto pos = osmium::builder::add_way_node_list(buffer, _nodes({
|
||||
{1, {3.5, 4.7}},
|
||||
{2, osmium::Location()}
|
||||
}));
|
||||
|
||||
return buffer.get<osmium::WayNodeList>(pos);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/handler/check_order.hpp>
|
||||
#include <osmium/memory/buffer.hpp>
|
||||
#include <osmium/opl.hpp>
|
||||
#include <osmium/visitor.hpp>
|
||||
|
||||
TEST_CASE("CheckOrder handler if everything is in order") {
|
||||
osmium::memory::Buffer buffer{1024};
|
||||
|
||||
REQUIRE(osmium::opl_parse("n-126", buffer));
|
||||
REQUIRE(osmium::opl_parse("n123", buffer));
|
||||
REQUIRE(osmium::opl_parse("n124", buffer));
|
||||
REQUIRE(osmium::opl_parse("n128", buffer));
|
||||
REQUIRE(osmium::opl_parse("w-100", buffer));
|
||||
REQUIRE(osmium::opl_parse("w100", buffer));
|
||||
REQUIRE(osmium::opl_parse("w102", buffer));
|
||||
REQUIRE(osmium::opl_parse("r-200", buffer));
|
||||
REQUIRE(osmium::opl_parse("r100", buffer));
|
||||
|
||||
osmium::handler::CheckOrder handler;
|
||||
osmium::apply(buffer, handler);
|
||||
REQUIRE(handler.max_node_id() == 128);
|
||||
REQUIRE(handler.max_way_id() == 102);
|
||||
REQUIRE(handler.max_relation_id() == 100);
|
||||
}
|
||||
|
||||
TEST_CASE("CheckOrder handler: Nodes must be in order") {
|
||||
osmium::memory::Buffer buffer{1024};
|
||||
|
||||
REQUIRE(osmium::opl_parse("n3", buffer));
|
||||
|
||||
SECTION("Positive ID") {
|
||||
REQUIRE(osmium::opl_parse("n2", buffer));
|
||||
}
|
||||
SECTION("Negative ID") {
|
||||
REQUIRE(osmium::opl_parse("n-2", buffer));
|
||||
}
|
||||
|
||||
osmium::handler::CheckOrder handler;
|
||||
REQUIRE_THROWS_AS(osmium::apply(buffer, handler), const osmium::out_of_order_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("CheckOrder handler: Ways must be in order") {
|
||||
osmium::memory::Buffer buffer{1024};
|
||||
|
||||
REQUIRE(osmium::opl_parse("w3", buffer));
|
||||
SECTION("Positive ID") {
|
||||
REQUIRE(osmium::opl_parse("w2", buffer));
|
||||
}
|
||||
SECTION("Negative ID") {
|
||||
REQUIRE(osmium::opl_parse("w-2", buffer));
|
||||
}
|
||||
|
||||
osmium::handler::CheckOrder handler;
|
||||
REQUIRE_THROWS_AS(osmium::apply(buffer, handler), const osmium::out_of_order_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("CheckOrder handler: Relations must be in order") {
|
||||
osmium::memory::Buffer buffer{1024};
|
||||
|
||||
REQUIRE(osmium::opl_parse("r3", buffer));
|
||||
SECTION("Positive ID") {
|
||||
REQUIRE(osmium::opl_parse("r2", buffer));
|
||||
}
|
||||
SECTION("Negative ID") {
|
||||
REQUIRE(osmium::opl_parse("r-2", buffer));
|
||||
}
|
||||
|
||||
osmium::handler::CheckOrder handler;
|
||||
REQUIRE_THROWS_AS(osmium::apply(buffer, handler), const osmium::out_of_order_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("CheckOrder handler: Same id twice is not allowed") {
|
||||
osmium::memory::Buffer buffer{1024};
|
||||
|
||||
REQUIRE(osmium::opl_parse("n3", buffer));
|
||||
REQUIRE(osmium::opl_parse("n3", buffer));
|
||||
|
||||
osmium::handler::CheckOrder handler;
|
||||
REQUIRE_THROWS_AS(osmium::apply(buffer, handler), const osmium::out_of_order_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("CheckOrder handler: Nodes after ways") {
|
||||
osmium::memory::Buffer buffer{1024};
|
||||
|
||||
REQUIRE(osmium::opl_parse("w50", buffer));
|
||||
SECTION("Positive ID") {
|
||||
REQUIRE(osmium::opl_parse("n30", buffer));
|
||||
}
|
||||
SECTION("Negative ID") {
|
||||
REQUIRE(osmium::opl_parse("n-30", buffer));
|
||||
}
|
||||
|
||||
osmium::handler::CheckOrder handler;
|
||||
REQUIRE_THROWS_AS(osmium::apply(buffer, handler), const osmium::out_of_order_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("CheckOrder handler: Nodes after relations") {
|
||||
osmium::memory::Buffer buffer{1024};
|
||||
|
||||
REQUIRE(osmium::opl_parse("r50", buffer));
|
||||
SECTION("Positive ID") {
|
||||
REQUIRE(osmium::opl_parse("n30", buffer));
|
||||
}
|
||||
SECTION("Negative ID") {
|
||||
REQUIRE(osmium::opl_parse("n-30", buffer));
|
||||
}
|
||||
|
||||
osmium::handler::CheckOrder handler;
|
||||
REQUIRE_THROWS_AS(osmium::apply(buffer, handler), const osmium::out_of_order_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("CheckOrder handler: Ways after relations") {
|
||||
osmium::memory::Buffer buffer{1024};
|
||||
|
||||
REQUIRE(osmium::opl_parse("r50", buffer));
|
||||
SECTION("Positive ID") {
|
||||
REQUIRE(osmium::opl_parse("w30", buffer));
|
||||
}
|
||||
SECTION("Negative ID") {
|
||||
REQUIRE(osmium::opl_parse("w-30", buffer));
|
||||
}
|
||||
|
||||
osmium::handler::CheckOrder handler;
|
||||
REQUIRE_THROWS_AS(osmium::apply(buffer, handler), const osmium::out_of_order_error&);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/dynamic_handler.hpp>
|
||||
#include <osmium/builder/attr.hpp>
|
||||
#include <osmium/visitor.hpp>
|
||||
|
||||
struct Handler1 : public osmium::handler::Handler {
|
||||
|
||||
int& count;
|
||||
|
||||
explicit Handler1(int& c) :
|
||||
count(c) {
|
||||
}
|
||||
|
||||
void node(const osmium::Node&) noexcept {
|
||||
++count;
|
||||
}
|
||||
|
||||
void way(const osmium::Way&) noexcept {
|
||||
++count;
|
||||
}
|
||||
|
||||
void relation(const osmium::Relation&) noexcept {
|
||||
++count;
|
||||
}
|
||||
|
||||
void area(const osmium::Area&) noexcept {
|
||||
++count;
|
||||
}
|
||||
|
||||
void changeset(const osmium::Changeset&) noexcept {
|
||||
++count;
|
||||
}
|
||||
|
||||
void flush() noexcept {
|
||||
++count;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
struct Handler2 : public osmium::handler::Handler {
|
||||
|
||||
int& count;
|
||||
|
||||
explicit Handler2(int& c) :
|
||||
count(c) {
|
||||
}
|
||||
|
||||
void node(const osmium::Node&) noexcept {
|
||||
count += 2;
|
||||
}
|
||||
|
||||
void way(const osmium::Way&) noexcept {
|
||||
count += 2;
|
||||
}
|
||||
|
||||
void relation(const osmium::Relation&) noexcept {
|
||||
count += 2;
|
||||
}
|
||||
|
||||
void area(const osmium::Area&) noexcept {
|
||||
count += 2;
|
||||
}
|
||||
|
||||
void changeset(const osmium::Changeset&) noexcept {
|
||||
count += 2;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
osmium::memory::Buffer fill_buffer() {
|
||||
using namespace osmium::builder::attr;
|
||||
osmium::memory::Buffer buffer{1024 * 1024, osmium::memory::Buffer::auto_grow::yes};
|
||||
|
||||
osmium::builder::add_node(buffer, _id(1));
|
||||
osmium::builder::add_way(buffer, _id(2));
|
||||
osmium::builder::add_relation(buffer, _id(3));
|
||||
osmium::builder::add_area(buffer, _id(4));
|
||||
osmium::builder::add_changeset(buffer, _cid(5));
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
TEST_CASE("Base test: static handler") {
|
||||
const auto buffer = fill_buffer();
|
||||
|
||||
int count = 0;
|
||||
Handler1 h1{count};
|
||||
osmium::apply(buffer, h1);
|
||||
REQUIRE(count == 6);
|
||||
|
||||
count = 0;
|
||||
Handler2 h2{count};
|
||||
osmium::apply(buffer, h2);
|
||||
REQUIRE(count == 10);
|
||||
}
|
||||
|
||||
TEST_CASE("Dynamic handler") {
|
||||
const auto buffer = fill_buffer();
|
||||
|
||||
osmium::handler::DynamicHandler handler;
|
||||
int count = 0;
|
||||
|
||||
osmium::apply(buffer, handler);
|
||||
REQUIRE(count == 0);
|
||||
|
||||
handler.set<Handler1>(count);
|
||||
osmium::apply(buffer, handler);
|
||||
REQUIRE(count == 6);
|
||||
|
||||
count = 0;
|
||||
handler.set<Handler2>(count);
|
||||
osmium::apply(buffer, handler);
|
||||
REQUIRE(count == 10);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/osm/types.hpp>
|
||||
#include <osmium/osm/location.hpp>
|
||||
#include <osmium/index/detail/tmpfile.hpp>
|
||||
#include <osmium/util/file.hpp>
|
||||
|
||||
#include <osmium/index/map/dense_file_array.hpp>
|
||||
#include <osmium/index/map/sparse_file_array.hpp>
|
||||
|
||||
#include <osmium/index/node_locations_map.hpp>
|
||||
|
||||
TEST_CASE("File based index") {
|
||||
|
||||
const int fd = osmium::detail::create_tmp_file();
|
||||
|
||||
REQUIRE(osmium::util::file_size(fd) == 0);
|
||||
|
||||
const osmium::unsigned_object_id_type id1 = 6;
|
||||
const osmium::unsigned_object_id_type id2 = 3;
|
||||
const osmium::Location loc1(1.2, 4.5);
|
||||
const osmium::Location loc2(3.5, -7.2);
|
||||
|
||||
SECTION("dense index") {
|
||||
using index_type = osmium::index::map::DenseFileArray<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
constexpr const size_t S = sizeof(index_type::element_type);
|
||||
|
||||
{
|
||||
index_type index{fd};
|
||||
|
||||
REQUIRE(index.size() == 0);
|
||||
|
||||
REQUIRE_THROWS_AS(index.get( 0), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 1), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 3), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 5), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 6), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 7), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(100), const osmium::not_found&);
|
||||
|
||||
index.set(id1, loc1);
|
||||
REQUIRE(index.size() == 7);
|
||||
|
||||
index.set(id2, loc2);
|
||||
REQUIRE(index.size() == 7);
|
||||
|
||||
index.sort();
|
||||
|
||||
REQUIRE(loc1 == index.get(id1));
|
||||
REQUIRE(loc2 == index.get(id2));
|
||||
|
||||
REQUIRE_THROWS_AS(index.get( 0), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 1), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 5), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 7), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(100), const osmium::not_found&);
|
||||
|
||||
REQUIRE(index.size() == 7);
|
||||
REQUIRE(std::distance(index.cbegin(), index.cend()) == 7);
|
||||
|
||||
REQUIRE(osmium::util::file_size(fd) >= (6 * S));
|
||||
}
|
||||
|
||||
{
|
||||
index_type index{fd};
|
||||
REQUIRE(osmium::util::file_size(fd) >= (6 * S));
|
||||
|
||||
REQUIRE(index.size() == 7);
|
||||
|
||||
REQUIRE(loc1 == index.get(id1));
|
||||
REQUIRE(loc2 == index.get(id2));
|
||||
|
||||
REQUIRE_THROWS_AS(index.get( 0), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 1), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 5), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 7), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(100), const osmium::not_found&);
|
||||
|
||||
REQUIRE(index.size() == 7);
|
||||
REQUIRE(std::distance(index.cbegin(), index.cend()) == 7);
|
||||
|
||||
auto it = index.cbegin();
|
||||
REQUIRE(*it++ == osmium::Location{});
|
||||
REQUIRE(*it++ == osmium::Location{});
|
||||
REQUIRE(*it++ == osmium::Location{});
|
||||
REQUIRE(*it++ == loc2);
|
||||
REQUIRE(*it++ == osmium::Location{});
|
||||
REQUIRE(*it++ == osmium::Location{});
|
||||
REQUIRE(*it++ == loc1);
|
||||
REQUIRE(it++ == index.cend());
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("sparse index") {
|
||||
using index_type = osmium::index::map::SparseFileArray<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
constexpr const size_t S = sizeof(index_type::element_type);
|
||||
|
||||
{
|
||||
index_type index{fd};
|
||||
|
||||
REQUIRE(index.size() == 0);
|
||||
|
||||
REQUIRE_THROWS_AS(index.get( 0), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 1), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 3), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 5), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 6), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 7), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(100), const osmium::not_found&);
|
||||
|
||||
index.set(id1, loc1);
|
||||
REQUIRE(index.size() == 1);
|
||||
|
||||
index.set(id2, loc2);
|
||||
REQUIRE(index.size() == 2);
|
||||
|
||||
index.sort();
|
||||
|
||||
REQUIRE(loc1 == index.get(id1));
|
||||
REQUIRE(loc2 == index.get(id2));
|
||||
|
||||
REQUIRE_THROWS_AS(index.get( 0), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 1), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 5), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 7), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(100), const osmium::not_found&);
|
||||
|
||||
REQUIRE(index.size() == 2);
|
||||
REQUIRE(std::distance(index.cbegin(), index.cend()) == 2);
|
||||
|
||||
REQUIRE(osmium::util::file_size(fd) >= (2 * S));
|
||||
}
|
||||
|
||||
{
|
||||
index_type index{fd};
|
||||
REQUIRE(osmium::util::file_size(fd) >= (2 * S));
|
||||
|
||||
REQUIRE(index.size() == 2);
|
||||
|
||||
REQUIRE(loc1 == index.get(id1));
|
||||
REQUIRE(loc2 == index.get(id2));
|
||||
|
||||
REQUIRE_THROWS_AS(index.get( 0), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 1), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 5), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get( 7), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(100), const osmium::not_found&);
|
||||
|
||||
REQUIRE(index.size() == 2);
|
||||
REQUIRE(std::distance(index.cbegin(), index.cend()) == 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+166
@@ -0,0 +1,166 @@
|
||||
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/index/id_set.hpp>
|
||||
#include <osmium/osm/types.hpp>
|
||||
|
||||
TEST_CASE("Basic functionality of IdSetDense") {
|
||||
osmium::index::IdSetDense<osmium::unsigned_object_id_type> s;
|
||||
|
||||
REQUIRE_FALSE(s.get(17));
|
||||
REQUIRE_FALSE(s.get(28));
|
||||
REQUIRE(s.empty());
|
||||
REQUIRE(s.size() == 0);
|
||||
|
||||
s.set(17);
|
||||
REQUIRE(s.get(17));
|
||||
REQUIRE_FALSE(s.get(28));
|
||||
REQUIRE_FALSE(s.empty());
|
||||
REQUIRE(s.size() == 1);
|
||||
|
||||
s.set(28);
|
||||
REQUIRE(s.get(17));
|
||||
REQUIRE(s.get(28));
|
||||
REQUIRE_FALSE(s.empty());
|
||||
REQUIRE(s.size() == 2);
|
||||
|
||||
s.set(17);
|
||||
REQUIRE(s.get(17));
|
||||
REQUIRE(s.size() == 2);
|
||||
|
||||
REQUIRE_FALSE(s.check_and_set(17));
|
||||
REQUIRE(s.get(17));
|
||||
REQUIRE(s.size() == 2);
|
||||
|
||||
s.unset(17);
|
||||
REQUIRE_FALSE(s.get(17));
|
||||
REQUIRE(s.size() == 1);
|
||||
|
||||
REQUIRE(s.check_and_set(32));
|
||||
REQUIRE(s.get(32));
|
||||
REQUIRE(s.size() == 2);
|
||||
|
||||
s.clear();
|
||||
REQUIRE(s.empty());
|
||||
REQUIRE(s.size() == 0);
|
||||
}
|
||||
|
||||
TEST_CASE("Iterating over IdSetDense") {
|
||||
osmium::index::IdSetDense<osmium::unsigned_object_id_type> s;
|
||||
s.set(7);
|
||||
s.set(35);
|
||||
s.set(35);
|
||||
s.set(20);
|
||||
s.set(1ULL << 33);
|
||||
s.set(21);
|
||||
s.set((1ULL << 27) + 13);
|
||||
|
||||
REQUIRE(s.size() == 6);
|
||||
|
||||
auto it = s.begin();
|
||||
REQUIRE(it != s.end());
|
||||
REQUIRE(*it == 7);
|
||||
++it;
|
||||
REQUIRE(it != s.end());
|
||||
REQUIRE(*it == 20);
|
||||
++it;
|
||||
REQUIRE(it != s.end());
|
||||
REQUIRE(*it == 21);
|
||||
++it;
|
||||
REQUIRE(it != s.end());
|
||||
REQUIRE(*it == 35);
|
||||
++it;
|
||||
REQUIRE(it != s.end());
|
||||
REQUIRE(*it == (1ULL << 27) + 13);
|
||||
++it;
|
||||
REQUIRE(it != s.end());
|
||||
REQUIRE(*it == 1ULL << 33);
|
||||
++it;
|
||||
REQUIRE(it == s.end());
|
||||
}
|
||||
|
||||
TEST_CASE("Test with larger Ids") {
|
||||
osmium::index::IdSetDense<osmium::unsigned_object_id_type> s;
|
||||
|
||||
const osmium::unsigned_object_id_type start = 25;
|
||||
const osmium::unsigned_object_id_type end = 100000000;
|
||||
const osmium::unsigned_object_id_type step = 123456;
|
||||
|
||||
for (osmium::unsigned_object_id_type i = start; i < end; i += step) {
|
||||
s.set(i);
|
||||
}
|
||||
|
||||
for (osmium::unsigned_object_id_type i = start; i < end; i += step) {
|
||||
REQUIRE(s.get(i));
|
||||
REQUIRE_FALSE(s.get(i + 1));
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("Large gap") {
|
||||
osmium::index::IdSetDense<osmium::unsigned_object_id_type> s;
|
||||
|
||||
s.set(3);
|
||||
s.set(1 << 30);
|
||||
|
||||
REQUIRE(s.get(1 << 30));
|
||||
REQUIRE_FALSE(s.get(1 << 29));
|
||||
}
|
||||
|
||||
TEST_CASE("Basic functionality of IdSetSmall") {
|
||||
osmium::index::IdSetSmall<osmium::unsigned_object_id_type> s;
|
||||
|
||||
REQUIRE_FALSE(s.get(17));
|
||||
REQUIRE_FALSE(s.get(28));
|
||||
REQUIRE(s.empty());
|
||||
|
||||
s.set(17);
|
||||
REQUIRE(s.get(17));
|
||||
REQUIRE_FALSE(s.get(28));
|
||||
REQUIRE_FALSE(s.empty());
|
||||
|
||||
s.set(28);
|
||||
REQUIRE(s.get(17));
|
||||
REQUIRE(s.get(28));
|
||||
REQUIRE_FALSE(s.empty());
|
||||
|
||||
s.clear();
|
||||
REQUIRE(s.empty());
|
||||
}
|
||||
|
||||
TEST_CASE("Iterating over IdSetSmall") {
|
||||
osmium::index::IdSetSmall<osmium::unsigned_object_id_type> s;
|
||||
s.set(7);
|
||||
s.set(35);
|
||||
s.set(35);
|
||||
s.set(20);
|
||||
s.set(1ULL << 33);
|
||||
s.set(21);
|
||||
s.set((1ULL << 27) + 13);
|
||||
|
||||
// needs to be called before size() and iterator will work properly
|
||||
s.sort_unique();
|
||||
|
||||
REQUIRE(s.size() == 6);
|
||||
|
||||
auto it = s.begin();
|
||||
REQUIRE(it != s.end());
|
||||
REQUIRE(*it == 7);
|
||||
++it;
|
||||
REQUIRE(it != s.end());
|
||||
REQUIRE(*it == 20);
|
||||
++it;
|
||||
REQUIRE(it != s.end());
|
||||
REQUIRE(*it == 21);
|
||||
++it;
|
||||
REQUIRE(it != s.end());
|
||||
REQUIRE(*it == 35);
|
||||
++it;
|
||||
REQUIRE(it != s.end());
|
||||
REQUIRE(*it == (1ULL << 27) + 13);
|
||||
++it;
|
||||
REQUIRE(it != s.end());
|
||||
REQUIRE(*it == 1ULL << 33);
|
||||
++it;
|
||||
REQUIRE(it == s.end());
|
||||
}
|
||||
|
||||
@@ -0,0 +1,258 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/osm/types.hpp>
|
||||
#include <osmium/osm/location.hpp>
|
||||
|
||||
#include <osmium/index/map/dense_file_array.hpp>
|
||||
#include <osmium/index/map/dense_mem_array.hpp>
|
||||
#include <osmium/index/map/dense_mmap_array.hpp>
|
||||
#include <osmium/index/map/dummy.hpp>
|
||||
#include <osmium/index/map/flex_mem.hpp>
|
||||
#include <osmium/index/map/sparse_file_array.hpp>
|
||||
#include <osmium/index/map/sparse_mem_array.hpp>
|
||||
#include <osmium/index/map/sparse_mem_map.hpp>
|
||||
#include <osmium/index/map/sparse_mem_table.hpp>
|
||||
#include <osmium/index/map/sparse_mmap_array.hpp>
|
||||
|
||||
#include <osmium/index/node_locations_map.hpp>
|
||||
|
||||
static_assert(osmium::index::empty_value<osmium::Location>() == osmium::Location{}, "Empty value for location is wrong");
|
||||
|
||||
template <typename TIndex>
|
||||
void test_func_all(TIndex& index) {
|
||||
const osmium::unsigned_object_id_type id1 = 12;
|
||||
const osmium::unsigned_object_id_type id2 = 3;
|
||||
const osmium::Location loc1{1.2, 4.5};
|
||||
const osmium::Location loc2{3.5, -7.2};
|
||||
|
||||
REQUIRE_THROWS_AS(index.get(id1), const osmium::not_found&);
|
||||
|
||||
index.set(id1, loc1);
|
||||
index.set(id2, loc2);
|
||||
|
||||
index.sort();
|
||||
|
||||
REQUIRE_THROWS_AS(index.get(0), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(1), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(5), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(100), const osmium::not_found&);
|
||||
REQUIRE_THROWS_WITH(index.get(0), "id 0 not found");
|
||||
REQUIRE_THROWS_WITH(index.get(1), "id 1 not found");
|
||||
|
||||
REQUIRE(index.get_noexcept(0) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(1) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(5) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(100) == osmium::Location{});
|
||||
}
|
||||
|
||||
template <typename TIndex>
|
||||
void test_func_real(TIndex& index) {
|
||||
const osmium::unsigned_object_id_type id1 = 12;
|
||||
const osmium::unsigned_object_id_type id2 = 3;
|
||||
const osmium::Location loc1{1.2, 4.5};
|
||||
const osmium::Location loc2{3.5, -7.2};
|
||||
|
||||
index.set(id1, loc1);
|
||||
index.set(id2, loc2);
|
||||
|
||||
index.sort();
|
||||
|
||||
REQUIRE(loc1 == index.get(id1));
|
||||
REQUIRE(loc2 == index.get(id2));
|
||||
|
||||
REQUIRE(loc1 == index.get_noexcept(id1));
|
||||
REQUIRE(loc2 == index.get_noexcept(id2));
|
||||
|
||||
REQUIRE_THROWS_AS(index.get(0), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(1), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(5), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(100), const osmium::not_found&);
|
||||
|
||||
REQUIRE(index.get_noexcept(0) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(1) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(5) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(100) == osmium::Location{});
|
||||
|
||||
index.clear();
|
||||
|
||||
REQUIRE_THROWS_AS(index.get(id1), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(id2), const osmium::not_found&);
|
||||
|
||||
REQUIRE_THROWS_AS(index.get(0), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(1), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(5), const osmium::not_found&);
|
||||
REQUIRE_THROWS_AS(index.get(100), const osmium::not_found&);
|
||||
|
||||
REQUIRE(index.get_noexcept(id1) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(id2) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(0) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(1) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(5) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(100) == osmium::Location{});
|
||||
}
|
||||
|
||||
TEST_CASE("Map Id to location: Dummy") {
|
||||
using index_type = osmium::index::map::Dummy<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
|
||||
index_type index1;
|
||||
|
||||
REQUIRE(0 == index1.size());
|
||||
REQUIRE(0 == index1.used_memory());
|
||||
|
||||
test_func_all<index_type>(index1);
|
||||
|
||||
REQUIRE(0 == index1.size());
|
||||
REQUIRE(0 == index1.used_memory());
|
||||
}
|
||||
|
||||
TEST_CASE("Map Id to location: DenseMemArray") {
|
||||
using index_type = osmium::index::map::DenseMemArray<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
|
||||
index_type index1;
|
||||
index1.reserve(1000);
|
||||
test_func_all<index_type>(index1);
|
||||
|
||||
index_type index2;
|
||||
index2.reserve(1000);
|
||||
test_func_real<index_type>(index2);
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
TEST_CASE("Map Id to location: DenseMmapArray") {
|
||||
using index_type = osmium::index::map::DenseMmapArray<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
|
||||
index_type index1;
|
||||
test_func_all<index_type>(index1);
|
||||
|
||||
index_type index2;
|
||||
test_func_real<index_type>(index2);
|
||||
}
|
||||
#else
|
||||
# pragma message("not running 'DenseMapMmap' test case on this machine")
|
||||
#endif
|
||||
|
||||
TEST_CASE("Map Id to location: DenseFileArray") {
|
||||
using index_type = osmium::index::map::DenseFileArray<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
|
||||
index_type index1;
|
||||
test_func_all<index_type>(index1);
|
||||
|
||||
index_type index2;
|
||||
test_func_real<index_type>(index2);
|
||||
}
|
||||
|
||||
#ifdef OSMIUM_WITH_SPARSEHASH
|
||||
|
||||
TEST_CASE("Map Id to location: SparseMemTable") {
|
||||
using index_type = osmium::index::map::SparseMemTable<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
|
||||
index_type index1;
|
||||
test_func_all<index_type>(index1);
|
||||
|
||||
index_type index2;
|
||||
test_func_real<index_type>(index2);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
TEST_CASE("Map Id to location: SparseMemMap") {
|
||||
using index_type = osmium::index::map::SparseMemMap<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
|
||||
index_type index1;
|
||||
test_func_all<index_type>(index1);
|
||||
|
||||
index_type index2;
|
||||
test_func_real<index_type>(index2);
|
||||
}
|
||||
|
||||
TEST_CASE("Map Id to location: SparseMemArray") {
|
||||
using index_type = osmium::index::map::SparseMemArray<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
|
||||
index_type index1;
|
||||
|
||||
REQUIRE(0 == index1.size());
|
||||
REQUIRE(0 == index1.used_memory());
|
||||
|
||||
test_func_all<index_type>(index1);
|
||||
|
||||
REQUIRE(2 == index1.size());
|
||||
|
||||
index_type index2;
|
||||
test_func_real<index_type>(index2);
|
||||
}
|
||||
|
||||
TEST_CASE("Map Id to location: FlexMem sparse") {
|
||||
using index_type = osmium::index::map::FlexMem<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
|
||||
index_type index1;
|
||||
test_func_all<index_type>(index1);
|
||||
|
||||
index_type index2;
|
||||
test_func_real<index_type>(index2);
|
||||
}
|
||||
|
||||
TEST_CASE("Map Id to location: FlexMem dense") {
|
||||
using index_type = osmium::index::map::FlexMem<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
|
||||
index_type index1{true};
|
||||
test_func_all<index_type>(index1);
|
||||
|
||||
index_type index2{true};
|
||||
test_func_real<index_type>(index2);
|
||||
}
|
||||
|
||||
TEST_CASE("Map Id to location: FlexMem switch") {
|
||||
using index_type = osmium::index::map::FlexMem<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
|
||||
const osmium::Location loc1{1.1, 1.2};
|
||||
const osmium::Location loc2{2.2, -9.4};
|
||||
|
||||
index_type index;
|
||||
|
||||
REQUIRE(index.size() == 0);
|
||||
|
||||
index.set(17, loc1);
|
||||
index.set(99, loc2);
|
||||
|
||||
REQUIRE_FALSE(index.is_dense());
|
||||
REQUIRE(index.size() == 2);
|
||||
REQUIRE(index.get_noexcept(0) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(1) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(17) == loc1);
|
||||
REQUIRE(index.get_noexcept(99) == loc2);
|
||||
REQUIRE(index.get_noexcept(2000000000) == osmium::Location{});
|
||||
|
||||
index.switch_to_dense();
|
||||
|
||||
REQUIRE(index.is_dense());
|
||||
REQUIRE(index.size() >= 2);
|
||||
REQUIRE(index.get_noexcept(0) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(1) == osmium::Location{});
|
||||
REQUIRE(index.get_noexcept(17) == loc1);
|
||||
REQUIRE(index.get_noexcept(99) == loc2);
|
||||
REQUIRE(index.get_noexcept(2000000000) == osmium::Location{});
|
||||
}
|
||||
|
||||
TEST_CASE("Map Id to location: Dynamic map choice") {
|
||||
using map_type = osmium::index::map::Map<osmium::unsigned_object_id_type, osmium::Location>;
|
||||
const auto& map_factory = osmium::index::MapFactory<osmium::unsigned_object_id_type, osmium::Location>::instance();
|
||||
|
||||
const std::vector<std::string> map_type_names = map_factory.map_types();
|
||||
REQUIRE(map_type_names.size() >= 6);
|
||||
|
||||
REQUIRE_THROWS_AS(map_factory.create_map(""), const osmium::map_factory_error&);
|
||||
REQUIRE_THROWS_AS(map_factory.create_map("does not exist"), const osmium::map_factory_error&);
|
||||
REQUIRE_THROWS_WITH(map_factory.create_map(""), "Need non-empty map type name");
|
||||
REQUIRE_THROWS_WITH(map_factory.create_map("does not exist"), "Support for map type 'does not exist' not compiled into this binary");
|
||||
|
||||
for (const auto& map_type_name : map_type_names) {
|
||||
std::unique_ptr<map_type> index1 = map_factory.create_map(map_type_name);
|
||||
index1->reserve(1000);
|
||||
test_func_all<map_type>(*index1);
|
||||
|
||||
std::unique_ptr<map_type> index2 = map_factory.create_map(map_type_name);
|
||||
index2->reserve(1000);
|
||||
test_func_real<map_type>(*index2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/builder/attr.hpp>
|
||||
#include <osmium/memory/buffer.hpp>
|
||||
#include <osmium/object_pointer_collection.hpp>
|
||||
#include <osmium/osm/object_comparisons.hpp>
|
||||
#include <osmium/visitor.hpp>
|
||||
|
||||
using namespace osmium::builder::attr;
|
||||
|
||||
TEST_CASE("Create ObjectPointerCollection") {
|
||||
osmium::memory::Buffer buffer{1024, osmium::memory::Buffer::auto_grow::yes};
|
||||
|
||||
osmium::builder::add_node(buffer,
|
||||
_id(3),
|
||||
_version(3)
|
||||
);
|
||||
|
||||
osmium::builder::add_node(buffer,
|
||||
_id(1),
|
||||
_version(2)
|
||||
);
|
||||
|
||||
osmium::builder::add_node(buffer,
|
||||
_id(1),
|
||||
_version(4)
|
||||
);
|
||||
|
||||
osmium::ObjectPointerCollection collection;
|
||||
REQUIRE(collection.empty());
|
||||
REQUIRE(collection.size() == 0);
|
||||
|
||||
osmium::apply(buffer, collection);
|
||||
|
||||
REQUIRE_FALSE(collection.empty());
|
||||
REQUIRE(collection.size() == 3);
|
||||
|
||||
auto it = collection.cbegin();
|
||||
REQUIRE(it->id() == 3);
|
||||
REQUIRE(it->version() == 3);
|
||||
++it;
|
||||
REQUIRE(it->id() == 1);
|
||||
REQUIRE(it->version() == 2);
|
||||
++it;
|
||||
REQUIRE(it->id() == 1);
|
||||
REQUIRE(it->version() == 4);
|
||||
++it;
|
||||
REQUIRE(it == collection.cend());
|
||||
|
||||
collection.sort(osmium::object_order_type_id_version{});
|
||||
|
||||
REQUIRE(collection.size() == 3);
|
||||
|
||||
it = collection.cbegin();
|
||||
REQUIRE(it->id() == 1);
|
||||
REQUIRE(it->version() == 2);
|
||||
++it;
|
||||
REQUIRE(it->id() == 1);
|
||||
REQUIRE(it->version() == 4);
|
||||
++it;
|
||||
REQUIRE(it->id() == 3);
|
||||
REQUIRE(it->version() == 3);
|
||||
++it;
|
||||
REQUIRE(it == collection.cend());
|
||||
|
||||
collection.sort(osmium::object_order_type_id_reverse_version{});
|
||||
|
||||
it = collection.cbegin();
|
||||
REQUIRE(it->id() == 1);
|
||||
REQUIRE(it->version() == 4);
|
||||
++it;
|
||||
REQUIRE(it->id() == 1);
|
||||
REQUIRE(it->version() == 2);
|
||||
++it;
|
||||
REQUIRE(it->id() == 3);
|
||||
REQUIRE(it->version() == 3);
|
||||
++it;
|
||||
REQUIRE(it == collection.cend());
|
||||
|
||||
collection.clear();
|
||||
|
||||
REQUIRE(collection.empty());
|
||||
REQUIRE(collection.size() == 0);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
#include <osmium/index/relations_map.hpp>
|
||||
|
||||
static_assert(std::is_default_constructible<osmium::index::RelationsMapIndex>::value == false, "RelationsMapIndex should not be default constructible");
|
||||
static_assert(std::is_copy_constructible<osmium::index::RelationsMapIndex>::value == false, "RelationsMapIndex should not be copy constructible");
|
||||
static_assert(std::is_copy_constructible<osmium::index::RelationsMapStash>::value == false, "RelationsMapStash should not be copy constructible");
|
||||
static_assert(std::is_copy_assignable<osmium::index::RelationsMapIndex>::value == false, "RelationsMapIndex should not be copy assignable");
|
||||
static_assert(std::is_copy_assignable<osmium::index::RelationsMapStash>::value == false, "RelationsMapStash should not be copy assignable");
|
||||
|
||||
TEST_CASE("RelationsMapStash lvalue") {
|
||||
osmium::index::RelationsMapStash stash;
|
||||
REQUIRE(stash.empty());
|
||||
REQUIRE(stash.size() == 0);
|
||||
|
||||
stash.add(1, 2);
|
||||
stash.add(2, 3);
|
||||
REQUIRE_FALSE(stash.empty());
|
||||
REQUIRE(stash.size() == 2);
|
||||
|
||||
const auto index = stash.build_member_to_parent_index();
|
||||
|
||||
REQUIRE_FALSE(index.empty());
|
||||
REQUIRE(index.size() == 2);
|
||||
|
||||
int count = 0;
|
||||
index.for_each(1, [&](osmium::unsigned_object_id_type id) {
|
||||
REQUIRE(id == 2);
|
||||
++count;
|
||||
});
|
||||
REQUIRE(count == 1);
|
||||
}
|
||||
|
||||
osmium::index::RelationsMapIndex func() {
|
||||
osmium::index::RelationsMapStash stash;
|
||||
|
||||
stash.add(1, 2);
|
||||
stash.add(2, 3);
|
||||
|
||||
return stash.build_member_to_parent_index();
|
||||
}
|
||||
|
||||
TEST_CASE("RelationsMapStash rvalue") {
|
||||
const osmium::index::RelationsMapIndex index{func()};
|
||||
|
||||
int count = 0;
|
||||
index.for_each(2, [&](osmium::unsigned_object_id_type id) {
|
||||
REQUIRE(id == 3);
|
||||
++count;
|
||||
});
|
||||
REQUIRE(count == 1);
|
||||
}
|
||||
|
||||
TEST_CASE("RelationsMapStash reverse index") {
|
||||
osmium::index::RelationsMapStash stash;
|
||||
REQUIRE(stash.empty());
|
||||
REQUIRE(stash.size() == 0);
|
||||
|
||||
stash.add(1, 2);
|
||||
stash.add(2, 3);
|
||||
REQUIRE_FALSE(stash.empty());
|
||||
REQUIRE(stash.size() == 2);
|
||||
|
||||
const auto index = stash.build_parent_to_member_index();
|
||||
|
||||
REQUIRE_FALSE(index.empty());
|
||||
REQUIRE(index.size() == 2);
|
||||
|
||||
int count = 0;
|
||||
index.for_each(2, [&](osmium::unsigned_object_id_type id) {
|
||||
REQUIRE(id == 1);
|
||||
++count;
|
||||
});
|
||||
index.for_each(3, [&](osmium::unsigned_object_id_type id) {
|
||||
REQUIRE(id == 2);
|
||||
++count;
|
||||
});
|
||||
REQUIRE(count == 2);
|
||||
}
|
||||
|
||||
TEST_CASE("RelationsMapStash both indexes") {
|
||||
osmium::index::RelationsMapStash stash;
|
||||
REQUIRE(stash.empty());
|
||||
REQUIRE(stash.size() == 0);
|
||||
|
||||
stash.add(1, 2);
|
||||
stash.add(2, 3);
|
||||
REQUIRE_FALSE(stash.empty());
|
||||
REQUIRE(stash.size() == 2);
|
||||
|
||||
const auto index = stash.build_indexes();
|
||||
|
||||
REQUIRE_FALSE(index.empty());
|
||||
REQUIRE(index.size() == 2);
|
||||
|
||||
int count = 0;
|
||||
index.member_to_parent().for_each(2, [&](osmium::unsigned_object_id_type id) {
|
||||
REQUIRE(id == 3);
|
||||
++count;
|
||||
});
|
||||
index.parent_to_member().for_each(2, [&](osmium::unsigned_object_id_type id) {
|
||||
REQUIRE(id == 1);
|
||||
++count;
|
||||
});
|
||||
REQUIRE(count == 2);
|
||||
}
|
||||
|
||||
+1
@@ -0,0 +1 @@
|
||||
n1 v1 dV c1 t2014-01-01T00:00:00Z i1 utest T x1.02 y1.02
|
||||
@@ -0,0 +1 @@
|
||||
n1 v1 dV c1 t2014-01-01T00:00:00Z i1 utest T x1.02 y1.02
|
||||
+1
@@ -0,0 +1 @@
|
||||
n1 v1 dV c1 t2014-01-01T00:00:00Z i1 utest T x1.02 y1.02
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6" generator="testdata" upload="false">
|
||||
<node id="1" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="1.02" lat="1.02"/>
|
||||
</osm>
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -0,0 +1 @@
|
||||
TESTDATA
|
||||
Binary file not shown.
@@ -0,0 +1,5 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<osm version="0.6" generator="osmium/1.2.1">
|
||||
<node id="1" version="1" timestamp="2015-09-17T11:52:00Z" uid="1" user="user_1" changeset="1" visible="false"/>
|
||||
<node id="2" version="1" timestamp="2015-09-17T11:52:00Z" uid="1" user="user_1" changeset="1" visible="true" lat="1" lon="1"/>
|
||||
</osm>
|
||||
Binary file not shown.
+29
@@ -0,0 +1,29 @@
|
||||
#include "catch.hpp"
|
||||
#include "utils.hpp"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <osmium/io/bzip2_compression.hpp>
|
||||
|
||||
TEST_CASE("Read bzip2-compressed file") {
|
||||
const std::string input_file = with_data_dir("t/io/data_bzip2.txt.bz2");
|
||||
|
||||
const int fd = ::open(input_file.c_str(), O_RDONLY);
|
||||
REQUIRE(fd > 0);
|
||||
|
||||
size_t size = 0;
|
||||
std::string all;
|
||||
{
|
||||
osmium::io::Bzip2Decompressor decomp{fd};
|
||||
for (std::string data = decomp.read(); !data.empty(); data = decomp.read()) {
|
||||
size += data.size();
|
||||
all += data;
|
||||
}
|
||||
}
|
||||
|
||||
REQUIRE(9 == size);
|
||||
REQUIRE("TESTDATA\n" == all);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/io/compression.hpp>
|
||||
|
||||
TEST_CASE("Create compressor using factory") {
|
||||
const auto& factory = osmium::io::CompressionFactory::instance();
|
||||
REQUIRE(factory.create_compressor(osmium::io::file_compression::none, -1, osmium::io::fsync::no));
|
||||
}
|
||||
|
||||
TEST_CASE("Create decompressor using factory") {
|
||||
const auto& factory = osmium::io::CompressionFactory::instance();
|
||||
REQUIRE(factory.create_decompressor(osmium::io::file_compression::none, nullptr, 0));
|
||||
}
|
||||
|
||||
TEST_CASE("Compression factory fails on undefined compression") {
|
||||
const auto& factory = osmium::io::CompressionFactory::instance();
|
||||
REQUIRE_THROWS_AS(factory.create_compressor(osmium::io::file_compression::gzip, -1, osmium::io::fsync::no),
|
||||
const osmium::unsupported_file_format_error&);
|
||||
REQUIRE_THROWS_WITH(factory.create_compressor(osmium::io::file_compression::gzip, -1, osmium::io::fsync::no),
|
||||
"Support for compression 'gzip' not compiled into this binary");
|
||||
}
|
||||
|
||||
@@ -0,0 +1,311 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <iterator>
|
||||
|
||||
#include <osmium/io/file.hpp>
|
||||
|
||||
TEST_CASE("Default file format") {
|
||||
const osmium::io::File f;
|
||||
REQUIRE(osmium::io::file_format::unknown == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
REQUIRE_THROWS_AS(f.check(), const std::runtime_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("File format when empty (stdin/stdout)") {
|
||||
const osmium::io::File f{""};
|
||||
REQUIRE(osmium::io::file_format::unknown == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
REQUIRE_THROWS_AS(f.check(), const std::runtime_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("File format from dash (stdin/stdout)") {
|
||||
const osmium::io::File f{"-"};
|
||||
REQUIRE(osmium::io::file_format::unknown == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
REQUIRE_THROWS_AS(f.check(), const std::runtime_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("File format from dash with osm.bz2") {
|
||||
const osmium::io::File f{"-", "osm.bz2"};
|
||||
REQUIRE("" == f.filename());
|
||||
REQUIRE(osmium::io::file_format::xml == f.format());
|
||||
REQUIRE(osmium::io::file_compression::bzip2 == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Detect file format by suffix 'osm'") {
|
||||
const osmium::io::File f{"test.osm"};
|
||||
REQUIRE(osmium::io::file_format::xml == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Detect file format by suffix 'pbf'") {
|
||||
const osmium::io::File f{"test.pbf"};
|
||||
REQUIRE(osmium::io::file_format::pbf == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Detect file format by suffix 'osm.pbf'") {
|
||||
const osmium::io::File f{"test.osm.pbf"};
|
||||
REQUIRE(osmium::io::file_format::pbf == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Detect file format by suffix 'opl'") {
|
||||
const osmium::io::File f{"test.opl"};
|
||||
REQUIRE(osmium::io::file_format::opl == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Detect file format by suffix 'osm.opl'") {
|
||||
const osmium::io::File f{"test.osm.opl"};
|
||||
REQUIRE(osmium::io::file_format::opl == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Detect file format by suffix 'osm.gz'") {
|
||||
const osmium::io::File f{"test.osm.gz"};
|
||||
REQUIRE(osmium::io::file_format::xml == f.format());
|
||||
REQUIRE(osmium::io::file_compression::gzip == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Detect file format by suffix 'opl.bz2'") {
|
||||
const osmium::io::File f{"test.osm.opl.bz2"};
|
||||
REQUIRE(osmium::io::file_format::opl == f.format());
|
||||
REQUIRE(osmium::io::file_compression::bzip2 == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Detect file format by suffix 'osc.gz'") {
|
||||
const osmium::io::File f{"test.osc.gz"};
|
||||
REQUIRE(osmium::io::file_format::xml == f.format());
|
||||
REQUIRE(osmium::io::file_compression::gzip == f.compression());
|
||||
REQUIRE(true == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Detect file format by suffix 'opl.gz'") {
|
||||
const osmium::io::File f{"test.osh.opl.gz"};
|
||||
REQUIRE(osmium::io::file_format::opl == f.format());
|
||||
REQUIRE(osmium::io::file_compression::gzip == f.compression());
|
||||
REQUIRE(true == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Detect file format by suffix 'osh.pbf'") {
|
||||
const osmium::io::File f{"test.osh.pbf"};
|
||||
REQUIRE(osmium::io::file_format::pbf == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(true == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Override file format by suffix 'osm'") {
|
||||
const osmium::io::File f{"test", "osm"};
|
||||
REQUIRE(osmium::io::file_format::xml == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Override file format by suffix 'pbf'") {
|
||||
const osmium::io::File f{"test", "pbf"};
|
||||
REQUIRE(osmium::io::file_format::pbf == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Override file format by suffix 'osm.pbf'") {
|
||||
const osmium::io::File f{"test", "osm.pbf"};
|
||||
REQUIRE(osmium::io::file_format::pbf == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Override file format by suffix 'opl'") {
|
||||
const osmium::io::File f{"test", "opl"};
|
||||
REQUIRE(osmium::io::file_format::opl == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Override file format by suffix 'osm.opl'") {
|
||||
const osmium::io::File f{"test", "osm.opl"};
|
||||
REQUIRE(osmium::io::file_format::opl == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Override file format by suffix 'osm.gz'") {
|
||||
const osmium::io::File f{"test", "osm.gz"};
|
||||
REQUIRE(osmium::io::file_format::xml == f.format());
|
||||
REQUIRE(osmium::io::file_compression::gzip == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Override file format by suffix 'osm.opl.bz2'") {
|
||||
const osmium::io::File f{"test", "osm.opl.bz2"};
|
||||
REQUIRE(osmium::io::file_format::opl == f.format());
|
||||
REQUIRE(osmium::io::file_compression::bzip2 == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Override file format by suffix 'osc.gz'") {
|
||||
const osmium::io::File f{"test", "osc.gz"};
|
||||
REQUIRE(osmium::io::file_format::xml == f.format());
|
||||
REQUIRE(osmium::io::file_compression::gzip == f.compression());
|
||||
REQUIRE(true == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Override file format by suffix 'osh.opl.gz'") {
|
||||
const osmium::io::File f{"test", "osh.opl.gz"};
|
||||
REQUIRE(osmium::io::file_format::opl == f.format());
|
||||
REQUIRE(osmium::io::file_compression::gzip == f.compression());
|
||||
REQUIRE(true == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("File format by suffix 'blackhole'") {
|
||||
const osmium::io::File f{"test.blackhole"};
|
||||
REQUIRE(osmium::io::file_format::blackhole == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Override file format by suffix 'blackhole'") {
|
||||
const osmium::io::File f{"test", "blackhole"};
|
||||
REQUIRE(osmium::io::file_format::blackhole == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Override file format by suffix 'osm.blackhole'") {
|
||||
const osmium::io::File f{"test", "osm.blackhole"};
|
||||
REQUIRE(osmium::io::file_format::blackhole == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Override file format by suffix 'osm.blackhole.bz2'") {
|
||||
const osmium::io::File f{"test", "osm.blackhole.bz2"};
|
||||
REQUIRE(osmium::io::file_format::blackhole == f.format());
|
||||
REQUIRE(osmium::io::file_compression::bzip2 == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Override file format by suffix 'osh.blackhole.gz'") {
|
||||
const osmium::io::File f{"test", "osh.blackhole.gz"};
|
||||
REQUIRE(osmium::io::file_format::blackhole == f.format());
|
||||
REQUIRE(osmium::io::file_compression::gzip == f.compression());
|
||||
REQUIRE(true == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Override file format by suffix 'osh.pbf'") {
|
||||
const osmium::io::File f{"test", "osh.pbf"};
|
||||
REQUIRE(osmium::io::file_format::pbf == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(true == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Format option pbf history") {
|
||||
const osmium::io::File f{"test", "pbf,history=true"};
|
||||
REQUIRE(osmium::io::file_format::pbf == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(true == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Format option pbf foo") {
|
||||
const osmium::io::File f{"test.osm", "pbf,foo=bar"};
|
||||
REQUIRE(osmium::io::file_format::pbf == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE("bar" == f.get("foo"));
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Format option xml abc something") {
|
||||
const osmium::io::File f{"test.bla", "xml,abc,some=thing"};
|
||||
REQUIRE(osmium::io::file_format::xml == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE("true" == f.get("abc"));
|
||||
REQUIRE("thing" == f.get("some"));
|
||||
REQUIRE(2 == std::distance(f.begin(), f.end()));
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("Unknown format 'foo.bar'") {
|
||||
const osmium::io::File f{"test.foo.bar"};
|
||||
REQUIRE(osmium::io::file_format::unknown == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE_THROWS_AS(f.check(), const std::runtime_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("Unknown format 'foo'") {
|
||||
const osmium::io::File f{"test", "foo"};
|
||||
REQUIRE_THROWS_AS(f.check(), const std::runtime_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("Unknown format 'osm.foo'") {
|
||||
const osmium::io::File f{"test", "osm.foo"};
|
||||
REQUIRE_THROWS_AS(f.check(), const std::runtime_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("Unknown format 'bla=foo'") {
|
||||
const osmium::io::File f{"test", "bla=foo"};
|
||||
REQUIRE_THROWS_AS(f.check(), const std::runtime_error&);
|
||||
}
|
||||
|
||||
TEST_CASE("URL without format") {
|
||||
const osmium::io::File f{"http://www.example.com/api"};
|
||||
REQUIRE(osmium::io::file_format::xml == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("URL without format and filename") {
|
||||
const osmium::io::File f{"http://planet.osm.org/pbf/planet-latest.osm.pbf"};
|
||||
REQUIRE(osmium::io::file_format::pbf == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(false == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
TEST_CASE("URL with format") {
|
||||
const osmium::io::File f{"http://www.example.com/api", "osh"};
|
||||
REQUIRE(osmium::io::file_format::xml == f.format());
|
||||
REQUIRE(osmium::io::file_compression::none == f.compression());
|
||||
REQUIRE(true == f.has_multiple_object_versions());
|
||||
f.check();
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user