# encoding: utf-8
import re
from bpython.test import unittest
from bpython.line import current_word, current_dict_key, current_dict, \
current_string, current_object, current_object_attribute, \
current_from_import_from, current_from_import_import, current_import, \
current_method_definition_name, current_single_word, \
current_expression_attribute, current_dotted_attribute
def cursor(s):
"""'ab|c' -> (2, 'abc')"""
cursor_offset = s.index('|')
line = s[:cursor_offset] + s[cursor_offset + 1:]
return cursor_offset, line
def decode(s):
"""'ad' -> ((3, 'abcd'), (1, 3, 'bdc'))"""
if not s.count('|') == 1:
raise ValueError('match helper needs | to occur once')
if s.count('') or s.count('|")
class TestCurrentDict(LineTestCase):
def setUp(self):
self.func = current_dict
def test_simple(self):
self.assertAccess('asdf|')
self.assertAccess('asdf|')
self.assertAccess('[|')
self.assertAccess('[|]')
self.assertAccess('[abc|')
self.assertAccess('asdf|')
class TestCurrentString(LineTestCase):
def setUp(self):
self.func = current_string
def test_closed(self):
self.assertAccess('""')
self.assertAccess('""')
self.assertAccess('""')
self.assertAccess("''")
self.assertAccess("''")
self.assertAccess("''''''")
self.assertAccess('""""""')
self.assertAccess('asdf.afd("a") + ""')
def test_open(self):
self.assertAccess('"')
self.assertAccess('"')
self.assertAccess('"')
self.assertAccess("'")
self.assertAccess("'")
self.assertAccess("'''")
self.assertAccess('"""')
self.assertAccess('asdf.afd("a") + "')
class TestCurrentObject(LineTestCase):
def setUp(self):
self.func = current_object
def test_simple(self):
self.assertAccess('.attr1|')
self.assertAccess('.|')
self.assertAccess('Object|')
self.assertAccess('Object|.')
self.assertAccess('.|')
self.assertAccess('.attr2|')
self.assertAccess('.att|r1.attr2')
self.assertAccess('stuff[stuff] + {123: 456} + .attr2|')
self.assertAccess('stuff[asd|fg]')
self.assertAccess('stuff[asdf[asd|fg]')
class TestCurrentAttribute(LineTestCase):
def setUp(self):
self.func = current_object_attribute
def test_simple(self):
self.assertAccess('Object.')
self.assertAccess('Object.attr1.')
self.assertAccess('Object..attr2')
self.assertAccess('stuff[stuff] + {123: 456} + Object.attr1.')
self.assertAccess('stuff[asd|fg]')
self.assertAccess('stuff[asdf[asd|fg]')
self.assertAccess('Object.attr1.')
self.assertAccess('Object..attr2')
class TestCurrentFromImportFrom(LineTestCase):
def setUp(self):
self.func = current_from_import_from
def test_simple(self):
self.assertAccess('from import path')
self.assertAccess('from import path|')
self.assertAccess('if True|: from sys import path')
self.assertAccess('if True: |from sys import path')
self.assertAccess('if True: from import p|ath')
self.assertAccess('if True: from sys imp|ort path')
self.assertAccess('if True: from sys import |path')
self.assertAccess('if True: from sys import path.stu|ff')
self.assertAccess('if True: from import sep|')
self.assertAccess('from ')
class TestCurrentFromImportImport(LineTestCase):
def setUp(self):
self.func = current_from_import_import
def test_simple(self):
self.assertAccess('from sys import ')
self.assertAccess('from sys import ')
self.assertAccess('from sys import |path')
self.assertAccess('from sys| import path')
self.assertAccess('from s|ys import path')
self.assertAccess('from |sys import path')
self.assertAccess('from xml.dom import ')
# because syntax error
self.assertAccess('from xml.dom import Node.as|d')
class TestCurrentImport(LineTestCase):
def setUp(self):
self.func = current_import
def test_simple(self):
self.assertAccess('import ')
self.assertAccess('import ')
self.assertAccess('import |path')
self.assertAccess('import path, ')
self.assertAccess('import path another|')
self.assertAccess('if True: import ')
self.assertAccess('if True: import ')
self.assertAccess('if True: import ')
self.assertAccess('if True: import as something')
class TestMethodDefinitionName(LineTestCase):
def setUp(self):
self.func = current_method_definition_name
def test_simple(self):
self.assertAccess('def ')
self.assertAccess(' def bar(x, y)|:')
self.assertAccess(' def (x, y)')
class TestSingleWord(LineTestCase):
def setUp(self):
self.func = current_single_word
def test_simple(self):
self.assertAccess('foo.bar|')
self.assertAccess('.foo|')
self.assertAccess(' ')
class TestCurrentExpressionAttribute(LineTestCase):
def setUp(self):
self.func = current_expression_attribute
def test_simple(self):
self.assertAccess('Object..')
self.assertAccess('Object..')
self.assertAccess('Object.(|)')
self.assertAccess('Object.another.(|)')
self.assertAccess('asdf asdf asdf.(abc|)')
def test_without_dot(self):
self.assertAccess('Object|')
self.assertAccess('Object|.')
self.assertAccess('|Object.')
def test_with_whitespace(self):
self.assertAccess('Object. ')
self.assertAccess('Object .')
self.assertAccess('Object . ')
self.assertAccess('Object .asdf attr|')
self.assertAccess('Object . attr')
self.assertAccess('Object. asdf attr|')
self.assertAccess('Object. attr')
self.assertAccess('Object . asdf attr|')
self.assertAccess('Object . attr')
def test_indexing(self):
self.assertAccess('abc[def].')
self.assertAccess('abc[def].')
self.assertAccess('abc[def].')
self.assertAccess('abc[def].gh |i')
self.assertAccess('abc[def]|')
def test_strings(self):
self.assertAccess('"hey".')
self.assertAccess('"hey"|')
self.assertAccess('"hey"|.a')
self.assertAccess('"hey".')
self.assertAccess('"hey".asdf d|')
self.assertAccess('"hey".')
class TestCurrentDottedAttribute(LineTestCase):
def setUp(self):
self.func = current_dotted_attribute
def test_simple(self):
self.assertAccess('|')
self.assertAccess('(|')
self.assertAccess('[|')
self.assertAccess('m.body[0].value|')
self.assertAccess('m.body[0].attr.value|')
if __name__ == '__main__':
unittest.main()