diff --git a/libs/editor/editor_tests/feature_type_to_osm_test.cpp b/libs/editor/editor_tests/feature_type_to_osm_test.cpp index db8e93d2c..3d919bbf5 100644 --- a/libs/editor/editor_tests/feature_type_to_osm_test.cpp +++ b/libs/editor/editor_tests/feature_type_to_osm_test.cpp @@ -7,13 +7,11 @@ using namespace editor; -UNIT_TEST(loadFromStream_simpleType) +UNIT_TEST(simpleType) { std::string data = - "building;[building];;addr:housenumber;name;1;\n" - " # comment that should be ignored\n" - "\n" - "amenity|restaurant;61;\n"; + "amenity|restaurant;61;\n" + "amenity|bicycle_parking;1071;\n"; classificator::Load(); @@ -26,15 +24,43 @@ UNIT_TEST(loadFromStream_simpleType) TEST_EQUAL(result.size(), 1, ()); TEST_EQUAL(result[0].key, "amenity", ()); TEST_EQUAL(result[0].value, "restaurant", ()); - - uint32_t type2 = classif().GetTypeByReadableObjectName("building"); - std::vector result2 = translator.OsmTagsFromType(type2); - TEST_EQUAL(result2.size(), 1, ()); - TEST_EQUAL(result2[0].key, "building", ()); - TEST_EQUAL(result2[0].value, "yes", ()); } -UNIT_TEST(loadFromStream_complexType) +UNIT_TEST(simpleTypeWithTags) +{ + std::string data = + "building;[building];;addr:housenumber;name;1;\n" + "amenity|school;[amenity=school],[education=school];;name;int_name;36;\n" + "amenity|doctors;[amenity=doctors][healthcare=doctor],[amenity=doctors],[healthcare=doctor];;name;int_name;207;\n"; + + classificator::Load(); + + TypeToOSMTranslator translator(false); + std::stringstream s(data); + translator.LoadFromStream(s); + + uint32_t buildingType = classif().GetTypeByReadableObjectName("building"); + std::vector buildingResult = translator.OsmTagsFromType(buildingType); + TEST_EQUAL(buildingResult.size(), 1, ()); + TEST_EQUAL(buildingResult[0].key, "building", ()); + TEST_EQUAL(buildingResult[0].value, "yes", ()); + + uint32_t schoolType = classif().GetTypeByReadableObjectName("amenity-school"); + std::vector schoolResult = translator.OsmTagsFromType(schoolType); + TEST_EQUAL(schoolResult.size(), 1, ()); + TEST_EQUAL(schoolResult[0].key, "amenity", ()); + TEST_EQUAL(schoolResult[0].value, "school", ()); + + uint32_t doctorType = classif().GetTypeByReadableObjectName("amenity-doctors"); + std::vector doctorResult = translator.OsmTagsFromType(doctorType); + TEST_EQUAL(doctorResult.size(), 2, ()); + TEST_EQUAL(doctorResult[0].key, "amenity", ()); + TEST_EQUAL(doctorResult[0].value, "doctors", ()); + TEST_EQUAL(doctorResult[1].key, "healthcare", ()); + TEST_EQUAL(doctorResult[1].value, "doctor", ()); +} + +UNIT_TEST(complexType) { std::string data = "building;[building];;addr:housenumber;name;1;\n" @@ -79,6 +105,94 @@ UNIT_TEST(loadFromStream_complexType) TEST_EQUAL(mormonResult[2].value, "mormon", ()); } +UNIT_TEST(mandatorySelector) +{ + std::string data = + "amenity|parking|fee;[amenity=parking][fee];;name;int_name;125;\n" + "highway|track|bridge;[highway=track][bridge?];;name;int_name;193;\n" + "shop;[shop?];;name;int_name;943;\n" + "disusedbusiness;[disused:shop?],[disused:amenity=restaurant],[disused:amenity=fast_food],[disused:amenity=cafe],[disused:amenity=pub],[disused:amenity=bar];;;;1237;\n"; + + classificator::Load(); + + TypeToOSMTranslator translator(false); + std::stringstream s(data); + translator.LoadFromStream(s); + + uint32_t parkingType = classif().GetTypeByReadableObjectName("amenity-parking-fee"); + std::vector parkingResult = translator.OsmTagsFromType(parkingType); + TEST_EQUAL(parkingResult.size(), 2, ()); + TEST_EQUAL(parkingResult[0].key, "amenity", ()); + TEST_EQUAL(parkingResult[0].value, "parking", ()); + TEST_EQUAL(parkingResult[1].key, "fee", ()); + TEST_EQUAL(parkingResult[1].value, "yes", ()); + + uint32_t trackType = classif().GetTypeByReadableObjectName("highway-track-bridge"); + std::vector trackResult = translator.OsmTagsFromType(trackType); + TEST_EQUAL(trackResult.size(), 2, ()); + TEST_EQUAL(trackResult[0].key, "highway", ()); + TEST_EQUAL(trackResult[0].value, "track", ()); + TEST_EQUAL(trackResult[1].key, "bridge", ()); + TEST_EQUAL(trackResult[1].value, "yes", ()); + + uint32_t shopType = classif().GetTypeByReadableObjectName("shop"); + std::vector shopResult = translator.OsmTagsFromType(shopType); + TEST_EQUAL(shopResult.size(), 1, ()); + TEST_EQUAL(shopResult[0].key, "shop", ()); + TEST_EQUAL(shopResult[0].value, "yes", ()); + + uint32_t disusedType = classif().GetTypeByReadableObjectName("disusedbusiness"); + std::vector disusedResult = translator.OsmTagsFromType(disusedType); + TEST_EQUAL(disusedResult.size(), 1, ()); + TEST_EQUAL(disusedResult[0].key, "disused:shop", ()); + TEST_EQUAL(disusedResult[0].value, "yes", ()); +} + +UNIT_TEST(forbiddenSelector) +{ + std::string data = + "amenity|lounger;[amenity=lounger][!seasonal];;name;int_name;153;\n" + "amenity|charging_station|motorcar|small;[amenity=charging_station][motorcar?][!capacity],[amenity=charging_station][motorcar?][capacity=1],[amenity=charging_station][motorcar?][capacity=2];;name;int_name;201;\n"; + + classificator::Load(); + + TypeToOSMTranslator translator(false); + std::stringstream s(data); + translator.LoadFromStream(s); + + uint32_t loungerType = classif().GetTypeByReadableObjectName("amenity-lounger"); + std::vector loungerResult = translator.OsmTagsFromType(loungerType); + TEST_EQUAL(loungerResult.size(), 1, ()); + TEST_EQUAL(loungerResult[0].key, "amenity", ()); + TEST_EQUAL(loungerResult[0].value, "lounger", ()); + + uint32_t chargingType = classif().GetTypeByReadableObjectName("amenity-charging_station-motorcar-small"); + std::vector chargingResult = translator.OsmTagsFromType(chargingType); + TEST_EQUAL(chargingResult.size(), 2, ()); + TEST_EQUAL(chargingResult[0].key, "amenity", ()); + TEST_EQUAL(chargingResult[0].value, "charging_station", ()); + TEST_EQUAL(chargingResult[1].key, "motorcar", ()); + TEST_EQUAL(chargingResult[1].value, "yes", ()); +} + +UNIT_TEST(ignoreComments) +{ + std::string data = + "building;[building];;addr:housenumber;name;1;\n" + " # comment that should be ignored\n" + "\n" + "deprecated:waterway|riverbank:05.2024;52;x\n" + "amenity|restaurant;61;\n" + "moved:amenity|telephone:05.2024;122;amenity|telephone\n" + "natural|lake;564;natural|water|lake\n"; // moved type, should be ignored + + classificator::Load(); + + TypeToOSMTranslator translator(false); + std::stringstream s(data); + translator.LoadFromStream(s); +} + UNIT_TEST(loadConfigFile) { TypeToOSMTranslator translator(false); @@ -90,7 +204,7 @@ UNIT_TEST(loadConfigFile) ASSERT(size < 1700, ()); } -UNIT_TEST(OsmTagsFromType) +UNIT_TEST(testWithRealFile) { classificator::Load();