From ca0cf83d57d6553dc704631b618ac7f612e7783e Mon Sep 17 00:00:00 2001
From: gam6itko <gam6itko@gmail.com>
Date: Fri, 8 Dec 2023 13:14:50 +0300
Subject: [PATCH 1/2] fix #832

---
 CHANGELOG.md                             |   1 +
 src/Faker/Generator.php                  |   4 +-
 src/Faker/Provider/ru_RU/Person.php      |  26 +++--
 test/Faker/Provider/ru_RU/PersonTest.php | 136 ++++++++++++++++++++++-
 4 files changed, 154 insertions(+), 13 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index eea5886ff9..7d08e5fa56 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@
 
 ## [Unreleased](https://github.com/FakerPHP/Faker/compare/v1.23.0...main)
 
+- Fixed double `а` female lastName in `ru_RU/Person::name()` (#832)
 - Fixed polish license plates (#685)
 - Stopped using `static` in callables in `Provider\pt_BR\PhoneNumber` (#785)
 - Fixed incorrect female name (#794)
diff --git a/src/Faker/Generator.php b/src/Faker/Generator.php
index ee58be35f4..ba6bcb2ab8 100644
--- a/src/Faker/Generator.php
+++ b/src/Faker/Generator.php
@@ -451,7 +451,7 @@
  *
  * @property string $firstName
  *
- * @method string firstName($gender = null)
+ * @method string firstName(?string $gender = null)
  *
  * @property string $firstNameMale
  *
@@ -463,7 +463,7 @@
  *
  * @property string $lastName
  *
- * @method string lastName()
+ * @method string lastName(?string $gender = null)
  *
  * @property string $title
  *
diff --git a/src/Faker/Provider/ru_RU/Person.php b/src/Faker/Provider/ru_RU/Person.php
index 95ec8069a8..b0e17d4e19 100644
--- a/src/Faker/Provider/ru_RU/Person.php
+++ b/src/Faker/Provider/ru_RU/Person.php
@@ -5,8 +5,8 @@
 class Person extends \Faker\Provider\Person
 {
     protected static $maleNameFormats = [
-        '{{firstNameMale}} {{middleNameMale}} {{lastName}}',
-        '{{lastName}} {{firstNameMale}} {{middleNameMale}}',
+        '{{firstNameMale}} {{middleNameMale}} {{lastNameMale}}',
+        '{{lastNameMale}} {{firstNameMale}} {{middleNameMale}}',
     ];
 
     /**
@@ -14,8 +14,8 @@ class Person extends \Faker\Provider\Person
      * That list of MALE last names could be safely extended to FEMALE list just by adding 'a' letter at the end
      */
     protected static $femaleNameFormats = [
-        '{{firstNameFemale}} {{middleNameFemale}} {{lastName}}а',
-        '{{lastName}}а {{firstNameFemale}} {{middleNameFemale}}',
+        '{{firstNameFemale}} {{middleNameFemale}} {{lastNameFemale}}',
+        '{{lastNameFemale}} {{firstNameFemale}} {{middleNameFemale}}',
     ];
 
     /**
@@ -165,16 +165,24 @@ public function middleName($gender = null)
      */
     public function lastName($gender = null)
     {
-        $lastName = static::randomElement(static::$lastName);
-
         if (static::GENDER_FEMALE === $gender) {
-            return $lastName . 'а';
+            return $this->lastNameFemale();
         }
 
         if (static::GENDER_MALE === $gender) {
-            return $lastName;
+            return $this->lastNameMale();
         }
 
-        return $lastName . static::randomElement(static::$lastNameSuffix);
+        return static::randomElement(static::$lastName) . static::randomElement(static::$lastNameSuffix);
+    }
+
+    public function lastNameMale(): string
+    {
+        return static::randomElement(static::$lastName);
+    }
+
+    public function lastNameFemale(): string
+    {
+        return static::randomElement(static::$lastName) . 'а';
     }
 }
diff --git a/test/Faker/Provider/ru_RU/PersonTest.php b/test/Faker/Provider/ru_RU/PersonTest.php
index aa34376d4d..1b4c18ec2c 100644
--- a/test/Faker/Provider/ru_RU/PersonTest.php
+++ b/test/Faker/Provider/ru_RU/PersonTest.php
@@ -2,6 +2,7 @@
 
 namespace Faker\Test\Provider\ru_RU;
 
+use Faker\Generator;
 use Faker\Provider\ru_RU\Person;
 use Faker\Test\TestCase;
 
@@ -10,12 +11,12 @@
  */
 final class PersonTest extends TestCase
 {
-    public function testLastNameFemale(): void
+    public function testLastNameForFemale(): void
     {
         self::assertEquals('а', substr($this->faker->lastName('female'), -2, 2));
     }
 
-    public function testLastNameMale(): void
+    public function testLastNameForMale(): void
     {
         self::assertNotEquals('а', substr($this->faker->lastName('male'), -2, 2));
     }
@@ -29,4 +30,135 @@ protected function getProviders(): iterable
     {
         yield new Person($this->faker);
     }
+
+    /**
+     * @dataProvider dataLastNameMale
+     */
+    public function testLastNameMale(int $seed, string $expected): void
+    {
+        $generator = new Generator();
+        $generator->seed($seed);
+
+        $provider = new Person($generator);
+
+        self::assertSame($expected, $provider->lastNameMale());
+    }
+
+    public function dataLastNameMale(): iterable
+    {
+        yield 'seed: 4' => [
+            4,
+            'Морозов',
+        ];
+
+        yield 'seed: 8' => [
+            8,
+            'Гусев',
+        ];
+
+        yield 'seed: 15' => [
+            15,
+            'Алексеев',
+        ];
+
+        yield 'seed: 16' => [
+            16,
+            'Фадеев',
+        ];
+
+        yield 'seed: 23' => [
+            23,
+            'Воронов',
+        ];
+
+        yield 'seed: 42' => [
+            42,
+            'Горбачёв',
+        ];
+    }
+
+    /**
+     * @dataProvider dataLastNameFemale
+     */
+    public function testLastNameFemale(int $seed, string $expected): void
+    {
+        $generator = new Generator();
+        $generator->seed($seed);
+
+        $provider = new Person($generator);
+
+        self::assertSame($expected, $provider->lastNameFemale());
+    }
+
+    public function dataLastNameFemale(): iterable
+    {
+        yield 'seed: 4' => [
+            4,
+            'Морозова',
+        ];
+
+        yield 'seed: 8' => [
+            8,
+            'Гусева',
+        ];
+
+        yield 'seed: 15' => [
+            15,
+            'Алексеева',
+        ];
+
+        yield 'seed: 16' => [
+            16,
+            'Фадеева',
+        ];
+
+        yield 'seed: 23' => [
+            23,
+            'Воронова',
+        ];
+
+        yield 'seed: 42' => [
+            42,
+            'Горбачёва',
+        ];
+    }
+
+    /**
+     * @dataProvider dataIssue832
+     */
+    public function testIssue832(int $seed, string $expected): void
+    {
+        $generator = new Generator();
+        $generator->seed($seed);
+
+        foreach ($this->getProviders() as $provider) {
+            $generator->addProvider($provider);
+        }
+
+        self::assertSame($expected, $generator->name('female'));
+    }
+
+    public static function dataIssue832(): iterable
+    {
+        //bad cases
+        yield 'seed: 55' => [
+            55,
+            'Ларионова Алиса Александровна',
+        ];
+
+        yield 'seed: 512' => [
+            512,
+            'Тихонова Галина Андреевна',
+        ];
+
+        yield 'seed: 625' => [
+            625,
+            'Ларионова Изабелла Романовна',
+        ];
+
+        yield 'seed: 1917' => [
+            1917,
+            'Павлова Владлена Романовна',
+        ];
+    }
 }

From 80e13ca6aa8b3386a61b3dba7240c8fda133221d Mon Sep 17 00:00:00 2001
From: gam6itko <gam6itko@gmail.com>
Date: Mon, 18 Dec 2023 21:15:16 +0300
Subject: [PATCH 2/2] review fixes

---
 src/Faker/Generator.php                  | 4 ++--
 test/Faker/Provider/ru_RU/PersonTest.php | 8 +++++---
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/Faker/Generator.php b/src/Faker/Generator.php
index ba6bcb2ab8..f11bc6b6ff 100644
--- a/src/Faker/Generator.php
+++ b/src/Faker/Generator.php
@@ -451,7 +451,7 @@
  *
  * @property string $firstName
  *
- * @method string firstName(?string $gender = null)
+ * @method string firstName($gender = null)
  *
  * @property string $firstNameMale
  *
@@ -463,7 +463,7 @@
  *
  * @property string $lastName
  *
- * @method string lastName(?string $gender = null)
+ * @method string lastName($gender = null)
  *
  * @property string $title
  *
diff --git a/test/Faker/Provider/ru_RU/PersonTest.php b/test/Faker/Provider/ru_RU/PersonTest.php
index 1b4c18ec2c..d1b34a8806 100644
--- a/test/Faker/Provider/ru_RU/PersonTest.php
+++ b/test/Faker/Provider/ru_RU/PersonTest.php
@@ -124,9 +124,11 @@ public function dataLastNameFemale(): iterable
     }
 
     /**
-     * @dataProvider dataIssue832
+     * Issue 832
+     *
+     * @dataProvider dataFemaleSurnameWithoutDoubleALetter
      */
-    public function testIssue832(int $seed, string $expected): void
+    public function testFemaleSurnameWithoutDoubleALetter(int $seed, string $expected): void
     {
         $generator = new Generator();
         $generator->seed($seed);
@@ -138,7 +140,7 @@ public function testIssue832(int $seed, string $expected): void
         self::assertSame($expected, $generator->name('female'));
     }
 
-    public static function dataIssue832(): iterable
+    public static function dataFemaleSurnameWithoutDoubleALetter(): iterable
     {
         //bad cases
         yield 'seed: 55' => [