Repository: joke2k/faker

Issue:
Separate male and female names for `hi_IN` provider
* Faker version: `<= 29.0.0`
* OS: all

The `hi_IN` locale doesn't have separate male and female names along with prefixes

### Expected behavior

There should be separate male and female names for `hi_IN` locale

### Actual behavior

Male and female names are mixed

Also mentioned in #2073 


Discussion:

Patch:
diff --git a/faker/providers/person/hi_IN/__init__.py b/faker/providers/person/hi_IN/__init__.py
index d5aebad4d5..9937fc8242 100644
--- a/faker/providers/person/hi_IN/__init__.py
+++ b/faker/providers/person/hi_IN/__init__.py
@@ -2,239 +2,524 @@
 
 
 class Provider(PersonProvider):
+
+    formats_male = (
+        "{{first_name_male}} {{last_name}}",
+        "{{prefix_male}} {{first_name_male}} {{last_name}}",
+        "{{first_name_male}} {{last_name}}{{suffix}}",
+        "{{prefix}} {{first_name_male}} {{last_name}}",
+    )
+    formats_female = (
+        "{{first_name_female}} {{last_name}}",
+        "{{prefix_female}} {{first_name_female}} {{last_name}}",
+        "{{first_name_female}} {{last_name}}{{suffix}}",
+        "{{prefix}} {{first_name_female}} {{last_name}}",
+    )
+
     formats = (
         "{{first_name}} {{last_name}}",
-        "{{first_name}} {{last_name}}",
-        "{{last_name}}, {{first_name}}",
+        "{{prefix}} {{first_name}} {{last_name}}",
+        "{{first_name}} {{last_name}}{{suffix}}",
     )
 
