FunctionsTest.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <?php
  2. namespace morphos\test\Russian;
  3. use morphos\Gender;
  4. use morphos\Russian\Cases;
  5. use PHPUnit\Framework\TestCase;
  6. class FunctionsTest extends TestCase
  7. {
  8. /**
  9. * @dataProvider fullNamesProvider()
  10. */
  11. public function testGetNameCases($name, $gender, $name2, $name3, $name4, $name5, $name6)
  12. {
  13. $this->assertEquals([
  14. Cases::IMENIT => $name,
  15. Cases::RODIT => $name2,
  16. Cases::DAT => $name3,
  17. Cases::VINIT => $name4,
  18. Cases::TVORIT => $name5,
  19. Cases::PREDLOJ => $name6,
  20. ], \morphos\Russian\getNameCases($name, $gender));
  21. // old-style call to inflectName()
  22. $this->assertEquals([
  23. Cases::IMENIT => $name,
  24. Cases::RODIT => $name2,
  25. Cases::DAT => $name3,
  26. Cases::VINIT => $name4,
  27. Cases::TVORIT => $name5,
  28. Cases::PREDLOJ => $name6,
  29. ], \morphos\Russian\inflectName($name, $gender));
  30. }
  31. public function fullNamesProvider()
  32. {
  33. return
  34. [
  35. [
  36. 'Янаев Осип Андреевич',
  37. Gender::MALE,
  38. 'Янаева Осипа Андреевича',
  39. 'Янаеву Осипу Андреевичу',
  40. 'Янаева Осипа Андреевича',
  41. 'Янаевым Осипом Андреевичем',
  42. 'Янаеве Осипе Андреевиче',
  43. ],
  44. [
  45. 'Молодыха Лариса Трофимовна',
  46. Gender::FEMALE,
  47. 'Молодыхи Ларисы Трофимовны',
  48. 'Молодыхе Ларисе Трофимовне',
  49. 'Молодыху Ларису Трофимовну',
  50. 'Молодыхой Ларисой Трофимовной',
  51. 'Молодыхе Ларисе Трофимовне',
  52. ],
  53. [
  54. 'Вергун Илья Захарович',
  55. Gender::MALE,
  56. 'Вергуна Ильи Захаровича',
  57. 'Вергуну Илье Захаровичу',
  58. 'Вергуна Илью Захаровича',
  59. 'Вергуном Ильей Захаровичем',
  60. 'Вергуне Илье Захаровиче',
  61. ],
  62. [
  63. 'Горюнова Таисия Романовна',
  64. Gender::FEMALE,
  65. 'Горюновой Таисии Романовны',
  66. 'Горюновой Таисии Романовне',
  67. 'Горюнову Таисию Романовну',
  68. 'Горюновой Таисией Романовной',
  69. 'Горюновой Таисии Романовне',
  70. ],
  71. [
  72. 'Путинцева Антонина Карповна',
  73. Gender::FEMALE,
  74. 'Путинцевой Антонины Карповны',
  75. 'Путинцевой Антонине Карповне',
  76. 'Путинцеву Антонину Карповну',
  77. 'Путинцевой Антониной Карповной',
  78. 'Путинцевой Антонине Карповне',
  79. ],
  80. [
  81. 'Янаев Осип',
  82. Gender::MALE,
  83. 'Янаева Осипа',
  84. 'Янаеву Осипу',
  85. 'Янаева Осипа',
  86. 'Янаевым Осипом',
  87. 'Янаеве Осипе',
  88. ],
  89. ['Осип', Gender::MALE, 'Осипа', 'Осипу', 'Осипа', 'Осипом', 'Осипе'],
  90. // foreign names
  91. [
  92. 'Андерсен Ганс Христиан',
  93. Gender::MALE,
  94. 'Андерсена Ганса Христиана',
  95. 'Андерсену Гансу Христиану',
  96. 'Андерсена Ганса Христиана',
  97. 'Андерсеном Гансом Христианом',
  98. 'Андерсене Гансе Христиане',
  99. ],
  100. [
  101. 'Милн Алан Александр',
  102. Gender::MALE,
  103. 'Милна Алана Александра',
  104. 'Милну Алану Александру',
  105. 'Милна Алана Александра',
  106. 'Милном Аланом Александром',
  107. 'Милне Алане Александре',
  108. ],
  109. [
  110. 'Тосунян Анна Георгиевна',
  111. Gender::FEMALE,
  112. 'Тосунян Анны Георгиевны',
  113. 'Тосунян Анне Георгиевне',
  114. 'Тосунян Анну Георгиевну',
  115. 'Тосунян Анной Георгиевной',
  116. 'Тосунян Анне Георгиевне',
  117. ],
  118. ];
  119. }
  120. /**
  121. * @dataProvider inflectNameProvider()
  122. */
  123. public function testInflectName($name, $case, $gender, $expected)
  124. {
  125. $this->assertEquals($expected, \morphos\Russian\inflectName($name, $case, $gender));
  126. }
  127. public function inflectNameProvider()
  128. {
  129. return
  130. [
  131. ['Янаев Осип Андреевич', Cases::GENITIVE, Gender::MALE, 'Янаева Осипа Андреевича'],
  132. ['Молодыха Лариса Трофимовна', Cases::DATIVE, Gender::FEMALE, 'Молодыхе Ларисе Трофимовне'],
  133. ['Вергун Илья Захарович', Cases::ACCUSATIVE, Gender::MALE, 'Вергуна Илью Захаровича'],
  134. ['Горюнова Таисия Романовна', Cases::ABLATIVE, Gender::FEMALE, 'Горюновой Таисией Романовной'],
  135. ['Путинцева Антонина Карповна', Cases::PREPOSITIONAL, Gender::FEMALE, 'Путинцевой Антонине Карповне'],
  136. // name parts
  137. ['Ганс', Cases::GENITIVE, Gender::MALE, 'Ганса'],
  138. ['Милн Алан', Cases::GENITIVE, Gender::MALE, 'Милна Алана'],
  139. ];
  140. }
  141. /**
  142. * @dataProvider verbsProvider()
  143. */
  144. public function testVerb($verb, $gender, $correctVerb)
  145. {
  146. $this->assertEquals($correctVerb, \morphos\Russian\RussianLanguage::verb($verb, $gender));
  147. }
  148. public function verbsProvider()
  149. {
  150. return
  151. [
  152. ['попал', Gender::MALE, 'попал'],
  153. ['попал', Gender::FEMALE, 'попала'],
  154. ['попался', Gender::MALE, 'попался'],
  155. ['попался', Gender::FEMALE, 'попалась'],
  156. ];
  157. }
  158. public function testDetectGender()
  159. {
  160. $this->assertEquals(Gender::MALE, \morphos\Russian\detectGender('Иванов Петр Андреевич'));
  161. $this->assertEquals(Gender::MALE, \morphos\Russian\detectGender('Иванов Петр'));
  162. $this->assertEquals(Gender::MALE, \morphos\Russian\detectGender('Петр'));
  163. $this->assertEquals(Gender::FEMALE, \morphos\Russian\detectGender('Мирова Анастасия Карповна'));
  164. $this->assertEquals(Gender::FEMALE, \morphos\Russian\detectGender('Мирова Анастасия'));
  165. $this->assertEquals(Gender::FEMALE, \morphos\Russian\detectGender('Анастасия'));
  166. }
  167. public function testPluralize()
  168. {
  169. $this->assertEquals('10 сообщений', \morphos\Russian\pluralize(10, 'сообщение'));
  170. $this->assertEquals('10 ванных', \morphos\Russian\pluralize(10, 'ванная'));
  171. // complex pluralization
  172. $this->assertEquals('10 новых непрочитанных сообщений',
  173. \morphos\Russian\pluralize(10, 'новое непрочитанное сообщение'));
  174. $this->assertEquals('22 новых непрочитанных сообщения',
  175. \morphos\Russian\pluralize(22, 'новое непрочитанное сообщение'));
  176. $this->assertEquals('21 небольшая лампа', \morphos\Russian\pluralize(21, 'небольшая лампа'));
  177. // old-style call to pluralize()
  178. // @phpstan-ignore-next-line
  179. $this->assertEquals('10 сообщений', \morphos\Russian\pluralize('сообщение', 10));
  180. }
  181. /**
  182. */
  183. public function testNameInvalid()
  184. {
  185. $this->assertFalse(\morphos\Russian\inflectName('Вергун Илья Захарович Захарович', Cases::GENITIVE));
  186. $this->assertFalse(\morphos\Russian\getNameCases('Вергун Илья Захарович Захарович'));
  187. $this->assertNull(\morphos\Russian\detectGender('Вергун Илья Захарович Захарович'));
  188. }
  189. }