diff --git a/CMakeLists.txt b/CMakeLists.txt index 40128f457..75c64770a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,7 @@ set(FAKER_SOURCES src/common/StringHelper.cpp src/modules/phone/Phone.cpp src/common/LuhnCheck.cpp - src/common/mappers/PrecisionMapper.cpp + src/common/mappers/precisionMapper/PrecisionMapper.cpp src/modules/system/System.cpp src/modules/database/Database.cpp src/modules/music/Music.cpp @@ -46,7 +46,7 @@ set(FAKER_SOURCES src/modules/sport/Sport.cpp src/modules/videoGame/VideoGame.cpp src/modules/medicine/Medicine.cpp -) + ) set(FAKER_UT_SOURCES src/modules/animal/AnimalTest.cpp @@ -68,7 +68,7 @@ set(FAKER_UT_SOURCES src/modules/phone/PhoneTest.cpp src/modules/helper/HelperTest.cpp src/common/LuhnCheckTest.cpp - src/common/mappers/PrecisionMapperTest.cpp + src/common/mappers/precisionMapper/PrecisionMapperTest.cpp src/modules/system/SystemTest.cpp src/modules/database/DatabaseTest.cpp src/modules/music/MusicTest.cpp @@ -78,7 +78,7 @@ set(FAKER_UT_SOURCES src/modules/sport/SportTest.cpp src/modules/videoGame/VideoGameTest.cpp src/modules/medicine/MedicineTest.cpp -) + ) add_library(${LIBRARY_NAME} ${FAKER_SOURCES}) diff --git a/include/faker-cxx/Helper.h b/include/faker-cxx/Helper.h index f1f20056b..353102e0a 100644 --- a/include/faker-cxx/Helper.h +++ b/include/faker-cxx/Helper.h @@ -34,6 +34,14 @@ class Helper return data[index]; } + template + static T arrayElement(const std::vector& data) + { + const auto index = Number::integer(data.size() - 1); + + return data[index]; + } + /** * @brief Returns shuffled STL container. * diff --git a/include/faker-cxx/Person.h b/include/faker-cxx/Person.h index 4b11fd896..574059caf 100644 --- a/include/faker-cxx/Person.h +++ b/include/faker-cxx/Person.h @@ -145,7 +145,17 @@ class Person * Person::hobby() // "Gaming" * @endcode */ - static std::string hobby(); + + /** + * @brief Returns a random language. + * + * @returns Language. + * + * @code + * Person::language() // "Polish" + * @endcode + */ + static std::string language(); }; } diff --git a/include/faker-cxx/types/Language.h b/include/faker-cxx/types/Language.h index 045c198bc..0aa456bc4 100644 --- a/include/faker-cxx/types/Language.h +++ b/include/faker-cxx/types/Language.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace faker { @@ -18,6 +19,11 @@ enum class Language Nepali, }; +const std::vector languages{ + Language::English, Language::Polish, Language::Italian, Language::French, Language::German, + Language::Russian, Language::Romanian, Language::Hindi, Language::Finnish, Language::Nepali, +}; + inline std::string toString(Language language) { std::map languageToStringMapping{ diff --git a/src/common/mappers/PrecisionMapperTest.cpp b/src/common/mappers/PrecisionMapperTest.cpp deleted file mode 100644 index fd4c981c6..000000000 --- a/src/common/mappers/PrecisionMapperTest.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "PrecisionMapper.h" - -#include "gtest/gtest.h" - -using namespace ::testing; -using namespace faker; - -class PrecisionMapperTest : public Test -{ -public: -}; - -TEST_F(PrecisionMapperTest, mapsPrecisionToDecimalPlaces) -{ - const auto zeroDp = PrecisionMapper::toDecimalPlaces(Precision::ZeroDp); - const auto oneDp = PrecisionMapper::toDecimalPlaces(Precision::OneDp); - const auto twoDp = PrecisionMapper::toDecimalPlaces(Precision::TwoDp); - const auto threeDp = PrecisionMapper::toDecimalPlaces(Precision::ThreeDp); - const auto fourDp = PrecisionMapper::toDecimalPlaces(Precision::FourDp); - const auto fiveDp = PrecisionMapper::toDecimalPlaces(Precision::FiveDp); - const auto sixDp = PrecisionMapper::toDecimalPlaces(Precision::SixDp); - const auto sevenDp = PrecisionMapper::toDecimalPlaces(Precision::SevenDp); - - ASSERT_EQ(zeroDp, 0); - ASSERT_EQ(oneDp, 1); - ASSERT_EQ(twoDp, 2); - ASSERT_EQ(threeDp, 3); - ASSERT_EQ(fourDp, 4); - ASSERT_EQ(fiveDp, 5); - ASSERT_EQ(sixDp, 6); - ASSERT_EQ(sevenDp, 7); -} diff --git a/src/common/mappers/PrecisionMapper.cpp b/src/common/mappers/precisionMapper/PrecisionMapper.cpp similarity index 85% rename from src/common/mappers/PrecisionMapper.cpp rename to src/common/mappers/precisionMapper/PrecisionMapper.cpp index 9323c00c1..4387dc19a 100644 --- a/src/common/mappers/PrecisionMapper.cpp +++ b/src/common/mappers/precisionMapper/PrecisionMapper.cpp @@ -2,12 +2,11 @@ namespace faker { - const std::map PrecisionMapper::precisionToDecimalPlacesMapping{ {Precision::ZeroDp, 0}, {Precision::OneDp, 1}, {Precision::TwoDp, 2}, {Precision::ThreeDp, 3}, {Precision::FourDp, 4}, {Precision::FiveDp, 5}, {Precision::SixDp, 6}, {Precision::SevenDp, 7}}; -unsigned PrecisionMapper::toDecimalPlaces(Precision precision) +unsigned PrecisionMapper::mapToDecimalPlaces(Precision precision) { return precisionToDecimalPlacesMapping.at(precision); } diff --git a/src/common/mappers/PrecisionMapper.h b/src/common/mappers/precisionMapper/PrecisionMapper.h similarity index 76% rename from src/common/mappers/PrecisionMapper.h rename to src/common/mappers/precisionMapper/PrecisionMapper.h index 7e41bfb6e..1c022b7f8 100644 --- a/src/common/mappers/PrecisionMapper.h +++ b/src/common/mappers/precisionMapper/PrecisionMapper.h @@ -7,7 +7,7 @@ namespace faker class PrecisionMapper { public: - static unsigned toDecimalPlaces(Precision precision); + static unsigned mapToDecimalPlaces(Precision precision); private: static const std::map precisionToDecimalPlacesMapping; diff --git a/src/common/mappers/precisionMapper/PrecisionMapperTest.cpp b/src/common/mappers/precisionMapper/PrecisionMapperTest.cpp new file mode 100644 index 000000000..11926c177 --- /dev/null +++ b/src/common/mappers/precisionMapper/PrecisionMapperTest.cpp @@ -0,0 +1,32 @@ +#include "PrecisionMapper.h" + +#include "gtest/gtest.h" + +using namespace ::testing; +using namespace faker; + +class PrecisionMapperTest : public Test +{ +public: +}; + +TEST_F(PrecisionMapperTest, mapsPrecisionToDecimalPlaces) +{ + const auto zeroDp = PrecisionMapper::mapToDecimalPlaces(Precision::ZeroDp); + const auto oneDp = PrecisionMapper::mapToDecimalPlaces(Precision::OneDp); + const auto twoDp = PrecisionMapper::mapToDecimalPlaces(Precision::TwoDp); + const auto threeDp = PrecisionMapper::mapToDecimalPlaces(Precision::ThreeDp); + const auto fourDp = PrecisionMapper::mapToDecimalPlaces(Precision::FourDp); + const auto fiveDp = PrecisionMapper::mapToDecimalPlaces(Precision::FiveDp); + const auto sixDp = PrecisionMapper::mapToDecimalPlaces(Precision::SixDp); + const auto sevenDp = PrecisionMapper::mapToDecimalPlaces(Precision::SevenDp); + + ASSERT_EQ(zeroDp, 0); + ASSERT_EQ(oneDp, 1); + ASSERT_EQ(twoDp, 2); + ASSERT_EQ(threeDp, 3); + ASSERT_EQ(fourDp, 4); + ASSERT_EQ(fiveDp, 5); + ASSERT_EQ(sixDp, 6); + ASSERT_EQ(sevenDp, 7); +} diff --git a/src/modules/finance/Finance.cpp b/src/modules/finance/Finance.cpp index 26a584882..fb7da3c2b 100644 --- a/src/modules/finance/Finance.cpp +++ b/src/modules/finance/Finance.cpp @@ -1,6 +1,6 @@ #include "faker-cxx/Finance.h" -#include "../../common/mappers/PrecisionMapper.h" +#include "../../common/mappers/precisionMapper/PrecisionMapper.h" #include "data/AccountTypes.h" #include "data/BankIndentifiersCodes.h" #include "data/CreditCardsFormats.h" @@ -59,7 +59,7 @@ std::string Finance::amount(double min, double max, Precision precision, const s ss << std::fixed; - ss.precision(PrecisionMapper::toDecimalPlaces(precision)); + ss.precision(PrecisionMapper::mapToDecimalPlaces(precision)); ss << generatedNumber; @@ -70,7 +70,6 @@ std::string Finance::iban(std::optional country) { const auto ibanCountry = country ? *country : Helper::arrayElement(supportedIbanCountries); - // TODO: error handling const auto& ibanFormat = ibanFormats.at(ibanCountry); const auto& countryCode = ibanFormat[0]; @@ -105,7 +104,6 @@ std::string Finance::bic(std::optional country) { const auto bicCountry = country ? *country : Helper::arrayElement(supportedBicCountries); - // TODO: error handling return Helper::arrayElement(bankIdentifiersCodesMapping.at(bicCountry)); } diff --git a/src/modules/finance/FinanceTest.cpp b/src/modules/finance/FinanceTest.cpp index e4a30298f..f094cbbc8 100644 --- a/src/modules/finance/FinanceTest.cpp +++ b/src/modules/finance/FinanceTest.cpp @@ -208,7 +208,6 @@ TEST_F(FinanceTest, shouldGenerateIban) { const auto iban = Finance::iban(); - // TODO: implement more detailed checks for iban with default argument ASSERT_TRUE(iban.starts_with("AT") || iban.starts_with("BE") || iban.starts_with("BG") || iban.starts_with("HR") || iban.starts_with("CY") || iban.starts_with("CZ") || iban.starts_with("DK") || iban.starts_with("EE") || iban.starts_with("FI") || iban.starts_with("FR") || iban.starts_with("DE") || iban.starts_with("GR") || diff --git a/src/modules/location/Location.cpp b/src/modules/location/Location.cpp index 2bcd8f671..b1565c19b 100644 --- a/src/modules/location/Location.cpp +++ b/src/modules/location/Location.cpp @@ -2,7 +2,7 @@ #include -#include "../../common/mappers/PrecisionMapper.h" +#include "../../common/mappers/precisionMapper/PrecisionMapper.h" #include "../../common/StringHelper.h" #include "data/Countries.h" #include "data/Directions.h" @@ -194,7 +194,7 @@ std::string Location::latitude(Precision precision) ss << std::fixed; - ss.precision(PrecisionMapper::toDecimalPlaces(precision)); + ss.precision(PrecisionMapper::mapToDecimalPlaces(precision)); ss << latitude; @@ -209,7 +209,7 @@ std::string Location::longitude(Precision precision) ss << std::fixed; - ss.precision(PrecisionMapper::toDecimalPlaces(precision)); + ss.precision(PrecisionMapper::mapToDecimalPlaces(precision)); ss << longitude; diff --git a/src/modules/person/Person.cpp b/src/modules/person/Person.cpp index ccb976152..9a7b8e8a9 100644 --- a/src/modules/person/Person.cpp +++ b/src/modules/person/Person.cpp @@ -190,4 +190,9 @@ std::string Person::hobby() { return Helper::arrayElement(hobbies); } + +std::string Person::language() +{ + return toString(Helper::arrayElement(languages)); +} } diff --git a/src/modules/person/PersonTest.cpp b/src/modules/person/PersonTest.cpp index e58a81137..976b956a3 100644 --- a/src/modules/person/PersonTest.cpp +++ b/src/modules/person/PersonTest.cpp @@ -48,11 +48,6 @@ const auto malePrefix{"Mr."}; const std::vector femalePrefixes{"Ms.", "Miss"}; const std::vector allPrefixes{"Mr.", "Ms.", "Miss"}; -const std::vector languages{ - Language::English, Language::French, Language::German, Language::Italian, Language::Polish, - Language::Russian, Language::Romanian, Language::Hindi, Language::Finnish, Language::Nepali, -}; - const std::map>> languageToFirstNamesMapping{ {Language::English, {{Sex::Male, englishFirstNamesMales}, {Sex::Female, englishFirstNamesFemales}}}, {Language::French, {{Sex::Male, frenchFirstNamesMales}, {Sex::Female, frenchFirstNamesFemales}}}, @@ -332,3 +327,11 @@ TEST_F(PersonTest, shouldGenerateHobby) ASSERT_TRUE( std::ranges::any_of(hobbies, [generatedHobby](const std::string& hobby) { return hobby == generatedHobby; })); } + +TEST_F(PersonTest, shouldGenerateLanguage) +{ + const auto generatedLanguage = Person::language(); + + ASSERT_TRUE(std::ranges::any_of(languages, [generatedLanguage](Language language) + { return generatedLanguage == toString(language); })); +}