00001
00002
00003
00004
00005
00006
00007
00008 #include <boost/test/unit_test.hpp>
00009 #include <boost/filesystem.hpp>
00010 #include <boost/property_tree/xml_parser.hpp>
00011 #include "../osmdb/osmdb.h"
00012 #include "../sqllib/sqllib.h"
00013 #include <test_config.h>
00014 #include <algorithm>
00015
00016 class OsmDBFixture
00017 {
00018 public:
00019 OsmDBFixture():
00020 pdb("")
00021 {
00022
00023 psql::execute_sql(pdb, "CREATE SCHEMA testing");
00024 psql::execute_sql(pdb, "SET search_path TO testing, public");
00025 }
00026 ~OsmDBFixture()
00027 {
00028 if (pdb.in_transaction() || pdb.in_failed_transaction())
00029 pdb.rollback_transaction();
00030 psql::execute_sql(pdb, "DROP SCHEMA testing CASCADE");
00031 }
00032 psql::Database pdb;
00033 };
00034
00035 BOOST_FIXTURE_TEST_SUITE(OsmDBCreateTests, OsmDBFixture)
00036
00037 BOOST_AUTO_TEST_CASE(create)
00038 {
00039 osmdb::OsmDatabase db(pdb);
00040 db.create_tables();
00041 }
00042
00043 BOOST_AUTO_TEST_CASE(indexes)
00044 {
00045 osmdb::OsmDatabase db(pdb);
00046 db.create_tables();
00047 db.create_indexes_and_keys();
00048 db.drop_indexes_and_keys();
00049 db.create_indexes_and_keys();
00050 db.drop_indexes_and_keys();
00051 }
00052
00053 BOOST_AUTO_TEST_CASE(insert)
00054 {
00055
00056 osmdb::OsmDatabase db(pdb);
00057 db.create_tables();
00058 db.create_indexes_and_keys();
00059 osmdb::ElementInsertion ins(db);
00060 osm::Node n(123, 1, 2);
00061 n.tags.insert(osm::Tag("nkey", "nval"));
00062 ins.insert_node(n);
00063 n.tags.clear();
00064 n.id = 124;
00065 ins.insert_node(n);
00066 osm::Way w(341);
00067 w.nodes.push_back(123);
00068 w.nodes.push_back(124);
00069 w.tags.insert(osm::Tag("wkey", "wval"));
00070 ins.insert_way(w);
00071 osm::Relation r(432);
00072 r.tags.insert(osm::Tag("rkey", "rval"));
00073 ins.insert_relation(r);
00074 r.tags.clear();
00075 r.id = 433;
00076 r.add_node("rnode", osm::Node(124));
00077 r.add_way("rway", osm::Way(341));
00078 r.add_rel("rrel", osm::Relation(432));
00079 ins.insert_relation(r);
00080 std::vector<std::tuple<int64_t, double, double> > nodes {std::make_tuple(123, 2, 1), std::make_tuple(124, 2, 1)};
00081 std::vector<std::tuple<int64_t> > ways {std::make_tuple(341)};
00082 std::vector<std::tuple<int64_t, int64_t, int64_t> > edges {std::make_tuple(341, 123, 124)};
00083 std::vector<std::tuple<int64_t, int64_t, int> > waynodes
00084 {
00085 std::make_tuple(341, 123, 0),
00086 std::make_tuple(341, 124, 1)
00087 };
00088 std::sort(waynodes.begin(), waynodes.end());
00089 std::vector<std::tuple<int64_t, std::string, std::string> > ndattrs {std::make_tuple(123, "nkey", "nval")};
00090 std::vector<std::tuple<int64_t, std::string, std::string> > wattrs {std::make_tuple(341, "wkey", "wval")};
00091 std::vector<std::tuple<int64_t> > rels {std::make_tuple(432), std::make_tuple(433)};
00092 std::vector<std::tuple<int64_t, std::string, std::string> > rattrs {std::make_tuple(432, "rkey", "rval")};
00093 std::vector<std::tuple<int64_t, std::string, int64_t> > nmembers {std::make_tuple(433, "rnode", 124)};
00094 std::vector<std::tuple<int64_t, std::string, int64_t> > wmembers {std::make_tuple(433, "rway", 341)};
00095 std::vector<std::tuple<int64_t, std::string, int64_t> > rmembers {std::make_tuple(433, "rrel", 432)};
00096 auto nodes2 = psql::query_sql<int64_t, double, double>(db.get_db(), "SELECT ID, ST_X(Location::geometry), ST_Y(Location::geometry) FROM Nodes");
00097 auto ways2 = psql::query_sql<int64_t>(db.get_db(), "SELECT ID FROM Ways");
00098 auto waynodes2 = psql::query_sql<int64_t, int64_t, int>(db.get_db(), "SELECT WayID, NodeID, SequenceNo FROM WayNodes");
00099 auto edges2 = psql::query_sql<int64_t, int64_t, int64_t>(db.get_db(), "SELECT WayID, StartNodeID, EndNodeID FROM Edges");
00100 std::sort(waynodes2.begin(), waynodes2.end());
00101 auto ndattrs2 = psql::query_sql<int64_t, std::string, std::string>(db.get_db(), "SELECT NodeID, Key, Value FROM NodeAttributes");
00102 auto wattrs2 = psql::query_sql<int64_t, std::string, std::string>(db.get_db(), "SELECT WayID, Key, Value FROM WayAttributes");
00103 auto rels2 = psql::query_sql<int64_t> (db.get_db(), "SELECT ID FROM Relations");
00104 auto rattrs2 = psql::query_sql<int64_t, std::string, std::string>(db.get_db(), "SELECT RelationID, Key, Value FROM RelationAttributes");
00105 auto nmembers2 = psql::query_sql<int64_t, std::string, int64_t>(db.get_db(), "SELECT RelationID, Role, NodeID FROM MemberNodes");
00106 auto wmembers2 = psql::query_sql<int64_t, std::string, int64_t>(db.get_db(), "SELECT RelationID, Role, WayID FROM MemberWays");
00107 auto rmembers2 = psql::query_sql<int64_t, std::string, int64_t>(db.get_db(), "SELECT ParentID, Role, ChildID FROM MemberRelations");
00108 BOOST_CHECK(nodes == nodes2);
00109 BOOST_CHECK(ways == ways2);
00110 BOOST_CHECK(edges == edges2);
00111 BOOST_CHECK(waynodes == waynodes2);
00112 BOOST_CHECK(ndattrs == ndattrs2);
00113 BOOST_CHECK(wattrs == wattrs2);
00114 BOOST_CHECK(rmembers == rmembers2);
00115 BOOST_CHECK(wmembers == wmembers2);
00116 BOOST_CHECK(nmembers == nmembers2);
00117 BOOST_CHECK(rattrs == rattrs2);
00118 BOOST_CHECK(rels == rels2);
00119
00120 }
00121
00122 BOOST_AUTO_TEST_CASE(new_import)
00123 {
00124
00125 osmdb::OsmDatabase db(pdb);
00126 db.create_tables();
00127 db.create_indexes_and_keys();
00128 osmdb::ElementCopy ins(db);
00129 ins.start_copy();
00130 osm::Node n(123, 1, 2);
00131 n.tags.insert(osm::Tag("nkey", "nval"));
00132 ins.insert_node(n);
00133 n.tags.clear();
00134 n.id = 124;
00135 ins.insert_node(n);
00136 osm::Way w(341);
00137 w.nodes.push_back(123);
00138 w.nodes.push_back(124);
00139 w.tags.insert(osm::Tag("\r\n\twkey", "wval"));
00140 ins.insert_way(w);
00141 osm::Relation r(432);
00142 r.tags.insert(osm::Tag("rkey", "rval"));
00143 ins.insert_relation(r);
00144 r.tags.clear();
00145 r.id = 433;
00146 r.add_node("rnode", osm::Node(124));
00147 r.add_way("rway", osm::Way(341));
00148 r.add_rel("rrel", osm::Relation(432));
00149 ins.insert_relation(r);
00150 ins.end_copy();
00151 osmdb::ImportTableProcessor proc(db);
00152 proc.process();
00153 std::vector<std::tuple<int64_t, double, double> > nodes {std::make_tuple(123, 2, 1), std::make_tuple(124, 2, 1)};
00154 std::vector<std::tuple<int64_t> > ways {std::make_tuple(341)};
00155 std::vector<std::tuple<int64_t, int64_t, int64_t> > edges {std::make_tuple(341, 123, 124)};
00156 std::vector<std::tuple<int64_t, int64_t, int> > waynodes
00157 {
00158 std::make_tuple(341, 123, 0),
00159 std::make_tuple(341, 124, 1)
00160 };
00161 std::sort(waynodes.begin(), waynodes.end());
00162 std::vector<std::tuple<int64_t, std::string, std::string> > ndattrs {std::make_tuple(123, "nkey", "nval")};
00163 std::vector<std::tuple<int64_t, std::string, std::string> > wattrs {std::make_tuple(341, "\r\n\twkey", "wval")};
00164 std::vector<std::tuple<int64_t> > rels {std::make_tuple(432), std::make_tuple(433)};
00165 std::vector<std::tuple<int64_t, std::string, std::string> > rattrs {std::make_tuple(432, "rkey", "rval")};
00166 std::vector<std::tuple<int64_t, std::string, int64_t> > nmembers {std::make_tuple(433, "rnode", 124)};
00167 std::vector<std::tuple<int64_t, std::string, int64_t> > wmembers {std::make_tuple(433, "rway", 341)};
00168 std::vector<std::tuple<int64_t, std::string, int64_t> > rmembers {std::make_tuple(433, "rrel", 432)};
00169 auto nodes2 = psql::query_sql<int64_t, double, double>(db.get_db(), "SELECT ID, ST_X(Location::geometry), ST_Y(Location::geometry) FROM Nodes");
00170 auto ways2 = psql::query_sql<int64_t>(db.get_db(), "SELECT ID FROM Ways");
00171 auto waynodes2 = psql::query_sql<int64_t, int64_t, int>(db.get_db(), "SELECT WayID, NodeID, SequenceNo FROM WayNodes");
00172 auto edges2 = psql::query_sql<int64_t, int64_t, int64_t>(db.get_db(), "SELECT WayID, StartNodeID, EndNodeID FROM Edges");
00173 std::sort(waynodes2.begin(), waynodes2.end());
00174 auto ndattrs2 = psql::query_sql<int64_t, std::string, std::string>(db.get_db(), "SELECT NodeID, Key, Value FROM NodeAttributes");
00175 auto wattrs2 = psql::query_sql<int64_t, std::string, std::string>(db.get_db(), "SELECT WayID, Key, Value FROM WayAttributes");
00176 auto rels2 = psql::query_sql<int64_t> (db.get_db(), "SELECT ID FROM Relations");
00177 auto rattrs2 = psql::query_sql<int64_t, std::string, std::string>(db.get_db(), "SELECT RelationID, Key, Value FROM RelationAttributes");
00178 auto nmembers2 = psql::query_sql<int64_t, std::string, int64_t>(db.get_db(), "SELECT RelationID, Role, NodeID FROM MemberNodes");
00179 auto wmembers2 = psql::query_sql<int64_t, std::string, int64_t>(db.get_db(), "SELECT RelationID, Role, WayID FROM MemberWays");
00180 auto rmembers2 = psql::query_sql<int64_t, std::string, int64_t>(db.get_db(), "SELECT ParentID, Role, ChildID FROM MemberRelations");
00181 BOOST_CHECK(nodes == nodes2);
00182 BOOST_CHECK(ways == ways2);
00183 BOOST_CHECK(edges == edges2);
00184 BOOST_CHECK(waynodes == waynodes2);
00185 BOOST_CHECK(ndattrs == ndattrs2);
00186 BOOST_CHECK(wattrs == wattrs2);
00187 BOOST_CHECK(rmembers == rmembers2);
00188 BOOST_CHECK(wmembers == wmembers2);
00189 BOOST_CHECK(nmembers == nmembers2);
00190 BOOST_CHECK(rattrs == rattrs2);
00191 BOOST_CHECK(rels == rels2);
00192 }
00193
00194 BOOST_AUTO_TEST_CASE(import_proc_dis)
00195 {
00196 osmdb::OsmDatabase db(pdb);
00197 osmdb::ImportTableProcessor proc(db);
00198 proc.disable_all();
00199 proc.action_signal.connect(
00200 [&](osmdb::ImportTableAction, int64_t)
00201 {
00202 BOOST_CHECK(false);
00203 });
00204
00205 }
00206
00207 BOOST_AUTO_TEST_CASE(empty_displaydb)
00208 {
00209 osmdb::OsmDatabase odb(pdb);
00210 odb.create_tables();
00211 odb.create_indexes_and_keys();
00212 osmdb::DisplayDB db(odb, TEST_TO_SHOW_EDGES, 1, 1);
00213 db.set_bounds(geo::Point(0, 0), geo::Point(1, 1), 1);
00214 }
00215
00216 BOOST_AUTO_TEST_CASE(simple)
00217 {
00218 osmdb::OsmDatabase odb(pdb);
00219 odb.create_tables();
00220 odb.create_indexes_and_keys();
00221 osmdb::DisplayDB db(odb, TEST_TO_SHOW_EDGES, 1, 1);
00222 osmdb::ElementInsertion ins(db.get_db());
00223 pdb.begin_transaction();
00224 osm::Node nd(1, 0.5, 0.5);
00225 nd.tags.insert(osm::Tag("key", "val"));
00226 ins.insert_node(nd);
00227 ins.insert_node(osm::Node(2, 0.4, 0.4));
00228 ins.insert_node(osm::Node(3, 0.4, 0.8));
00229 osm::Way w(1);
00230 w.nodes.push_back(2);
00231 w.nodes.push_back(3);
00232 w.tags.insert(osm::Tag("key", "val"));
00233 ins.insert_way(w);
00234 nd.id = 4;
00235 nd.position.lat = 1.5;
00236 nd.position.lon = 0.5;
00237 ins.insert_node(nd);
00238 ins.insert_node(osm::Node(5, 0.6, 0.4));
00239 pdb.commit_transaction();
00240 db.set_bounds(geo::Point(1, 0), geo::Point(0, 1), 1);
00241 BOOST_CHECK(db.get_display_elements().size() == 1);
00242 auto elems = db.get_selected(geo::Point(1, 0), geo::Point(0, 1), 1);
00243 BOOST_CHECK(elems.size() == 1);
00244 BOOST_CHECK(elems[0]->get_description().front().first == "way");
00245 }
00246
00247 BOOST_AUTO_TEST_CASE(wayred_cursor)
00248 {
00249 osmdb::OsmDatabase odb(pdb);
00250 odb.create_tables();
00251 odb.create_indexes_and_keys();
00252 osmdb::ElementInsertion ins(odb);
00253 pdb.begin_transaction();
00254 osm::Node nd(1, 0.5, 0.5);
00255 nd.tags.insert(osm::Tag("key", "val"));
00256 ins.insert_node(nd);
00257 ins.insert_node(osm::Node(2, 0.4, 0.4));
00258 ins.insert_node(osm::Node(3, 0.4, 0.8));
00259 osm::Way w(1);
00260 w.nodes.push_back(2);
00261 w.nodes.push_back(3);
00262 w.tags.insert(osm::Tag("key", "val"));
00263 ins.insert_way(w);
00264 w = osm::Way(2);
00265 nd.id = 4;
00266 nd.position.lat = 1.5;
00267 nd.position.lon = 0.5;
00268 ins.insert_node(nd);
00269 ins.insert_node(osm::Node(5, 0.6, 0.4));
00270 pdb.commit_transaction();
00271 boost::property_tree::ptree entries;
00272 boost::property_tree::ptree kv;
00273 kv.put("key", "key");
00274 kv.put("value", "val");
00275 entries.put_child("entries.entry.elements.el", kv);
00276 auto st(sqllib::get_decl_wayred_crs(entries, pdb));
00277 auto crs(psql::make_cursor(pdb, "wayred_crs", st));
00278 pdb.begin_transaction();
00279 crs.open();
00280 crs.fetch(10);
00281 auto vect(crs.get_buffer());
00282 BOOST_CHECK(vect.size() == 2);
00283 crs.close();
00284 pdb.rollback_transaction();
00285 }
00286
00287 BOOST_AUTO_TEST_CASE(properties)
00288 {
00289 osmdb::OsmDatabase odb(pdb);
00290 odb.create_tables();
00291 osmdb::ElementInsertion ins(odb);
00292 osm::Node n(123, 1, 2);
00293 n.tags.insert(osm::Tag("nkey", "nval"));
00294 ins.insert_node(n);
00295 n.tags.clear();
00296 n.id = 124;
00297 ins.insert_node(n);
00298 osm::Way w(341);
00299 w.nodes.push_back(123);
00300 w.nodes.push_back(124);
00301 w.tags.insert(osm::Tag("wkey", "wval"));
00302 ins.insert_way(w);
00303 osm::Relation r(432);
00304 r.tags.insert(osm::Tag("rkey", "rval"));
00305 r.add_node("rnode", osm::Node(124));
00306 r.add_way("rway", osm::Way(341));
00307 r.add_rel("rrel", osm::Relation(433));
00308 ins.insert_relation(r);
00309 osmdb::PropertiesSelection db(odb);
00310 BOOST_CHECK(db.get_node_tags(123).count(osm::Tag("nkey", "nval")) == 1);
00311 geo::Point p(1, 2);
00312 BOOST_CHECK(db.get_position(123).close(p, 0.0001));
00313 BOOST_CHECK(db.get_way_tags(341).count(osm::Tag("wkey", "wval")) == 1);
00314 BOOST_CHECK(db.get_waynodes(341).size() == 2);
00315 BOOST_CHECK(db.get_waynodes(341)[0] == 123);
00316 BOOST_CHECK(db.get_relation_tags(432).count(osm::Tag("rkey", "rval")) == 1);
00317 BOOST_CHECK(db.get_node_members(432).count("rnode") == 1);
00318 BOOST_CHECK(db.get_way_members(432).count("rway") == 1);
00319 BOOST_CHECK(db.get_relation_members(432).count("rrel") == 1);
00320 osm::Node n2(123);
00321 n2.fill(db);
00322 n.id = 123;
00323 n.tags.insert(osm::Tag("nkey", "nval"));
00324 BOOST_CHECK(n == n2);
00325 osm::Way w2(341);
00326 w2.fill(db);
00327 w.nodes[0].fill(db);
00328 w.nodes[1].fill(db);
00329 BOOST_CHECK(w == w2);
00330 osm::Relation r2(432);
00331 r2.fill(db);
00332 for (auto it = r.members.begin(); it != r.members.end(); ++it)
00333 it->second->fill(db);
00334 BOOST_CHECK(r == r2);
00335 }
00336
00337 BOOST_AUTO_TEST_CASE(waylister)
00338 {
00339 osmdb::OsmDatabase odb(pdb);
00340 odb.create_tables();
00341 odb.create_indexes_and_keys();
00342 osmdb::ElementInsertion ins(odb);
00343 pdb.begin_transaction();
00344 ins.insert_node(osm::Node(2, 0.4, 0.4));
00345 ins.insert_node(osm::Node(3, 0.4, 0.8));
00346 ins.insert_node(osm::Node(4, 0.4, 0.8));
00347 ins.insert_node(osm::Node(5, 0.4, 0.8));
00348 ins.insert_node(osm::Node(6, 0.4, 0.8));
00349 ins.insert_node(osm::Node(7, 0.4, 0.8));
00350 ins.insert_node(osm::Node(8, 0.4, 0.8));
00351 osm::Way w(1);
00352 w.nodes.push_back(osm::Node(2, 0.4, 0.4));
00353 w.nodes.push_back(osm::Node(3, 0.4, 0.8));
00354 w.nodes.push_back(osm::Node(4, 0.4, 0.8));
00355 w.tags.insert(osm::Tag("key", "val"));
00356 ins.insert_way(w);
00357 osm::Way w2(2);
00358 w2.nodes.push_back(3);
00359 w2.nodes.push_back(5);
00360 w2.tags.insert(osm::Tag("asdf", "bsdf"));
00361 w2.tags.insert(osm::Tag("fcda", "gas"));
00362 ins.insert_way(w2);
00363 osm::Way w3(3);
00364 w3.tags.insert(osm::Tag("key", "val"));
00365 w3.nodes.push_back(osm::Node(4, 0.4, 0.8));
00366 w3.nodes.push_back(osm::Node(5, 0.4, 0.8));
00367 w3.nodes.push_back(osm::Node(6, 0.4, 0.8));
00368 ins.insert_way(w3);
00369 osm::Way w4(4);
00370 w4.nodes.push_back(5);
00371 w4.nodes.push_back(7);
00372 ins.insert_way(w4);
00373 osm::Way w5(5);
00374 w5.nodes.push_back(6);
00375 w5.nodes.push_back(8);
00376 ins.insert_way(w5);
00377 std::map<osm::Way, std::multimap<osm::Node, osm::Way, osm::LtByID>, osm::LtByID> exp;
00378 std::multimap<osm::Node, osm::Way, osm::LtByID> mp;
00379 mp.insert(std::make_pair(osm::Node(3, 0.4, 0.8), w2));
00380 mp.insert(std::make_pair(osm::Node(4, 0.4, 0.8), w3));
00381 exp[w] = mp;
00382 mp.clear();
00383 mp.insert(std::make_pair(osm::Node(4, 0.4, 0.8), w));
00384 mp.insert(std::make_pair(osm::Node(5, 0.4, 0.8), w4));
00385 mp.insert(std::make_pair(osm::Node(5, 0.4, 0.8), w2));
00386 mp.insert(std::make_pair(osm::Node(6, 0.4, 0.8), w5));
00387 exp[w3] = mp;
00388 pdb.commit_transaction();
00389 pdb.begin_transaction();
00390 std::map<osm::Way, std::multimap<osm::Node, osm::Way, osm::LtByID>, osm::LtByID> got;
00391 osmdb::WayLister wl(odb, std::multimap<std::string, std::string> {std::make_pair("key", "val")}, 2);
00392 while (!wl.end())
00393 {
00394 wl.next();
00395 for (auto it = wl.get_current_connected_ways().begin(); it != wl.get_current_connected_ways().end(); ++it)
00396 {
00397 got.insert(*it);
00398 }
00399 }
00400 pdb.commit_transaction();
00401 class WayCmpIgnNd
00402 {
00403 public:
00404 bool operator()(osm::Way const& w1, osm::Way const& w2)
00405 {
00406 return w1.id == w2.id && w1.tags == w2.tags;
00407 }
00408 };
00409 class Comp
00410 {
00411 public:
00412 bool operator()(decltype(*got.begin()) p1, decltype(*got.begin()) p2)
00413 {
00414 return osm::EqByID()(p1.first, p2.first) && util::multimap_eq<WayCmpIgnNd>(p1.second, p2.second);
00415 }
00416 } cmp;
00417 bool b = std::equal(got.begin(), got.end(), exp.begin(), cmp);
00418 BOOST_CHECK(b);
00419 }
00420
00421 BOOST_AUTO_TEST_SUITE_END()