/engine/test.py

https://github.com/GunioRobot/ibus-skk · Python · 936 lines · 843 code · 41 blank · 52 comment · 15 complexity · 82790e0a2f1905dc715f5a7ac21d9881 MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. from __future__ import with_statement
  3. import unittest
  4. import os, os.path
  5. import skk
  6. import nicola
  7. from ibus import modifier
  8. class TestSKK(unittest.TestCase):
  9. def setUp(self):
  10. # Make sure to start with new empty usrdict.
  11. usrdict_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
  12. ".skk-ibus-jisyo")
  13. try:
  14. os.unlink(usrdict_path)
  15. except:
  16. pass
  17. sysdict_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
  18. "skk-ibus-jisyo")
  19. s_dict_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
  20. "SKK-JISYO.S")
  21. if not os.path.exists(sysdict_path):
  22. if not os.path.exists(s_dict_path):
  23. raise RuntimeError('SKK-JISYO.S not found; do "wget http://openlab.ring.gr.jp/skk/skk/dic/SKK-JISYO.S"')
  24. with open(sysdict_path, 'a') as tp:
  25. with open(s_dict_path, 'r') as fp:
  26. for line in fp:
  27. tp.write(line)
  28. if line.startswith(';; okuri-nasi'):
  29. tp.write(u'#/# /#0月#0日/#1/#1/#1月#1日/\n'.encode('EUC-JP'))
  30. tp.write(u'#ひき /#1匹/#3匹/#0匹/#2匹/\n'.encode('EUC-JP'))
  31. tp.write(u'>し /氏/\n'.encode('EUC-JP'))
  32. if line.startswith('greek '):
  33. tp.write(u'request /リクエスト/\n'.encode('EUC-JP'))
  34. if line.startswith(u'ちょう '.encode('EUC-JP')):
  35. tp.write(u'ちょう> /超/\n'.encode('EUC-JP'))
  36. self.__skk = skk.Context(usrdict=skk.UsrDict(usrdict_path),
  37. sysdict=skk.SysDict(sysdict_path),
  38. candidate_selector=skk.CandidateSelector())
  39. def testusrdict(self):
  40. usrdict_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
  41. ".skk-ibus-jisyo-corrupted")
  42. with open(usrdict_path, 'w+') as fp:
  43. fp.write(u'あい /愛/\n'.encode('EUC-JP'))
  44. try:
  45. usrdict = skk.UsrDict(usrdict_path, 'UTF-8')
  46. self.assertNotEqual(usrdict, None)
  47. self.assertTrue(usrdict.read_only)
  48. except Exception, e:
  49. self.fail("can't open user dictionary: %s" % e.message)
  50. finally:
  51. os.unlink(usrdict_path)
  52. def testinputmodechange(self):
  53. self.__skk.reset()
  54. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_NONE)
  55. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_DEFAULT)
  56. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  57. # catch ctrl-j in HIRAGANA
  58. handled, output = self.__skk.press_key(u'ctrl+j')
  59. self.assert_(handled)
  60. self.assertEqual(output, u'')
  61. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_NONE)
  62. self.assertEqual(self.__skk.preedit, u'')
  63. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_HIRAGANA)
  64. # HIRAGANA to KATAKANA
  65. handled, output = self.__skk.press_key(u'q')
  66. self.assert_(handled)
  67. self.assertEqual(output, u'')
  68. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_NONE)
  69. self.assertEqual(self.__skk.preedit, u'')
  70. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_KATAKANA)
  71. # catch ctrl-j in KATAKANA, and be still in KATAKANA
  72. self.__skk.press_key(u'ctrl+j')
  73. self.assert_(handled)
  74. self.assertEqual(output, u'')
  75. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_NONE)
  76. self.assertEqual(self.__skk.preedit, u'')
  77. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_KATAKANA)
  78. # KATAKANA to HIRAGANA
  79. handled, output = self.__skk.press_key(u'q')
  80. self.assert_(handled)
  81. self.assertEqual(output, u'')
  82. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_NONE)
  83. self.assertEqual(self.__skk.preedit, u'')
  84. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_HIRAGANA)
  85. # HIRAGANA to LATIN
  86. handled, output = self.__skk.press_key(u'l')
  87. self.assert_(handled)
  88. self.assertEqual(output, u'')
  89. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_NONE)
  90. self.assertEqual(self.__skk.preedit, u'')
  91. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_LATIN)
  92. # 'q' letter in LATIN
  93. handled, output = self.__skk.press_key(u'q')
  94. self.assert_(handled)
  95. self.assertEqual(output, u'q')
  96. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_NONE)
  97. self.assertEqual(self.__skk.preedit, u'')
  98. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_LATIN)
  99. # LATIN to HIRAGANA
  100. handled, output = self.__skk.press_key(u'ctrl+j')
  101. self.assert_(handled)
  102. self.assertEqual(output, u'')
  103. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_NONE)
  104. self.assertEqual(self.__skk.preedit, u'')
  105. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_HIRAGANA)
  106. # HIRAGANA to WIDE-LATIN
  107. handled, output = self.__skk.press_key(u'L')
  108. self.assert_(handled)
  109. self.assertEqual(output, u'')
  110. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_NONE)
  111. self.assertEqual(self.__skk.preedit, u'')
  112. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_WIDE_LATIN)
  113. # 'q' letter in WIDE-LATIN
  114. handled, output = self.__skk.press_key(u'q')
  115. self.assert_(handled)
  116. self.assertEqual(output, u'q')
  117. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_NONE)
  118. self.assertEqual(self.__skk.preedit, u'')
  119. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_WIDE_LATIN)
  120. # WIDE-LATIN to HIRAGANA
  121. handled, output = self.__skk.press_key(u'ctrl+j')
  122. self.assert_(handled)
  123. self.assertEqual(output, u'')
  124. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_NONE)
  125. self.assertEqual(self.__skk.preedit, u'')
  126. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_HIRAGANA)
  127. # wwl -> and HIRAGANA to LATIN
  128. self.__skk.reset()
  129. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  130. self.__skk.press_key(u'w')
  131. handled, output = self.__skk.press_key(u'w')
  132. self.assertTrue(handled)
  133. self.assertEqual(output, u'っ')
  134. self.assertEqual(self.__skk.preedit, u'w')
  135. handled, output = self.__skk.press_key(u'l')
  136. self.assertTrue(handled)
  137. self.assertEqual(output, u'')
  138. self.assertEqual(self.__skk.preedit, u'')
  139. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_LATIN)
  140. def testromkana(self):
  141. self.__skk.reset()
  142. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  143. # ka ->
  144. self.assertEqual(self.__skk.press_key(u'k'), (True, u''))
  145. self.assertEqual(self.__skk.preedit, u'k')
  146. self.assertEqual(self.__skk.press_key(u'a'), (True, u'か'))
  147. self.assertEqual(self.__skk.preedit, u'')
  148. # myo -> みょ
  149. self.assertEqual(self.__skk.press_key(u'm'), (True, u''))
  150. self.assertEqual(self.__skk.preedit, u'm')
  151. self.assertEqual(self.__skk.press_key(u'y'), (True, u''))
  152. self.assertEqual(self.__skk.preedit, u'my')
  153. self.assertEqual(self.__skk.press_key(u'o'), (True, u'みょ'))
  154. self.assertEqual(self.__skk.preedit, u'')
  155. # toggle submode to katakana
  156. self.assertEqual(self.__skk.press_key(u'q'), (True, u''))
  157. # ka ->
  158. self.assertEqual(self.__skk.press_key(u'k'), (True, u''))
  159. self.assertEqual(self.__skk.preedit, u'k')
  160. self.assertEqual(self.__skk.press_key(u'a'), (True, u'カ'))
  161. self.assertEqual(self.__skk.preedit, u'')
  162. # nX -> ンX
  163. self.__skk.press_key(u'n')
  164. self.assertEqual(self.__skk.press_key(u'.'), (True, u'ン。'))
  165. # ww -> っw, etc. Issue#33.
  166. for c in (u'h', u'm', u'w'):
  167. self.__skk.reset()
  168. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  169. self.__skk.press_key(c)
  170. handled, output = self.__skk.press_key(c)
  171. self.assertTrue(handled)
  172. self.assertEqual(output, u'っ')
  173. self.assertEqual(self.__skk.preedit, c)
  174. # zl ->
  175. self.__skk.reset()
  176. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  177. self.__skk.press_key(u'z')
  178. self.assertEqual(self.__skk.press_key(u'l'), (True, u'→'))
  179. # cancel rom-kana conversion
  180. self.__skk.reset()
  181. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  182. self.__skk.press_key(u'm')
  183. self.__skk.press_key(u'y')
  184. self.assertEqual(self.__skk.press_key(u'ctrl+g'), (True, u''))
  185. self.__skk.press_key(u'm')
  186. self.__skk.press_key(u'y')
  187. self.__skk.press_key(u'a')
  188. self.assertEqual(self.__skk.press_key(u'ctrl+g'), (False, u''))
  189. def testhiraganakatakana(self):
  190. self.__skk.reset()
  191. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  192. self.__skk.press_key(u'A')
  193. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_START)
  194. self.__skk.press_key(u'i')
  195. self.assertEqual(self.__skk.press_key(u'q'), (True, u'アイ'))
  196. self.assertEqual(self.__skk.preedit, u'')
  197. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_HIRAGANA)
  198. self.__skk.press_key(u'q')
  199. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_KATAKANA)
  200. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_NONE)
  201. self.assertEqual(self.__skk.preedit, u'')
  202. self.__skk.press_key(u'A')
  203. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_START)
  204. self.__skk.press_key(u'i')
  205. self.assertEqual(self.__skk.press_key(u'q'), (True, u'あい'))
  206. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_KATAKANA)
  207. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_NONE)
  208. self.assertEqual(self.__skk.preedit, u'')
  209. # ->
  210. self.__skk.reset()
  211. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  212. self.__skk.press_key(u'V')
  213. self.__skk.press_key(u'u')
  214. self.assertEqual(self.__skk.preedit, u'▽う゛')
  215. self.assertEqual(self.__skk.press_key(u'q'), (True, u'ヴ'))
  216. # ->
  217. self.__skk.reset()
  218. self.__skk.activate_input_mode(skk.INPUT_MODE_KATAKANA)
  219. self.__skk.press_key(u'V')
  220. self.__skk.press_key(u'u')
  221. self.assertEqual(self.__skk.preedit, u'▽ヴ')
  222. self.assertEqual(self.__skk.press_key(u'q'), (True, u'う゛'))
  223. # nq ->
  224. self.__skk.reset()
  225. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  226. self.__skk.press_key(u'Q')
  227. self.__skk.press_key(u'n')
  228. handled, output = self.__skk.press_key(u'q')
  229. self.assertTrue(handled)
  230. self.assertEqual(output, u'ン')
  231. # Wo -> (Issue#36)
  232. self.__skk.reset()
  233. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  234. self.__skk.press_key(u'W')
  235. self.__skk.press_key(u'o')
  236. self.assertEqual(self.__skk.preedit, u'▽を')
  237. def testokurinasi(self):
  238. self.__skk.reset()
  239. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  240. self.assertEqual(self.__skk.press_key(u'A'), (True, u''))
  241. self.assertEqual(self.__skk.preedit, u'▽あ')
  242. self.assertEqual(self.__skk.press_key(u'i'), (True, u''))
  243. self.assertEqual(self.__skk.preedit, u'▽あい')
  244. self.__skk.press_key(u' ')
  245. self.assertEqual(self.__skk.preedit, u'▼愛')
  246. self.__skk.press_key(u' ')
  247. self.assertEqual(self.__skk.preedit, u'▼哀')
  248. # NA -> , NAN -> *n, NANA -> [DictEdit] *んあ
  249. self.__skk.reset()
  250. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  251. self.__skk.press_key(u'N')
  252. self.__skk.press_key(u'A')
  253. self.assertEqual(self.__skk.preedit, u'▽な')
  254. self.__skk.press_key(u'N')
  255. self.assertEqual(self.__skk.preedit, u'▽な*n')
  256. self.__skk.press_key(u'A')
  257. self.assertEqual(self.__skk.preedit, u'[DictEdit] な*んあ ')
  258. self.__skk.press_key(u'ctrl+g')
  259. self.__skk.press_key(u'return')
  260. # NA -> , NAN -> *n, NANa -> [DictEdit] *
  261. self.__skk.press_key(u'N')
  262. self.__skk.press_key(u'A')
  263. self.assertEqual(self.__skk.preedit, u'▽な')
  264. self.__skk.press_key(u'N')
  265. self.assertEqual(self.__skk.preedit, u'▽な*n')
  266. self.__skk.press_key(u'a')
  267. self.assertEqual(self.__skk.preedit, u'[DictEdit] な*な ')
  268. def testegglikenewline(self):
  269. self.__skk.reset()
  270. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  271. # CONV_STATE_START
  272. self.__skk.press_key(u'A')
  273. self.__skk.press_key(u'i')
  274. self.__skk.egg_like_newline = False
  275. self.assertEqual(self.__skk.press_key(u'return'), (True, u'あい\n'))
  276. self.__skk.press_key(u'A')
  277. self.__skk.press_key(u'i')
  278. self.__skk.egg_like_newline = True
  279. self.assertEqual(self.__skk.press_key(u'return'), (True, u'あい'))
  280. # CONV_STATE_SELECT
  281. self.__skk.press_key(u'A')
  282. self.__skk.press_key(u'i')
  283. self.__skk.press_key(u' ')
  284. self.__skk.egg_like_newline = False
  285. self.assertEqual(self.__skk.press_key(u'return'), (True, u'愛\n'))
  286. self.__skk.press_key(u'A')
  287. self.__skk.press_key(u'i')
  288. self.__skk.press_key(u' ')
  289. self.__skk.egg_like_newline = True
  290. self.assertEqual(self.__skk.press_key(u'return'), (True, u'愛'))
  291. def testokuriari(self):
  292. self.__skk.reset()
  293. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  294. self.__skk.press_key(u'K')
  295. self.__skk.press_key(u'a')
  296. self.__skk.press_key(u'n')
  297. self.__skk.press_key(u'g')
  298. self.__skk.press_key(u'a')
  299. self.__skk.press_key(u'E')
  300. self.assertEqual(self.__skk.preedit, u'▼考え')
  301. self.assertEqual(self.__skk.press_key(u'r'), (True, u'考え'))
  302. self.assertEqual(self.__skk.preedit, u'r')
  303. self.assertEqual(self.__skk.press_key(u'u'), (True, u'る'))
  304. self.__skk.reset()
  305. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  306. self.__skk.press_key(u'H')
  307. self.__skk.press_key(u'a')
  308. self.__skk.press_key(u'Z')
  309. self.assertEqual(self.__skk.preedit, u'▽は*z')
  310. self.__skk.press_key(u'u')
  311. self.assertEqual(self.__skk.preedit, u'▼恥ず')
  312. self.__skk.reset()
  313. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  314. self.__skk.press_key(u'T')
  315. self.__skk.press_key(u'u')
  316. self.__skk.press_key(u'k')
  317. self.__skk.press_key(u'a')
  318. self.__skk.press_key(u'T')
  319. self.__skk.press_key(u't')
  320. self.assertEqual(self.__skk.preedit, u'▽つか*っt')
  321. # Debian Bug#591052
  322. self.__skk.reset()
  323. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  324. self.__skk.press_key(u'K')
  325. self.__skk.press_key(u'a')
  326. self.__skk.press_key(u'n')
  327. self.__skk.press_key(u'J')
  328. self.assertEqual(self.__skk.preedit, u'▽かん*j')
  329. # Issue#10
  330. self.__skk.debug = True
  331. self.__skk.reset()
  332. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  333. self.__skk.press_key(u'F')
  334. self.__skk.press_key(u'u')
  335. self.__skk.press_key(u'N')
  336. self.__skk.press_key(u'd')
  337. self.__skk.press_key(u'a')
  338. self.assertEqual(self.__skk.preedit, u'▼踏んだ')
  339. self.__skk.debug = False
  340. # Issue#19
  341. self.__skk.reset()
  342. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  343. self.__skk.press_key(u'A')
  344. self.__skk.press_key(u'z')
  345. self.__skk.press_key(u'u')
  346. self.__skk.press_key(u'm')
  347. self.__skk.press_key(u'a')
  348. self.__skk.press_key(u' ')
  349. self.assertEqual(self.__skk.preedit, u'▼東')
  350. self.__skk.press_key(u'>')
  351. self.assertEqual(self.__skk.preedit, u'▽>')
  352. self.__skk.press_key(u's')
  353. self.__skk.press_key(u'h')
  354. self.__skk.press_key(u'i')
  355. self.__skk.press_key(u' ')
  356. self.assertEqual(self.__skk.preedit, u'▼氏')
  357. self.__skk.kakutei()
  358. self.__skk.press_key(u'T')
  359. self.__skk.press_key(u'y')
  360. self.__skk.press_key(u'o')
  361. self.__skk.press_key(u'u')
  362. self.__skk.press_key(u'>')
  363. self.assertEqual(self.__skk.preedit, u'▼超')
  364. # Issue#28
  365. self.__skk.reset()
  366. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  367. self.__skk.press_key(u'S')
  368. self.__skk.press_key(u'a')
  369. self.__skk.press_key(u's')
  370. self.__skk.press_key(u'S')
  371. self.assertEqual(self.__skk.preedit, u'▽さっ*s')
  372. def testcompletion(self):
  373. self.__skk.reset()
  374. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  375. self.__skk.press_key(u'A')
  376. self.assertEqual(self.__skk.preedit, u'▽あ')
  377. self.__skk.press_key(u'\t')
  378. self.assertEqual(self.__skk.preedit, u'▽あい')
  379. self.__skk.press_key(u'\t')
  380. self.assertEqual(self.__skk.preedit, u'▽あいさつ')
  381. self.__skk.press_key(u' ')
  382. self.__skk.kakutei()
  383. self.__skk.press_key(u'A')
  384. self.assertEqual(self.__skk.preedit, u'▽あ')
  385. self.__skk.press_key(u'\t')
  386. self.assertEqual(self.__skk.preedit, u'▽あいさつ')
  387. self.__skk.press_key(u' ')
  388. self.__skk.kakutei()
  389. self.assertEqual(self.__skk.preedit, u'')
  390. self.__skk.press_key(u'A')
  391. self.assertEqual(self.__skk.preedit, u'▽あ')
  392. self.__skk.press_key(u'ctrl+i')
  393. self.assertEqual(self.__skk.preedit, u'▽あいさつ')
  394. def testautoconvesion(self):
  395. self.__skk.reset()
  396. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  397. self.__skk.press_key(u'A')
  398. self.assertEqual(self.__skk.preedit, u'▽あ')
  399. self.__skk.press_key(u'i')
  400. self.assertEqual(self.__skk.preedit, u'▽あい')
  401. self.__skk.press_key(u',')
  402. self.assertEqual(self.__skk.preedit, u'▼愛、')
  403. self.__skk.press_key(u' ')
  404. self.assertEqual(self.__skk.preedit, u'▼哀、')
  405. self.__skk.reset()
  406. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  407. self.__skk.press_key(u'A')
  408. self.__skk.press_key(u'i')
  409. self.__skk.press_key(u'w')
  410. self.__skk.press_key(u'o')
  411. self.assertEqual(self.__skk.preedit, u'▼愛を')
  412. def testdelete(self):
  413. self.__skk.reset()
  414. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  415. self.__skk.press_key(u'A')
  416. self.assertEqual(self.__skk.preedit, u'▽あ')
  417. handled, output = self.__skk.press_key(u'backspace')
  418. self.assertTrue(handled)
  419. self.assertEqual(self.__skk.preedit, u'▽')
  420. handled, output = self.__skk.press_key(u'backspace')
  421. self.assertTrue(handled)
  422. self.assertEqual(self.__skk.preedit, u'')
  423. self.__skk.reset()
  424. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  425. self.__skk.press_key(u'A')
  426. self.assertEqual(self.__skk.preedit, u'▽あ')
  427. self.__skk.press_key(u'i')
  428. self.__skk.press_key(u's')
  429. self.__skk.press_key(u'a')
  430. self.__skk.press_key(u't')
  431. self.__skk.press_key(u's')
  432. self.__skk.press_key(u'u')
  433. self.assertEqual(self.__skk.preedit, u'▽あいさつ')
  434. self.__skk.press_key(u' ')
  435. self.assertEqual(self.__skk.preedit, u'▼挨拶')
  436. handled, output = self.__skk.press_key(u'backspace')
  437. self.assertTrue(handled)
  438. self.assertEqual(output, u'挨')
  439. handled, output = self.__skk.press_key(u'backspace')
  440. self.assertFalse(handled)
  441. def testdeleteshortcut(self):
  442. self.__skk.reset()
  443. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  444. self.__skk.press_key(u'A')
  445. self.assertEqual(self.__skk.preedit, u'▽あ')
  446. handled, output = self.__skk.press_key(u'ctrl+h')
  447. self.assertTrue(handled)
  448. self.assertEqual(self.__skk.preedit, u'▽')
  449. handled, output = self.__skk.press_key(u'ctrl+h')
  450. self.assertTrue(handled)
  451. self.assertEqual(self.__skk.preedit, u'')
  452. self.__skk.reset()
  453. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  454. self.__skk.press_key(u'A')
  455. self.assertEqual(self.__skk.preedit, u'▽あ')
  456. self.__skk.press_key(u'i')
  457. self.__skk.press_key(u's')
  458. self.__skk.press_key(u'a')
  459. self.__skk.press_key(u't')
  460. self.__skk.press_key(u's')
  461. self.__skk.press_key(u'u')
  462. self.assertEqual(self.__skk.preedit, u'▽あいさつ')
  463. self.__skk.press_key(u' ')
  464. self.assertEqual(self.__skk.preedit, u'▼挨拶')
  465. handled, output = self.__skk.press_key(u'ctrl+h')
  466. self.assertTrue(handled)
  467. self.assertEqual(output, u'挨')
  468. handled, output = self.__skk.press_key(u'ctrl+h')
  469. self.assertFalse(handled)
  470. def testnumeric(self):
  471. self.__skk.reset()
  472. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  473. self.__skk.press_key(u'Q')
  474. self.assertEqual(self.__skk.preedit, u'▽')
  475. self.__skk.press_key(u'5')
  476. self.__skk.press_key(u'/')
  477. self.__skk.press_key(u'1')
  478. self.__skk.press_key(u' ')
  479. self.assertEqual(self.__skk.preedit, u'▼5月1日')
  480. self.__skk.reset()
  481. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  482. self.__skk.press_key(u'Q')
  483. self.__skk.press_key(u'5')
  484. self.__skk.press_key(u'h')
  485. self.__skk.press_key(u'i')
  486. self.__skk.press_key(u'k')
  487. self.__skk.press_key(u'i')
  488. self.__skk.press_key(u' ')
  489. self.assertEqual(self.__skk.preedit, u'▼5匹')
  490. self.__skk.press_key(u' ')
  491. self.assertEqual(self.__skk.preedit, u'▼五匹')
  492. self.__skk.reset()
  493. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  494. self.__skk.press_key(u'Q')
  495. self.assertEqual(self.__skk.preedit, u'▽')
  496. self.__skk.press_key(u'5')
  497. self.__skk.press_key(u'0')
  498. self.__skk.press_key(u'0')
  499. self.__skk.press_key(u'0')
  500. self.__skk.press_key(u'0')
  501. self.__skk.press_key(u'h')
  502. self.__skk.press_key(u'i')
  503. self.__skk.press_key(u'k')
  504. self.__skk.press_key(u'i')
  505. self.__skk.press_key(u' ')
  506. self.__skk.press_key(u' ')
  507. self.assertEqual(self.__skk.preedit, u'▼五万匹')
  508. def testkzik(self):
  509. self.__skk.reset()
  510. self.__skk.rom_kana_rule = skk.ROM_KANA_KZIK
  511. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  512. self.__skk.press_key(u'b')
  513. self.__skk.press_key(u'g')
  514. handled, output = self.__skk.press_key(u'd')
  515. self.assertTrue(handled)
  516. self.assertEqual(output, u'びぇん')
  517. self.__skk.press_key(u's')
  518. handled, output = self.__skk.press_key(u'q')
  519. self.assertTrue(handled)
  520. self.assertEqual(output, u'さい')
  521. self.__skk.press_key(u'd')
  522. handled, output = self.__skk.press_key(u'l')
  523. self.assertTrue(handled)
  524. self.assertEqual(output, u'どん')
  525. self.__skk.rom_kana_rule = skk.ROM_KANA_NORMAL
  526. self.__skk.reset()
  527. def testdictedit(self):
  528. self.__skk.reset()
  529. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  530. self.__skk.press_key(u'K')
  531. self.__skk.press_key(u'a')
  532. self.__skk.press_key(u'p')
  533. self.__skk.press_key(u'a')
  534. self.__skk.press_key(u' ')
  535. self.assertEqual(self.__skk.preedit, u'[DictEdit] かぱ ')
  536. self.__skk.press_key(u'a')
  537. self.assertEqual(self.__skk.preedit, u'[DictEdit] かぱ あ')
  538. self.__skk.press_key(u'backspace')
  539. self.__skk.press_key(u'A')
  540. self.__skk.press_key(u'ctrl+j')
  541. self.assertEqual(self.__skk.preedit, u'[DictEdit] かぱ あ')
  542. self.__skk.press_key(u'backspace')
  543. self.__skk.press_key(u'K')
  544. self.__skk.press_key(u'a')
  545. self.__skk.press_key(u' ')
  546. self.__skk.press_key(u'ctrl+g')
  547. self.assertEqual(self.__skk.preedit, u'[DictEdit] かぱ ▽か')
  548. self.__skk.press_key(u'return')
  549. self.__skk.press_key(u'backspace')
  550. self.__skk.press_key(u'K')
  551. self.__skk.press_key(u'a')
  552. self.__skk.press_key(u'p')
  553. self.__skk.press_key(u'a')
  554. self.__skk.press_key(u' ')
  555. self.assertEqual(self.__skk.preedit, u'[[DictEdit]] かぱ ')
  556. self.__skk.press_key(u'ctrl+g')
  557. self.assertEqual(self.__skk.preedit, u'[DictEdit] かぱ ▽かぱ')
  558. self.__skk.press_key(u'ctrl+g')
  559. self.assertEqual(self.__skk.preedit, u'[DictEdit] かぱ ')
  560. # Don't register empty string (Debian Bug#590191)
  561. self.__skk.press_key(u'return')
  562. self.assertEqual(self.__skk.preedit, u'▽かぱ')
  563. self.__skk.press_key(u' ')
  564. self.assertEqual(self.__skk.preedit, u'[DictEdit] かぱ ')
  565. self.__skk.press_key(u'K')
  566. self.__skk.press_key(u'a')
  567. self.assertEqual(self.__skk.preedit, u'[DictEdit] かぱ ▽か')
  568. self.__skk.press_key(u' ')
  569. self.assertEqual(self.__skk.preedit, u'[DictEdit] かぱ ▼下')
  570. self.__skk.press_key(u'H')
  571. self.__skk.press_key(u'a')
  572. self.__skk.press_key(u' ')
  573. self.__skk.press_key(u'return')
  574. self.__skk.press_key(u'a')
  575. self.__skk.press_key(u'backspace')
  576. self.assertEqual(self.__skk.preedit, u'[DictEdit] かぱ 下破')
  577. self.assertEqual(self.__skk.press_key(u'return'), (True, u'下破'))
  578. self.__skk.press_key(u'K')
  579. self.__skk.press_key(u'a')
  580. self.__skk.press_key(u'p')
  581. self.__skk.press_key(u'a')
  582. self.__skk.press_key(u' ')
  583. self.assertEqual(self.__skk.preedit, u'▼下破')
  584. # Purge "下破" from the user dictionary (Debian Bug#590188).
  585. self.__skk.press_key(u'X')
  586. self.assertEqual(self.__skk.preedit, u'')
  587. self.__skk.press_key(u'K')
  588. self.__skk.press_key(u'a')
  589. self.__skk.press_key(u'p')
  590. self.__skk.press_key(u'a')
  591. self.assertEqual(self.__skk.preedit, u'▽かぱ')
  592. self.__skk.press_key(u' ')
  593. # Should enter dict-edit since "下破" is purged above.
  594. self.assertEqual(self.__skk.preedit, u'[DictEdit] かぱ ')
  595. self.__skk.press_key(u'ctrl+g')
  596. self.__skk.press_key(u'ctrl+g')
  597. self.assertEqual(self.__skk.preedit, u'')
  598. self.__skk.press_key(u'K')
  599. self.__skk.press_key(u'a')
  600. self.__skk.press_key(u'n')
  601. self.__skk.press_key(u'j')
  602. self.__skk.press_key(u'i')
  603. self.__skk.press_key(u' ')
  604. self.__skk.press_key(u' ')
  605. self.__skk.press_key(u' ')
  606. self.__skk.press_key(u'ctrl+g')
  607. self.assertEqual(self.__skk.preedit, u'▼幹事')
  608. self.__skk.press_key(u'return')
  609. self.__skk.press_key(u'K')
  610. self.__skk.press_key(u'a')
  611. self.__skk.press_key(u'n')
  612. self.__skk.press_key(u'g')
  613. self.__skk.press_key(u'a')
  614. self.__skk.press_key(u'E')
  615. self.__skk.press_key(u' ')
  616. self.assertEqual(self.__skk.preedit, u'[DictEdit] かんが*え ')
  617. self.__skk.press_key(u'ctrl+g')
  618. self.assertEqual(self.__skk.preedit, u'▼考え')
  619. self.__skk.press_key(u'ctrl+g')
  620. self.assertEqual(self.__skk.preedit, u'▽かんがえ')
  621. self.__skk.press_key(u'E')
  622. self.assertEqual(self.__skk.preedit, u'[DictEdit] かんがえ*え ')
  623. self.__skk.press_key(u'ctrl+g')
  624. self.assertEqual(self.__skk.preedit, u'▽かんがええ')
  625. self.__skk.press_key(u'ctrl+h')
  626. self.assertEqual(self.__skk.preedit, u'▽かんがえ')
  627. self.__skk.press_key(u'ctrl+h')
  628. self.assertEqual(self.__skk.preedit, u'▽かんが')
  629. self.__skk.press_key(u'ctrl+g')
  630. self.__skk.press_key(u'K')
  631. self.__skk.press_key(u'a')
  632. self.__skk.press_key(u't')
  633. self.__skk.press_key(u'a')
  634. self.__skk.press_key(u'k')
  635. self.__skk.press_key(u'a')
  636. self.__skk.press_key(u'n')
  637. self.__skk.press_key(u'a')
  638. self.__skk.press_key(u' ')
  639. self.__skk.press_key(u' ')
  640. self.__skk.press_key(u'K')
  641. self.__skk.press_key(u'a')
  642. self.__skk.press_key(u't')
  643. self.__skk.press_key(u'a')
  644. self.__skk.press_key(u'k')
  645. self.__skk.press_key(u'a')
  646. self.__skk.press_key(u'n')
  647. self.__skk.press_key(u'a')
  648. self.__skk.press_key(u'q')
  649. self.assertEqual(self.__skk.preedit, u'[DictEdit] かたかな カタカナ')
  650. self.__skk.press_key(u'backspace')
  651. self.__skk.press_key(u'l')
  652. self.__skk.press_key(u'n')
  653. self.__skk.press_key(u'a')
  654. self.assertEqual(self.__skk.preedit, u'[DictEdit] かたかな カタカna')
  655. # http://github.com/ueno/ibus-skk/issues/#issue/4
  656. handled, output = self.__skk.press_key(u'ctrl+m')
  657. self.assertEqual(output, u'カタカna')
  658. def testhankaku(self):
  659. self.__skk.reset()
  660. self.__skk.activate_input_mode(skk.INPUT_MODE_KATAKANA)
  661. self.__skk.press_key(u'ctrl+q')
  662. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_HANKAKU_KATAKANA)
  663. self.__skk.press_key(u'Z')
  664. self.__skk.press_key(u'e')
  665. self.__skk.press_key(u'n')
  666. self.__skk.press_key(u'k')
  667. self.__skk.press_key(u'a')
  668. self.__skk.press_key(u'k')
  669. self.__skk.press_key(u'u')
  670. self.assertEqual(self.__skk.preedit, u'▽ゼンカク')
  671. handled, output = self.__skk.press_key(u'ctrl+q')
  672. self.assertTrue(handled)
  673. self.assertEqual(output, u'ゼンカク')
  674. self.__skk.press_key(u'Z')
  675. self.__skk.press_key(u'e')
  676. self.__skk.press_key(u'n')
  677. self.__skk.press_key(u'k')
  678. self.__skk.press_key(u'a')
  679. self.__skk.press_key(u'k')
  680. self.__skk.press_key(u'u')
  681. self.assertEqual(self.__skk.preedit, u'▽ゼンカク')
  682. self.__skk.press_key(u' ')
  683. self.assertEqual(self.__skk.preedit, u'▼全角')
  684. def testabbrev(self):
  685. self.__skk.reset()
  686. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  687. self.__skk.press_key(u'/')
  688. self.__skk.press_key(u'r')
  689. self.__skk.press_key(u'e')
  690. self.__skk.press_key(u'q')
  691. self.__skk.press_key(u'u')
  692. self.__skk.press_key(u'e')
  693. self.__skk.press_key(u's')
  694. self.__skk.press_key(u't')
  695. self.assertEqual(self.__skk.preedit, u'▽request')
  696. self.__skk.press_key(u' ')
  697. self.assertEqual(self.__skk.preedit, u'▼リクエスト')
  698. self.__skk.reset()
  699. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  700. self.__skk.press_key(u'z')
  701. handled, output = self.__skk.press_key(u'/')
  702. self.assertTrue(handled)
  703. self.assertEqual(output, u'・')
  704. self.__skk.reset();
  705. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  706. self.__skk.press_key(u'/')
  707. handled, output = self.__skk.press_key(u']')
  708. self.assertTrue(handled)
  709. self.assertEqual(output, u'')
  710. self.assertEqual(self.__skk.preedit, u'▽]')
  711. # Ignore "" in abbrev mode (Issue#16).
  712. self.__skk.reset();
  713. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  714. self.__skk.press_key(u'/')
  715. handled, output = self.__skk.press_key(u'(')
  716. self.assertTrue(handled)
  717. self.assertEqual(output, u'')
  718. self.assertEqual(self.__skk.preedit, u'▽(')
  719. self.__skk.reset();
  720. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  721. self.__skk.press_key(u'/')
  722. handled, output = self.__skk.press_key(u'A')
  723. self.assertTrue(handled)
  724. self.assertEqual(output, u'')
  725. self.assertEqual(self.__skk.preedit, u'▽A')
  726. # Convert hankaku to zenkaku with ctrl+q (Issue#17).
  727. self.__skk.reset();
  728. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  729. self.__skk.press_key(u'/')
  730. self.__skk.press_key(u'a')
  731. self.__skk.press_key(u'a')
  732. handled, output = self.__skk.press_key(u'ctrl+q')
  733. self.assertTrue(handled)
  734. self.assertEqual(output, u'aa')
  735. def testkuten(self):
  736. self.__skk.reset()
  737. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  738. self.__skk.press_key(u'\\')
  739. self.assertEqual(self.__skk.preedit, u'Kuten([MM]KKTT) ')
  740. self.__skk.press_key(u'a')
  741. self.__skk.press_key(u'backspace')
  742. self.assertEqual(self.__skk.preedit, u'Kuten([MM]KKTT) ')
  743. self.__skk.press_key(u'backspace')
  744. self.assertEqual(self.__skk.preedit, u'')
  745. self.__skk.press_key(u'\\')
  746. self.__skk.press_key(u'a')
  747. self.__skk.press_key(u'1')
  748. self.__skk.press_key(u'a')
  749. self.__skk.press_key(u'2')
  750. handled, output = self.__skk.press_key(u'return')
  751. self.assertTrue(handled)
  752. self.assertEqual(output, u'、')
  753. # Don't start KUTEN input on {wide,}latin input mode.
  754. self.__skk.activate_input_mode(skk.INPUT_MODE_LATIN)
  755. handled, output = self.__skk.press_key(u'\\')
  756. self.assertTrue(handled)
  757. self.assertEqual(output, u'\\')
  758. self.__skk.activate_input_mode(skk.INPUT_MODE_WIDE_LATIN)
  759. handled, output = self.__skk.press_key(u'\\')
  760. self.assertTrue(handled)
  761. self.assertEqual(output, u'\')
  762. def testnicola(self):
  763. class Counter(object):
  764. def __init__(self):
  765. self.__counter = 0
  766. def time(self):
  767. return self.__counter
  768. def incr(self, amount):
  769. self.__counter += amount
  770. t = Counter()
  771. n = nicola.Nicola(time_func=t.time)
  772. # single key - timeout
  773. n.queue('a')
  774. result = n.dispatch()
  775. self.assertEqual(result.output, tuple())
  776. t.incr(0.2)
  777. result = n.dispatch()
  778. self.assertEqual(result.output, ('a',))
  779. # single key - release
  780. n.queue('a')
  781. n.queue('release+a')
  782. result = n.dispatch()
  783. self.assertEqual(result.output, ('a',))
  784. # single key - overlap
  785. n.queue('a')
  786. t.incr(0.05)
  787. n.queue('b')
  788. result = n.dispatch()
  789. self.assertEqual(result.output, ('a',))
  790. t.incr(0.2)
  791. result = n.dispatch()
  792. self.assertEqual(result.output, ('b',))
  793. # double key - shifted
  794. n.queue('a')
  795. t.incr(0.01)
  796. n.queue('lshift')
  797. t.incr(0.2)
  798. result = n.dispatch()
  799. self.assertEqual(result.output, ('lshift+a',))
  800. # double key - shifted reverse
  801. n.queue('lshift')
  802. t.incr(0.01)
  803. n.queue('a')
  804. t.incr(0.2)
  805. result = n.dispatch()
  806. self.assertEqual(result.output, ('lshift+a',))
  807. # double key - shifted expired
  808. n.queue('a')
  809. t.incr(0.06)
  810. n.queue('lshift')
  811. result = n.dispatch()
  812. self.assertNotEqual(result.output, ('lshift+a',))
  813. t.incr(0.2)
  814. result = n.dispatch()
  815. # double key - skk-nicola
  816. n.queue('f')
  817. t.incr(0.03)
  818. n.queue('j')
  819. result = n.dispatch()
  820. self.assertEqual(result.output, ('[fj]',))
  821. t.incr(0.2)
  822. # double key - skk-nicola (reverse)
  823. n.queue('j')
  824. t.incr(0.03)
  825. n.queue('f')
  826. result = n.dispatch()
  827. self.assertEqual(result.output, ('[fj]',))
  828. t.incr(0.2)
  829. result = n.dispatch()
  830. # double key - skk-nicola (lshift+rshift)
  831. n.queue('lshift')
  832. t.incr(0.03)
  833. n.queue('rshift')
  834. result = n.dispatch()
  835. self.assertEqual(result.output, ('[LR]',))
  836. t.incr(0.2)
  837. # triple key t1 <= t2
  838. n.queue('a')
  839. t.incr(0.01)
  840. n.queue('lshift')
  841. t.incr(0.02)
  842. n.queue('b')
  843. result = n.dispatch()
  844. self.assertEqual(result.output, ('lshift+a',))
  845. result = n.dispatch()
  846. self.assertEqual(result.output, tuple())
  847. t.incr(0.2)
  848. result = n.dispatch()
  849. self.assertEqual(result.output, ('b',))
  850. # triple key t1 > t2
  851. n.queue('a')
  852. t.incr(0.02)
  853. n.queue('lshift')
  854. t.incr(0.01)
  855. n.queue('b')
  856. result = n.dispatch()
  857. self.assertEqual(result.output, ('a', 'lshift+b'))
  858. def testnicolaskk(self):
  859. self.__skk.reset()
  860. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  861. self.__skk.press_key(u'nicola+[fj]')
  862. self.assertEqual(self.__skk.conv_state, skk.CONV_STATE_START)
  863. self.__skk.press_key(u'nicola+w') #
  864. self.__skk.press_key(u'nicola+;') #
  865. self.__skk.press_key(u'nicola+rshift+w') #
  866. self.assertEqual(self.__skk.preedit, u'▽かんが')
  867. self.__skk.press_key(u'nicola+[fj]') # start okuri-ari conversion
  868. self.__skk.press_key(u'nicola+lshift+w') #
  869. self.assertEqual(self.__skk.preedit, u'▼考え')
  870. self.__skk.reset()
  871. self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
  872. self.__skk.press_key(u'nicola+[LR]')
  873. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_LATIN)
  874. self.__skk.press_key(u'nicola+[LR]')
  875. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_HIRAGANA)
  876. self.__skk.activate_input_mode(skk.INPUT_MODE_LATIN)
  877. self.__skk.press_key(u'nicola+ctrl+j')
  878. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_HIRAGANA)
  879. self.__skk.press_key(u'nicola+Z')
  880. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_WIDE_LATIN)
  881. self.__skk.press_key(u'nicola+ctrl+j')
  882. self.assertEqual(self.__skk.input_mode, skk.INPUT_MODE_HIRAGANA)
  883. # latin mode input test
  884. self.__skk.activate_input_mode(skk.INPUT_MODE_LATIN)
  885. handled, output = self.__skk.press_key(u'nicola+[fj]')
  886. self.assertEqual(output, 'fj')
  887. handled, output = self.__skk.press_key(u'nicola+[')
  888. self.assertEqual(output, '[')
  889. handled, output = self.__skk.press_key(u'nicola+[LR]')
  890. self.assertEqual(output, '')
  891. self.__skk.activate_input_mode(skk.INPUT_MODE_WIDE_LATIN)
  892. handled, output = self.__skk.press_key(u'nicola+[fj]')
  893. self.assertEqual(output, u'fj')
  894. if __name__ == '__main__':
  895. unittest.main()