NounPluralizationTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?php
  2. namespace morphos\test\Russian;
  3. use morphos\Russian\NounPluralization;
  4. use PHPUnit\Framework\TestCase;
  5. class NounPluralizationTest extends TestCase
  6. {
  7. /**
  8. * @dataProvider pluralizationWordsProvider
  9. *
  10. * @param string $word
  11. * @param $pluralized2
  12. * @param $pluralized5
  13. *
  14. * @throws \Exception
  15. */
  16. public function testPluralization($word, $pluralized2, $pluralized5)
  17. {
  18. // One
  19. $this->assertEquals($word, NounPluralization::pluralize($word, 1));
  20. $this->assertEquals($word, NounPluralization::pluralize($word, 101));
  21. $this->assertEquals($word, NounPluralization::pluralize($word, 201));
  22. $this->assertEquals($word, NounPluralization::pluralize($word, 1501));
  23. // Two-Four
  24. $this->assertEquals($pluralized2, NounPluralization::pluralize($word, 2));
  25. $this->assertEquals($pluralized2, NounPluralization::pluralize($word, 23));
  26. $this->assertEquals($pluralized2, NounPluralization::pluralize($word, 104));
  27. $this->assertEquals($pluralized2, NounPluralization::pluralize($word, 1503));
  28. // Five
  29. $this->assertEquals($pluralized5, NounPluralization::pluralize($word, 5));
  30. $this->assertEquals($pluralized5, NounPluralization::pluralize($word, 211));
  31. $this->assertEquals($pluralized5, NounPluralization::pluralize($word, 520));
  32. $this->assertEquals($pluralized5, NounPluralization::pluralize($word, 1513));
  33. }
  34. public function pluralizationWordsProvider()
  35. {
  36. return [
  37. ['дом', 'дома', 'домов'],
  38. ['поле', 'поля', 'полей'],
  39. ['яблоко', 'яблока', 'яблок'],
  40. ['море', 'моря', 'морей'],
  41. ['плечо', 'плеча', 'плеч'],
  42. ['стол', 'стола', 'столов'],
  43. ['нож', 'ножа', 'ножей'],
  44. ['плакса', 'плаксы', 'плакс'],
  45. ['ложка', 'ложки', 'ложек'],
  46. ['вилка', 'вилки', 'вилок'],
  47. ['чашка', 'чашки', 'чашек'],
  48. ['тарелка', 'тарелки', 'тарелок'],
  49. ['день', 'дня', 'дней'],
  50. ['ночь', 'ночи', 'ночей'],
  51. ['ядро', 'ядра', 'ядер'],
  52. ['рубль', 'рубля', 'рублей'],
  53. ['фунт', 'фунта', 'фунтов'],
  54. ['лира', 'лиры', 'лир'],
  55. ['крона', 'кроны', 'крон'],
  56. ['юань', 'юаня', 'юаней'],
  57. ['гривна', 'гривны', 'гривен'],
  58. // адъективное склонение
  59. ['ванная', 'ванных', 'ванных'],
  60. ['прохожий', 'прохожих', 'прохожих'],
  61. ];
  62. }
  63. /**
  64. * @dataProvider pluralizationWordsWithCaseProvider
  65. *
  66. * @param string $word
  67. * @param $pluralizedOne
  68. * @param $pluralizedMany
  69. *
  70. * @param string $case
  71. *
  72. * @throws \Exception
  73. */
  74. public function testPluralizationWithCase($word, $pluralizedOne, $pluralizedMany, $case)
  75. {
  76. // One
  77. $this->assertEquals($pluralizedOne, NounPluralization::pluralize($word, 1, false, $case));
  78. $this->assertEquals($pluralizedOne, NounPluralization::pluralize($word, 21, false, $case));
  79. $this->assertEquals($pluralizedOne, NounPluralization::pluralize($word, 101, false, $case));
  80. // Many
  81. $this->assertEquals($pluralizedMany, NounPluralization::pluralize($word, 3, false, $case));
  82. $this->assertEquals($pluralizedMany, NounPluralization::pluralize($word, 22, false, $case));
  83. $this->assertEquals($pluralizedMany, NounPluralization::pluralize($word, 60, false, $case));
  84. }
  85. public function pluralizationWordsWithCaseProvider()
  86. {
  87. return [
  88. // в ином падеже
  89. ['год', 'годе', 'годах', 'предложный'],
  90. ['товар', 'товару', 'товарам', 'дательный'],
  91. ];
  92. }
  93. /**
  94. * @dataProvider pluralWordsProvider
  95. */
  96. public function testPluralInflection($word, $animateness, $inflected)
  97. {
  98. $this->assertEquals($inflected, array_values(NounPluralization::getCases($word, $animateness)));
  99. }
  100. public function pluralWordsProvider()
  101. {
  102. return [
  103. // 1 склонение
  104. ['дом', false, ['дома', 'домов', 'домам', 'дома', 'домами', 'домах']],
  105. ['склон', false, ['склоны', 'склонов', 'склонам', 'склоны', 'склонами', 'склонах']],
  106. ['поле', false, ['поля', 'полей', 'полям', 'поля', 'полями', 'полях']],
  107. ['ночь', false, ['ночи', 'ночей', 'ночам', 'ночи', 'ночами', 'ночах']],
  108. ['кирпич', false, ['кирпичи', 'кирпичей', 'кирпичам', 'кирпичи', 'кирпичами', 'кирпичах']],
  109. ['гвоздь', false, ['гвозди', 'гвоздей', 'гвоздям', 'гвозди', 'гвоздями', 'гвоздях']],
  110. ['молния', false, ['молния', 'молний', 'молниям', 'молния', 'молниями', 'молниях']],
  111. ['тысяча', false, ['тысячи', 'тысяч', 'тысячам', 'тысячи', 'тысячами', 'тысячах']],
  112. ['сообщение', false, ['сообщения', 'сообщений', 'сообщениям', 'сообщения', 'сообщениями', 'сообщениях']],
  113. ['халат', false, ['халаты', 'халатов', 'халатам', 'халаты', 'халатами', 'халатах']],
  114. [
  115. 'прожектор',
  116. false,
  117. ['прожекторы', 'прожекторов', 'прожекторам', 'прожекторы', 'прожекторами', 'прожекторах'],
  118. ],
  119. ['пирсинг', false, ['пирсинги', 'пирсингов', 'пирсингам', 'пирсинги', 'пирсингами', 'пирсингах']],
  120. ['фабрика', false, ['фабрики', 'фабрик', 'фабрикам', 'фабрики', 'фабриками', 'фабриках']],
  121. ['гений', true, ['гения', 'гениев', 'гениям', 'гениев', 'гениями', 'гениях']],
  122. [
  123. 'библиотекарь',
  124. true,
  125. ['библиотекари', 'библиотекарей', 'библиотекарям', 'библиотекарей', 'библиотекарями', 'библиотекарях'],
  126. ],
  127. ['лошадь', false, ['лошади', 'лошадей', 'лошадям', 'лошади', 'лошадями', 'лошадях']],
  128. ['любитель', true, ['любители', 'любителей', 'любителям', 'любителей', 'любителями', 'любителях']],
  129. ['матрас', false, ['матрасы', 'матрасов', 'матрасам', 'матрасы', 'матрасами', 'матрасах']],
  130. ['коттедж', false, ['коттеджы', 'коттеджей', 'коттеджам', 'коттеджы', 'коттеджами', 'коттеджах']],
  131. // 2 склонение
  132. ['копейка', false, ['копейки', 'копеек', 'копейкам', 'копейки', 'копейками', 'копейках']],
  133. ['штука', false, ['штуки', 'штук', 'штукам', 'штуки', 'штуками', 'штуках']],
  134. ['батарейка', false, ['батарейки', 'батареек', 'батарейкам', 'батарейки', 'батарейками', 'батарейках']],
  135. ['письмо', false, ['письма', 'писем', 'письмам', 'письма', 'письмами', 'письмах']],
  136. ['пятно', false, ['пятна', 'пятен', 'пятнам', 'пятна', 'пятнами', 'пятнах']],
  137. ['волчище', false, ['волчища', 'волчищ', 'волчищам', 'волчища', 'волчищами', 'волчищах']],
  138. ['год', false, ['года', 'лет', 'годам', 'года', 'годами', 'годах']],
  139. ['месяц', false, ['месяцы', 'месяцев', 'месяцам', 'месяцы', 'месяцами', 'месяцах']],
  140. ['новость', false, ['новости', 'новостей', 'новостям', 'новости', 'новостями', 'новостях']],
  141. ['тень', false, ['тени', 'теней', 'теням', 'тени', 'тенями', 'тенях']],
  142. ['человек', true, ['люди', 'человек', 'людям', 'людей', 'людьми', 'людях']],
  143. ['песец', true, ['песцы', 'песцов', 'песцам', 'песцов', 'песцами', 'песцах']],
  144. [
  145. 'руководитель',
  146. true,
  147. ['руководители', 'руководителей', 'руководителям', 'руководителей', 'руководителями', 'руководителях'],
  148. ],
  149. ['голосование', true, ['голосования', 'голосований', 'голосованиям', 'голосований', 'голосованиями', 'голосованиях']],
  150. // 3 склонение
  151. ['дерево', false, ['деревья', 'деревьев', 'деревьям', 'деревья', 'деревьями', 'деревьях']],
  152. // Адъективное склонение
  153. // мужской род
  154. ['выходной', false, ['выходные', 'выходных', 'выходным', 'выходные', 'выходными', 'выходных']],
  155. [
  156. 'двугривенный',
  157. false,
  158. ['двугривенные', 'двугривенных', 'двугривенным', 'двугривенные', 'двугривенными', 'двугривенных'],
  159. ],
  160. ['рабочий', true, ['рабочие', 'рабочих', 'рабочим', 'рабочих', 'рабочими', 'рабочих']],
  161. // средний род
  162. ['животное', true, ['животные', 'животных', 'животным', 'животных', 'животными', 'животных']],
  163. [
  164. 'подлежащее',
  165. false,
  166. ['подлежащие', 'подлежащих', 'подлежащим', 'подлежащие', 'подлежащими', 'подлежащих'],
  167. ],
  168. // женский род
  169. ['запятая', false, ['запятые', 'запятых', 'запятым', 'запятые', 'запятыми', 'запятых']],
  170. ['горничная', true, ['горничные', 'горничных', 'горничным', 'горничных', 'горничными', 'горничных']],
  171. ['заведующая', true, ['заведующие', 'заведующих', 'заведующим', 'заведующих', 'заведующими', 'заведующих']],
  172. ];
  173. }
  174. }