1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011 |
- # coding: utf-8
- #
- # Copyright (C) 2015-2018 YouCompleteMe contributors
- #
- # This file is part of YouCompleteMe.
- #
- # YouCompleteMe is free software: you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation, either version 3 of the License, or
- # (at your option) any later version.
- #
- # YouCompleteMe is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>.
- # Intentionally not importing unicode_literals!
- from __future__ import print_function
- from __future__ import division
- from __future__ import absolute_import
- # Not installing aliases from python-future; it's unreliable and slow.
- from builtins import * # noqa
- from ycm.tests import PathToTestFile
- from ycm.tests.test_utils import ( CurrentWorkingDirectory, ExtendedMock,
- MockVimBuffers, MockVimModule, Version,
- VimBuffer, VimError, WindowsAndMacOnly )
- MockVimModule()
- from ycm import vimsupport
- from nose.tools import eq_
- from hamcrest import ( assert_that, calling, contains, empty, equal_to,
- has_entry, raises )
- from mock import MagicMock, call, patch
- from ycmd.utils import ToBytes
- import os
- import json
- @patch( 'vim.eval', new_callable = ExtendedMock )
- def SetLocationListsForBuffer_Current_test( vim_eval ):
- diagnostics = [ {
- 'bufnr': 3,
- 'filename': 'some_filename',
- 'lnum': 5,
- 'col': 22,
- 'type': 'E',
- 'valid': 1
- } ]
- current_buffer = VimBuffer( '/test', number = 3 )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
- vimsupport.SetLocationListsForBuffer( 3, diagnostics )
- vim_eval.assert_has_exact_calls( [
- call( 'setloclist( 1, {0} )'.format( json.dumps( diagnostics ) ) )
- ] )
- @patch( 'vim.eval', new_callable = ExtendedMock )
- def SetLocationListsForBuffer_NotCurrent_test( vim_eval ):
- diagnostics = [ {
- 'bufnr': 3,
- 'filename': 'some_filename',
- 'lnum': 5,
- 'col': 22,
- 'type': 'E',
- 'valid': 1
- } ]
- current_buffer = VimBuffer( '/test', number = 3 )
- other_buffer = VimBuffer( '/notcurrent', number = 1 )
- with MockVimBuffers( [ current_buffer, other_buffer ], [ current_buffer ] ):
- vimsupport.SetLocationListsForBuffer( 1, diagnostics )
- vim_eval.assert_not_called()
- @patch( 'vim.eval', new_callable = ExtendedMock, side_effect = [ -1, 1 ] )
- def SetLocationListsForBuffer_NotVisible_test( vim_eval ):
- diagnostics = [ {
- 'bufnr': 3,
- 'filename': 'some_filename',
- 'lnum': 5,
- 'col': 22,
- 'type': 'E',
- 'valid': 1
- } ]
- current_buffer = VimBuffer( '/test', number = 3 )
- other_buffer = VimBuffer( '/notcurrent', number = 1 )
- with MockVimBuffers( [ current_buffer, other_buffer ], [ current_buffer ] ):
- vimsupport.SetLocationListsForBuffer( 1, diagnostics )
- vim_eval.assert_not_called()
- @patch( 'vim.eval', new_callable = ExtendedMock, side_effect = [ -1, 1 ] )
- def SetLocationListsForBuffer_MultipleWindows_test( vim_eval ):
- diagnostics = [ {
- 'bufnr': 3,
- 'filename': 'some_filename',
- 'lnum': 5,
- 'col': 22,
- 'type': 'E',
- 'valid': 1
- } ]
- current_buffer = VimBuffer( '/test', number = 3 )
- other_buffer = VimBuffer( '/notcurrent', number = 1 )
- with MockVimBuffers( [ current_buffer, other_buffer ],
- [ current_buffer, other_buffer ] ):
- vimsupport.SetLocationListsForBuffer( 1, diagnostics )
- vim_eval.assert_has_exact_calls( [
- call( 'setloclist( 2, {0} )'.format( json.dumps( diagnostics ) ) )
- ] )
- @patch( 'vim.eval', new_callable = ExtendedMock )
- def SetLocationList_test( vim_eval ):
- diagnostics = [ {
- 'bufnr': 3,
- 'filename': 'some_filename',
- 'lnum': 5,
- 'col': 22,
- 'type': 'E',
- 'valid': 1
- } ]
- current_buffer = VimBuffer( '/test', number = 3 )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ], ( 1, 1 ) ):
- vimsupport.SetLocationList( diagnostics )
- vim_eval.assert_has_calls( [
- call( 'setloclist( 0, {0} )'.format( json.dumps( diagnostics ) ) ),
- ] )
- @patch( 'vim.eval', new_callable = ExtendedMock )
- def SetLocationList_NotCurrent_test( vim_eval ):
- diagnostics = [ {
- 'bufnr': 3,
- 'filename': 'some_filename',
- 'lnum': 5,
- 'col': 22,
- 'type': 'E',
- 'valid': 1
- } ]
- current_buffer = VimBuffer( '/test', number = 3 )
- other_buffer = VimBuffer( '/notcurrent', number = 1 )
- with MockVimBuffers( [ current_buffer, other_buffer ],
- [ current_buffer, other_buffer ],
- ( 1, 1 ) ):
- vimsupport.SetLocationList( diagnostics )
- # This version does not check the current buffer and just sets the current win
- vim_eval.assert_has_exact_calls( [
- call( 'setloclist( 0, {0} )'.format( json.dumps( diagnostics ) ) ),
- ] )
- @patch( 'ycm.vimsupport.VariableExists', return_value = True )
- @patch( 'ycm.vimsupport.SetFittingHeightForCurrentWindow' )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def OpenLocationList_test( vim_command, fitting_height, variable_exists ):
- vimsupport.OpenLocationList( focus = False, autoclose = True )
- vim_command.assert_has_exact_calls( [
- call( 'lopen' ),
- call( 'augroup ycmlocation' ),
- call( 'autocmd! * <buffer>' ),
- call( 'autocmd WinLeave <buffer> '
- 'if bufnr( "%" ) == expand( "<abuf>" ) | q | endif '
- '| autocmd! ycmlocation' ),
- call( 'augroup END' ),
- call( 'doautocmd User YcmLocationOpened' ),
- call( 'silent! wincmd p' )
- ] )
- fitting_height.assert_called_once_with()
- variable_exists.assert_called_once_with( '#User#YcmLocationOpened' )
- @patch( 'vim.command' )
- def SetFittingHeightForCurrentWindow_LineWrapOn_test( vim_command, *args ):
- # Create a two lines buffer whose first line is longer than the window width.
- current_buffer = VimBuffer( 'buffer',
- contents = [ 'a' * 140, 'b' * 80 ] )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ] ) as vim:
- vim.current.window.width = 120
- vim.current.window.options[ 'wrap' ] = True
- vimsupport.SetFittingHeightForCurrentWindow()
- vim_command.assert_called_once_with( '3wincmd _' )
- @patch( 'vim.command' )
- def SetFittingHeightForCurrentWindow_LineWrapOff_test( vim_command, *args ):
- # Create a two lines buffer whose first line is longer than the window width.
- current_buffer = VimBuffer( 'buffer',
- contents = [ 'a' * 140, 'b' * 80 ] )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ] ) as vim:
- vim.current.window.width = 120
- vim.current.window.options[ 'wrap' ] = False
- vimsupport.SetFittingHeightForCurrentWindow()
- vim_command.assert_called_once_with( '2wincmd _' )
- def AssertBuffersAreEqualAsBytes( result_buffer, expected_buffer ):
- eq_( len( result_buffer ), len( expected_buffer ) )
- for result_line, expected_line in zip( result_buffer, expected_buffer ):
- eq_( ToBytes( result_line ), ToBytes( expected_line ) )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleLine_Repl_1_test():
- # Replace with longer range
- result_buffer = VimBuffer( 'buffer', contents = [ 'This is a string' ] )
- start, end = _BuildLocations( 1, 11, 1, 17 )
- vimsupport.ReplaceChunk( start, end, 'pie', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'This is a pie' ], result_buffer )
- # and replace again
- start, end = _BuildLocations( 1, 10, 1, 11 )
- vimsupport.ReplaceChunk( start, end, ' piece of ', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'This is a piece of pie' ], result_buffer )
- # and once more, for luck
- start, end = _BuildLocations( 1, 1, 1, 5 )
- vimsupport.ReplaceChunk( start, end, 'How long', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'How long is a piece of pie' ],
- result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleLine_Repl_2_test():
- # Replace with shorter range
- result_buffer = VimBuffer( 'buffer', contents = [ 'This is a string' ] )
- start, end = _BuildLocations( 1, 11, 1, 17 )
- vimsupport.ReplaceChunk( start, end, 'test', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'This is a test' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleLine_Repl_3_test():
- # Replace with equal range
- result_buffer = VimBuffer( 'buffer', contents = [ 'This is a string' ] )
- start, end = _BuildLocations( 1, 6, 1, 8 )
- vimsupport.ReplaceChunk( start, end, 'be', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'This be a string' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleLine_Add_1_test():
- # Insert at start
- result_buffer = VimBuffer( 'buffer', contents = [ 'is a string' ] )
- start, end = _BuildLocations( 1, 1, 1, 1 )
- vimsupport.ReplaceChunk( start, end, 'This ', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'This is a string' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleLine_Add_2_test():
- # Insert at end
- result_buffer = VimBuffer( 'buffer', contents = [ 'This is a ' ] )
- start, end = _BuildLocations( 1, 11, 1, 11 )
- vimsupport.ReplaceChunk( start, end, 'string', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'This is a string' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleLine_Add_3_test():
- # Insert in the middle
- result_buffer = VimBuffer( 'buffer', contents = [ 'This is a string' ] )
- start, end = _BuildLocations( 1, 8, 1, 8 )
- vimsupport.ReplaceChunk( start, end, ' not', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'This is not a string' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleLine_Del_1_test():
- # Delete from start
- result_buffer = VimBuffer( 'buffer', contents = [ 'This is a string' ] )
- start, end = _BuildLocations( 1, 1, 1, 6 )
- vimsupport.ReplaceChunk( start, end, '', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'is a string' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleLine_Del_2_test():
- # Delete from end
- result_buffer = VimBuffer( 'buffer', contents = [ 'This is a string' ] )
- start, end = _BuildLocations( 1, 10, 1, 18 )
- vimsupport.ReplaceChunk( start, end, '', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'This is a' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleLine_Del_3_test():
- # Delete from middle
- result_buffer = VimBuffer( 'buffer', contents = [ 'This is not a string' ] )
- start, end = _BuildLocations( 1, 9, 1, 13 )
- vimsupport.ReplaceChunk( start, end, '', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'This is a string' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleLine_Unicode_ReplaceUnicodeChars_test():
- # Replace Unicode characters.
- result_buffer = VimBuffer(
- 'buffer', contents = [ 'This Uniçø∂‰ string is in the middle' ] )
- start, end = _BuildLocations( 1, 6, 1, 20 )
- vimsupport.ReplaceChunk( start, end, 'Unicode ', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'This Unicode string is in the middle' ],
- result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleLine_Unicode_ReplaceAfterUnicode_test():
- # Replace ASCII characters after Unicode characters in the line.
- result_buffer = VimBuffer(
- 'buffer', contents = [ 'This Uniçø∂‰ string is in the middle' ] )
- start, end = _BuildLocations( 1, 30, 1, 43 )
- vimsupport.ReplaceChunk( start, end, 'fåke', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'This Uniçø∂‰ string is fåke' ],
- result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleLine_Unicode_Grown_test():
- # Replace ASCII characters after Unicode characters in the line.
- result_buffer = VimBuffer( 'buffer', contents = [ 'a' ] )
- start, end = _BuildLocations( 1, 1, 1, 2 )
- vimsupport.ReplaceChunk( start, end, 'å', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'å' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_RemoveSingleLine_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCa' ] )
- start, end = _BuildLocations( 2, 1, 3, 1 )
- vimsupport.ReplaceChunk( start, end, '', result_buffer )
- # First line is not affected.
- AssertBuffersAreEqualAsBytes( [ 'aAa',
- 'aCa' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleToMultipleLines_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCa' ] )
- start, end = _BuildLocations( 2, 3, 2, 4 )
- vimsupport.ReplaceChunk( start, end, 'cccc', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aAa',
- 'aBcccc',
- 'aCa' ], result_buffer )
- # now make another change to the second line
- start, end = _BuildLocations( 2, 2, 2, 2 )
- vimsupport.ReplaceChunk( start, end, 'Eb\nbF', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aAa',
- 'aEb',
- 'bFBcccc',
- 'aCa' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleToMultipleLines2_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCa' ] )
- start, end = _BuildLocations( 2, 2, 2, 2 )
- vimsupport.ReplaceChunk( start, end, 'Eb\nbFb\nG', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aAa',
- 'aEb',
- 'bFb',
- 'GBa',
- 'aCa' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleToMultipleLines3_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCa' ] )
- start, end = _BuildLocations( 2, 2, 2, 2 )
- vimsupport.ReplaceChunk( start, end, 'Eb\nbFb\nbGb', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aAa',
- 'aEb',
- 'bFb',
- 'bGbBa',
- 'aCa' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleToMultipleLinesReplace_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCa' ] )
- start, end = _BuildLocations( 1, 2, 1, 4 )
- vimsupport.ReplaceChunk( start, end, 'Eb\nbFb\nbGb', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aEb',
- 'bFb',
- 'bGb',
- 'aBa',
- 'aCa' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SingleToMultipleLinesReplace_2_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCa' ] )
- start, end = _BuildLocations( 1, 4, 1, 4 )
- vimsupport.ReplaceChunk( start, end, 'cccc', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aAacccc',
- 'aBa',
- 'aCa', ], result_buffer )
- # now do a subsequent change (insert in the middle of the first line)
- start, end = _BuildLocations( 1, 2, 1, 4 )
- vimsupport.ReplaceChunk( start, end, 'Eb\nbFb\nbGb', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aEb',
- 'bFb',
- 'bGbcccc',
- 'aBa',
- 'aCa' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_MultipleLinesToSingleLine_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCaaaa' ] )
- start, end = _BuildLocations( 3, 4, 3, 5 )
- vimsupport.ReplaceChunk( start, end, 'dd\ndd', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aAa',
- 'aBa',
- 'aCadd',
- 'ddaa' ], result_buffer )
- # make another modification applying offsets
- start, end = _BuildLocations( 3, 3, 3, 4 )
- vimsupport.ReplaceChunk( start, end, 'cccc', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aAa',
- 'aBa',
- 'aCccccdd',
- 'ddaa' ], result_buffer )
- # and another, for luck
- start, end = _BuildLocations( 2, 2, 3, 2 )
- vimsupport.ReplaceChunk( start, end, 'E', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aAa',
- 'aECccccdd',
- 'ddaa' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_MultipleLinesToSameMultipleLines_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCa',
- 'aDe' ] )
- start, end = _BuildLocations( 2, 2, 3, 2 )
- vimsupport.ReplaceChunk( start, end, 'Eb\nbF', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aAa',
- 'aEb',
- 'bFCa',
- 'aDe' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_MultipleLinesToMoreMultipleLines_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCa',
- 'aDe' ] )
- start, end = _BuildLocations( 2, 2, 3, 2 )
- vimsupport.ReplaceChunk( start, end, 'Eb\nbFb\nbG', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aAa',
- 'aEb',
- 'bFb',
- 'bGCa',
- 'aDe' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_MultipleLinesToLessMultipleLines_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCa',
- 'aDe' ] )
- start, end = _BuildLocations( 1, 2, 3, 2 )
- vimsupport.ReplaceChunk( start, end, 'Eb\nbF', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aEb',
- 'bFCa',
- 'aDe' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_MultipleLinesToEvenLessMultipleLines_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCa',
- 'aDe' ] )
- start, end = _BuildLocations( 1, 2, 4, 2 )
- vimsupport.ReplaceChunk( start, end, 'Eb\nbF', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aEb',
- 'bFDe' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_SpanBufferEdge_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCa' ] )
- start, end = _BuildLocations( 1, 1, 1, 3 )
- vimsupport.ReplaceChunk( start, end, 'bDb', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'bDba',
- 'aBa',
- 'aCa' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_DeleteTextInLine_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCa' ] )
- start, end = _BuildLocations( 2, 2, 2, 3 )
- vimsupport.ReplaceChunk( start, end, '', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aAa',
- 'aa',
- 'aCa' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_AddTextInLine_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCa' ] )
- start, end = _BuildLocations( 2, 2, 2, 2 )
- vimsupport.ReplaceChunk( start, end, 'bDb', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aAa',
- 'abDbBa',
- 'aCa' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_ReplaceTextInLine_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'aAa',
- 'aBa',
- 'aCa' ] )
- start, end = _BuildLocations( 2, 2, 2, 3 )
- vimsupport.ReplaceChunk( start, end, 'bDb', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'aAa',
- 'abDba',
- 'aCa' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_NewlineChunk_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'first line',
- 'second line' ] )
- start, end = _BuildLocations( 1, 11, 2, 1 )
- vimsupport.ReplaceChunk( start, end, '\n', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'first line',
- 'second line' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunk_BeyondEndOfFile_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'first line',
- 'second line' ] )
- start, end = _BuildLocations( 1, 11, 3, 1 )
- vimsupport.ReplaceChunk( start, end, '\n', result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'first line' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 3 ) )
- def ReplaceChunk_CursorPosition_test():
- result_buffer = VimBuffer( 'buffer', contents = [ 'bar' ] )
- start, end = _BuildLocations( 1, 1, 1, 1 )
- vimsupport.ReplaceChunk( start,
- end,
- 'xyz\nfoo',
- result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'xyz', 'foobar' ], result_buffer )
- # Cursor line is 0-based.
- assert_that( vimsupport.CurrentLineAndColumn(), contains( 1, 6 ) )
- def _BuildLocations( start_line, start_column, end_line, end_column ):
- return {
- 'line_num' : start_line,
- 'column_num': start_column,
- }, {
- 'line_num' : end_line,
- 'column_num': end_column,
- }
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunksInBuffer_SortedChunks_test():
- chunks = [
- _BuildChunk( 1, 4, 1, 4, '(' ),
- _BuildChunk( 1, 11, 1, 11, ')' )
- ]
- result_buffer = VimBuffer( 'buffer', contents = [ 'CT<10 >> 2> ct' ] )
- vimsupport.ReplaceChunksInBuffer( chunks, result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'CT<(10 >> 2)> ct' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunksInBuffer_UnsortedChunks_test():
- chunks = [
- _BuildChunk( 1, 11, 1, 11, ')' ),
- _BuildChunk( 1, 4, 1, 4, '(' )
- ]
- result_buffer = VimBuffer( 'buffer', contents = [ 'CT<10 >> 2> ct' ] )
- vimsupport.ReplaceChunksInBuffer( chunks, result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'CT<(10 >> 2)> ct' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunksInBuffer_LineOverlappingChunks_test():
- chunks = [
- _BuildChunk( 1, 11, 2, 1, '\n ' ),
- _BuildChunk( 2, 12, 3, 1, '\n ' ),
- _BuildChunk( 3, 11, 4, 1, '\n ' )
- ]
- result_buffer = VimBuffer( 'buffer', contents = [ 'first line',
- 'second line',
- 'third line',
- 'fourth line' ] )
- vimsupport.ReplaceChunksInBuffer( chunks, result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'first line',
- ' second line',
- ' third line',
- ' fourth line' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunksInBuffer_OutdentChunks_test():
- chunks = [
- _BuildChunk( 1, 1, 1, 5, ' ' ),
- _BuildChunk( 1, 15, 2, 9, '\n ' ),
- _BuildChunk( 2, 20, 3, 3, '\n' )
- ]
- result_buffer = VimBuffer( 'buffer', contents = [ ' first line',
- ' second line',
- ' third line' ] )
- vimsupport.ReplaceChunksInBuffer( chunks, result_buffer )
- AssertBuffersAreEqualAsBytes( [ ' first line',
- ' second line',
- ' third line' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunksInBuffer_OneLineIndentingChunks_test():
- chunks = [
- _BuildChunk( 1, 8, 2, 1, '\n ' ),
- _BuildChunk( 2, 9, 2, 10, '\n ' ),
- _BuildChunk( 2, 19, 2, 20, '\n ' )
- ]
- result_buffer = VimBuffer( 'buffer', contents = [ 'class {',
- 'method { statement }',
- '}' ] )
- vimsupport.ReplaceChunksInBuffer( chunks, result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'class {',
- ' method {',
- ' statement',
- ' }',
- '}' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- def ReplaceChunksInBuffer_SameLocation_test():
- chunks = [
- _BuildChunk( 1, 1, 1, 1, 'this ' ),
- _BuildChunk( 1, 1, 1, 1, 'is ' ),
- _BuildChunk( 1, 1, 1, 1, 'pure ' )
- ]
- result_buffer = VimBuffer( 'buffer', contents = [ 'folly' ] )
- vimsupport.ReplaceChunksInBuffer( chunks, result_buffer )
- AssertBuffersAreEqualAsBytes( [ 'this is pure folly' ], result_buffer )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- @patch( 'ycm.vimsupport.VariableExists', return_value = False )
- @patch( 'ycm.vimsupport.SetFittingHeightForCurrentWindow' )
- @patch( 'ycm.vimsupport.GetBufferNumberForFilename',
- return_value = 1,
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.BufferIsVisible',
- return_value = True,
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.OpenFilename' )
- @patch( 'ycm.vimsupport.PostVimMessage', new_callable = ExtendedMock )
- @patch( 'vim.eval', new_callable = ExtendedMock )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def ReplaceChunks_SingleFile_Open_test( vim_command,
- vim_eval,
- post_vim_message,
- open_filename,
- buffer_is_visible,
- get_buffer_number_for_filename,
- set_fitting_height,
- variable_exists ):
- single_buffer_name = os.path.realpath( 'single_file' )
- chunks = [
- _BuildChunk( 1, 1, 2, 1, 'replacement', single_buffer_name )
- ]
- result_buffer = VimBuffer(
- single_buffer_name,
- contents = [
- 'line1',
- 'line2',
- 'line3'
- ]
- )
- with patch( 'vim.buffers', [ None, result_buffer, None ] ):
- vimsupport.ReplaceChunks( chunks )
- # Ensure that we applied the replacement correctly
- eq_( result_buffer.GetLines(), [
- 'replacementline2',
- 'line3',
- ] )
- # GetBufferNumberForFilename is called twice:
- # - once to the check if we would require opening the file (so that we can
- # raise a warning)
- # - once whilst applying the changes
- get_buffer_number_for_filename.assert_has_exact_calls( [
- call( single_buffer_name ),
- call( single_buffer_name ),
- ] )
- # BufferIsVisible is called twice for the same reasons as above
- buffer_is_visible.assert_has_exact_calls( [
- call( 1 ),
- call( 1 ),
- ] )
- # we don't attempt to open any files
- open_filename.assert_not_called()
- # But we do set the quickfix list
- vim_eval.assert_has_exact_calls( [
- call( 'setqflist( {0} )'.format( json.dumps( [ {
- 'bufnr': 1,
- 'filename': single_buffer_name,
- 'lnum': 1,
- 'col': 1,
- 'text': 'replacement',
- 'type': 'F'
- } ] ) ) ),
- ] )
- # And it is ReplaceChunks that prints the message showing the number of
- # changes
- post_vim_message.assert_has_exact_calls( [
- call( 'Applied 1 changes', warning = False ),
- ] )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- @patch( 'ycm.vimsupport.VariableExists', return_value = False )
- @patch( 'ycm.vimsupport.SetFittingHeightForCurrentWindow' )
- @patch( 'ycm.vimsupport.GetBufferNumberForFilename',
- side_effect = [ -1, -1, 1 ],
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.BufferIsVisible',
- side_effect = [ False, False, True ],
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.OpenFilename',
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.PostVimMessage', new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.Confirm',
- return_value = True,
- new_callable = ExtendedMock )
- @patch( 'vim.eval', return_value = 10, new_callable = ExtendedMock )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def ReplaceChunks_SingleFile_NotOpen_test( vim_command,
- vim_eval,
- confirm,
- post_vim_message,
- open_filename,
- buffer_is_visible,
- get_buffer_number_for_filename,
- set_fitting_height,
- variable_exists ):
- single_buffer_name = os.path.realpath( 'single_file' )
- chunks = [
- _BuildChunk( 1, 1, 2, 1, 'replacement', single_buffer_name )
- ]
- result_buffer = VimBuffer(
- single_buffer_name,
- contents = [
- 'line1',
- 'line2',
- 'line3'
- ]
- )
- with patch( 'vim.buffers', [ None, result_buffer, None ] ):
- vimsupport.ReplaceChunks( chunks )
- # We checked if it was OK to open the file
- confirm.assert_has_exact_calls( [
- call( vimsupport.FIXIT_OPENING_BUFFERS_MESSAGE_FORMAT.format( 1 ) )
- ] )
- # Ensure that we applied the replacement correctly
- eq_( result_buffer.GetLines(), [
- 'replacementline2',
- 'line3',
- ] )
- # GetBufferNumberForFilename is called 3 times. The return values are set in
- # the @patch call above:
- # - once to the check if we would require opening the file (so that we can
- # raise a warning) (-1 return)
- # - once whilst applying the changes (-1 return)
- # - finally after calling OpenFilename (1 return)
- get_buffer_number_for_filename.assert_has_exact_calls( [
- call( single_buffer_name ),
- call( single_buffer_name ),
- call( single_buffer_name ),
- ] )
- # BufferIsVisible is called 3 times for the same reasons as above, with the
- # return of each one
- buffer_is_visible.assert_has_exact_calls( [
- call( -1 ),
- call( -1 ),
- call( 1 ),
- ] )
- # We open 'single_file' as expected.
- open_filename.assert_called_with( single_buffer_name, {
- 'focus': True,
- 'fix': True,
- 'size': 10
- } )
- # And close it again, then show the quickfix window.
- vim_command.assert_has_exact_calls( [
- call( 'lclose' ),
- call( 'hide' ),
- ] )
- # And update the quickfix list
- vim_eval.assert_has_exact_calls( [
- call( '&previewheight' ),
- call( 'setqflist( {0} )'.format( json.dumps( [ {
- 'bufnr': 1,
- 'filename': single_buffer_name,
- 'lnum': 1,
- 'col': 1,
- 'text': 'replacement',
- 'type': 'F'
- } ] ) ) ),
- ] )
- # And it is ReplaceChunks that prints the message showing the number of
- # changes
- post_vim_message.assert_has_exact_calls( [
- call( 'Applied 1 changes', warning = False ),
- ] )
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- @patch( 'ycm.vimsupport.VariableExists', return_value = False )
- @patch( 'ycm.vimsupport.SetFittingHeightForCurrentWindow' )
- @patch( 'ycm.vimsupport.GetBufferNumberForFilename',
- side_effect = [ -1, 1 ],
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.BufferIsVisible',
- side_effect = [ False, True ],
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.OpenFilename',
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.PostVimMessage', new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.Confirm',
- return_value = True,
- new_callable = ExtendedMock )
- @patch( 'vim.eval', return_value = 10, new_callable = ExtendedMock )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def ReplaceChunks_SingleFile_NotOpen_Silent_test(
- vim_command,
- vim_eval,
- confirm,
- post_vim_message,
- open_filename,
- buffer_is_visible,
- get_buffer_number_for_filename,
- set_fitting_height,
- variable_exists ):
- # This test is the same as ReplaceChunks_SingleFile_NotOpen_test, but we pass
- # the silent flag, as used by post-complete actions, and shows the stuff we
- # _don't_ call in that case.
- single_buffer_name = os.path.realpath( 'single_file' )
- chunks = [
- _BuildChunk( 1, 1, 2, 1, 'replacement', single_buffer_name )
- ]
- result_buffer = VimBuffer(
- single_buffer_name,
- contents = [
- 'line1',
- 'line2',
- 'line3'
- ]
- )
- with patch( 'vim.buffers', [ None, result_buffer, None ] ):
- vimsupport.ReplaceChunks( chunks, silent=True )
- # We didn't check if it was OK to open the file (silent)
- confirm.assert_not_called()
- # Ensure that we applied the replacement correctly
- eq_( result_buffer.GetLines(), [
- 'replacementline2',
- 'line3',
- ] )
- # GetBufferNumberForFilename is called 2 times. The return values are set in
- # the @patch call above:
- # - once whilst applying the changes (-1 return)
- # - finally after calling OpenFilename (1 return)
- get_buffer_number_for_filename.assert_has_exact_calls( [
- call( single_buffer_name ),
- call( single_buffer_name ),
- ] )
- # BufferIsVisible is called 2 times for the same reasons as above, with the
- # return of each one
- buffer_is_visible.assert_has_exact_calls( [
- call( -1 ),
- call( 1 ),
- ] )
- # We open 'single_file' as expected.
- open_filename.assert_called_with( single_buffer_name, {
- 'focus': True,
- 'fix': True,
- 'size': 10
- } )
- # And close it again, but don't show the quickfix window
- vim_command.assert_has_exact_calls( [
- call( 'lclose' ),
- call( 'hide' ),
- ] )
- set_fitting_height.assert_not_called()
- # But we _don't_ update the QuickFix list
- vim_eval.assert_has_exact_calls( [
- call( '&previewheight' ),
- ] )
- # And we don't print a message either
- post_vim_message.assert_not_called()
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- @patch( 'ycm.vimsupport.GetBufferNumberForFilename',
- side_effect = [ -1, -1, 1 ],
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.BufferIsVisible',
- side_effect = [ False, False, True ],
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.OpenFilename',
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.PostVimMessage',
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.Confirm',
- return_value = False,
- new_callable = ExtendedMock )
- @patch( 'vim.eval',
- return_value = 10,
- new_callable = ExtendedMock )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def ReplaceChunks_User_Declines_To_Open_File_test(
- vim_command,
- vim_eval,
- confirm,
- post_vim_message,
- open_filename,
- buffer_is_visible,
- get_buffer_number_for_filename ):
- # Same as above, except the user selects Cancel when asked if they should
- # allow us to open lots of (ahem, 1) file.
- single_buffer_name = os.path.realpath( 'single_file' )
- chunks = [
- _BuildChunk( 1, 1, 2, 1, 'replacement', single_buffer_name )
- ]
- result_buffer = VimBuffer(
- single_buffer_name,
- contents = [
- 'line1',
- 'line2',
- 'line3'
- ]
- )
- with patch( 'vim.buffers', [ None, result_buffer, None ] ):
- vimsupport.ReplaceChunks( chunks )
- # We checked if it was OK to open the file
- confirm.assert_has_exact_calls( [
- call( vimsupport.FIXIT_OPENING_BUFFERS_MESSAGE_FORMAT.format( 1 ) )
- ] )
- # Ensure that buffer is not changed
- eq_( result_buffer.GetLines(), [
- 'line1',
- 'line2',
- 'line3',
- ] )
- # GetBufferNumberForFilename is called once. The return values are set in
- # the @patch call above:
- # - once to the check if we would require opening the file (so that we can
- # raise a warning) (-1 return)
- get_buffer_number_for_filename.assert_has_exact_calls( [
- call( single_buffer_name ),
- ] )
- # BufferIsVisible is called once for the above file, which wasn't visible.
- buffer_is_visible.assert_has_exact_calls( [
- call( -1 ),
- ] )
- # We don't attempt to open any files or update any quickfix list or anything
- # like that
- open_filename.assert_not_called()
- vim_eval.assert_not_called()
- vim_command.assert_not_called()
- post_vim_message.assert_not_called()
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- @patch( 'ycm.vimsupport.GetBufferNumberForFilename',
- side_effect = [ -1, -1, 1 ],
- new_callable = ExtendedMock )
- # Key difference is here: In the final check, BufferIsVisible returns False
- @patch( 'ycm.vimsupport.BufferIsVisible',
- side_effect = [ False, False, False ],
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.OpenFilename',
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.PostVimMessage',
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.Confirm',
- return_value = True,
- new_callable = ExtendedMock )
- @patch( 'vim.eval',
- return_value = 10,
- new_callable = ExtendedMock )
- @patch( 'vim.command',
- new_callable = ExtendedMock )
- def ReplaceChunks_User_Aborts_Opening_File_test(
- vim_command,
- vim_eval,
- confirm,
- post_vim_message,
- open_filename,
- buffer_is_visible,
- get_buffer_number_for_filename ):
- # Same as above, except the user selects Abort or Quick during the
- # "swap-file-found" dialog
- single_buffer_name = os.path.realpath( 'single_file' )
- chunks = [
- _BuildChunk( 1, 1, 2, 1, 'replacement', single_buffer_name )
- ]
- result_buffer = VimBuffer(
- single_buffer_name,
- contents = [
- 'line1',
- 'line2',
- 'line3'
- ]
- )
- with patch( 'vim.buffers', [ None, result_buffer, None ] ):
- assert_that( calling( vimsupport.ReplaceChunks ).with_args( chunks ),
- raises( RuntimeError,
- 'Unable to open file: .+single_file\n'
- 'FixIt/Refactor operation aborted prior to completion. '
- 'Your files have not been fully updated. '
- 'Please use undo commands to revert the applied changes.' ) )
- # We checked if it was OK to open the file
- confirm.assert_has_exact_calls( [
- call( vimsupport.FIXIT_OPENING_BUFFERS_MESSAGE_FORMAT.format( 1 ) )
- ] )
- # Ensure that buffer is not changed
- eq_( result_buffer.GetLines(), [
- 'line1',
- 'line2',
- 'line3',
- ] )
- # We tried to open this file
- open_filename.assert_called_with( single_buffer_name, {
- 'focus': True,
- 'fix': True,
- 'size': 10
- } )
- vim_eval.assert_called_with( "&previewheight" )
- # But raised an exception before issuing the message at the end
- post_vim_message.assert_not_called()
- @patch( 'vim.current.window.cursor', ( 1, 1 ) )
- @patch( 'ycm.vimsupport.VariableExists', return_value = False )
- @patch( 'ycm.vimsupport.SetFittingHeightForCurrentWindow' )
- @patch( 'ycm.vimsupport.GetBufferNumberForFilename', side_effect = [
- 22, # first_file (check)
- -1, # second_file (check)
- 22, # first_file (apply)
- -1, # second_file (apply)
- 19, # second_file (check after open)
- ],
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.BufferIsVisible', side_effect = [
- True, # first_file (check)
- False, # second_file (check)
- True, # first_file (apply)
- False, # second_file (apply)
- True, # side_effect (check after open)
- ],
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.OpenFilename',
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.PostVimMessage',
- new_callable = ExtendedMock )
- @patch( 'ycm.vimsupport.Confirm', return_value = True,
- new_callable = ExtendedMock )
- @patch( 'vim.eval', return_value = 10,
- new_callable = ExtendedMock )
- @patch( 'vim.command',
- new_callable = ExtendedMock )
- def ReplaceChunks_MultiFile_Open_test( vim_command,
- vim_eval,
- confirm,
- post_vim_message,
- open_filename,
- buffer_is_visible,
- get_buffer_number_for_filename,
- set_fitting_height,
- variable_exists ):
- # Chunks are split across 2 files, one is already open, one isn't
- first_buffer_name = os.path.realpath( '1_first_file' )
- second_buffer_name = os.path.realpath( '2_second_file' )
- chunks = [
- _BuildChunk( 1, 1, 2, 1, 'first_file_replacement ', first_buffer_name ),
- _BuildChunk( 2, 1, 2, 1, 'second_file_replacement ', second_buffer_name ),
- ]
- first_file = VimBuffer(
- first_buffer_name,
- number = 22,
- contents = [
- 'line1',
- 'line2',
- 'line3',
- ]
- )
- second_file = VimBuffer(
- second_buffer_name,
- number = 19,
- contents = [
- 'another line1',
- 'ACME line2',
- ]
- )
- vim_buffers = [ None ] * 23
- vim_buffers[ 22 ] = first_file
- vim_buffers[ 19 ] = second_file
- with patch( 'vim.buffers', vim_buffers ):
- vimsupport.ReplaceChunks( chunks )
- # We checked for the right file names
- get_buffer_number_for_filename.assert_has_exact_calls( [
- call( first_buffer_name ),
- call( second_buffer_name ),
- call( first_buffer_name ),
- call( second_buffer_name ),
- call( second_buffer_name ),
- ] )
- # We checked if it was OK to open the file
- confirm.assert_has_exact_calls( [
- call( vimsupport.FIXIT_OPENING_BUFFERS_MESSAGE_FORMAT.format( 1 ) )
- ] )
- # Ensure that buffers are updated
- eq_( second_file.GetLines(), [
- 'another line1',
- 'second_file_replacement ACME line2',
- ] )
- eq_( first_file.GetLines(), [
- 'first_file_replacement line2',
- 'line3',
- ] )
- # We open '2_second_file' as expected.
- open_filename.assert_called_with( second_buffer_name, {
- 'focus': True,
- 'fix': True,
- 'size': 10
- } )
- # And close it again, then show the quickfix window.
- vim_command.assert_has_exact_calls( [
- call( 'lclose' ),
- call( 'hide' ),
- ] )
- # And update the quickfix list with each entry
- vim_eval.assert_has_exact_calls( [
- call( '&previewheight' ),
- call( 'setqflist( {0} )'.format( json.dumps( [ {
- 'bufnr': 22,
- 'filename': first_buffer_name,
- 'lnum': 1,
- 'col': 1,
- 'text': 'first_file_replacement ',
- 'type': 'F'
- }, {
- 'bufnr': 19,
- 'filename': second_buffer_name,
- 'lnum': 2,
- 'col': 1,
- 'text': 'second_file_replacement ',
- 'type': 'F'
- } ] ) ) ),
- ] )
- # And it is ReplaceChunks that prints the message showing the number of
- # changes
- post_vim_message.assert_has_exact_calls( [
- call( 'Applied 2 changes', warning = False ),
- ] )
- def _BuildChunk( start_line,
- start_column,
- end_line,
- end_column,
- replacement_text, filepath='test_file_name' ):
- return {
- 'range': {
- 'start': {
- 'filepath': filepath,
- 'line_num': start_line,
- 'column_num': start_column,
- },
- 'end': {
- 'filepath': filepath,
- 'line_num': end_line,
- 'column_num': end_column,
- },
- },
- 'replacement_text': replacement_text
- }
- def GetDiagnosticMatchPattern_ErrorInMiddleOfLine_test():
- current_buffer = VimBuffer(
- 'some_file',
- contents = [ 'Highlight this error please' ]
- )
- with patch( 'vim.current.buffer', current_buffer ):
- assert_that(
- vimsupport.GetDiagnosticMatchPattern( 1, 16, 1, 21 ),
- equal_to( '\\%1l\\%16c\\_.\\{-}\\%1l\\%21c' )
- )
- def AddDiagnosticSyntaxMatch_WarningAtEndOfLine_test():
- current_buffer = VimBuffer(
- 'some_file',
- contents = [ 'Highlight this warning' ]
- )
- with patch( 'vim.current.buffer', current_buffer ):
- assert_that(
- vimsupport.GetDiagnosticMatchPattern( 1, 16, 1, 23 ),
- equal_to( '\\%1l\\%16c\\_.\\{-}\\%1l\\%23c' )
- )
- def AddDiagnosticSyntaxMatch_UnicodeAtEndOfLine_test():
- current_buffer = VimBuffer(
- 'some_file',
- contents = [ 'Highlight unicøde' ]
- )
- with patch( 'vim.current.buffer', current_buffer ):
- assert_that(
- vimsupport.GetDiagnosticMatchPattern( 1, 16, 1, 19 ),
- equal_to( '\\%1l\\%16c\\_.\\{-}\\%1l\\%19c' )
- )
- def AddDiagnosticSyntaxMatch_NonPositivePosition_test():
- current_buffer = VimBuffer(
- 'some_file',
- contents = [ 'Some contents' ]
- )
- with patch( 'vim.current.buffer', current_buffer ):
- assert_that(
- vimsupport.GetDiagnosticMatchPattern( 0, 0, 0, 0 ),
- equal_to( '\\%1l\\%1c\\_.\\{-}\\%1l\\%1c' )
- )
- assert_that(
- vimsupport.GetDiagnosticMatchPattern( -1, -2, -3, -4 ),
- equal_to( '\\%1l\\%1c\\_.\\{-}\\%1l\\%1c' )
- )
- @patch( 'vim.command', new_callable=ExtendedMock )
- @patch( 'vim.current', new_callable=ExtendedMock )
- def WriteToPreviewWindow_test( vim_current, vim_command ):
- vim_current.window.options.__getitem__ = MagicMock( return_value = True )
- vimsupport.WriteToPreviewWindow( "test" )
- vim_command.assert_has_exact_calls( [
- call( 'silent! pclose!' ),
- call( 'silent! pedit! _TEMP_FILE_' ),
- call( 'silent! wincmd P' ),
- call( 'silent! wincmd p' ) ] )
- vim_current.buffer.__setitem__.assert_called_with(
- slice( None, None, None ), [ 'test' ] )
- vim_current.buffer.options.__setitem__.assert_has_exact_calls( [
- call( 'modifiable', True ),
- call( 'readonly', False ),
- call( 'buftype', 'nofile' ),
- call( 'bufhidden', 'wipe' ),
- call( 'buflisted', False ),
- call( 'swapfile', False ),
- call( 'modifiable', False ),
- call( 'modified', False ),
- call( 'readonly', True ),
- ], any_order = True )
- @patch( 'vim.current' )
- def WriteToPreviewWindow_MultiLine_test( vim_current ):
- vim_current.window.options.__getitem__ = MagicMock( return_value = True )
- vimsupport.WriteToPreviewWindow( "test\ntest2" )
- vim_current.buffer.__setitem__.assert_called_with(
- slice( None, None, None ), [ 'test', 'test2' ] )
- @patch( 'vim.command', new_callable=ExtendedMock )
- @patch( 'vim.current', new_callable=ExtendedMock )
- def WriteToPreviewWindow_JumpFail_test( vim_current, vim_command ):
- vim_current.window.options.__getitem__ = MagicMock( return_value = False )
- vimsupport.WriteToPreviewWindow( "test" )
- vim_command.assert_has_exact_calls( [
- call( 'silent! pclose!' ),
- call( 'silent! pedit! _TEMP_FILE_' ),
- call( 'silent! wincmd P' ),
- call( 'redraw' ),
- call( "echo 'test'" ),
- ] )
- vim_current.buffer.__setitem__.assert_not_called()
- vim_current.buffer.options.__setitem__.assert_not_called()
- @patch( 'vim.command', new_callable=ExtendedMock )
- @patch( 'vim.current', new_callable=ExtendedMock )
- def WriteToPreviewWindow_JumpFail_MultiLine_test( vim_current, vim_command ):
- vim_current.window.options.__getitem__ = MagicMock( return_value = False )
- vimsupport.WriteToPreviewWindow( "test\ntest2" )
- vim_command.assert_has_exact_calls( [
- call( 'silent! pclose!' ),
- call( 'silent! pedit! _TEMP_FILE_' ),
- call( 'silent! wincmd P' ),
- call( 'redraw' ),
- call( "echo 'test'" ),
- call( "echo 'test2'" ),
- ] )
- vim_current.buffer.__setitem__.assert_not_called()
- vim_current.buffer.options.__setitem__.assert_not_called()
- def BufferIsVisibleForFilename_test():
- visible_buffer = VimBuffer( 'visible_filename', number = 1 )
- hidden_buffer = VimBuffer( 'hidden_filename', number = 2 )
- with MockVimBuffers( [ visible_buffer, hidden_buffer ], [ visible_buffer ] ):
- eq_( vimsupport.BufferIsVisibleForFilename( 'visible_filename' ), True )
- eq_( vimsupport.BufferIsVisibleForFilename( 'hidden_filename' ), False )
- eq_( vimsupport.BufferIsVisibleForFilename( 'another_filename' ), False )
- def CloseBuffersForFilename_test():
- current_buffer = VimBuffer( 'some_filename', number = 2 )
- other_buffer = VimBuffer( 'some_filename', number = 5 )
- with MockVimBuffers( [ current_buffer, other_buffer ],
- [ current_buffer ] ) as vim:
- vimsupport.CloseBuffersForFilename( 'some_filename' )
- assert_that( vim.buffers, empty() )
- @patch( 'vim.command', new_callable = ExtendedMock )
- @patch( 'vim.current', new_callable = ExtendedMock )
- def OpenFilename_test( vim_current, vim_command ):
- # Options used to open a logfile.
- options = {
- 'size': vimsupport.GetIntValue( '&previewheight' ),
- 'fix': True,
- 'focus': False,
- 'watch': True,
- 'position': 'end'
- }
- vimsupport.OpenFilename( __file__, options )
- vim_command.assert_has_exact_calls( [
- call( '12split {0}'.format( __file__ ) ),
- call( "exec "
- "'au BufEnter <buffer> :silent! checktime {0}'".format( __file__ ) ),
- call( 'silent! normal! Gzz' ),
- call( 'silent! wincmd p' )
- ] )
- vim_current.buffer.options.__setitem__.assert_has_exact_calls( [
- call( 'autoread', True ),
- ] )
- vim_current.window.options.__setitem__.assert_has_exact_calls( [
- call( 'winfixheight', True )
- ] )
- def GetUnsavedAndSpecifiedBufferData_EncodedUnicodeCharsInBuffers_test():
- filepath = os.path.realpath( 'filename' )
- contents = [ ToBytes( u'abc' ), ToBytes( u'fДa' ) ]
- vim_buffer = VimBuffer( filepath, contents = contents )
- with patch( 'vim.buffers', [ vim_buffer ] ):
- assert_that( vimsupport.GetUnsavedAndSpecifiedBufferData( vim_buffer,
- filepath ),
- has_entry( filepath,
- has_entry( u'contents', u'abc\nfДa\n' ) ) )
- def GetBufferFilepath_NoBufferName_UnicodeWorkingDirectory_test():
- vim_buffer = VimBuffer( '', number = 42 )
- unicode_dir = PathToTestFile( u'uni¢𐍈d€' )
- with CurrentWorkingDirectory( unicode_dir ):
- assert_that( vimsupport.GetBufferFilepath( vim_buffer ),
- equal_to( os.path.join( unicode_dir, '42' ) ) )
- # NOTE: Vim returns byte offsets for columns, not actual character columns. This
- # makes 'ДД' have 4 columns: column 0, column 2 and column 4.
- @patch( 'vim.current.line', ToBytes( 'ДДaa' ) )
- @patch( 'ycm.vimsupport.CurrentColumn', side_effect = [ 4 ] )
- def TextBeforeCursor_EncodedUnicode_test( *args ):
- eq_( vimsupport.TextBeforeCursor(), u'ДД' )
- # NOTE: Vim returns byte offsets for columns, not actual character columns. This
- # makes 'ДД' have 4 columns: column 0, column 2 and column 4.
- @patch( 'vim.current.line', ToBytes( 'aaДД' ) )
- @patch( 'ycm.vimsupport.CurrentColumn', side_effect = [ 2 ] )
- def TextAfterCursor_EncodedUnicode_test( *args ):
- eq_( vimsupport.TextAfterCursor(), u'ДД' )
- @patch( 'vim.current.line', ToBytes( 'fДa' ) )
- def CurrentLineContents_EncodedUnicode_test( *args ):
- eq_( vimsupport.CurrentLineContents(), u'fДa' )
- @patch( 'vim.eval', side_effect = lambda x: x )
- def VimExpressionToPythonType_IntAsUnicode_test( *args ):
- eq_( vimsupport.VimExpressionToPythonType( '123' ), 123 )
- @patch( 'vim.eval', side_effect = lambda x: x )
- def VimExpressionToPythonType_IntAsBytes_test( *args ):
- eq_( vimsupport.VimExpressionToPythonType( ToBytes( '123' ) ), 123 )
- @patch( 'vim.eval', side_effect = lambda x: x )
- def VimExpressionToPythonType_StringAsUnicode_test( *args ):
- eq_( vimsupport.VimExpressionToPythonType( 'foo' ), 'foo' )
- @patch( 'vim.eval', side_effect = lambda x: x )
- def VimExpressionToPythonType_StringAsBytes_test( *args ):
- eq_( vimsupport.VimExpressionToPythonType( ToBytes( 'foo' ) ), 'foo' )
- @patch( 'vim.eval', side_effect = lambda x: x )
- def VimExpressionToPythonType_ListPassthrough_test( *args ):
- eq_( vimsupport.VimExpressionToPythonType( [ 1, 2 ] ), [ 1, 2 ] )
- @patch( 'vim.eval', side_effect = lambda x: x )
- def VimExpressionToPythonType_ObjectPassthrough_test( *args ):
- eq_( vimsupport.VimExpressionToPythonType( { 1: 2 } ), { 1: 2 } )
- @patch( 'vim.eval', side_effect = lambda x: x )
- def VimExpressionToPythonType_GeneratorPassthrough_test( *args ):
- gen = ( x**2 for x in [ 1, 2, 3 ] )
- eq_( vimsupport.VimExpressionToPythonType( gen ), gen )
- @patch( 'vim.eval',
- new_callable = ExtendedMock,
- side_effect = [ None, 2, None ] )
- def SelectFromList_LastItem_test( vim_eval ):
- eq_( vimsupport.SelectFromList( 'test', [ 'a', 'b' ] ),
- 1 )
- vim_eval.assert_has_exact_calls( [
- call( 'inputsave()' ),
- call( 'inputlist( ["test", "1: a", "2: b"] )' ),
- call( 'inputrestore()' )
- ] )
- @patch( 'vim.eval',
- new_callable = ExtendedMock,
- side_effect = [ None, 1, None ] )
- def SelectFromList_FirstItem_test( vim_eval ):
- eq_( vimsupport.SelectFromList( 'test', [ 'a', 'b' ] ),
- 0 )
- vim_eval.assert_has_exact_calls( [
- call( 'inputsave()' ),
- call( 'inputlist( ["test", "1: a", "2: b"] )' ),
- call( 'inputrestore()' )
- ] )
- @patch( 'vim.eval', side_effect = [ None, 3, None ] )
- def SelectFromList_OutOfRange_test( vim_eval ):
- assert_that( calling( vimsupport.SelectFromList ).with_args( 'test',
- [ 'a', 'b' ] ),
- raises( RuntimeError, vimsupport.NO_SELECTION_MADE_MSG ) )
- @patch( 'vim.eval', side_effect = [ None, 0, None ] )
- def SelectFromList_SelectPrompt_test( vim_eval ):
- assert_that( calling( vimsupport.SelectFromList ).with_args( 'test',
- [ 'a', 'b' ] ),
- raises( RuntimeError, vimsupport.NO_SELECTION_MADE_MSG ) )
- @patch( 'vim.eval', side_effect = [ None, -199, None ] )
- def SelectFromList_Negative_test( vim_eval ):
- assert_that( calling( vimsupport.SelectFromList ).with_args( 'test',
- [ 'a', 'b' ] ),
- raises( RuntimeError, vimsupport.NO_SELECTION_MADE_MSG ) )
- def Filetypes_IntegerFiletype_test():
- current_buffer = VimBuffer( 'buffer', number = 1, filetype = '42' )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
- assert_that( vimsupport.CurrentFiletypes(), contains( '42' ) )
- assert_that( vimsupport.GetBufferFiletypes( 1 ), contains( '42' ) )
- assert_that( vimsupport.FiletypesForBuffer( current_buffer ),
- contains( '42' ) )
- @patch( 'ycm.vimsupport.VariableExists', return_value = False )
- @patch( 'ycm.vimsupport.SearchInCurrentBuffer', return_value = 0 )
- @patch( 'vim.current' )
- def InsertNamespace_insert_test( vim_current, *args ):
- contents = [ '',
- 'namespace Taqueria {',
- '',
- ' int taco = Math' ]
- vim_current.buffer = VimBuffer( '', contents = contents )
- vim_current.window.cursor = ( 1, 1 )
- vimsupport.InsertNamespace( 'System' )
- expected_buffer = [ 'using System;',
- '',
- 'namespace Taqueria {',
- '',
- ' int taco = Math' ]
- AssertBuffersAreEqualAsBytes( expected_buffer, vim_current.buffer )
- @patch( 'ycm.vimsupport.VariableExists', return_value = False )
- @patch( 'ycm.vimsupport.SearchInCurrentBuffer', return_value = 2 )
- @patch( 'vim.current' )
- def InsertNamespace_append_test( vim_current, *args ):
- contents = [ 'namespace Taqueria {',
- ' using System;',
- '',
- ' class Tasty {',
- ' int taco;',
- ' List salad = new List' ]
- vim_current.buffer = VimBuffer( '', contents = contents )
- vim_current.window.cursor = ( 1, 1 )
- vimsupport.InsertNamespace( 'System.Collections' )
- expected_buffer = [ 'namespace Taqueria {',
- ' using System;',
- ' using System.Collections;',
- '',
- ' class Tasty {',
- ' int taco;',
- ' List salad = new List' ]
- AssertBuffersAreEqualAsBytes( expected_buffer, vim_current.buffer )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def JumpToLocation_SameFile_SameBuffer_NoSwapFile_test( vim_command ):
- # No 'u' prefix for the current buffer name string to simulate Vim returning
- # bytes on Python 2 but unicode on Python 3.
- current_buffer = VimBuffer( 'uni¢𐍈d€' )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ] ) as vim:
- vimsupport.JumpToLocation( os.path.realpath( u'uni¢𐍈d€' ),
- 2,
- 5,
- 'aboveleft',
- 'same-buffer' )
- assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
- vim_command.assert_has_exact_calls( [
- call( 'normal! m\'' ),
- call( 'normal! zz' )
- ] )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def JumpToLocation_DifferentFile_SameBuffer_Unmodified_test( vim_command ):
- current_buffer = VimBuffer( 'uni¢𐍈d€' )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ] ) as vim:
- target_name = os.path.realpath( u'different_uni¢𐍈d€' )
- vimsupport.JumpToLocation( target_name, 2, 5, 'belowright', 'same-buffer' )
- assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
- vim_command.assert_has_exact_calls( [
- call( 'normal! m\'' ),
- call( u'keepjumps belowright edit {0}'.format( target_name ) ),
- call( 'normal! zz' )
- ] )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def JumpToLocation_DifferentFile_SameBuffer_Modified_CannotHide_test(
- vim_command ):
- current_buffer = VimBuffer( 'uni¢𐍈d€', modified = True )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ] ) as vim:
- target_name = os.path.realpath( u'different_uni¢𐍈d€' )
- vimsupport.JumpToLocation( target_name, 2, 5, 'botright', 'same-buffer' )
- assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
- vim_command.assert_has_exact_calls( [
- call( 'normal! m\'' ),
- call( u'keepjumps botright split {0}'.format( target_name ) ),
- call( 'normal! zz' )
- ] )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def JumpToLocation_DifferentFile_SameBuffer_Modified_CanHide_test(
- vim_command ):
- current_buffer = VimBuffer( 'uni¢𐍈d€', modified = True, bufhidden = "hide" )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ] ) as vim:
- target_name = os.path.realpath( u'different_uni¢𐍈d€' )
- vimsupport.JumpToLocation( target_name, 2, 5, 'leftabove', 'same-buffer' )
- assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
- vim_command.assert_has_exact_calls( [
- call( 'normal! m\'' ),
- call( u'keepjumps leftabove edit {0}'.format( target_name ) ),
- call( 'normal! zz' )
- ] )
- @patch( 'vim.command',
- side_effect = [ None, VimError( 'Unknown code' ), None ] )
- def JumpToLocation_DifferentFile_SameBuffer_SwapFile_Unexpected_test(
- vim_command ):
- current_buffer = VimBuffer( 'uni¢𐍈d€' )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
- assert_that(
- calling( vimsupport.JumpToLocation ).with_args(
- os.path.realpath( u'different_uni¢𐍈d€' ),
- 2,
- 5,
- 'rightbelow',
- 'same-buffer' ),
- raises( VimError, 'Unknown code' )
- )
- @patch( 'vim.command',
- new_callable = ExtendedMock,
- side_effect = [ None, VimError( 'E325' ), None ] )
- def JumpToLocation_DifferentFile_SameBuffer_SwapFile_Quit_test( vim_command ):
- current_buffer = VimBuffer( 'uni¢𐍈d€' )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
- target_name = os.path.realpath( u'different_uni¢𐍈d€' )
- vimsupport.JumpToLocation( target_name, 2, 5, 'topleft', 'same-buffer' )
- vim_command.assert_has_exact_calls( [
- call( 'normal! m\'' ),
- call( u'keepjumps topleft edit {0}'.format( target_name ) )
- ] )
- @patch( 'vim.command',
- new_callable = ExtendedMock,
- side_effect = [ None, KeyboardInterrupt, None ] )
- def JumpToLocation_DifferentFile_SameBuffer_SwapFile_Abort_test( vim_command ):
- current_buffer = VimBuffer( 'uni¢𐍈d€' )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
- target_name = os.path.realpath( u'different_uni¢𐍈d€' )
- vimsupport.JumpToLocation( target_name, 2, 5, 'vertical', 'same-buffer' )
- vim_command.assert_has_exact_calls( [
- call( 'normal! m\'' ),
- call( u'keepjumps vertical edit {0}'.format( target_name ) )
- ] )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def JumpToLocation_DifferentFile_Split_CurrentTab_NotAlreadyOpened_test(
- vim_command ):
- current_buffer = VimBuffer( 'uni¢𐍈d€' )
- current_window = MagicMock( buffer = current_buffer )
- current_tab = MagicMock( windows = [ current_window ] )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ] ) as vim:
- vim.current.tabpage = current_tab
- target_name = os.path.realpath( u'different_uni¢𐍈d€' )
- vimsupport.JumpToLocation( target_name,
- 2,
- 5,
- 'aboveleft',
- 'split-or-existing-window' )
- vim_command.assert_has_exact_calls( [
- call( 'normal! m\'' ),
- call( u'keepjumps aboveleft split {0}'.format( target_name ) ),
- call( 'normal! zz' )
- ] )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def JumpToLocation_DifferentFile_Split_CurrentTab_AlreadyOpened_test(
- vim_command ):
- current_buffer = VimBuffer( 'uni¢𐍈d€' )
- different_buffer = VimBuffer( 'different_uni¢𐍈d€' )
- current_window = MagicMock( buffer = current_buffer )
- different_window = MagicMock( buffer = different_buffer )
- current_tab = MagicMock( windows = [ current_window, different_window ] )
- with MockVimBuffers( [ current_buffer, different_buffer ],
- [ current_buffer ] ) as vim:
- vim.current.tabpage = current_tab
- vimsupport.JumpToLocation( os.path.realpath( u'different_uni¢𐍈d€' ),
- 2,
- 5,
- 'belowright',
- 'split-or-existing-window' )
- assert_that( vim.current.tabpage, equal_to( current_tab ) )
- assert_that( vim.current.window, equal_to( different_window ) )
- assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
- vim_command.assert_has_exact_calls( [
- call( 'normal! m\'' ),
- call( 'normal! zz' )
- ] )
- @WindowsAndMacOnly
- @patch( 'vim.command', new_callable = ExtendedMock )
- def JumpToLocation_DifferentFile_Split_CurrentTab_AlreadyOpened_Case_test(
- vim_command ):
- current_buffer = VimBuffer( 'current_buffer' )
- different_buffer = VimBuffer( 'AnotHer_buFfeR' )
- current_window = MagicMock( buffer = current_buffer )
- different_window = MagicMock( buffer = different_buffer )
- current_tab = MagicMock( windows = [ current_window, different_window ] )
- with MockVimBuffers( [ current_buffer, different_buffer ],
- [ current_buffer ] ) as vim:
- vim.current.tabpage = current_tab
- vimsupport.JumpToLocation( os.path.realpath( 'anOther_BuffEr' ),
- 4,
- 1,
- 'belowright',
- 'split-or-existing-window' )
- assert_that( vim.current.tabpage, equal_to( current_tab ) )
- assert_that( vim.current.window, equal_to( different_window ) )
- assert_that( vim.current.window.cursor, equal_to( ( 4, 0 ) ) )
- vim_command.assert_has_exact_calls( [
- call( 'normal! m\'' ),
- call( 'normal! zz' )
- ] )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def JumpToLocation_DifferentFile_Split_AllTabs_NotAlreadyOpened_test(
- vim_command ):
- current_buffer = VimBuffer( 'uni¢𐍈d€' )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
- target_name = os.path.realpath( u'different_uni¢𐍈d€' )
- vimsupport.JumpToLocation( target_name,
- 2,
- 5,
- 'tab',
- 'split-or-existing-window' )
- vim_command.assert_has_exact_calls( [
- call( 'normal! m\'' ),
- call( u'keepjumps tab split {0}'.format( target_name ) ),
- call( 'normal! zz' )
- ] )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def JumpToLocation_DifferentFile_Split_AllTabs_AlreadyOpened_test(
- vim_command ):
- current_buffer = VimBuffer( 'uni¢𐍈d€' )
- different_buffer = VimBuffer( 'different_uni¢𐍈d€' )
- current_window = MagicMock( buffer = current_buffer )
- different_window = MagicMock( buffer = different_buffer )
- current_tab = MagicMock( windows = [ current_window, different_window ] )
- with patch( 'vim.tabpages', [ current_tab ] ):
- with MockVimBuffers( [ current_buffer, different_buffer ],
- [ current_buffer ] ) as vim:
- vimsupport.JumpToLocation( os.path.realpath( u'different_uni¢𐍈d€' ),
- 2,
- 5,
- 'tab',
- 'split-or-existing-window' )
- assert_that( vim.current.tabpage, equal_to( current_tab ) )
- assert_that( vim.current.window, equal_to( different_window ) )
- assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
- vim_command.assert_has_exact_calls( [
- call( 'normal! m\'' ),
- call( 'normal! zz' )
- ] )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def JumpToLocation_DifferentFile_NewOrExistingTab_NotAlreadyOpened_test(
- vim_command ):
- current_buffer = VimBuffer( 'uni¢𐍈d€' )
- with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
- target_name = os.path.realpath( u'different_uni¢𐍈d€' )
- vimsupport.JumpToLocation( target_name,
- 2,
- 5,
- 'aboveleft vertical',
- 'new-or-existing-tab' )
- vim_command.assert_has_exact_calls( [
- call( 'normal! m\'' ),
- call( u'keepjumps aboveleft vertical tabedit {0}'.format( target_name ) ),
- call( 'normal! zz' )
- ] )
- @patch( 'vim.command', new_callable = ExtendedMock )
- def JumpToLocation_DifferentFile_NewOrExistingTab_AlreadyOpened_test(
- vim_command ):
- current_buffer = VimBuffer( 'uni¢𐍈d€' )
- different_buffer = VimBuffer( 'different_uni¢𐍈d€' )
- current_window = MagicMock( buffer = current_buffer )
- different_window = MagicMock( buffer = different_buffer )
- current_tab = MagicMock( windows = [ current_window, different_window ] )
- with patch( 'vim.tabpages', [ current_tab ] ):
- with MockVimBuffers( [ current_buffer, different_buffer ],
- [ current_buffer ] ) as vim:
- vimsupport.JumpToLocation( os.path.realpath( u'different_uni¢𐍈d€' ),
- 2,
- 5,
- 'belowright tab',
- 'new-or-existing-tab' )
- assert_that( vim.current.tabpage, equal_to( current_tab ) )
- assert_that( vim.current.window, equal_to( different_window ) )
- assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
- vim_command.assert_has_exact_calls( [
- call( 'normal! m\'' ),
- call( 'normal! zz' )
- ] )
- @patch( 'ycm.tests.test_utils.VIM_VERSION', Version( 7, 4, 1578 ) )
- def VimVersionAtLeast_test():
- assert_that( vimsupport.VimVersionAtLeast( '7.3.414' ) )
- assert_that( vimsupport.VimVersionAtLeast( '7.4.1578' ) )
- assert_that( not vimsupport.VimVersionAtLeast( '7.4.1579' ) )
- assert_that( not vimsupport.VimVersionAtLeast( '7.4.1898' ) )
- assert_that( not vimsupport.VimVersionAtLeast( '8.1.278' ) )
|