diff --git a/include/faker-cxx/types/AddressCountry.h b/include/faker-cxx/types/AddressCountry.h index e75558b47..7d587d9d8 100644 --- a/include/faker-cxx/types/AddressCountry.h +++ b/include/faker-cxx/types/AddressCountry.h @@ -13,22 +13,19 @@ enum class AddressCountry Poland, France, Russia, + Ukraine }; const std::vector addressCountries{ - AddressCountry::Usa, - AddressCountry::Poland, - AddressCountry::France, - AddressCountry::Russia, + AddressCountry::Usa, AddressCountry::Poland, AddressCountry::France, + AddressCountry::Russia, AddressCountry::Ukraine, }; inline std::string toString(AddressCountry country) { std::map countryToStringMapping{ - {AddressCountry::Usa, "Usa"}, - {AddressCountry::Poland, "Poland"}, - {AddressCountry::France, "France"}, - {AddressCountry::Russia, "Russia"}, + {AddressCountry::Usa, "Usa"}, {AddressCountry::Poland, "Poland"}, {AddressCountry::France, "France"}, + {AddressCountry::Russia, "Russia"}, {AddressCountry::Ukraine, "Ukraine"}, }; return countryToStringMapping.at(country); diff --git a/src/modules/location/Location.cpp b/src/modules/location/Location.cpp index 8f0b3124c..33e23b5ae 100644 --- a/src/modules/location/Location.cpp +++ b/src/modules/location/Location.cpp @@ -11,6 +11,7 @@ #include "data/russia/RussiaAddresses.h" #include "data/States.h" #include "data/TimeZones.h" +#include "data/ukraine/UkraineAddresses.h" #include "data/usa/UsaAddresses.h" #include "faker-cxx/Helper.h" #include "faker-cxx/Person.h" @@ -21,17 +22,15 @@ namespace faker namespace { const std::map countryToCountryAddressesMapping{ - {AddressCountry::Usa, usaAddresses}, - {AddressCountry::Poland, polandAddresses}, - {AddressCountry::Russia, russiaAddresses}, - {AddressCountry::France, franceAddresses}, + {AddressCountry::Usa, usaAddresses}, {AddressCountry::Poland, polandAddresses}, + {AddressCountry::Russia, russiaAddresses}, {AddressCountry::France, franceAddresses}, + {AddressCountry::Ukraine, ukraineAddresses}, }; const std::map countryAddressToCountryMapping{ - {AddressCountry::Usa, Country::Usa}, - {AddressCountry::Poland, Country::Poland}, - {AddressCountry::Russia, Country::Russia}, - {AddressCountry::France, Country::France}, + {AddressCountry::Usa, Country::Usa}, {AddressCountry::Poland, Country::Poland}, + {AddressCountry::Russia, Country::Russia}, {AddressCountry::France, Country::France}, + {AddressCountry::Ukraine, Country::Ukraine}, }; } diff --git a/src/modules/location/LocationTest.cpp b/src/modules/location/LocationTest.cpp index 0b9101517..98eba1698 100644 --- a/src/modules/location/LocationTest.cpp +++ b/src/modules/location/LocationTest.cpp @@ -9,6 +9,8 @@ #include "../person/data/england/EnglishLastNames.h" #include "../person/data/russia/RussianFirstNames.h" #include "../person/data/russia/RussianLastNames.h" +#include "../person/data/ukraine/UkrainianFirstNames.h" +#include "../person/data/ukraine/UkrainianLastNames.h" #include "../string/data/Characters.h" #include "data/Countries.h" #include "data/CountryAddresses.h" @@ -18,6 +20,7 @@ #include "data/russia/RussiaAddresses.h" #include "data/States.h" #include "data/TimeZones.h" +#include "data/ukraine/UkraineAddresses.h" #include "data/usa/UsaAddresses.h" using namespace ::testing; @@ -26,10 +29,9 @@ using namespace faker; namespace { const std::map countryToCountryAddressesMapping{ - {AddressCountry::Usa, usaAddresses}, - {AddressCountry::Poland, polandAddresses}, - {AddressCountry::Russia, russiaAddresses}, - {AddressCountry::France, franceAddresses}, + {AddressCountry::Usa, usaAddresses}, {AddressCountry::Poland, polandAddresses}, + {AddressCountry::Russia, russiaAddresses}, {AddressCountry::France, franceAddresses}, + {AddressCountry::Ukraine, ukraineAddresses}, }; const std::map generatedTestName{ @@ -37,6 +39,7 @@ const std::map generatedTestName{ {AddressCountry::France, "shouldGenerateFrenchAddress"}, {AddressCountry::Poland, "shouldGeneratePolishAddress"}, {AddressCountry::Russia, "shouldGenerateRussianAddress"}, + {AddressCountry::Ukraine, "shouldGenerateUkrainianAddress"}, }; } @@ -242,7 +245,7 @@ TEST_F(LocationTest, shouldGenerateRussiaStreetAddress) firstNames.insert(firstNames.end(), russianFemalesFirstNames.begin(), russianFemalesFirstNames.end()); std::vector lastNames{russianMalesLastNames}; - firstNames.insert(firstNames.end(), russianFemalesLastNames.begin(), russianFemalesLastNames.end()); + lastNames.insert(lastNames.end(), russianFemalesLastNames.begin(), russianFemalesLastNames.end()); ASSERT_TRUE(std::ranges::any_of(russiaStreetPrefixes, [&generatedStreetAddress](const std::string& prefix) { return generatedStreetAddress.find(prefix) != std::string::npos; })); @@ -250,12 +253,8 @@ TEST_F(LocationTest, shouldGenerateRussiaStreetAddress) { return generatedStreetAddress.find(firstName) != std::string::npos; }) || std::ranges::any_of(lastNames, [&generatedStreetAddress](const std::string& lastName) { return generatedStreetAddress.find(lastName) != std::string::npos; }) || - std::ranges::any_of(russiaStreetNames, - [&generatedStreetAddress](const std::string& streetName) - { - return generatedStreetAddress.find(streetName) != std::string::npos; - ; - })); + std::ranges::any_of(russiaStreetNames, [&generatedStreetAddress](const std::string& streetName) + { return generatedStreetAddress.find(streetName) != std::string::npos; })); } TEST_F(LocationTest, shouldGenerateFranceStreet) @@ -394,3 +393,51 @@ TEST_F(LocationTest, shouldGenerateTimeZone) ASSERT_TRUE(std::ranges::any_of(timeZones, [generatedTimeZone](const std::string& timeZone) { return timeZone == generatedTimeZone; })); } + +TEST_F(LocationTest, shouldGenerateUkraineStreet) +{ + const auto generatedStreet = Location::street(AddressCountry::Ukraine); + + const auto generatedStreetElements = StringHelper::split(generatedStreet, " "); + + const auto& generatedStreetPrefix = generatedStreetElements[0]; + const auto& generatedStreetSuffix = + StringHelper::join({generatedStreetElements.begin() + 1, generatedStreetElements.end()}); + + ASSERT_TRUE(std::ranges::any_of(ukraineStreetPrefixes, [&generatedStreetPrefix](const std::string& streetPrefix) + { return streetPrefix == generatedStreetPrefix; })); + + std::vector firstNames{ukrainianMalesFirstNames}; + firstNames.insert(firstNames.end(), ukrainianFemalesFirstNames.begin(), ukrainianFemalesFirstNames.end()); + + std::vector lastNames{ukrainianMalesLastNames}; + lastNames.insert(lastNames.end(), ukrainianFemalesLastNames.begin(), ukrainianFemalesLastNames.end()); + + ASSERT_TRUE(std::ranges::any_of(firstNames, [&generatedStreetSuffix](const std::string& firstName) + { return generatedStreetSuffix.find(firstName) != std::string::npos; }) || + std::ranges::any_of(lastNames, [&generatedStreetSuffix](const std::string& lastName) + { return generatedStreetSuffix.find(lastName) != std::string::npos; }) || + std::ranges::any_of(ukraineStreetNames, [&generatedStreetSuffix](const std::string& streetName) + { return generatedStreetSuffix.find(streetName) != std::string::npos; })); +} + +TEST_F(LocationTest, shouldGenerateUkraineStreetAddress) +{ + const auto generatedStreetAddress = Location::streetAddress(AddressCountry::Ukraine); + + ASSERT_TRUE(std::ranges::any_of(ukraineStreetPrefixes, [&generatedStreetAddress](const std::string& prefix) + { return generatedStreetAddress.find(prefix) != std::string::npos; })); + + std::vector firstNames{ukrainianMalesFirstNames}; + firstNames.insert(firstNames.end(), ukrainianFemalesFirstNames.begin(), ukrainianFemalesFirstNames.end()); + + std::vector lastNames{ukrainianMalesLastNames}; + lastNames.insert(lastNames.end(), ukrainianFemalesLastNames.begin(), ukrainianFemalesLastNames.end()); + + ASSERT_TRUE(std::ranges::any_of(firstNames, [&generatedStreetAddress](const std::string& firstName) + { return generatedStreetAddress.find(firstName) != std::string::npos; }) || + std::ranges::any_of(lastNames, [&generatedStreetAddress](const std::string& lastName) + { return generatedStreetAddress.find(lastName) != std::string::npos; }) || + std::ranges::any_of(ukraineStreetNames, [&generatedStreetAddress](const std::string& streetName) + { return generatedStreetAddress.find(streetName) != std::string::npos; })); +} diff --git a/src/modules/location/data/ukraine/UkraineAddresses.h b/src/modules/location/data/ukraine/UkraineAddresses.h new file mode 100644 index 000000000..50015a234 --- /dev/null +++ b/src/modules/location/data/ukraine/UkraineAddresses.h @@ -0,0 +1,31 @@ +#pragma once + +#include "../CountryAddresses.h" +#include "UkraineCities.h" +#include "UkraineStreetNames.h" +#include "UkraineStreetPrefixes.h" + +namespace faker +{ +const std::string ukraineZipCodeFormat{"#####"}; + +const std::vector ukraineAddressFormats{"{street} {buildingNumber}", + "{street} {buildingNumber} {secondaryAddress}"}; + +const std::vector ukraineSecondaryAddressFormats{"кв. ###", "кв. ##", "кв. #"}; + +const std::vector ukraineBuildingNumberFormats{"#", "##", "###"}; + +const std::vector ukraineStreetFormats{"{streetPrefix} {firstName}", "{streetPrefix} {lastName}", + "{streetPrefix} {streetName}"}; + +const CountryAddresses ukraineAddresses{ukraineCities, + ukraineZipCodeFormat, + ukraineAddressFormats, + ukraineSecondaryAddressFormats, + ukraineStreetFormats, + ukraineStreetPrefixes, + ukraineStreetNames, + {}, + ukraineBuildingNumberFormats}; +} diff --git a/src/modules/location/data/ukraine/UkraineCities.h b/src/modules/location/data/ukraine/UkraineCities.h new file mode 100644 index 000000000..9dc00c0ee --- /dev/null +++ b/src/modules/location/data/ukraine/UkraineCities.h @@ -0,0 +1,490 @@ +#pragma once + +#include +#include + +namespace faker +{ +const std::vector ukraineCities{ + "Авдіївка", + "Аджи-Мушкай", + "Алмазна", + "Алупка", + "Алушта", + "Алчевськ", + "Амвросіївка", + "Ананьїв", + "Андрушівка", + "Антрацит (місто)", + "Апостолове", + "Армянськ", + "Арциз", + "Балаклія", + "Балта", + "Бар (Україна)", + "Баранівка", + "Барвінкове", + "Батурин", + "Бахмач", + "Бахмут", + "Бахчисарай", + "Баштанка", + "Белз", + "Бердичів", + "Бердянськ", + "Берегове", + "Бережани", + "Березань (місто)", + "Березівка", + "Березне", + "Берестечко", + "Берислав", + "Бершадь", + "Бібрка", + "Біла Церква", + "Білгород-Дністровський", + "Білицьке", + "Білогірськ", + "Білозерське", + "Білопілля", + "Біляївка", + "Благовіщенське", + "Бобринець", + "Бобровиця", + "Богодухів", + "Богуслав", + "Боково-Хрустальне", + "Болград", + "Болехів", + "Борзна", + "Борислав", + "Бориспіль", + "Бородянка", + "Борщів", + "Боссе (Донецьк)", + "Боярка", + "Бровари", + "Броди", + "Брянка", + "Булгак (село)", + "Бунге (місто)", + "Буринь", + "Бурштин (місто)", + "Буськ", + "Буча", + "Бучач", + "Валки (місто)", + "Вараш", + "Василівка (місто)", + "Васильків", + "Ватутіне", + "Вашківці", + "Великі Мости", + "Верхівцеве", + "Верхньодніпровськ", + "Вижниця", + "Вилкове", + "Винники", + "Виноградів", + "Вишгород", + "Вишневе (місто)", + "Вільногірськ", + "Вільнянськ", + "Вінниця", + "Вовчанськ", + "Вознесенівка", + "Вознесенськ", + "Волноваха", + "Володимир (місто)", + "Волочиськ", + "Ворожба", + "Вуглегірськ", + "Вугледар", + "Гадяч", + "Гайворон", + "Гайсин", + "Галич", + "Генічеськ", + "Географія Вільнянська", + "Герца", + "Гірник (місто)", + "Гірське", + "Глиняни", + "Глобине", + "Глухів", + "Гнівань", + "Гола Пристань", + "Голубівка", + "Горішні Плавні", + "Горлівка", + "Городенка", + "Городище (Черкаська область)", + "Городня", + "Городок (Львівська область)", + "Городок (Хмельницька область)", + "Горохів", + "Гостомель", + "Гребінка", + "Гуляйполе", + "Дебальцеве", + "Деражня", + "Дергачі", + "Джабу", + "Джанкой", + "Дніпро (місто)", + "Дніпрорудне", + "Добромиль", + "Добропілля", + "Добросин", + "Довжанськ", + "Докучаєвськ", + "Долина (місто)", + "Долинська", + "Донецьк", + "Дрогобич", + "Дружба (місто)", + "Дружківка", + "Дубляни", + "Дубно", + "Дубровиця", + "Дунаївці", + "Енергодар", + "Євпаторія", + "Єнакієве", + "Жашків", + "Жданівка", + "Жидачів", + "Житомир", + "Жмеринка", + "Жовква", + "Жовті Води", + "Заводське", + "Залізне", + "Заліщики", + "Запоріжжя", + "Заставна", + "Збараж", + "Зборів", + "Звенигородка", + "Звягель", + "Здолбунів", + "Зелене (Харків)", + "Зеленодольськ", + "Зимогір'я", + "Зіньків", + "Зміїв", + "Знам'янка", + "Золоте", + "Золотоноша", + "Золочів", + "Зоринськ", + "Зугрес", + "Івано-Франківськ", + "Ізмаїл", + "Ізюм", + "Ізяслав", + "Іллінці", + "Іловайськ", + "Інкерман", + "Ірміно", + "Ірпінь", + "Іршава", + "Ічня", + "Кагарлик", + "Кадіївка", + "Калинівка (місто)", + "Калуш", + "Кальміуське", + "Кам'янець-Подільський", + "Кам'янка (Черкаська область)", + "Кам'янка-Бузька", + "Кам'янка-Дніпровська", + "Кам'янське", + "Камінь-Каширський", + "Канів", + "Карлівка", + "Каховка", + "Керч", + "Київ", + "Кипуче", + "Ківерці", + "Кілія", + "Кіцмань", + "Кобеляки", + "Ковель", + "Кодима", + "Користувач:Козак Яна/Чернетка", + "Козятин", + "Коломия", + "Комарно", + "Конотоп", + "Копичинці", + "Корець", + "Коростень", + "Коростишів", + "Корсунь-Шевченківський", + "Корюківка", + "Косів", + "Костопіль", + "Костянтинівка", + "Коцюбинське", + "Краматорськ", + "Красилів", + "Красногорівка", + "Красноград", + "Кременець", + "Кременчук", + "Кремінна", + "Кривий Ріг", + "Кролевець", + "Кропивницький", + "Куп'янськ", + "Курахове", + "Ладижин", + "Ланівці", + "Лебедин", + "Лиман (місто)", + "Липовець", + "Лисичанськ", + "Лозова", + "Лохвиця", + "Лубни", + "Луганськ", + "Лутугине", + "Луцьк", + "Львів", + "Любомль", + "Люботин", + "Макіївка", + "Мала Виска", + "Малин", + "Мар'їнка", + "Марганець (місто)", + "Маріуполь", + "Мелітополь", + "Мена (місто)", + "Мерефа", + "Миколаїв", + "Миколаїв (Львівська область)", + "Миколаївка (місто)", + "Миргород", + "Мирноград", + "Миронівка", + "Міусинськ", + "Могилів-Подільський", + "Молодогвардійськ", + "Молочанськ", + "Монастириська", + "Монастирище", + "Моршин", + "Моспине", + "Мостиська", + "Мукачево", + "Надвірна", + "Немирів", + "Нетішин", + "Ніжин", + "Нікополь", + "Нова Каховка", + "Нова Одеса", + "Новгород-Сіверський", + "Нове Давидково", + "Новий Буг", + "Новий Калинів", + "Новий Розділ", + "Новоазовськ", + "Нововолинськ", + "Новогродівка", + "Новодністровськ", + "Новодружеськ", + "Новомиргород", + "Новомосковськ", + "Новоселиця", + "Новоукраїнка", + "Новояворівськ", + "Носівка", + "Носівка (Сновськ)", + "Обухів", + "Овруч", + "Одеса", + "Олевськ", + "Олександрівськ", + "Олександрія", + "Олешки", + "Оріхів", + "Остер (місто)", + "Острог", + "Охтирка", + "Очаків", + "П'ятихатки", + "Павлоград", + "Первомайськ (Алчевський район)", + "Первомайськ (Миколаївська область)", + "Первомайський (місто)", + "Перевальськ", + "Перемишляни", + "Перечин", + "Перещепине", + "Переяслав", + "Першотравенськ", + "Петрово-Красносілля", + "Пирятин", + "Південне (місто)", + "Підгайці", + "Підгородне", + "Пісочин (смт)", + "Погребище", + "Подільськ", + "Покров", + "Покровськ", + "Пологи (місто)", + "Полонне", + "Полтава", + "Помічна", + "Попасна", + "Почаїв", + "Привілля", + "Прилуки", + "Приморськ (Україна)", + "Прип'ять (місто)", + "Пустомити", + "Путивль", + "Рава-Руська", + "Радехів", + "Радивилів", + "Радомишль", + "Рахів", + "Рені", + "Решетилівка", + "Ржищів", + "Рівне", + "Ровеньки", + "Рогатин", + "Родинське", + "Рожище", + "Роздільна", + "Ромни", + "Рубіжне", + "Рудки", + "Саки (місто)", + "Самбір", + "Сарни", + "Свалява", + "Сватове", + "Світловодськ", + "Світлодарськ", + "Святогірськ", + "Севастополь", + "Селидове", + "Семенівка", + "Середина-Буда", + "Сєвєродонецьк", + "Синельникове", + "Сіверськ", + "Сімферополь", + "Скадовськ", + "Скалат", + "Сквира", + "Сколе", + "Славута", + "Славутич (місто)", + "Слов'янськ", + "Сміла", + "Снігурівка", + "Сніжне", + "Сновськ", + "Снятин", + "Сокаль", + "Сокиряни", + "Соледар", + "Сорокине", + "Соснівка (місто)", + "Старий Крим", + "Старий Самбір", + "Старобільськ", + "Старокостянтинів", + "Стебник", + "Сторожинець", + "Стрий", + "Судак (місто)", + "Судова Вишня", + "Суми", + "Суходільськ", + "Таврійськ", + "Тальне", + "Тараща", + "Татарбунари", + "Теплодар", + "Теребовля", + "Тернівка (місто)", + "Тернопіль", + "Тетіїв", + "Тиврів", + "Тисмениця", + "Тихе (Крим)", + "Тлумач", + "Токмак", + "Томашгород (село)", + "Торецьк", + "Тростянець", + "Трускавець", + "Тульчин", + "Турка", + "Тячів", + "Угнів", + "Ужгород", + "Узин", + "Українка (місто)", + "Українськ", + "Умань", + "Устилуг", + "Фастів", + "Федорівка (Сакський район)", + "Феодосія", + "Харків", + "Харцизьк", + "Херсон", + "Хирів", + "Хмельницький", + "Хмільник", + "Ходорів", + "Хорол (місто)", + "Хоростків", + "Хотин", + "Хрестівка", + "Христинівка", + "Хрустальний", + "Хуст", + "Часів Яр", + "Червоноград", + "Червоносів", + "Черкаси", + "Чернівці", + "Чернігів", + "Чигирин", + "Чистякове", + "Чоп", + "Чорнобиль", + "Чорноморськ", + "Чортків", + "Чугуїв", + "Чуднів", + "Шаргород", + "Шахтарськ", + "Шепетівка", + "Шостка", + "Шпола", + "Шумськ", + "Щастя (місто)", + "Щолкіне", + "Южне", + "Южноукраїнськ", + "Яворів", + "Яготин", + "Ялта", + "Ямпіль", + "Яни Капу", + "Янів (Київська область)", + "Яремче", +}; +} diff --git a/src/modules/location/data/ukraine/UkraineStreetNames.h b/src/modules/location/data/ukraine/UkraineStreetNames.h new file mode 100644 index 000000000..817a5951c --- /dev/null +++ b/src/modules/location/data/ukraine/UkraineStreetNames.h @@ -0,0 +1,71 @@ +#pragma once + +#include +#include + +namespace faker +{ +const std::vector ukraineStreetNames{ + "Хрещатик", + "Бессарабська", + "Саксаганського", + "Липська", + "Золотоворітська", + "Артема", + "Шевченка", + "Горького", + "Московська", + "Лесі Українки", + "Січових Стрільців", + "Майдан Незалежності", + "Прорізна", + "Інститутська", + "Пушкінська", + "Бульвар Тараса Шевченка", + "Крещатик", + "Печерська", + "Харківська", + "Богдана Хмельницького", + "Нова", + "Героїв Майдану", + "Гагаріна", + "Любченка", + "Озерна", + "Петра Могили", + "Сагайдачного", + "Тичини", + "Азербайджанська", + "Азовська", + "Азовська", + "Азовський", + "Айвазовського", + "Академіка Корольова", + "Академіка Ромоданова", + "Генерала Алмазова", + "Генерала Алмазова", + "Алматинська", + "Алчевських", + "Алчевської", + "Христини Алчевської", + "Альпійська", + "Альпійський", + "Амет-Хана Султана", + "Академіка Амосова", + "Миколи Амосова", + "Валентинівська", + "Валіховський", + "Валківська", + "Валова", + "Варварівська", + "Варненська", + "Варшавська", + "Варшавська", + "Миколи Василенка", + "Симона Петлюри", + "Василицька", + "Василівська", + "Василівська", + "Васильківська", + "Васильківський", +}; +} diff --git a/src/modules/location/data/ukraine/UkraineStreetPrefixes.h b/src/modules/location/data/ukraine/UkraineStreetPrefixes.h new file mode 100644 index 000000000..d69f4eae5 --- /dev/null +++ b/src/modules/location/data/ukraine/UkraineStreetPrefixes.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include + +namespace faker +{ +const std::vector ukraineStreetPrefixes{"вулиця", "аллея", "бульвар", "лінія", "набережна", + "шоссе", "перевулок", "проспект", "міст", "авеню"}; +}