completion_request_test.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. # Copyright (C) 2015-2019 YouCompleteMe Contributors
  2. #
  3. # This file is part of YouCompleteMe.
  4. #
  5. # YouCompleteMe is free software: you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation, either version 3 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # YouCompleteMe is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>.
  17. import json
  18. from hamcrest import assert_that, equal_to
  19. from ycm.tests.conftest import UserOptions
  20. from ycm.tests.test_utils import MockVimModule
  21. vim_mock = MockVimModule()
  22. from ycm.client import completion_request
  23. class ConvertCompletionResponseToVimDatas_test:
  24. """ This class tests the
  25. completion_request._ConvertCompletionResponseToVimDatas method """
  26. def _Check( self, completion_data, expected_vim_data ):
  27. vim_data = completion_request._ConvertCompletionDataToVimData(
  28. completion_data )
  29. try:
  30. assert_that( vim_data, equal_to( expected_vim_data ) )
  31. except Exception:
  32. print( "Expected:\n"
  33. f"'{ expected_vim_data }'\n"
  34. "when parsing:\n'"
  35. f"{ completion_data }'\n"
  36. "But found:\n"
  37. f"'{ vim_data }'" )
  38. raise
  39. def AllFields_test( self ):
  40. extra_data = {
  41. 'doc_string': 'DOC STRING',
  42. }
  43. self._Check( {
  44. 'insertion_text': 'INSERTION TEXT',
  45. 'menu_text': 'MENU TEXT',
  46. 'extra_menu_info': 'EXTRA MENU INFO',
  47. 'kind': 'K',
  48. 'detailed_info': 'DETAILED INFO',
  49. 'extra_data': extra_data,
  50. }, {
  51. 'word' : 'INSERTION TEXT',
  52. 'abbr' : 'MENU TEXT',
  53. 'menu' : 'EXTRA MENU INFO',
  54. 'kind' : 'k',
  55. 'info' : 'DETAILED INFO\nDOC STRING',
  56. 'equal' : 1,
  57. 'dup' : 1,
  58. 'empty' : 1,
  59. 'user_data': json.dumps( extra_data ),
  60. } )
  61. def OnlyInsertionTextField_test( self ):
  62. self._Check( {
  63. 'insertion_text': 'INSERTION TEXT'
  64. }, {
  65. 'word' : 'INSERTION TEXT',
  66. 'abbr' : '',
  67. 'menu' : '',
  68. 'kind' : '',
  69. 'info' : '',
  70. 'equal' : 1,
  71. 'dup' : 1,
  72. 'empty' : 1,
  73. 'user_data': '{}',
  74. } )
  75. def JustDetailedInfo_test( self ):
  76. self._Check( {
  77. 'insertion_text': 'INSERTION TEXT',
  78. 'menu_text': 'MENU TEXT',
  79. 'extra_menu_info': 'EXTRA MENU INFO',
  80. 'kind': 'K',
  81. 'detailed_info': 'DETAILED INFO',
  82. }, {
  83. 'word' : 'INSERTION TEXT',
  84. 'abbr' : 'MENU TEXT',
  85. 'menu' : 'EXTRA MENU INFO',
  86. 'kind' : 'k',
  87. 'info' : 'DETAILED INFO',
  88. 'equal' : 1,
  89. 'dup' : 1,
  90. 'empty' : 1,
  91. 'user_data': '{}',
  92. } )
  93. def JustDocString_test( self ):
  94. extra_data = {
  95. 'doc_string': 'DOC STRING',
  96. }
  97. self._Check( {
  98. 'insertion_text': 'INSERTION TEXT',
  99. 'menu_text': 'MENU TEXT',
  100. 'extra_menu_info': 'EXTRA MENU INFO',
  101. 'kind': 'K',
  102. 'extra_data': extra_data,
  103. }, {
  104. 'word' : 'INSERTION TEXT',
  105. 'abbr' : 'MENU TEXT',
  106. 'menu' : 'EXTRA MENU INFO',
  107. 'kind' : 'k',
  108. 'info' : 'DOC STRING',
  109. 'equal' : 1,
  110. 'dup' : 1,
  111. 'empty' : 1,
  112. 'user_data': json.dumps( extra_data ),
  113. } )
  114. def ExtraInfoNoDocString_test( self ):
  115. self._Check( {
  116. 'insertion_text': 'INSERTION TEXT',
  117. 'menu_text': 'MENU TEXT',
  118. 'extra_menu_info': 'EXTRA MENU INFO',
  119. 'kind': 'K',
  120. 'extra_data': {
  121. },
  122. }, {
  123. 'word' : 'INSERTION TEXT',
  124. 'abbr' : 'MENU TEXT',
  125. 'menu' : 'EXTRA MENU INFO',
  126. 'kind' : 'k',
  127. 'info' : '',
  128. 'equal' : 1,
  129. 'dup' : 1,
  130. 'empty' : 1,
  131. 'user_data': '{}',
  132. } )
  133. def NullCharactersInExtraInfoAndDocString_test( self ):
  134. extra_data = {
  135. 'doc_string': 'DOC\x00STRING'
  136. }
  137. self._Check( {
  138. 'insertion_text': 'INSERTION TEXT',
  139. 'menu_text': 'MENU TEXT',
  140. 'extra_menu_info': 'EXTRA MENU INFO',
  141. 'kind': 'K',
  142. 'detailed_info': 'DETAILED\x00INFO',
  143. 'extra_data': extra_data,
  144. }, {
  145. 'word' : 'INSERTION TEXT',
  146. 'abbr' : 'MENU TEXT',
  147. 'menu' : 'EXTRA MENU INFO',
  148. 'kind' : 'k',
  149. 'info' : 'DETAILEDINFO\nDOCSTRING',
  150. 'equal' : 1,
  151. 'dup' : 1,
  152. 'empty' : 1,
  153. 'user_data': json.dumps( extra_data ),
  154. } )
  155. def ExtraInfoNoDocStringWithDetailedInfo_test( self ):
  156. self._Check( {
  157. 'insertion_text': 'INSERTION TEXT',
  158. 'menu_text': 'MENU TEXT',
  159. 'extra_menu_info': 'EXTRA MENU INFO',
  160. 'kind': 'K',
  161. 'detailed_info': 'DETAILED INFO',
  162. 'extra_data': {
  163. },
  164. }, {
  165. 'word' : 'INSERTION TEXT',
  166. 'abbr' : 'MENU TEXT',
  167. 'menu' : 'EXTRA MENU INFO',
  168. 'kind' : 'k',
  169. 'info' : 'DETAILED INFO',
  170. 'equal' : 1,
  171. 'dup' : 1,
  172. 'empty' : 1,
  173. 'user_data': '{}',
  174. } )
  175. def EmptyInsertionText_test( self ):
  176. extra_data = {
  177. 'doc_string': 'DOC STRING',
  178. }
  179. self._Check( {
  180. 'insertion_text': '',
  181. 'menu_text': 'MENU TEXT',
  182. 'extra_menu_info': 'EXTRA MENU INFO',
  183. 'kind': 'K',
  184. 'detailed_info': 'DETAILED INFO',
  185. 'extra_data': extra_data,
  186. }, {
  187. 'word' : '',
  188. 'abbr' : 'MENU TEXT',
  189. 'menu' : 'EXTRA MENU INFO',
  190. 'kind' : 'k',
  191. 'info' : 'DETAILED INFO\nDOC STRING',
  192. 'equal' : 1,
  193. 'dup' : 1,
  194. 'empty' : 1,
  195. 'user_data': json.dumps( extra_data ),
  196. } )
  197. def TruncateForPopup_test( self, *args ):
  198. with UserOptions( { '&columns': 60, '&completeopt': b'popup,menuone' } ):
  199. extra_data = {
  200. 'doc_string': 'DOC STRING',
  201. }
  202. self._Check( {
  203. 'insertion_text': '',
  204. 'menu_text': 'MENU TEXT',
  205. 'extra_menu_info': 'ESPECIALLY LONG EXTRA MENU INFO LOREM IPSUM DOLOR',
  206. 'kind': 'K',
  207. 'detailed_info': 'DETAILED INFO',
  208. 'extra_data': extra_data,
  209. }, {
  210. 'word' : '',
  211. 'abbr' : 'MENU TEXT',
  212. 'menu' : 'ESPECIALLY LONG E...',
  213. 'kind' : 'k',
  214. 'info' : 'ESPECIALLY LONG EXTRA MENU INFO LOREM IPSUM DOLOR\n\n' +
  215. 'DETAILED INFO\nDOC STRING',
  216. 'equal' : 1,
  217. 'dup' : 1,
  218. 'empty' : 1,
  219. 'user_data': json.dumps( extra_data ),
  220. } )
  221. def OnlyTruncateForPopupIfNecessary_test( self, *args ):
  222. with UserOptions( { '&columns': 60, '&completeopt': b'popup,menuone' } ):
  223. extra_data = {
  224. 'doc_string': 'DOC STRING',
  225. }
  226. self._Check( {
  227. 'insertion_text': '',
  228. 'menu_text': 'MENU TEXT',
  229. 'extra_menu_info': 'EXTRA MENU INFO',
  230. 'kind': 'K',
  231. 'detailed_info': 'DETAILED INFO',
  232. 'extra_data': extra_data,
  233. }, {
  234. 'word' : '',
  235. 'abbr' : 'MENU TEXT',
  236. 'menu' : 'EXTRA MENU INFO',
  237. 'kind' : 'k',
  238. 'info' : 'DETAILED INFO\nDOC STRING',
  239. 'equal' : 1,
  240. 'dup' : 1,
  241. 'empty' : 1,
  242. 'user_data': json.dumps( extra_data ),
  243. } )
  244. def DontTruncateIfNotPopup_test( self, *args ):
  245. with UserOptions( { '&columns': 60, '&completeopt': b'preview,menuone' } ):
  246. extra_data = {
  247. 'doc_string': 'DOC STRING',
  248. }
  249. self._Check( {
  250. 'insertion_text': '',
  251. 'menu_text': 'MENU TEXT',
  252. 'extra_menu_info': 'ESPECIALLY LONG EXTRA MENU INFO LOREM IPSUM DOLOR',
  253. 'kind': 'K',
  254. 'detailed_info': 'DETAILED INFO',
  255. 'extra_data': extra_data,
  256. }, {
  257. 'word' : '',
  258. 'abbr' : 'MENU TEXT',
  259. 'menu' : 'ESPECIALLY LONG EXTRA MENU INFO LOREM IPSUM DOLOR',
  260. 'kind' : 'k',
  261. 'info' : 'DETAILED INFO\nDOC STRING',
  262. 'equal' : 1,
  263. 'dup' : 1,
  264. 'empty' : 1,
  265. 'user_data': json.dumps( extra_data ),
  266. } )
  267. def TruncateForPopupWithoutDuplication_test( self, *args ):
  268. with UserOptions( { '&columns': 60, '&completeopt': b'popup,menuone' } ):
  269. extra_data = {
  270. 'doc_string': 'DOC STRING',
  271. }
  272. self._Check( {
  273. 'insertion_text': '',
  274. 'menu_text': 'MENU TEXT',
  275. 'extra_menu_info': 'ESPECIALLY LONG METHOD SIGNATURE LOREM IPSUM',
  276. 'kind': 'K',
  277. 'detailed_info': 'ESPECIALLY LONG METHOD SIGNATURE LOREM IPSUM',
  278. 'extra_data': extra_data,
  279. }, {
  280. 'word' : '',
  281. 'abbr' : 'MENU TEXT',
  282. 'menu' : 'ESPECIALLY LONG M...',
  283. 'kind' : 'k',
  284. 'info' : 'ESPECIALLY LONG METHOD SIGNATURE LOREM IPSUM\n' +
  285. 'DOC STRING',
  286. 'equal' : 1,
  287. 'dup' : 1,
  288. 'empty' : 1,
  289. 'user_data': json.dumps( extra_data ),
  290. } )