Add integration tests with YouCompleteMe.

This commit is contained in:
Holger Rapp 2014-03-04 20:36:27 +01:00
parent b65efa5aa7
commit f4cda88027

113
test.py
View File

@ -76,6 +76,10 @@ def no_unidecode_available():
if not UNIDECODE_IMPORTED:
return "unidecode is not available."
def not_testing_with_other_plugins(self):
if self.plugins and not self.test_plugins:
return "Not testing integration with other plugins."
def is_process_running(pid):
"""Returns true if a process with pid is running, false otherwise."""
# from http://stackoverflow.com/questions/568271/how-to-check-if-there-exists-a-process-with-a-given-pid
@ -86,13 +90,46 @@ def is_process_running(pid):
else:
return True
def random_string(n):
return ''.join(random.choice(string.ascii_lowercase) for x in range(n))
def silent_call(cmd):
"""Calls 'cmd' and returns the exit value."""
return subprocess.call(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
def create_directory(dirname):
"""Creates 'dirname' and its parents if it does not exist."""
try:
os.makedirs(dirname)
except OSError:
pass
def plugin_cache_dir():
"""The directory that we check out our bundles to."""
return os.path.join(tempfile.gettempdir(), "UltiSnips_test_vim_plugins")
def clone_plugin(plugin):
"""Clone the given plugin into our plugin directory."""
dirname = os.path.join(plugin_cache_dir(), os.path.basename(plugin))
if os.path.exists(dirname):
print "Skip cloning of %s. Already there." % plugin
return
create_directory(dirname)
print "Cloning %s." % plugin
subprocess.call(["git", "clone", "--recursive",
"--depth", "1", "https://github.com/%s" % plugin, dirname])
if plugin == "Valloric/YouCompleteMe":
## CLUTCH: this plugin needs something extra.
subprocess.call(os.path.join(dirname, "./install.sh"), cwd=dirname)
def setup_other_plugins(all_plugins):
"""Creates /tmp/UltiSnips_test_vim_plugins and clones all plugins into this."""
clone_plugin("tpope/vim-pathogen")
for plugin in all_plugins:
clone_plugin(plugin)
def random_string(n):
return ''.join(random.choice(string.ascii_lowercase) for x in range(n))
class VimInterface(object):
def get_buffer_data(self):
handle, fn = tempfile.mkstemp(prefix="UltiSnips_Test",suffix=".txt")
@ -263,8 +300,9 @@ class _VimTest(unittest.TestCase):
keys = ""
sleeptime = 0.00
output = ""
plugins = []
# Skip this test for the given reason or None for not skipping it.
skip_if = lambda self: None
skip_if = not_testing_with_other_plugins
def runTest(self):
# Only checks the output. All work is done in setUp().
@ -293,10 +331,7 @@ class _VimTest(unittest.TestCase):
"""Creates a file in the runtimepath that is created for this test.
Returns the absolute path to the file."""
abs_path = os.path.join(self._temporary_directory, *file_path.split("/"))
try:
os.makedirs(os.path.dirname(abs_path))
except OSError:
pass
create_directory(os.path.dirname(abs_path))
content = dedent(content + "\n")
if PYTHON3:
@ -307,6 +342,12 @@ class _VimTest(unittest.TestCase):
file_handle.write(content)
return abs_path
def _link_file(self, source, relative_destination):
"""Creates a link from 'source' to the 'relative_destination' in our temp dir."""
absdir = os.path.join(self._temporary_directory, relative_destination)
create_directory(absdir)
os.symlink(source, os.path.join(absdir, os.path.basename(source)))
def setUp(self):
reason_for_skipping = self.skip_if()
if reason_for_skipping is not None:
@ -315,13 +356,23 @@ class _VimTest(unittest.TestCase):
self._temporary_directory = tempfile.mkdtemp(prefix="UltiSnips_Test")
vim_config = []
# Vim parameters.
vim_config.append('set nocompatible')
vim_config.append('set runtimepath=$VIMRUNTIME,.,%s' % self._temporary_directory)
if self.plugins:
self._link_file(os.path.join(plugin_cache_dir(), "vim-pathogen", "autoload"), ".")
for plugin in self.plugins:
self._link_file(os.path.join(plugin_cache_dir(), os.path.basename(plugin)), "bundle")
vim_config.append("execute pathogen#infect()")
# Vim parameters.
vim_config.append('syntax on')
vim_config.append('filetype plugin indent on')
vim_config.append('set clipboard=""')
vim_config.append('set encoding=utf-8')
vim_config.append('set fileencoding=utf-8')
vim_config.append('set buftype=nofile')
vim_config.append('set runtimepath=$VIMRUNTIME,.,%s' % self._temporary_directory)
vim_config.append('set shortmess=at')
vim_config.append('let g:UltiSnipsExpandTrigger="<tab>"')
vim_config.append('let g:UltiSnipsJumpForwardTrigger="?"')
@ -329,7 +380,8 @@ class _VimTest(unittest.TestCase):
vim_config.append('let g:UltiSnipsListSnippets="@"')
vim_config.append('let g:UltiSnipsUsePythonVersion="%i"' % (3 if PYTHON3 else 2))
vim_config.append('let g:UltiSnipsSnippetDirectories=["us"]')
vim_config.append('filetype plugin on')
self._extra_options(vim_config)
# Now activate UltiSnips.
vim_config.append('so plugin/UltiSnips.vim')
@ -368,8 +420,6 @@ class _VimTest(unittest.TestCase):
# End of python stuff.
vim_config.append("EOF")
self._extra_options(vim_config)
for name, content in self.files.items():
self._create_file(name, content)
@ -3204,9 +3254,7 @@ snippet test1
keys = "test" + EX
wanted = "blub\n\nblah\n"
# End: snipMate support #}}}
# SnippetsInCurrentScope {{{#
class VerifyVimDict1(_VimTest):
"""check:
correct type (4 means vim dictionary)
@ -3241,6 +3289,28 @@ class VerifyVimDict3(_VimTest):
akey = '"te{}stâ"'.format("'")
keys = ("te'=(UltiSnips#SnippetsInCurrentScope()[{}]".format(akey) + ')\n')
wanted = "te'123êabc"
# End: SnippetsInCurrentScope #}}}
# Plugin: YouCompleteMe {{{#
class YouCompleteMe_IntegrationTest(_VimTest):
plugins = ["Valloric/YouCompleteMe"]
snippets = ("superlongtrigger", "Hello")
keys = "superlo\ty"
wanted = "Hello"
def _extra_options(self, vim_config):
# Not sure why, but I need to make a new tab for this to work.
vim_config.append('let g:UltiSnipsExpandTrigger="y"')
vim_config.append('tabnew')
def _before_test(self):
self.vim.send(":set ft=python\n")
# Give ycm a chance to catch up.
time.sleep(1)
# End: Plugin: YouCompleteMe #}}}
###########################################################################
# END OF TEST #
@ -3255,10 +3325,12 @@ if __name__ == '__main__':
p = optparse.OptionParser("%prog [OPTIONS] <test case names to run>")
p.set_defaults(session="vim", interrupt=False,
verbose=False, interface="screen", retries=4)
verbose=False, interface="screen", retries=4, plugins=False)
p.add_option("-v", "--verbose", dest="verbose", action="store_true",
help="print name of tests as they are executed")
p.add_option("--plugins", action="store_true",
help="Run integration tests with other Vim plugins.")
p.add_option("--interface", type=str,
help="interface to vim to use on Mac and or Linux [screen|tmux].")
p.add_option("-s", "--session", dest="session", metavar="SESSION",
@ -3297,17 +3369,24 @@ if __name__ == '__main__':
# Inform all test case which screen session to use
suite = unittest.TestSuite()
all_other_plugins = set()
for s in all_test_suites:
for test in s:
test.vim = vim
test.interrupt = options.interrupt
test.retries = options.retries
test.test_plugins = options.plugins
all_other_plugins.update(test.plugins)
if len(selected_tests):
id = test.id().split('.')[1]
if not any([ id.startswith(t) for t in selected_tests ]):
continue
suite.addTest(test)
if options.plugins:
setup_other_plugins(all_other_plugins)
if options.verbose:
v = 2
else: