test_completerlib.py
147 lines
| 5.0 KiB
| text/x-python
|
PythonLexer
Jörgen Stenarson
|
r5688 | # -*- coding: utf-8 -*- | ||
"""Tests for completerlib. | ||||
""" | ||||
from __future__ import absolute_import | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
import os | ||||
import shutil | ||||
import sys | ||||
import tempfile | ||||
import unittest | ||||
from os.path import join | ||||
Thomas Kluyver
|
r14813 | import nose.tools as nt | ||
Ross Jones
|
r6148 | from IPython.core.completerlib import magic_run_completer, module_completion | ||
Thomas Kluyver
|
r13447 | from IPython.utils import py3compat | ||
Ross Jones
|
r6148 | from IPython.utils.tempdir import TemporaryDirectory | ||
Thomas Kluyver
|
r12168 | from IPython.testing.decorators import onlyif_unicode_paths | ||
Jörgen Stenarson
|
r5688 | |||
class MockEvent(object): | ||||
def __init__(self, line): | ||||
self.line = line | ||||
#----------------------------------------------------------------------------- | ||||
# Test functions begin | ||||
#----------------------------------------------------------------------------- | ||||
class Test_magic_run_completer(unittest.TestCase): | ||||
Thomas Kluyver
|
r14814 | files = [u"aao.py", u"a.py", u"b.py", u"aao.txt"] | ||
Thomas Kluyver
|
r14818 | dirs = [u"adir/", "bdir/"] | ||
Thomas Kluyver
|
r14814 | |||
Jörgen Stenarson
|
r5688 | def setUp(self): | ||
self.BASETESTDIR = tempfile.mkdtemp() | ||||
Thomas Kluyver
|
r14814 | for fil in self.files: | ||
Jörgen Stenarson
|
r5688 | with open(join(self.BASETESTDIR, fil), "w") as sfile: | ||
sfile.write("pass\n") | ||||
Thomas Kluyver
|
r14817 | for d in self.dirs: | ||
os.mkdir(join(self.BASETESTDIR, d)) | ||||
Thomas Kluyver
|
r13447 | self.oldpath = py3compat.getcwd() | ||
Jörgen Stenarson
|
r5688 | os.chdir(self.BASETESTDIR) | ||
def tearDown(self): | ||||
os.chdir(self.oldpath) | ||||
shutil.rmtree(self.BASETESTDIR) | ||||
def test_1(self): | ||||
"""Test magic_run_completer, should match two alterntives | ||||
""" | ||||
event = MockEvent(u"%run a") | ||||
mockself = None | ||||
MinRK
|
r5692 | match = set(magic_run_completer(mockself, event)) | ||
Thomas Kluyver
|
r14817 | self.assertEqual(match, {u"a.py", u"aao.py", u"adir/"}) | ||
Jörgen Stenarson
|
r5688 | |||
def test_2(self): | ||||
"""Test magic_run_completer, should match one alterntive | ||||
""" | ||||
event = MockEvent(u"%run aa") | ||||
mockself = None | ||||
MinRK
|
r5692 | match = set(magic_run_completer(mockself, event)) | ||
Thomas Kluyver
|
r12168 | self.assertEqual(match, set([u"aao.py"])) | ||
Min RK
|
r5690 | |||
def test_3(self): | ||||
MinRK
|
r5692 | """Test magic_run_completer with unterminated " """ | ||
Min RK
|
r5690 | event = MockEvent(u'%run "a') | ||
mockself = None | ||||
MinRK
|
r5692 | match = set(magic_run_completer(mockself, event)) | ||
Thomas Kluyver
|
r14817 | self.assertEqual(match, {u"a.py", u"aao.py", u"adir/"}) | ||
Min RK
|
r5690 | |||
Thomas Kluyver
|
r14814 | def test_completion_more_args(self): | ||
event = MockEvent(u'%run a.py ') | ||||
match = set(magic_run_completer(None, event)) | ||||
Thomas Kluyver
|
r14817 | self.assertEqual(match, set(self.files + self.dirs)) | ||
Thomas Kluyver
|
r14814 | |||
Thomas Kluyver
|
r14813 | def test_completion_in_dir(self): | ||
# Github issue #3459 | ||||
event = MockEvent(u'%run a.py {}'.format(join(self.BASETESTDIR, 'a'))) | ||||
print(repr(event.line)) | ||||
match = set(magic_run_completer(None, event)) | ||||
Thomas Kluyver
|
r14849 | # We specifically use replace here rather than normpath, because | ||
# at one point there were duplicates 'adir' and 'adir/', and normpath | ||||
# would hide the failure for that. | ||||
self.assertEqual(match, {join(self.BASETESTDIR, f).replace('\\','/') | ||||
for f in (u'a.py', u'aao.py', u'aao.txt', u'adir/')}) | ||||
Thomas Kluyver
|
r12168 | |||
class Test_magic_run_completer_nonascii(unittest.TestCase): | ||||
@onlyif_unicode_paths | ||||
def setUp(self): | ||||
self.BASETESTDIR = tempfile.mkdtemp() | ||||
for fil in [u"aaø.py", u"a.py", u"b.py"]: | ||||
with open(join(self.BASETESTDIR, fil), "w") as sfile: | ||||
sfile.write("pass\n") | ||||
Thomas Kluyver
|
r13447 | self.oldpath = py3compat.getcwd() | ||
Thomas Kluyver
|
r12168 | os.chdir(self.BASETESTDIR) | ||
def tearDown(self): | ||||
os.chdir(self.oldpath) | ||||
shutil.rmtree(self.BASETESTDIR) | ||||
@onlyif_unicode_paths | ||||
def test_1(self): | ||||
"""Test magic_run_completer, should match two alterntives | ||||
""" | ||||
event = MockEvent(u"%run a") | ||||
mockself = None | ||||
match = set(magic_run_completer(mockself, event)) | ||||
self.assertEqual(match, set([u"a.py", u"aaø.py"])) | ||||
@onlyif_unicode_paths | ||||
def test_2(self): | ||||
"""Test magic_run_completer, should match one alterntive | ||||
""" | ||||
event = MockEvent(u"%run aa") | ||||
mockself = None | ||||
match = set(magic_run_completer(mockself, event)) | ||||
self.assertEqual(match, set([u"aaø.py"])) | ||||
@onlyif_unicode_paths | ||||
def test_3(self): | ||||
"""Test magic_run_completer with unterminated " """ | ||||
event = MockEvent(u'%run "a') | ||||
mockself = None | ||||
match = set(magic_run_completer(mockself, event)) | ||||
self.assertEqual(match, set([u"a.py", u"aaø.py"])) | ||||
Thomas Kluyver
|
r14813 | |||
# module_completer: | ||||
def test_import_invalid_module(): | ||||
"""Testing of issue https://github.com/ipython/ipython/issues/1107""" | ||||
invalid_module_names = set(['foo-bar', 'foo:bar', '10foo']) | ||||
valid_module_names = set(['foobar']) | ||||
with TemporaryDirectory() as tmpdir: | ||||
sys.path.insert( 0, tmpdir ) | ||||
for name in invalid_module_names | valid_module_names: | ||||
filename = os.path.join(tmpdir, name + '.py') | ||||
open(filename, 'w').close() | ||||
s = set( module_completion('import foo') ) | ||||
intersection = s.intersection(invalid_module_names) | ||||
nt.assert_equal(intersection, set()) | ||||
assert valid_module_names.issubset(s), valid_module_names.intersection(s) | ||||