m2m模型翻译
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

398 lines
13 KiB

6 months ago
  1. # -*- coding: utf-8 -*-
  2. #*****************************************************************************
  3. # Copyright (C) 2006 Michael Graz. <mgraz@plan10.com>
  4. # Copyright (C) 2006 Michael Graz. <mgraz@plan10.com>
  5. #
  6. # Distributed under the terms of the BSD License. The full license is in
  7. # the file COPYING, distributed as part of this software.
  8. #*****************************************************************************
  9. from __future__ import print_function, unicode_literals, absolute_import
  10. import sys, unittest
  11. sys.path.insert(0, '../..')
  12. from pyreadline.modes.emacs import *
  13. from pyreadline import keysyms
  14. from pyreadline.lineeditor import lineobj
  15. from pyreadline.test.common import *
  16. from pyreadline.logger import log
  17. import pyreadline.logger as logger
  18. logger.sock_silent=True
  19. logger.show_event=["debug"]
  20. #----------------------------------------------------------------------
  21. class EmacsModeTest (EmacsMode):
  22. tested_commands={}
  23. def __init__ (self):
  24. EmacsMode.__init__ (self, MockReadline())
  25. self.mock_console = MockConsole ()
  26. self.init_editing_mode (None)
  27. self.lst_completions = []
  28. self.completer = self.mock_completer
  29. self.completer_delims = ' '
  30. self.tabstop = 4
  31. self.mark_directories=False
  32. self.show_all_if_ambiguous=False
  33. def get_mock_console (self):
  34. return self.mock_console
  35. console = property (get_mock_console)
  36. def _set_line (self, text):
  37. self.l_buffer.set_line (text)
  38. def get_line (self):
  39. return self.l_buffer.get_line_text ()
  40. line = property (get_line)
  41. def get_line_cursor (self):
  42. return self.l_buffer.point
  43. line_cursor = property (get_line_cursor)
  44. def input (self, keytext):
  45. if keytext[0:1] == '"' and keytext[-1:] == '"':
  46. lst_key = ['"%s"' % c for c in keytext[1:-1]]
  47. else:
  48. lst_key = [keytext]
  49. for key in lst_key:
  50. keyinfo, event = keytext_to_keyinfo_and_event (key)
  51. dispatch_func = self.key_dispatch.get(keyinfo.tuple(),self.self_insert)
  52. self.tested_commands[dispatch_func.__name__]=dispatch_func
  53. log("keydisp: %s %s"%( key,dispatch_func.__name__))
  54. dispatch_func (event)
  55. self.previous_func=dispatch_func
  56. def accept_line (self, e):
  57. if EmacsMode.accept_line (self, e):
  58. # simulate return
  59. # self.add_history (self.line)
  60. self.l_buffer.reset_line ()
  61. def mock_completer (self, text, state):
  62. return self.lst_completions [state]
  63. #----------------------------------------------------------------------
  64. class TestsKeyinfo (unittest.TestCase):
  65. def test_keyinfo (self):
  66. keyinfo, event = keytext_to_keyinfo_and_event ('"d"')
  67. self.assertEqual ('d', event.char)
  68. keyinfo, event = keytext_to_keyinfo_and_event ('"D"')
  69. self.assertEqual ('D', event.char)
  70. keyinfo, event = keytext_to_keyinfo_and_event ('"$"')
  71. self.assertEqual ('$', event.char)
  72. keyinfo, event = keytext_to_keyinfo_and_event ('Escape')
  73. self.assertEqual ('\x1b', event.char)
  74. class TestsMovement (unittest.TestCase):
  75. def test_cursor (self):
  76. r = EmacsModeTest ()
  77. self.assertEqual (r.line, '')
  78. r.input('"First Second Third"')
  79. self.assertEqual (r.line, 'First Second Third')
  80. self.assertEqual (r.line_cursor, 18)
  81. r.input('Control-a')
  82. self.assertEqual (r.line, 'First Second Third')
  83. self.assertEqual (r.line_cursor, 0)
  84. r.input('Control-e')
  85. self.assertEqual (r.line, 'First Second Third')
  86. self.assertEqual (r.line_cursor, 18)
  87. r.input('Home')
  88. self.assertEqual (r.line, 'First Second Third')
  89. self.assertEqual (r.line_cursor, 0)
  90. r.input('Right')
  91. self.assertEqual (r.line, 'First Second Third')
  92. self.assertEqual (r.line_cursor, 1)
  93. r.input('Ctrl-f')
  94. self.assertEqual (r.line, 'First Second Third')
  95. self.assertEqual (r.line_cursor, 2)
  96. r.input('Ctrl-Right')
  97. self.assertEqual (r.line, 'First Second Third')
  98. self.assertEqual (r.line_cursor, 5)
  99. r.input('Ctrl-Right')
  100. self.assertEqual (r.line, 'First Second Third')
  101. self.assertEqual (r.line_cursor, 12)
  102. r.input('Ctrl-Right')
  103. self.assertEqual (r.line, 'First Second Third')
  104. self.assertEqual (r.line_cursor, 18)
  105. r.input('Ctrl-Right')
  106. self.assertEqual (r.line, 'First Second Third')
  107. self.assertEqual (r.line_cursor, 18)
  108. r.input('Ctrl-Left')
  109. self.assertEqual (r.line, 'First Second Third')
  110. self.assertEqual (r.line_cursor, 13)
  111. r.input('Ctrl-Left')
  112. self.assertEqual (r.line, 'First Second Third')
  113. self.assertEqual (r.line_cursor, 6)
  114. r.input('Ctrl-Left')
  115. self.assertEqual (r.line, 'First Second Third')
  116. self.assertEqual (r.line_cursor, 0)
  117. r.input('Ctrl-Left')
  118. self.assertEqual (r.line, 'First Second Third')
  119. self.assertEqual (r.line_cursor, 0)
  120. class TestsDelete (unittest.TestCase):
  121. def test_delete (self):
  122. r = EmacsModeTest ()
  123. self.assertEqual (r.line, '')
  124. r.input('"First Second Third"')
  125. self.assertEqual (r.line, 'First Second Third')
  126. self.assertEqual (r.line_cursor, 18)
  127. r.input('Delete')
  128. self.assertEqual (r.line, 'First Second Third')
  129. self.assertEqual (r.line_cursor, 18)
  130. r.input('Left')
  131. r.input('Left')
  132. r.input('Delete')
  133. self.assertEqual (r.line, 'First Second Thid')
  134. self.assertEqual (r.line_cursor, 16)
  135. r.input('Delete')
  136. self.assertEqual (r.line, 'First Second Thi')
  137. self.assertEqual (r.line_cursor, 16)
  138. r.input('Backspace')
  139. self.assertEqual (r.line, 'First Second Th')
  140. self.assertEqual (r.line_cursor, 15)
  141. r.input('Home')
  142. r.input('Right')
  143. r.input('Right')
  144. self.assertEqual (r.line, 'First Second Th')
  145. self.assertEqual (r.line_cursor, 2)
  146. r.input('Backspace')
  147. self.assertEqual (r.line, 'Frst Second Th')
  148. self.assertEqual (r.line_cursor, 1)
  149. r.input('Backspace')
  150. self.assertEqual (r.line, 'rst Second Th')
  151. self.assertEqual (r.line_cursor, 0)
  152. r.input('Backspace')
  153. self.assertEqual (r.line, 'rst Second Th')
  154. self.assertEqual (r.line_cursor, 0)
  155. r.input('Escape')
  156. self.assertEqual (r.line, '')
  157. self.assertEqual (r.line_cursor, 0)
  158. def test_delete_word (self):
  159. r = EmacsModeTest ()
  160. self.assertEqual (r.line, '')
  161. r.input('"First Second Third"')
  162. self.assertEqual (r.line, 'First Second Third')
  163. self.assertEqual (r.line_cursor, 18)
  164. r.input('Control-Backspace')
  165. self.assertEqual (r.line, 'First Second ')
  166. self.assertEqual (r.line_cursor, 13)
  167. r.input('Backspace')
  168. r.input('Left')
  169. r.input('Left')
  170. self.assertEqual (r.line, 'First Second')
  171. self.assertEqual (r.line_cursor, 10)
  172. r.input('Control-Backspace')
  173. self.assertEqual (r.line, 'First nd')
  174. self.assertEqual (r.line_cursor, 6)
  175. r.input('Escape')
  176. self.assertEqual (r.line, '')
  177. self.assertEqual (r.line_cursor, 0)
  178. r.input('"First Second Third"')
  179. r.input('Home')
  180. r.input('Right')
  181. r.input('Right')
  182. r.input('Control-Delete')
  183. self.assertEqual (r.line, 'FiSecond Third')
  184. self.assertEqual (r.line_cursor, 2)
  185. r.input('Control-Delete')
  186. self.assertEqual (r.line, 'FiThird')
  187. self.assertEqual (r.line_cursor, 2)
  188. r.input('Control-Delete')
  189. self.assertEqual (r.line, 'Fi')
  190. self.assertEqual (r.line_cursor, 2)
  191. r.input('Control-Delete')
  192. self.assertEqual (r.line, 'Fi')
  193. self.assertEqual (r.line_cursor, 2)
  194. r.input('Escape')
  195. self.assertEqual (r.line, '')
  196. self.assertEqual (r.line_cursor, 0)
  197. class TestsSelectionMovement (unittest.TestCase):
  198. def test_cursor (self):
  199. r = EmacsModeTest ()
  200. self.assertEqual (r.line, '')
  201. r.input('"First Second Third"')
  202. self.assertEqual (r.line, 'First Second Third')
  203. self.assertEqual (r.line_cursor, 18)
  204. self.assertEqual (r.l_buffer.selection_mark, -1)
  205. r.input('Home')
  206. r.input('Shift-Right')
  207. self.assertEqual (r.line, 'First Second Third')
  208. self.assertEqual (r.line_cursor, 1)
  209. self.assertEqual (r.l_buffer.selection_mark, 0)
  210. r.input('Shift-Control-Right')
  211. self.assertEqual (r.line, 'First Second Third')
  212. self.assertEqual (r.line_cursor, 5)
  213. self.assertEqual (r.l_buffer.selection_mark, 0)
  214. r.input('"a"')
  215. self.assertEqual (r.line, 'a Second Third')
  216. self.assertEqual (r.line_cursor, 1)
  217. self.assertEqual (r.l_buffer.selection_mark, -1)
  218. r.input('Shift-End')
  219. self.assertEqual (r.line, 'a Second Third')
  220. self.assertEqual (r.line_cursor, 14)
  221. self.assertEqual (r.l_buffer.selection_mark, 1)
  222. r.input('Delete')
  223. self.assertEqual (r.line, 'a')
  224. self.assertEqual (r.line_cursor, 1)
  225. self.assertEqual (r.l_buffer.selection_mark, -1)
  226. class TestsHistory (unittest.TestCase):
  227. def test_history_1 (self):
  228. r = EmacsModeTest ()
  229. r.add_history ('aa')
  230. r.add_history ('bbb')
  231. self.assertEqual (r.line, '')
  232. r.input ('Up')
  233. self.assertEqual (r.line, 'bbb')
  234. self.assertEqual (r.line_cursor, 3)
  235. r.input ('Up')
  236. self.assertEqual (r.line, 'aa')
  237. self.assertEqual (r.line_cursor, 2)
  238. r.input ('Up')
  239. self.assertEqual (r.line, 'aa')
  240. self.assertEqual (r.line_cursor, 2)
  241. r.input ('Down')
  242. self.assertEqual (r.line, 'bbb')
  243. self.assertEqual (r.line_cursor, 3)
  244. r.input ('Down')
  245. self.assertEqual (r.line, '')
  246. self.assertEqual (r.line_cursor, 0)
  247. def test_history_2 (self):
  248. r = EmacsModeTest ()
  249. r.add_history ('aaaa')
  250. r.add_history ('aaba')
  251. r.add_history ('aaca')
  252. r.add_history ('akca')
  253. r.add_history ('bbb')
  254. r.add_history ('ako')
  255. self.assert_line(r,'',0)
  256. r.input ('"a"')
  257. r.input ('Up')
  258. self.assert_line(r,'ako',1)
  259. r.input ('Up')
  260. self.assert_line(r,'akca',1)
  261. r.input ('Up')
  262. self.assert_line(r,'aaca',1)
  263. r.input ('Up')
  264. self.assert_line(r,'aaba',1)
  265. r.input ('Up')
  266. self.assert_line(r,'aaaa',1)
  267. r.input ('Right')
  268. self.assert_line(r,'aaaa',2)
  269. r.input ('Down')
  270. self.assert_line(r,'aaba',2)
  271. r.input ('Down')
  272. self.assert_line(r,'aaca',2)
  273. r.input ('Down')
  274. self.assert_line(r,'aaca',2)
  275. r.input ('Left')
  276. r.input ('Left')
  277. r.input ('Down')
  278. r.input ('Down')
  279. self.assert_line(r,'bbb',3)
  280. r.input ('Left')
  281. self.assert_line(r,'bbb',2)
  282. r.input ('Down')
  283. self.assert_line(r,'bbb',2)
  284. r.input ('Up')
  285. self.assert_line(r,'bbb',2)
  286. def test_history_3 (self):
  287. r = EmacsModeTest ()
  288. r.add_history ('aaaa')
  289. r.add_history ('aaba')
  290. r.add_history ('aaca')
  291. r.add_history ('akca')
  292. r.add_history ('bbb')
  293. r.add_history ('ako')
  294. self.assert_line(r,'',0)
  295. r.input ('')
  296. r.input ('Up')
  297. self.assert_line(r,'ako',3)
  298. r.input ('Down')
  299. self.assert_line(r,'',0)
  300. r.input ('Up')
  301. self.assert_line(r,'ako',3)
  302. def test_history_3 (self):
  303. r = EmacsModeTest ()
  304. r.add_history ('aaaa')
  305. r.add_history ('aaba')
  306. r.add_history ('aaca')
  307. r.add_history ('akca')
  308. r.add_history ('bbb')
  309. r.add_history ('ako')
  310. self.assert_line(r,'',0)
  311. r.input ('k')
  312. r.input ('Up')
  313. self.assert_line(r,'k',1)
  314. def test_complete (self):
  315. import rlcompleter
  316. logger.sock_silent = False
  317. log("-" * 50)
  318. r = EmacsModeTest()
  319. completerobj = rlcompleter.Completer()
  320. def _nop(val, word):
  321. return word
  322. completerobj._callable_postfix = _nop
  323. r.completer = completerobj.complete
  324. r._bind_key("tab", r.complete)
  325. r.input('"exi(ksdjksjd)"')
  326. r.input('Control-a')
  327. r.input('Right')
  328. r.input('Right')
  329. r.input('Right')
  330. r.input('Tab')
  331. self.assert_line(r, "exit(ksdjksjd)", 4)
  332. r.input('Escape')
  333. r.input('"exi"')
  334. r.input('Control-a')
  335. r.input('Right')
  336. r.input('Right')
  337. r.input('Right')
  338. r.input('Tab')
  339. self.assert_line(r, "exit", 4)
  340. def assert_line(self,r,line,cursor):
  341. self.assertEqual (r.line, line)
  342. self.assertEqual (r.line_cursor, cursor)
  343. #----------------------------------------------------------------------
  344. # utility functions
  345. #----------------------------------------------------------------------
  346. if __name__ == '__main__':
  347. Tester()
  348. tested=list(EmacsModeTest.tested_commands.keys())
  349. tested.sort()
  350. # print(" Tested functions ".center(60,"-"))
  351. # print( "\n".join(tested))
  352. # print()
  353. all_funcs=dict([(x.__name__,x) for x in list(EmacsModeTest().key_dispatch.values())])
  354. all_funcs=list(all_funcs.keys())
  355. not_tested=[x for x in all_funcs if x not in tested]
  356. not_tested.sort()
  357. print(" Not tested functions ".center(60,"-"))
  358. print("\n".join(not_tested))