GeographicalNamesInflectionTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <?php
  2. namespace morphos\test\Russian;
  3. use morphos\Russian\Cases;
  4. use morphos\Russian\GeographicalNamesInflection;
  5. use PHPUnit\Framework\TestCase;
  6. class GeographicalNamesInflectionTest extends TestCase
  7. {
  8. /**
  9. * @dataProvider wordsProvider
  10. * @throws \Exception
  11. */
  12. public function testInflection($word, $case2, $case3, $case4, $case5, $case6, $case7)
  13. {
  14. $this->assertEquals([
  15. Cases::IMENIT => $word,
  16. Cases::RODIT => $case2,
  17. Cases::DAT => $case3,
  18. Cases::VINIT => $case4,
  19. Cases::TVORIT => $case5,
  20. Cases::PREDLOJ => $case6,
  21. Cases::LOCATIVE => $case7,
  22. ], GeographicalNamesInflection::getCases($word));
  23. }
  24. public function wordsProvider()
  25. {
  26. return [
  27. ['Москва', 'Москвы', 'Москве', 'Москву', 'Москвой', 'Москве', 'Москве'],
  28. ['Киев', 'Киева', 'Киеву', 'Киев', 'Киевом', 'Киеве', 'Киеве'],
  29. ['Ишимбай', 'Ишимбая', 'Ишимбаю', 'Ишимбай', 'Ишимбаем', 'Ишимбае', 'Ишимбае'],
  30. ['Африка', 'Африки', 'Африке', 'Африку', 'Африкой', 'Африке', 'Африке'],
  31. ['Уругвай', 'Уругвая', 'Уругваю', 'Уругвай', 'Уругваем', 'Уругвае', 'Уругвае'],
  32. ['Европа', 'Европы', 'Европе', 'Европу', 'Европой', 'Европе', 'Европе'],
  33. ['Азия', 'Азии', 'Азии', 'Азию', 'Азией', 'Азии', 'Азии'],
  34. ['Рига', 'Риги', 'Риге', 'Ригу', 'Ригой', 'Риге', 'Риге'],
  35. ['Волга', 'Волги', 'Волге', 'Волгу', 'Волгой', 'Волге', 'Волге'],
  36. ['Ставрополь', 'Ставрополя', 'Ставрополю', 'Ставрополь', 'Ставрополем', 'Ставрополе', 'Ставрополе'],
  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. ['Воронеж', 'Воронежа', 'Воронежу', 'Воронеж', 'Воронежем', 'Воронеже', 'Воронеже'],
  65. ['Адыгея', 'Адыгее', 'Адыгее', 'Адыгея', 'Адыгеей', 'Адыгее', 'Адыгее'],
  66. ['Кемерово', 'Кемерова', 'Кемерову', 'Кемерово', 'Кемеровом', 'Кемерове', 'Кемерове'],
  67. // с беглой гласной
  68. ['Торжок', 'Торжка', 'Торжку', 'Торжок', 'Торжком', 'Торжке', 'Торжке'],
  69. [
  70. 'Вышний Волочек',
  71. 'Вышнего Волочка',
  72. 'Вышнему Волочку',
  73. 'Вышний Волочек',
  74. 'Вышним Волочком',
  75. 'Вышнем Волочке',
  76. 'Вышнем Волочке',
  77. ],
  78. ['Орёл', 'Орла', 'Орлу', 'Орёл', 'Орлом', 'Орле', 'Орле'],
  79. // сложные названия
  80. [
  81. 'Санкт-Петербург',
  82. 'Санкт-Петербурга',
  83. 'Санкт-Петербургу',
  84. 'Санкт-Петербург',
  85. 'Санкт-Петербургом',
  86. 'Санкт-Петербурге',
  87. 'Санкт-Петербурге',
  88. ],
  89. [
  90. 'Ростов-на-Дону',
  91. 'Ростова-на-Дону',
  92. 'Ростову-на-Дону',
  93. 'Ростов-на-Дону',
  94. 'Ростовом-на-Дону',
  95. 'Ростове-на-Дону',
  96. 'Ростове-на-Дону',
  97. ],
  98. [
  99. 'Нижний Новгород',
  100. 'Нижнего Новгорода',
  101. 'Нижнему Новгороду',
  102. 'Нижний Новгород',
  103. 'Нижним Новгородом',
  104. 'Нижнем Новгороде',
  105. 'Нижнем Новгороде',
  106. ],
  107. [
  108. 'Набережные Челны',
  109. 'Набережных Челнов',
  110. 'Набережным Челнам',
  111. 'Набережные Челны',
  112. 'Набережными Челнами',
  113. 'Набережных Челнах',
  114. 'Набережных Челнах',
  115. ],
  116. // N край
  117. [
  118. 'Краснодарский край',
  119. 'Краснодарского края',
  120. 'Краснодарскому краю',
  121. 'Краснодарский край',
  122. 'Краснодарским краем',
  123. 'Краснодарском крае',
  124. 'Краснодарском крае',
  125. ],
  126. // N область
  127. [
  128. 'Ростовская область',
  129. 'Ростовской области',
  130. 'Ростовской области',
  131. 'Ростовскую область',
  132. 'Ростовской областью',
  133. 'Ростовской области',
  134. 'Ростовской области',
  135. ],
  136. // город N
  137. [
  138. 'город Москва',
  139. 'города Москва',
  140. 'городу Москва',
  141. 'город Москва',
  142. 'городом Москва',
  143. 'городе Москва',
  144. 'городе Москва',
  145. ],
  146. // село N
  147. [
  148. 'село Привольное',
  149. 'села Привольное',
  150. 'селу Привольное',
  151. 'село Привольное',
  152. 'селом Привольное',
  153. 'селе Привольное',
  154. 'селе Привольное',
  155. ],
  156. // республика N
  157. [
  158. 'Республика Крым',
  159. 'Республики Крым',
  160. 'Республике Крым',
  161. 'Республику Крым',
  162. 'Республикой Крым',
  163. 'Республике Крым',
  164. 'Республике Крым',
  165. ],
  166. // исключения
  167. [
  168. 'Великие Луки',
  169. 'Великих Лук',
  170. 'Великим Лукам',
  171. 'Великие Луки',
  172. 'Великими Луками',
  173. 'Великих Луках',
  174. 'Великих Луках',
  175. ],
  176. [
  177. 'Электросталь',
  178. 'Электростали',
  179. 'Электростали',
  180. 'Электросталь',
  181. 'Электросталью',
  182. 'Электростали',
  183. 'Электростали',
  184. ],
  185. // неизменяемые названия
  186. ['США', 'США', 'США', 'США', 'США', 'США', 'США'],
  187. ['ОАЭ', 'ОАЭ', 'ОАЭ', 'ОАЭ', 'ОАЭ', 'ОАЭ', 'ОАЭ'],
  188. ];
  189. }
  190. /**
  191. * @dataProvider immutableWordsProvider
  192. */
  193. public function testImmutableWords($word)
  194. {
  195. $this->assertFalse(GeographicalNamesInflection::isMutable($word));
  196. }
  197. public function immutableWordsProvider()
  198. {
  199. return [
  200. ['сша'],
  201. ['оаэ'],
  202. ];
  203. }
  204. }