LastNamesInflectionTest.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. namespace morphos\test\Russian;
  3. use morphos\NamesInflection;
  4. use morphos\Russian\Cases;
  5. use morphos\Russian\LastNamesInflection;
  6. use PHPUnit\Framework\TestCase;
  7. class LastNamesInflectionTest extends TestCase
  8. {
  9. /**
  10. * @dataProvider lastNamesProvider
  11. */
  12. public function testMutable($name, $gender)
  13. {
  14. $this->assertTrue(LastNamesInflection::isMutable($name, $gender));
  15. }
  16. /**
  17. * @dataProvider lastNamesProvider
  18. */
  19. public function testGetCases($name, $gender, $name2, $name3, $name4, $name5, $name6)
  20. {
  21. $forms = LastNamesInflection::getCases($name, $gender);
  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. ], $forms);
  30. }
  31. /**
  32. * @dataProvider lastNamesProvider()
  33. */
  34. public function testDetectGender($name, $gender)
  35. {
  36. $result = LastNamesInflection::detectGender($name);
  37. if ($result !== null) {
  38. $this->assertEquals($gender, $result, 'For name ' . $name);
  39. } else {
  40. $this->markTestSkipped('Test gender detection is skipped for ' . $name);
  41. // $this->assertEquals($gender, $result, 'For name ' . $name);
  42. }
  43. }
  44. public function lastNamesProvider()
  45. {
  46. return [
  47. ['Смирнов', NamesInflection::MALE, 'Смирнова', 'Смирнову', 'Смирнова', 'Смирновым', 'Смирнове'],
  48. ['Кромской', NamesInflection::MALE, 'Кромского', 'Кромскому', 'Кромского', 'Кромским', 'Кромском'],
  49. ['Ус', NamesInflection::MALE, 'Уса', 'Усу', 'Уса', 'Усом', 'Усе'],
  50. ['Кузьмич', NamesInflection::MALE, 'Кузьмича', 'Кузьмичу', 'Кузьмича', 'Кузьмичом', 'Кузьмиче'],
  51. ['Берг', NamesInflection::MALE, 'Берга', 'Бергу', 'Берга', 'Бергом', 'Берге'],
  52. ['Медведь', NamesInflection::MALE, 'Медведя', 'Медведю', 'Медведя', 'Медведем', 'Медведе'],
  53. ['Суздаль', NamesInflection::MALE, 'Суздаля', 'Суздалю', 'Суздаля', 'Суздалем', 'Суздале'],
  54. ['Тронь', NamesInflection::MALE, 'Троня', 'Троню', 'Троня', 'Тронем', 'Троне'],
  55. ['Толстой', NamesInflection::MALE, 'Толстого', 'Толстому', 'Толстого', 'Толстым', 'Толстом'],
  56. ['Стальной', NamesInflection::MALE, 'Стального', 'Стальному', 'Стального', 'Стальным', 'Стальном'],
  57. ['Жареный', NamesInflection::MALE, 'Жареного', 'Жареному', 'Жареного', 'Жареным', 'Жареном'],
  58. ['Брынзей', NamesInflection::MALE, 'Брынзея', 'Брынзею', 'Брынзея', 'Брынзеем', 'Брынзее'],
  59. ['Бакай', NamesInflection::MALE, 'Бакая', 'Бакаю', 'Бакая', 'Бакаем', 'Бакае'],
  60. ['Грицай', NamesInflection::MALE, 'Грицая', 'Грицаю', 'Грицая', 'Грицаем', 'Грицае'],
  61. ['Прожога', NamesInflection::MALE, 'Прожоги', 'Прожоге', 'Прожогу', 'Прожогой', 'Прожоге'],
  62. ['Мазепа', NamesInflection::MALE, 'Мазепы', 'Мазепе', 'Мазепу', 'Мазепой', 'Мазепе'],
  63. ['Цой', NamesInflection::MALE, 'Цоя', 'Цою', 'Цоя', 'Цоем', 'Цое'],
  64. ['Лукелий', NamesInflection::MALE, 'Лукелия', 'Лукелию', 'Лукелия', 'Лукелием', 'Лукелии'],
  65. ['Стуккей', NamesInflection::MALE, 'Стуккея', 'Стуккею', 'Стуккея', 'Стуккеем', 'Стуккее'],
  66. ['Смирнова', NamesInflection::FEMALE, 'Смирновой', 'Смирновой', 'Смирнову', 'Смирновой', 'Смирновой'],
  67. ['Кромская', NamesInflection::FEMALE, 'Кромской', 'Кромской', 'Кромскую', 'Кромской', 'Кромской'],
  68. ['Закипная', NamesInflection::FEMALE, 'Закипной', 'Закипной', 'Закипную', 'Закипной', 'Закипной'],
  69. // ['Зима', NamesInflection::FEMALE, 'Зимы', 'Зиме', 'Зиму', 'Зимой', 'Зиме'],
  70. // ['Зоя', NamesInflection::FEMALE, 'Зои', 'Зое', 'Зою', 'Зоей', 'Зое'],
  71. // ['Молодыха', NamesInflection::FEMALE, 'Молодыхи', 'Молодыхе', 'Молодыху', 'Молодыхой', 'Молодыхе'],
  72. ['Стальная', NamesInflection::FEMALE, 'Стальной', 'Стальной', 'Стальную', 'Стальной', 'Стальной'],
  73. [
  74. 'Завгородняя',
  75. NamesInflection::FEMALE,
  76. 'Завгородней',
  77. 'Завгородней',
  78. 'Завгороднюю',
  79. 'Завгородней',
  80. 'Завгородней',
  81. ],
  82. // foreign names
  83. // ['Мартен-Люган', NamesInflection::MALE, 'Мартена-Люгана', 'Мартену-Люгану', 'Мартена-Люгана', 'Мартеном-Люганом', 'Мартене-Люгане'],
  84. [
  85. 'Копусов-Долинин',
  86. NamesInflection::MALE,
  87. 'Копусова-Долинина',
  88. 'Копусову-Долинину',
  89. 'Копусова-Долинина',
  90. 'Копусовым-Долининым',
  91. 'Копусове-Долинине',
  92. ],
  93. // ['Кучера-Бози', NamesInflection::MALE, 'Кучеры-Бози', 'Кучере-Бози', 'Кучеру-Бози', 'Кучерой-Бози', 'Кучере-Бози'],
  94. ];
  95. }
  96. /**
  97. * @dataProvider immutableNamesProvider()
  98. */
  99. public function testImmutable($name, $gender)
  100. {
  101. $this->assertFalse(LastNamesInflection::isMutable($name, $gender));
  102. }
  103. public function immutableNamesProvider()
  104. {
  105. return [
  106. ['Фоминых', NamesInflection::MALE],
  107. ['Хитрово', NamesInflection::MALE],
  108. ['Бози', NamesInflection::MALE],
  109. ['Цой', NamesInflection::FEMALE],
  110. ];
  111. }
  112. }