AbstractDictLoaderTestCase.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. <?php
  2. /*
  3. * This file is part of the overtrue/pinyin.
  4. *
  5. * (c) overtrue <i@overtrue.me>
  6. *
  7. * This source file is subject to the MIT license that is bundled
  8. * with this source code in the file LICENSE.
  9. */
  10. namespace Overtrue\Pinyin\Test;
  11. use Overtrue\Pinyin\Pinyin;
  12. use PHPUnit\Framework\TestCase;
  13. abstract class AbstractDictLoaderTestCase extends TestCase
  14. {
  15. /**
  16. * @var Pinyin
  17. */
  18. protected $pinyin;
  19. public function testConvert()
  20. {
  21. $pinyin = $this->pinyin;
  22. $this->assertSame(array('nin', 'hao', '2018i', 'New', 'Year'), $pinyin->convert('您好&^2018i New Year!√ç', \PINYIN_KEEP_NUMBER | \PINYIN_KEEP_ENGLISH));
  23. $this->assertSame(array('nin', 'hao', 'i', 'New', 'Year'), $pinyin->convert('您好&^2018i New Year!√ç', \PINYIN_KEEP_ENGLISH));
  24. $this->assertSame(array('nin', 'hao', '2018'), $pinyin->convert('您好&^2018i New Year!√ç', \PINYIN_KEEP_NUMBER));
  25. $this->assertSame(array('nin', 'hao'), $pinyin->convert('您好!'));
  26. $this->assertSame(array('nin', 'hao'), $pinyin->convert('您好!', PINYIN_DEFAULT));
  27. $this->assertSame(array('nin2', 'hao3'), $pinyin->convert('您好!', PINYIN_ASCII_TONE));
  28. $this->assertSame(array('nín', 'hǎo'), $pinyin->convert('您好!', PINYIN_TONE));
  29. $this->assertSame(array('nín', 'hǎo', '2018'), $pinyin->convert('您好2018!', PINYIN_KEEP_NUMBER | PINYIN_TONE));
  30. $this->assertSame(array('nín', 'hǎo'), $pinyin->convert('您好 New Year!', PINYIN_KEEP_NUMBER | PINYIN_TONE));
  31. }
  32. public function testPermalink()
  33. {
  34. $pinyin = $this->pinyin;
  35. $this->assertSame('dai-zhe-xi-wang-qu-lyu-xing', $pinyin->permalink('带着希望去旅行'));
  36. $this->assertSame('dai_zhe_xi_wang_qu_lyu_xing', $pinyin->permalink('带着希望去旅行', '_'));
  37. $this->assertSame('dai.zhe.xi.wang.qu.lyu.xing', $pinyin->permalink('带着希望去旅行', '.'));
  38. $this->assertSame('daizhexiwangqulyuxing', $pinyin->permalink('带着希望去旅行', ''));
  39. // with number.
  40. $this->assertSame('1-dai-23-zhe-56-xi-wang-qu-abc-lyu-xing-568', $pinyin->permalink('1带23着。!5_6.=希望去abc旅行568'));
  41. $this->expectException('InvalidArgumentException', "Delimiter must be one of: '_', '-', '', '.'.");
  42. $this->assertSame('daizhexiwangqulyuxing', $pinyin->permalink('带着希望去旅行', '='));
  43. }
  44. public function testAbbr()
  45. {
  46. $pinyin = $this->pinyin;
  47. $this->assertSame('dzxwqlx', $pinyin->abbr('带着希望去旅行'));
  48. $this->assertSame('d z x w q l x', $pinyin->abbr('带着希望去旅行', ' '));
  49. $this->assertSame('d*z*x*w*q*l*x', $pinyin->abbr('带着希望去旅行', '*'));
  50. $this->assertSame('d--z--x--w--q--l--x', $pinyin->abbr('带着希望去旅行', '--'));
  51. // issue #27
  52. $this->assertEquals('dldnr', $pinyin->abbr('独立的女人'));
  53. $this->assertEquals('n', $pinyin->abbr('女'));
  54. $this->assertEquals('nr', $pinyin->abbr('女人'));
  55. // #91 #101
  56. $this->assertEquals('nh2017', $pinyin->abbr('你好2017!', \PINYIN_KEEP_NUMBER));
  57. $this->assertEquals('HNY2018', $pinyin->abbr('Happy New Year! 2018!', \PINYIN_KEEP_NUMBER | \PINYIN_KEEP_ENGLISH));
  58. }
  59. public function testSentence()
  60. {
  61. $pinyin = $this->pinyin;
  62. $this->assertSame('dai zhe xi wang qu lyu xing, bi dao da zhong dian geng mei hao!', $pinyin->sentence('带着希望去旅行,比到达终点更美好!'));
  63. // $this->assertSame('dai zhe xi 123 wang qu good lyu boy2 xing!.', $pinyin->sentence('带^着&*希123望去good旅boy2行!.'));
  64. // $this->assertSame('dai zhe xi 123 wang.. qu good lyu boy2 xing!.', $pinyin->sentence('--带^着&*希123望.。去good旅boy2行!.'));
  65. }
  66. public function testName()
  67. {
  68. $pinyin = $this->pinyin;
  69. $this->assertSame(array('shan'), $pinyin->name('单'));
  70. $this->assertSame(array('gu', 'dan'), $pinyin->name('孤单'));
  71. $this->assertSame(array('shan', 'dan', 'dan'), $pinyin->name('单单单'));
  72. $this->assertSame(array('chan', 'yu', 'dan'), $pinyin->name('单于单'));
  73. $this->assertSame(array('piao', 'dan', 'pu'), $pinyin->name('朴单朴'));
  74. $this->assertSame(array('yu', 'chi', 'pu'), $pinyin->name('尉迟朴'));
  75. $this->assertSame(array('wei', 'mou', 'mou'), $pinyin->name('尉某某'));
  76. $this->assertSame(array('yu', 'chi', 'mou', 'mou'), $pinyin->name('尉迟某某'));
  77. $this->assertSame(array('zhai', 'di', 'di'), $pinyin->name('翟翟翟'));
  78. // 以下两词在任何位置都不变
  79. $this->assertSame(array('mou', 'mou', 'yu', 'chi'), $pinyin->name('某某尉迟'));
  80. $this->assertSame(array('shan', 'chan', 'yu', 'dan'), $pinyin->name('单单于单'));
  81. }
  82. // test special words
  83. public function testSpecialWords()
  84. {
  85. $pinyin = $this->pinyin;
  86. $this->assertEquals('hello, world!', $pinyin->sentence('hello, world!'));
  87. $this->assertEquals('DNA jiàn dìng', $pinyin->sentence('DNA鉴定', \PINYIN_TONE));
  88. $this->assertEquals('21 sān tǐ zōng hé zhèng', $pinyin->sentence('21三体综合症', \PINYIN_TONE));
  89. $this->assertEquals('C pán', $pinyin->sentence('C盘', \PINYIN_TONE));
  90. $this->assertEquals('G diǎn', $pinyin->sentence('G点', \PINYIN_TONE));
  91. $this->assertEquals('zhōng dù xìng fèi shuǐ zhǒng', $pinyin->sentence('中度性肺水肿', \PINYIN_TONE));
  92. }
  93. // test multibyte non-Chinese character
  94. public function testSpecialWordsUsingAbbr()
  95. {
  96. $pinyin = $this->pinyin;
  97. $this->assertEquals('dfscdzz123r', $pinyin->abbr('Ⅲ度房室传导阻滞123人', PINYIN_KEEP_ENGLISH | PINYIN_KEEP_NUMBER));
  98. }
  99. // test Polyphone
  100. public function testPolyphone()
  101. {
  102. $pinyin = $this->pinyin;
  103. // 了
  104. $this->assertEquals(array('liǎo', 'rán'), $pinyin->convert('了然', PINYIN_TONE));
  105. $this->assertEquals(array('lái', 'le'), $pinyin->convert('来了', PINYIN_TONE));
  106. // 还
  107. $this->assertEquals(array('hái', 'yǒu'), $pinyin->convert('还有', PINYIN_TONE));
  108. $this->assertEquals(array('jiāo', 'huán'), $pinyin->convert('交还', PINYIN_TONE));
  109. // 什
  110. $this->assertEquals(array('shén', 'me'), $pinyin->convert('什么', PINYIN_TONE));
  111. $this->assertEquals(array('shí', 'jǐn'), $pinyin->convert('什锦', PINYIN_TONE));
  112. // 便
  113. $this->assertEquals(array('biàn', 'dāng'), $pinyin->convert('便当', PINYIN_TONE));
  114. $this->assertEquals(array('pián', 'yí'), $pinyin->convert('便宜', PINYIN_TONE));
  115. // 剥
  116. $this->assertEquals(array('bō', 'xuē'), $pinyin->convert('剥削', PINYIN_TONE));
  117. $this->assertEquals(array('bāo', 'pí', 'qì'), $pinyin->convert('剥皮器', PINYIN_TONE));
  118. // 不
  119. $this->assertEquals(array('péi', 'bú', 'shì'), $pinyin->convert('赔不是', PINYIN_TONE));
  120. $this->assertEquals(array('pǎo', 'le', 'hé', 'shàng', 'pǎo', 'bù', 'liǎo', 'miào'), $pinyin->convert('跑了和尚,跑不了庙', PINYIN_TONE));
  121. // 降
  122. $this->assertEquals(array('jiàng', 'wēn'), $pinyin->convert('降温', PINYIN_TONE));
  123. $this->assertEquals(array('tóu', 'xiáng'), $pinyin->convert('投降', PINYIN_TONE));
  124. // 都
  125. $this->assertEquals(array('shǒu', 'dū'), $pinyin->convert('首都', PINYIN_TONE));
  126. $this->assertEquals(array('dōu', 'shén', 'me', 'nián', 'dài', 'le'), $pinyin->convert('都什么年代了', PINYIN_TONE));
  127. // 乐
  128. $this->assertEquals(array('kuài', 'lè'), $pinyin->convert('快乐', PINYIN_TONE));
  129. $this->assertEquals(array('yīn', 'yuè'), $pinyin->convert('音乐', PINYIN_TONE));
  130. // 长
  131. $this->assertEquals(array('chéng', 'zhǎng'), $pinyin->convert('成长', PINYIN_TONE));
  132. $this->assertEquals(array('cháng', 'jiāng'), $pinyin->convert('长江', PINYIN_TONE));
  133. // 难
  134. $this->assertEquals(array('nàn', 'mín'), $pinyin->convert('难民', PINYIN_TONE));
  135. $this->assertEquals(array('nán', 'guò'), $pinyin->convert('难过', PINYIN_TONE));
  136. // 厦
  137. $this->assertEquals(array('dà', 'shà'), $pinyin->convert('大厦', PINYIN_TONE));
  138. $this->assertEquals(array('xià', 'mén'), $pinyin->convert('厦门', PINYIN_TONE));
  139. // 曾
  140. $this->assertEquals(array('céng', 'jīng'), $pinyin->convert('曾经', PINYIN_TONE));
  141. $this->assertEquals(array('xìng', 'zēng'), $pinyin->convert('姓曾', PINYIN_TONE));
  142. $this->assertEquals(array('zēng', 'xìng'), $pinyin->convert('曾姓', PINYIN_TONE));
  143. // 奇
  144. $this->assertEquals(array('qí', 'guài'), $pinyin->convert('奇怪', PINYIN_TONE));
  145. $this->assertEquals(array('jī', 'ǒu', 'jiào', 'yàn'), $pinyin->convert('奇偶校验', PINYIN_TONE));
  146. // 其它多音词
  147. $this->assertEquals(array('náo', 'zhí', 'wéi', 'qū'), $pinyin->convert('挠直为曲', PINYIN_TONE));
  148. $this->assertEquals(array('pī', 'fēng', 'mò', 'yuè'), $pinyin->convert('批风抹月', PINYIN_TONE));
  149. }
  150. /**
  151. * 测试字母+数字Bug.
  152. */
  153. public function testNumberWithAlpha()
  154. {
  155. $pinyin = $this->pinyin;
  156. $this->assertEquals('cè shì R60', $pinyin->sentence('测试R60', \PINYIN_TONE));
  157. $this->assertEquals('ce4 shi4 R60', $pinyin->sentence('测试R60', \PINYIN_ASCII_TONE));
  158. $this->assertEquals('ce shi R60', $pinyin->sentence('测试R60'));
  159. $this->assertEquals('ce ce5 shi Rr60', $pinyin->sentence('测ce5试Rr60'));
  160. $this->assertEquals('ce shi R50', $pinyin->sentence('测试R50'));
  161. $this->assertEquals('ce 3sh4i R50', $pinyin->sentence('测3sh4i R50'));
  162. $this->assertEquals('ce3sh4i R50', $pinyin->sentence('ce3sh4i R50'));
  163. $this->assertEquals('33ai4', $pinyin->sentence('33ai4'));
  164. $this->assertEquals('33ai4 ni', $pinyin->sentence('33ai4你'));
  165. $this->assertEquals('ai 334 ni', $pinyin->sentence('爱334你'));
  166. $this->assertEquals('aaaa1234', $pinyin->sentence('aaaa1234'));
  167. $this->assertEquals('aaaa_1234', $pinyin->sentence('aaaa_1234'));
  168. $this->assertEquals('ai45 liao wu sheng qu ce shi', $pinyin->sentence('ai45了无生趣测试'));
  169. $this->assertEquals('java gong cheng shi', $pinyin->sentence('java工程师'));
  170. }
  171. /**
  172. * 测试单个音的字.
  173. *
  174. * bug: #19
  175. * bug: #22
  176. * bug: #23
  177. * bug: #24
  178. * bug: #29
  179. * bug: #235
  180. * bug: #81
  181. */
  182. public function testSingleAccent()
  183. {
  184. $pinyin = $this->pinyin;
  185. $this->assertEquals('a le tai', $pinyin->sentence('阿勒泰'));
  186. $this->assertEquals('e er duo si', $pinyin->sentence('鄂尔多斯'));
  187. $this->assertEquals('zu', $pinyin->sentence('足'));
  188. $this->assertEquals('feng', $pinyin->sentence('冯'));
  189. $this->assertEquals('bao hu ping he', $pinyin->sentence('暴虎冯河'));
  190. $this->assertEquals('hé', $pinyin->sentence('和', PINYIN_TONE));
  191. $this->assertEquals('gěi', $pinyin->sentence('给', PINYIN_TONE));
  192. $this->assertEquals('là', $pinyin->sentence('腊', PINYIN_TONE));
  193. // # 28 词库不全
  194. $this->assertEquals('kun', $pinyin->sentence('堃'));
  195. // #29
  196. $this->assertEquals('dì', $pinyin->sentence('地', PINYIN_TONE));
  197. $this->assertEquals('zhi yu si di', $pinyin->sentence('置于死地'));
  198. // #35
  199. $this->assertEquals('ji xiao', $pinyin->sentence('技校'));
  200. $this->assertEquals('jiao zheng', $pinyin->sentence('校正'));
  201. // #45
  202. $this->assertEquals('luó', $pinyin->sentence('罗', PINYIN_TONE));
  203. // #58
  204. $this->assertEquals('fēi', $pinyin->sentence('飞', PINYIN_TONE));
  205. $this->assertEquals('jiāng', $pinyin->sentence('将', PINYIN_TONE));
  206. $this->assertEquals('míng jiàng', $pinyin->sentence('名将', PINYIN_TONE));
  207. $this->assertEquals('dì wáng jiàng xiàng', $pinyin->sentence('帝王将相', PINYIN_TONE));
  208. $this->assertEquals('dì wáng jiàng xiàng', $pinyin->sentence('帝王将相', PINYIN_TONE));
  209. $this->assertEquals('wèi shǒu wèi wěi', $pinyin->sentence('畏首畏尾', PINYIN_TONE));
  210. // #63
  211. $this->assertEquals('shěn', $pinyin->sentence('沈', PINYIN_TONE));
  212. $this->assertEquals('shěn yáng', $pinyin->sentence('沈阳', PINYIN_TONE));
  213. $this->assertEquals('chén yú luò yàn', $pinyin->sentence('沈鱼落雁', PINYIN_TONE));
  214. // #81
  215. $this->assertEquals('yuán yùn', $pinyin->sentence('圆晕', PINYIN_TONE));
  216. $this->assertEquals('guāng yùn', $pinyin->sentence('光晕', PINYIN_TONE));
  217. $this->assertEquals('yūn jué', $pinyin->sentence('晕厥', PINYIN_TONE));
  218. // #105 #112
  219. $this->assertEquals('èn', $pinyin->sentence('嗯', PINYIN_TONE));
  220. // #96
  221. $this->assertEquals('shén me', $pinyin->sentence('什么', PINYIN_TONE));
  222. $this->assertEquals('hái shuō shén me ne? huán gěi nǐ. hái gè pì!', $pinyin->sentence('还说什么呢?还给你。还个屁!', \PINYIN_TONE));
  223. // #82
  224. $this->assertEquals('wū lā tè qián qí', $pinyin->sentence('乌拉特前旗', PINYIN_TONE));
  225. $this->assertEquals('cháo yáng qū', $pinyin->sentence('朝阳区', PINYIN_TONE));
  226. $this->assertEquals('jì xī xiàn', $pinyin->sentence('绩溪县', PINYIN_TONE));
  227. $this->assertEquals('bǎi sè xiàn', $pinyin->sentence('百色县', PINYIN_TONE));
  228. $this->assertEquals('dū ān yáo zú zì zhì xiàn', $pinyin->sentence('都安瑶族自治县', PINYIN_TONE));
  229. $this->assertEquals('tǎ shí kù ěr gān', $pinyin->sentence('塔什库尔干', PINYIN_TONE));
  230. $this->assertEquals('cháng yáng tǔ jiā zú zì zhì xiàn', $pinyin->sentence('长阳土家族自治县', PINYIN_TONE));
  231. $this->assertEquals('mǎ wěi qū', $pinyin->sentence('马尾区', PINYIN_TONE));
  232. $this->assertEquals('sān dū shuǐ zú zì zhì xiàn', $pinyin->sentence('三都水族自治县', PINYIN_TONE));
  233. }
  234. public function testYu()
  235. {
  236. $this->assertEquals(array('lyu', 'xiu', 'cai'), $this->pinyin->convert('吕秀才'));
  237. $this->assertEquals(array('lv', 'xiu', 'cai'), $this->pinyin->convert('吕秀才', \PINYIN_UMLAUT_V));
  238. }
  239. public function testIssue175()
  240. {
  241. $this->assertEquals('yùn', $this->pinyin->sentence('貟', PINYIN_TONE));
  242. $this->assertEquals(['yun', 'xiu', 'cai'], $this->pinyin->name('貟秀才'));
  243. $this->assertEquals(['yun', 'xiu', 'cai'], $this->pinyin->name('贠秀才'));
  244. }
  245. public function testIssue138()
  246. {
  247. $this->assertEquals(['wu', 'la', 'gui'], $this->pinyin->convert('乌拉圭'));
  248. }
  249. public function testPhrase()
  250. {
  251. $pinyin = $this->pinyin;
  252. $this->assertEquals('bei3-jing1', $pinyin->phrase('北京', '-', \PINYIN_ASCII_TONE));
  253. }
  254. }