-    # First 20 names from here
-    # https://www.babycenter.in/l25020672/top-20-indian-boys-names-of-2016-photos
-    # Next 20 names from here
-    # https://www.babycenter.in/l25020674/top-20-indian-girls-names-of-2016-photos
-    first_names = (
-        "मुहम्मद",
-        "आरव",
-        "अर्जुन",
-        "रायन",
-        "आद्विक",
-        "अथर्व",
-        "रेयांश",
-        "अयान",
-        "विहान",
-        "साई",
-        "अद्वैत",
-        "शौर्य",
-        "विआन",
-        "आरुष",
-        "इशान",
-        "अयांश",
-        "पार्थ",
-        "देन्यल",
-        "किआन",
-        "विवान",
-        "आद्या",
-        "अनन्या",
-        "शनाया",
-        "फ़ातिमा",
-        "श्री",
-        "अनाया",
-        "अनिका",
-        "मायरा",
-        "इनाया",
-        "अमायरा",
-        "आन्वी",
-        "स्वरा",
-        "ज़ारा",
-        "मरियम",
-        "आराध्या",
-        "तन्वी",
-        "दीया",
-        "अद्विका",
-        "ईवा",
-        "आव्या",
+    # http://www.20000-names.com/male_hindi_names.htm
+    first_names_male = (
         "अभय",
         "आदित्य",
         "अजित",
+        "आकाङ्क्षा",
+        "अकबर",
         "अखिल",
         "अमर",
+        "अमित",
+        "अमृत",
         "आनन्द",
+        "अनन्‍त",
+        "अनिल",
+        "अनिरुद्ध",
+        "अनिश",
         "अंकुर",
+        "अनुज",
         "अनुपम",
+        "अरविन्द",
+        "अर्जुन",
+        "अरुण",
+        "अरुणा",
+        "असीम",
         "अशोक",
+        "बल",
+        "बलदेव",
+        "बलराम",
+        "भारत",
+        "ब्रह्मा",
+        "बृजेश",
+        "चण्ड",
         "चन्दना",
+        "चन्द्रकान्त",
+        "दामोदर",
+        "दर्शन",
+        "दयाराम",
+        "देवदान",
+        "दीपक",
+        "देवदान",
+        "देवदास",
+        "देवराज",
+        "धनञ्जय",
+        "धवल",
+        "दिलीप",
+        "दिनेश",
+        "दीपक",
+        "दिलीप",
         "गणेश",
         "गौतम",
+        "गोपाल",
+        "गोतम",
         "गोविंदा",
+        "गुलज़ार",
         "हनुमान्",
+        "हरेन्द्र",
+        "हरि",
+        "हरीश",
+        "हर्श",
+        "हर्शद",
+        "हर्शल",
+        "इला",
+        "इन्द्र",
         "इन्द्रजित",
         "ईश",
         "जगन्नाथ",
         "जगदीश",
+        "जगजीत",
         "जयदेव",
+        "ज़स्विन्देर्",
+        "जय",
+        "जयन्त",
+        "जयेन्द्र",
         "जितेन्द्र",
+        "जौहर",
+        "ज्योतिष",
         "कैलाश",
         "कालिदास",
+        "काम",
+        "कमल",
         "कम्बोज",
+        "कपिल",
+        "कर्ण",
+        "ख़ान",
         "किरण",
+        "कशोर",
+        "कृष्ण",
+        "कुमार",
+        "कुणाल",
+        "लक्ष्मण",
+        "लाल",
         "ललित",
+        "लोचन",
+        "माधव",
+        "मधुकर",
+        "महात्मा",
+        "महावीर",
+        "महेन्द्रा",
         "मानदीप",
+        "मनीश",
+        "मणि",
+        "मणीन्द्र",
+        "मनीश",
+        "मञ्जुनाथ",
         "मोहन",
         "मुकेश",
-        "नरेन्द्र",
+        "नंद",
         "नारायण",
+        "नरेन्द्र",
+        "नवीन",
         "निखिल",
+        "नीरव",
+        "िनशा",
+        "ओम",
+        "पद्म",
+        "पल्लव",
+        "पीताम्बर",
         "प्रभाकर",
+        "प्रभात",
+        "प्रभु",
         "प्रबोध",
         "प्रदीप",
+        "प्रकाश",
+        "प्रमोद",
         "प्रणव",
+        "प्रणय",
+        "प्रसाद",
+        "प्रसन्न",
+        "प्रताप",
         "प्रेम",
+        "पुरुषोत्तम",
+        "रघु",
+        "राहुल",
+        "राज",
+        "राजन",
+        "रजनीकांत",
         "राजीव",
+        "राजेन्द्र",
+        "राजेश",
+        "राजीव",
+        "राकेश",
+        "राम",
+        "रामचन्द्र",
+        "रामकृष्ण",
+        "रञ्जित",
         "रतन",
+        "रत्नम",
+        "रावण",
+        "रवि",
+        "ऋषि",
         "रोहन",
-        "विष्णु",
-        "विक्रम",
-        "विजया",
+        "सचिन",
+        "संदीप",
+        "शनि",
+        "संजय",
+        "संजित",
+        "संजीव",
+        "शंकर",
+        "सरल",
+        "सतीश",
+        "सवितृ",
+        "शेखर",
+        "सेठ",
+        "शनि",
+        "शंकर",
+        "शङ्कर",
+        "शंतनु",
+        "शर्म",
+        "शशि",
+        "शेखर",
+        "शेष",
+        "शिव",
+        "श्रेष्ठ",
+        "श्रीपति",
+        "श्याम",
+        "श्यामल",
+        "सिद्धार्थ",
+        "सिकन्दर",
+        "सोहेल",
+        "सुभाष",
+        "सुदर्शन",
+        "सुधीर",
+        "सुमन",
+        "सुमन्त्र",
+        "सुन्दर",
+        "सुनील",
+        "सुरज",
+        "सुरेन्द्र",
+        "सुरेश",
+        "सूर्य",
+        "सुशील",
+        "स्वपन",
+        "स्वप्निल",
+        "स्वर्ण",
+        "उत्तम",
+        "वसन्त",
+        "वासिष्ठ",
+        "भरत",
         "विजय",
+        "विजया",
+        "विक्रम",
+        "विमल",
+        "विनय",
+        "विपिन",
+        "विपुल",
+        "विशाल",
+        "विष्णु",
         "विवेक",
         "यश",
+    )
+
+    # http://www.20000-names.com/female_hindi_names.htm
+    first_names_female = (
+        "आभा",
         "अभिलाषा",
         "अदिती",
         "ऐश्वर्या",
+        "आकाङ्क्षा",
+        "अमला",
         "अमिता",
+        "अमृता",
+        "आनन्दा",
+        "अनिला",
+        "अणिमा",
         "अंकिता",
+        "अनुष्का",
+        "अनुजा",
+        "अर्चना",
+        "अरुंधती",
         "आशा",
         "अवनी",
+        "अवन्ती",
+        "बल",
         "भरत",
+        "चण्डा",
+        "चन्दना",
+        "चन्द्रकान्ता",
         "चेतना",
+        "दमयंती",
+        "दर्शना",
+        "दीपाली",
+        "दीप्ति",
+        "देवी",
+        "दीपाली",
+        "दीप्ति",
         "दिव्या",
+        "दुर्गा",
         "एषा",
+        "गौहर",
+        "गौरी",
+        "गीता",
+        "गोपीनाथ",
+        "गुलज़ार",
+        "इला",
+        "इन्दिरा",
+        "इन्द्रजित",
         "इन्दु",
+        "ज़स्विन्देर्",
         "जया",
         "जयन्ती",
         "ज्योत्सना",
+        "ज्योत्स्ना",
+        "कैलाश",
+        "कला",
+        "काली",
+        "कल्पना",
+        "कमला",
+        "कान्ता",
         "कान्ती",
+        "करिश्मा",
+        "काशी",
+        "कौशल्या",
+        "िकशोरी",
+        "क्षितिज",
         "कुमारी",
+        "कुंती",
+        "लक्ष्मी",
         "लता",
+        "लावण्या",
+        "लक्ष्मी",
+        "लीला",
+        "लीलावती",
+        "लीला",
         "लीला",
+        "लीलावती",
+        "लीना",
+        "माधवी",
+        "मधु",
+        "मधुर",
+        "माला",
         "मालती",
+        "मनीषा",
+        "मञ्जु",
+        "मञ्जुला",
+        "मञ्जूषा",
+        "माया",
+        "मीरा",
+        "मोहना",
         "मोहिनी",
+        "मुक्ता",
+        "नेहा",
+        "निखिला",
         "निशा",
+        "नित्य",
+        "पद्म",
+        "पद्मावती",
+        "पद्मिनी",
+        "पार्वती",
+        "परवीन",
+        "पूर्णिमा",
+        "प्रतिभा",
+        "प्रतिमा",
+        "प्रेमा",
+        "प्रिया",
         "पूर्णिमा",
         "पुष्पा",
         "रचना",
+        "राधा",
         "रजनी",
+        "राज्य",
+        "रानी",
         "रश्मी",
+        "रति",
+        "रत्न",
+        "रेशमी",
+        "रीतिका",
         "रिया",
+        "रोहना",
+        "रुक्मिणी",
+        "रुपिन्द्र",
+        "संजना",
         "सरला",
         "सरस्वती",
+        "सारिका",
+        "सती",
         "सावित्री",
+        "सीमा",
+        "सीता",
         "शक्ति",
+        "शकुन्तला",
         "शान्ता",
+        "शान्ती",
         "शर्मिला",
+        "शशी",
+        "शीला",
+        "शिवाली",
+        "शोभा",
         "श्यामा",
+        "श्यामला",
+        "सीमा",
+        "सीता",
+        "सितारा",
+        "सोनल",
+        "श्री",
+        "सुदर्शना",
         "सुलभा",
+        "सुमना",
+        "सुमती",
+        "सुनीता",
+        "सुनीती",
+        "सुशीला",
+        "स्वर्ण",
+        "तारा",
         "तृष्णा",
+        "उमा",
+        "उषा",
+        "वसन्ता",
         "विद्या",
-        "अली",
-        "हासन",
-        "हुसैन",
-        "ज़ाकिर",
-        "रिज़वान",
-        "फ़रहान",
-        "ज़ोया",
+        "विजया",
+        "विमला",
     )
 
+    first_names = first_names_male + first_names_female
+
+    # https://blogs.transparent.com/hindi/common-surnames-in-india/
     last_names = (
-        "पाटिल",
+        # Common Surnames in North India (Delhi, Haryana, Punjab,etc)
         "शर्मा",
-        "आचार्य",
-        "अग्रवाल",
+        "भट",
+        "वर्मा",
+        "कुमार",
+        "गुप्ता",
+        "मल्होत्रा",
+        "भटनागर",
+        "सक्सेना",
+        "कपूर",
         "सिंह",
-        "अहलुवालिया",
+        "महरा",
+        "चोपरा",
+        "सरीन",
+        "मालिक",
+        "सैनी",
+        "जैन",
+        "कौल",
+        "खत्री",
+        "गोयल",
+        "तिवारी",
+        "भरद्वाज",
+        "चोपरा",
+        "प्रसाद",
+        "आचार्य",
+        "अगरवाल",
+        "अहलूवालिया",
+        "टंडन",
         "आहूजा",
-        "पुष्कर",
-        "शिरोळे",
-        "गायकवाड",
-        "गावित",
-        "शिरोळे",
-        "बापट",
-        "अरोड़ा",
-        "बाबू",
-        "बादामी",
-        "जमानत",
-        "बजाज",
-        "बक्षी",
-        "बालकृष्णन",
-        "बालासुब्रमणियम",
-        "बसु",
-        "भंडारी",
-        "चौधरी",
-        "चौहान",
-        "छाबरा",
-        "दादा",
-        "डानी",
-        "डार",
-        "दारा",
-        "दत्ता",
-        "दवे",
-        "दयाल",
-        "धालीवाल",
-        "दीक्षित",
-        "दोषी",
-        "दुआ",
-        "दूबे",
-        "ढींगरा",
-        "वाल",
-        "साया",
-        "बना",
-        "ड़ाल",
-        "गर्ग",
-        "गणेश",
-        "गांगुली",
-        "गुप्ता",
-        "हेगडे",
-        "जोशी",
-        "काले",
-        "कृष्णा",
-        "कृष्णमूर्ति",
-        "कृष्णन",
-        "कुलकर्णी",
-        "कुमार",
-        "कुण्डा",
-        "नाम",
-        "रामलला",
-        "लता",
-        "लोदी",
-        "लोकनाट्यों",
-        "विकावि",
-        "लाल",
-        "लाला",
-        "वफादार",
-        "लूथरा",
-        "मदन",
-        "मगर",
-        "भारत",
-        "महावीर",
-        "महादेव",
-        "महाजन",
-        "महाराज",
+        "अरोरा",
+        # Common Surnames in East India: (Bengal, Orrisa, etc.)
+        "चटर्जी",
+        "चतुर्वेदी",
+        "सेन",
+        "बोस",
+        "सेनगुप्ता",
+        "दास",
+        "दासगुप्ता",
+        "मुख़र्जी",
+        "दुत्ता",
+        "बनर्जी",
+        "चक्रवर्ती",
+        "भट्टाचार्य",
+        "घोष",
+        "मित्रा",
+        "गुहा",
+        "सरकार",
+        "साहा",
+        "रॉय",
+        "चोधरी",
+        "रॉय चौधरी",
         "मजूमदार",
-        "मल्लिक",
-        "सेनाधीश",
-        "माने",
-        "मंगल",
-        "मंगत",
-        "रामशर्मा",
-        "मणि",
-        "मान",
-        "श्रीविमल",
-        "कुमार",
         "मंडल",
-        "अली",
-        "हासन",
-        "हुसैन",
+        "मैती",
+        "कलिता",
+        "हजारिका",
+        "नाथ",
+        "बुरुाह",
+        "थापा",
+        "गुरुंग",
+        "राय",
+        "प्रधान",
+        "तमांग",
+        "छेत्री",
+        # Common Surnames in South India (Karnataka, Tamil Nadu, Kerala, etc.)
+        "नायर",
+        "मेनन",
+        "पिल्लई",
+        "वेंकटएसन",
+        "बलासुब्रमानियम",
+        "राव",
+        "जयरामन",
+        "सुब्रमण्यम",
+        "रंगन",
+        "रंगराजन",
+        "नारायण",
+        "रेड्डी",
+        # Common Surnames in Central India (Bihar/ Uttar Pradesh, Madhya Pradesh, etc)
+        "सिंह",
+        "द्विवेदी",
+        "मिश्रा",
+        "त्रिवेदी",
+        "झा",
+        "शुक्ला",
+        "यादव",
+        "सिन्हा",
+        "पाण्डेय",
+        "झादव",
+        "जेटली",
+        "चौहान",
+        "जोशी",
+        "मिस्त्री",
         "खान",
-        "अब्बासी",
-        "नूरानी",
+        "श्रीवास्तव",
+        # Common Surnames in West India (Maharashtra, Gujarat, Goa etc)
+        "शाह",
+        "देशपांडे",
+        "गावडे",
+        "कदम",
+        "ताम्बे",
+        "मेहता",
+        "पटेल",
+        "पाटिल",
+        "पवार",
+        "चवन",
+        "डी’सोउज़ा",
+        "लोबो",
+        "रोद्रिगुएस",
+        "डी’कोस्टा",
     )
+
+    prefixes_male = ("श्री", "श्रीमान")
+
+    prefixes_female = ("श्री", "श्रीमती")
+
+    prefixes = (
+        "माननीय",
+        "आदरसूचक",
+        "सम्मानसूचक",
+        "संमानित",
+        "आदरवाचक",
+        "सम्मानात्मक",
+    )
+
+    suffixes = ("जी",)


Test patch:
diff --git a/tests/providers/test_person.py b/tests/providers/test_person.py
index 9018aff33b..aedfa5bf74 100644
--- a/tests/providers/test_person.py
+++ b/tests/providers/test_person.py
@@ -21,6 +21,7 @@
 from faker.providers.person.fr_BE import Provider as FrBEProvider
 from faker.providers.person.ga_IE import Provider as GaIEProvider
 from faker.providers.person.he_IL import Provider as HeILProvider
+from faker.providers.person.hi_IN import Provider as HiINProvider
 from faker.providers.person.hy_AM import Provider as HyAmProvider
 from faker.providers.person.lv_LV import Provider as LvProvider
 from faker.providers.person.ne_NP import Provider as NeProvider
@@ -1719,6 +1720,584 @@ def test_name(self):
         assert last_romanized_name in ZhTWProvider.last_romanized_names
 
 
+class TestHyAM(unittest.TestCase):
+    """Tests person in the hy_AM locale"""
+
+    def setUp(self):
+        self.fake = Faker("hy_AM")
+        Faker.seed(0)
+
+    def test_name(self):
+        # General name
+        name = self.fake.name()
+        self.assertIsInstance(name, str)
+
+        # Female name
+        name = self.fake.name_female()
+        self.assertIsInstance(name, str)
+
+        # Male name
+        name = self.fake.name_male()
+        self.assertIsInstance(name, str)
+
+    def test_first_name(self):
+        # General first name
+        name = self.fake.first_name()
+        self.assertIsInstance(name, str)
+        assert name in HyAmProvider.first_names
+
+        # Female first name
+        name = self.fake.first_name_female()
+        self.assertIsInstance(name, str)
+        assert name in HyAmProvider.first_names
+        assert name in HyAmProvider.first_names_female
+
+        # Male first name
+        name = self.fake.first_name_male()
+        self.assertIsInstance(name, str)
+        assert name in HyAmProvider.first_names
+        assert name in HyAmProvider.first_names_male
+
+    def test_last_name(self):
+        # There's no gender-specific last name in Armenian.
+        assert not hasattr(HyAmProvider, "last_names_male")
+        assert not hasattr(HyAmProvider, "last_names_female")
+        # All last names apply for all genders.
+        assert hasattr(HyAmProvider, "last_names")
+
+        # General last name.
+        name = self.fake.last_name()
+        self.assertIsInstance(name, str)
+        assert name in HyAmProvider.last_names
+
+        # Females last name.
+        name = self.fake.last_name_female()
+        self.assertIsInstance(name, str)
+        assert name in HyAmProvider.last_names
+
+        # Male last name.
+        name = self.fake.last_name_male()
+        self.assertIsInstance(name, str)
+        assert name in HyAmProvider.last_names
+
+
+class TestTaIN(unittest.TestCase):
+    def setUp(self):
+        self.fake = Faker("ta_IN")
+        Faker.seed(0)
+
+    def test_gender_first_names(self):
+        """simple test to verify that we are pulling gender specific names"""
+        name = self.fake.first_name_female()
+        assert name in TaINProvider.first_names_female
+        name = self.fake.first_name_male()
+        assert name in TaINProvider.first_names_male
+        name = self.fake.first_name()
+        assert name in TaINProvider.first_names
+
+
+class TestRuRU(unittest.TestCase):
+    """Tests person in the ru_RU locale"""
+
+    def setUp(self):
+        self.fake = Faker("ru_RU")
+        Faker.seed(0)
+
+    def test_translit(self):
+        assert translit("Александр Сергеевич Пушкин") == "Aleksandr Sergeevich Pushkin"
+        assert translit("Анна Андреевна Ахматова") == "Anna Andreevna Akhmatova"
+        assert translit("Михаил") == "Mikhail"
+        assert translit("Фёдор") == "Fedor"
+        assert translit("Екатерина") == "Yekaterina"
+        assert translit("Анастасия") == "Anastasiya"
+        assert translit("Юрьевич") == "Yurevich"
+        assert translit("Никитична") == "Nikitichna"
+        assert translit("Щербакова") == "Shcherbakova"
+        assert translit("Маяковский") == "Mayakovskiy"
+        assert translit("Петров-Водкин") == "Petrov-Vodkin"
+        assert translit("Воронцова-Дашкова") == "Vorontsova-Dashkova"
+        assert translit("А.С.Пушкин") == "A.S.Pushkin"
+        assert translit("А. С. Пушкин") == "A. S. Pushkin"
+        assert translit("тов. И.И.Сидоров") == "tov. I.I.Sidorov"
+        assert translit("г-н А.Б.Петров") == "g-n A.B.Petrov"
+        assert translit("г-жа Ю.М.Петрова") == "g-zha Yu.M.Petrova"
+
+    def test_name_female(self):
+        first_name = self.fake.first_name_female()
+        assert first_name in RuProvider.first_names_female
+        middle_name = self.fake.middle_name_female()
+        assert middle_name in RuProvider.middle_names_female
+        last_name = self.fake.last_name_female()
+        assert last_name in RuProvider.last_names_female
+
+    def test_name_male(self):
+        first_name = self.fake.first_name_male()
+        assert first_name in RuProvider.first_names_male
+        middle_name = self.fake.middle_name_male()
+        assert middle_name in RuProvider.middle_names_male
+        last_name = self.fake.last_name_male()
+        assert last_name in RuProvider.last_names_male
+
+    def test_language_name(self):
+        language_name = self.fake.language_name()
+        assert language_name in RuProvider.language_names
+
+
+class TestEs(unittest.TestCase):
+    """Tests person in the es locale."""
+
+    def setUp(self):
+        self.fake = Faker("es")
+        Faker.seed(0)
+
+    def test_language_name(self):
+        language_name = self.fake.language_name()
+        assert language_name in EsProvider.language_names
+
+
+class TestEsCO(unittest.TestCase):
+    """Tests person in the es_CO locale"""
+
+    def setUp(self):
+        self.fake = Faker("es_CO")
+        Faker.seed(0)
+
+    def test_first_names(self):
+        # General first name
+        name = self.fake.first_name()
+        self.assertIsInstance(name, str)
+        assert name in EsCOProvider.first_names
+
+        # Female first name
+        name = self.fake.first_name_female()
+        self.assertIsInstance(name, str)
+        assert name in EsCOProvider.first_names
+        assert name in EsCOProvider.first_names_female
+
+        # Male first name
+        name = self.fake.first_name_male()
+        self.assertIsInstance(name, str)
+        assert name in EsCOProvider.first_names
+        assert name in EsCOProvider.first_names_male
+
+    def test_last_names(self):
+        # General last name
+        name = self.fake.last_name()
+        self.assertIsInstance(name, str)
+        assert name in EsCOProvider.last_names
+
+        # Female last name
+        name = self.fake.last_name_female()
+        self.assertIsInstance(name, str)
+        assert name in EsCOProvider.last_names
+
+        # Male last name
+        name = self.fake.last_name_male()
+        self.assertIsInstance(name, str)
+        assert name in EsCOProvider.last_names
+
+    def test_prefix(self):
+        # Female prefix
+        prefix = self.fake.prefix_female()
+        self.assertIsInstance(prefix, str)
+        assert prefix in EsCOProvider.prefixes_female
+
+        # Male prefix
+        prefix = self.fake.prefix_male()
+        self.assertIsInstance(prefix, str)
+        assert prefix in EsCOProvider.prefixes_male
+
+
+class TestHeIL(unittest.TestCase):
+    """Tests person in the he_IL locale."""
+
+    def setUp(self):
+        self.fake = Faker("he_IL")
+        Faker.seed(0)
+
+    def test_language_name(self):
+        language_name = self.fake.language_name()
+        assert language_name in HeILProvider.language_names
+
+    def test_male_first_name(self):
+        first_name_male = self.fake.first_name_male()
+        assert first_name_male in HeILProvider.first_names_male
+
+    def test_female_first_name(self):
+        first_name_female = self.fake.first_name_female()
+        assert first_name_female in HeILProvider.first_names_female
+
+    def test_last_name(self):
+        last_name = self.fake.last_name()
+        assert last_name in HeILProvider.last_names
+
+
+class TestPtPt(unittest.TestCase):
+    """Tests person in the pt_PT locale."""
+
+    def setUp(self):
+        self.fake = Faker("pt_PT")
+        Faker.seed(0)
+
+    def test_male_first_name(self):
+        first_name_male = self.fake.first_name_male()
+        assert first_name_male in PtPtProvider.first_names_male
+
+    def test_female_first_name(self):
+        first_name_female = self.fake.first_name_female()
+        assert first_name_female in PtPtProvider.first_names_female
+
+    def test_last_name(self):
+        last_name = self.fake.last_name()
+        assert last_name in PtPtProvider.last_names
+
+
+class TestEnGB(unittest.TestCase):
+    def setUp(self):
+        self.fake = Faker("en_GB")
+        Faker.seed(0)
+
+    def test_first_name_female(self):
+        name = self.fake.first_name_female()
+        assert name in EnGBProvider.first_names_female
+
+    def test_first_name_male(self):
+        name = self.fake.first_name_male()
+        assert name in EnGBProvider.first_names_male
+
+    def test_name_female(self):
+        full_name = self.fake.name_female()
+        first_name = self.get_first_name_from_full_name(full_name)
+        assert first_name in EnGBProvider.first_names_female
+
+    def test_name_male(self):
+        full_name = self.fake.name_male()
+        first_name = self.get_first_name_from_full_name(full_name)
+        assert first_name in EnGBProvider.first_names_male
+
+    def get_first_name_from_full_name(self, full_name):
+        names = full_name.split(" ")
+        if len(names) == 2:
+            return names[0]
+        return names[1]
+
+
+class TestUs(unittest.TestCase):
+    """Tests person in the en_US locale"""
+
+    def setUp(self):
+        self.fake = Faker("en_US")
+        Faker.seed(0)
+
+    def test_first_names(self):
+        # General first name
+        name = self.fake.first_name()
+        self.assertIsInstance(name, str)
+        assert name in EnUSProvider.first_names
+
+        # Female first name
+        name = self.fake.first_name_female()
+        self.assertIsInstance(name, str)
+        assert name in EnUSProvider.first_names
+        assert name in EnUSProvider.first_names_female
+
+        # Male first name
+        name = self.fake.first_name_male()
+        self.assertIsInstance(name, str)
+        assert name in EnUSProvider.first_names
+        assert name in EnUSProvider.first_names_male
+
+        # Nonbinary first name
+        name = self.fake.first_name_nonbinary()
+        self.assertIsInstance(name, str)
+        assert name in EnUSProvider.first_names
+        assert name in EnUSProvider.first_names_nonbinary
+
+    def test_last_names(self):
+        # General last name
+        name = self.fake.last_name()
+        self.assertIsInstance(name, str)
+        assert name in EnUSProvider.last_names
+
+        # Female last name
+        name = self.fake.last_name_female()
+        self.assertIsInstance(name, str)
+        assert name in EnUSProvider.last_names
+
+        # Male last name
+        name = self.fake.last_name_male()
+        self.assertIsInstance(name, str)
+        assert name in EnUSProvider.last_names
+
+        # Nonbinary last name
+        name = self.fake.last_name_nonbinary()
+        self.assertIsInstance(name, str)
+        assert name in EnUSProvider.last_names
+
+    def test_prefix(self):
+        # Nonbinary prefix
+        prefix = self.fake.prefix_nonbinary()
+        self.assertIsInstance(prefix, str)
+        assert prefix in EnUSProvider.prefixes_nonbinary
+
+    def test_suffix(self):
+        # Nonbinary suffix
+        suffix = self.fake.suffix_nonbinary()
+        self.assertIsInstance(suffix, str)
+        assert suffix in EnUSProvider.suffixes_nonbinary
+
+
+class TestEn(unittest.TestCase):
+    """Tests person in the en locale"""
+
+    def setUp(self):
+        self.fake = Faker("en")
+        Faker.seed(0)
+
+    def test_suffix(self):
+        # Traditional suffix -- provider does not offer a nonbinary suffix at this time
+        suffix = self.fake.suffix()
+        self.assertIsInstance(suffix, str)
+        assert suffix in EnProvider.suffixes_male or suffix in EnProvider.suffixes_female
+
+
+class TestOrIN(unittest.TestCase):
+    def setUp(self):
+        self.fake = Faker("or_IN")
+        Faker.seed(0)
+
+    def test_first_names(self):
+        """simple test to verify that we are pulling gender specific names"""
+        name = self.fake.first_name_female()
+        assert name in OrINProvider.first_names_female
+
+        name = self.fake.first_name_male()
+        assert name in OrINProvider.first_names_male
+
+        name = self.fake.first_name_unisex()
+        assert name in OrINProvider.first_names_unisex
+
+        name = self.fake.first_name()
+        assert name in OrINProvider.first_names
+
+    def test_middle_names(self):
+        """test the middle name"""
+        name = self.fake.middle_name()
+        assert name in OrINProvider.middle_names
+
+    def test_last_names(self):
+        """test the last name is generating from the provided tuple"""
+        last_name = self.fake.last_name()
+        assert last_name in OrINProvider.last_names
+
+
+class TestEnIN(unittest.TestCase):
+    """Tests person in the en_IN locale"""
+
+    def setUp(self):
+        self.fake = Faker("en_IN")
+        Faker.seed(0)
+
+    def test_first_name(self):
+        first_name = self.fake.first_name()
+        assert first_name in EnINProvider.first_names
+
+    def test_last_name(self):
+        last_name = self.fake.last_name()
+        assert last_name in EnINProvider.last_names
+
+
+class TestHiIN(unittest.TestCase):
+    """Tests person in the hi_IN locale"""
+
+    def setUp(self):
+        self.fake = Faker("hi_IN")
+        Faker.seed(0)
+
+    def test_first_name(self):
+        """Verify that gender specific names are set correctly"""
+
+        name = self.fake.first_name_male()
+        assert name in HiINProvider.first_names_male
+
+        name = self.fake.first_name_female()
+        assert name in HiINProvider.first_names_female
+
+        name = self.fake.first_name()
+        assert name in HiINProvider.first_names_male
+
+    def test_last_name(self):
+        last_name = self.fake.last_name()
+        assert last_name in HiINProvider.last_names
+
+    def test_name(self):
+        name = self.fake.name().split()
+
+        assert all(isinstance(n, str) for n in name)
+
+        prefixes = HiINProvider.prefixes_male + HiINProvider.prefixes_female + HiINProvider.prefixes
+
+        # name should always be 2-3 words. If 3, first word should be a prefix.
+        if len(name) == 3:
+            assert all(
+                [
+                    name[0] in prefixes,
+                    name[1] in HiINProvider.first_names,
+                    name[2] in HiINProvider.last_names,
+                ]
+            )
+        else:
+            assert name[0] in HiINProvider.first_names
+            if name[-1].endswith(HiINProvider.suffixes):
+                assert name[-1][:-1] in HiINProvider.last_names
+                assert name[-1][-1] in HiINProvider.suffixes
+            else:
+                assert name[-1] in HiINProvider.last_names
+
+
+class TestEnIE(unittest.TestCase):
+    """Tests person in the en-IE locale"""
+
+    def setUp(self):
+        self.fake = Faker("en-ie")
+        self.provider = EnIEProvider
+        Faker.seed(0)
+
+    def test_first_name(self):
+        # General first name
+        name = self.fake.first_name()
+        assert name
+        self.assertIsInstance(name, str)
+        assert name in self.provider.first_names
+
+        # Females first name
+        name = self.fake.first_name_female()
+        assert name
+        self.assertIsInstance(name, str)
+        assert name in self.provider.first_names
+        assert name in self.provider.first_names_female
+
+        # Male first name
+        name = self.fake.first_name_male()
+        assert name
+        self.assertIsInstance(name, str)
+        assert name in self.provider.first_names
+        assert name in self.provider.first_names_male
+
+    def test_last_name(self):
+        assert not hasattr(self.provider, "last_names_male")
+        assert not hasattr(self.provider, "last_names_female")
+        # All last names apply for all genders.
+        assert hasattr(self.provider, "last_names")
+
+        # General last name.
+        name = self.fake.last_name()
+        assert name
+        self.assertIsInstance(name, str)
+        assert name in self.provider.last_names
+
+        # Females last name.
+        name = self.fake.last_name_female()
+        assert name
+        self.assertIsInstance(name, str)
+        assert name in self.provider.last_names
+        assert name in self.provider.last_names
+
+        # Male last name.
+        name = self.fake.last_name_male()
+        assert name
+        self.assertIsInstance(name, str)
+        assert name in self.provider.last_names
+
+
+class TestGaIE(TestEnIE):
+    """Tests person in the ga-IE locale"""
+
+    def setUp(self):
+        self.fake = Faker("ga-ie")
+        self.provider = GaIEProvider
+        Faker.seed(0)
+
+
+class TestYoNG(unittest.TestCase):
+    def setUp(self):
+        self.fake = Faker("yo_NG")
+        Faker.seed(0)
+
+    def test_last_name(self):
+        """
+        Test the generation of Zulu last names.
+        """
+        # There's no gender-specific last name in Zulu.
+        self.assertTrue(hasattr(YoNGProvider, "last_names_male"))
+        self.assertTrue(hasattr(YoNGProvider, "last_names_female"))
+
+        # All last names apply to all genders.
+        self.assertTrue(hasattr(YoNGProvider, "last_names"))
+
+        # General last name.
+        name = self.fake.last_name()
+        self.assertIsInstance(name, str)
+        self.assertIn(name, YoNGProvider.last_names)
+
+        # Females last name.
+        name = self.fake.last_name_female()
+        self.assertIsInstance(name, str)
+        self.assertIn(name, YoNGProvider.last_names)
+
+        # Male last name.
+        name = self.fake.last_name_male()
+        self.assertIsInstance(name, str)
+        self.assertIn(name, YoNGProvider.last_names)
+
+    def test_first_name(self):
+        """
+        Test the generation of Zulu first names.
+        """
+        # General first name.
+        name = self.fake.first_name()
+        self.assertIsInstance(name, str)
+        self.assertIn(name, YoNGProvider.first_names)
+
+        # Female first name.
+        name = self.fake.first_name_female()
+        self.assertIsInstance(name, str)
+        self.assertIn(name, YoNGProvider.first_names)
+        self.assertIn(name, YoNGProvider.first_names_female)
+
+        # Male first name.
+        name = self.fake.first_name_male()
+        self.assertIsInstance(name, str)
+        self.assertIn(name, YoNGProvider.first_names)
+        self.assertIn(name, YoNGProvider.first_names_male)
+
+    def test_full_name(self):
+        """
+        Test the generation of full Zulu names.
+        """
+        # Full name.
+        name = self.fake.name()
+        self.assertIsInstance(name, str)
+
+        full_name_parts = name.split()
+
+        if len(full_name_parts) == 2:
+            first_name = full_name_parts[0]
+            last_name = full_name_parts[1]
+            self.assertIn(first_name, YoNGProvider.first_names)
+            self.assertIn(last_name, YoNGProvider.last_names)
+        elif len(full_name_parts) == 3:
+            prefix = full_name_parts[0]
+            first_name = full_name_parts[1]
+            last_name = full_name_parts[2]
+
+            self.assertIn(prefix, YoNGProvider.prefixes_female + YoNGProvider.prefixes_male)
+            self.assertIn(first_name, YoNGProvider.first_names)
+            self.assertIn(last_name, YoNGProvider.last_names)
+        else:
+            raise AssertionError("Invalid number of name parts. Expected 2 or 3.")
+
+
 class TestZuZa(unittest.TestCase):
     def setUp(self):
         self.fake = Faker("zu_ZA")