diff -r 646c2388d8f5 Lib/idlelib/idle_test/mock_idle.py --- a/Lib/idlelib/idle_test/mock_idle.py Sun Aug 18 12:43:24 2013 +0200 +++ b/Lib/idlelib/idle_test/mock_idle.py Mon Aug 26 21:58:19 2013 -0400 @@ -25,3 +25,7 @@ pass def undo_block_stop(*args): pass + +class AutoCompleteWindow: + def complete(): + return diff -r 646c2388d8f5 Lib/idlelib/idle_test/mock_tk.py --- a/Lib/idlelib/idle_test/mock_tk.py Sun Aug 18 12:43:24 2013 +0200 +++ b/Lib/idlelib/idle_test/mock_tk.py Mon Aug 26 21:58:19 2013 -0400 @@ -4,6 +4,21 @@ required in spite of what the doc strings say. """ +class Event: + """Minimal mock for tkinter events. + + Use setattr() when testing if other attributes are needed.""" + def __init__(self): + self.widget = None + self.x = self.y = None + self.x_root = self.y_root = None + self.char = None + self.keysym = None + self.keycode = None + self.num = None + self.width = self.height = None + self.type = None + class Var: "Use for String/Int/BooleanVar: incomplete" def __init__(self, master=None, value=None, name=None): diff -r 646c2388d8f5 Lib/idlelib/idle_test/test_autocomplete.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/idlelib/idle_test/test_autocomplete.py Mon Aug 26 21:58:19 2013 -0400 @@ -0,0 +1,127 @@ +import unittest +from test.support import requires +import idlelib.AutoComplete as ac +from idlelib.EditorWindow import EditorWindow +from tkinter import Tk, Text, TclError +import idlelib.AutoCompleteWindow as acw +from idlelib.idle_test.mock_tk import Event +from idlelib.idle_test.mock_idle import AutoCompleteWindow + +class ac_func: + """Mock for AutoComplete functions""" + def __init__(self): + self.result = None + self.args = None + self.kwds = None + def __call__(self, *args, **kwds): + self.args = args + self.kwds = kwds + return self.result + +class AutoCompleteTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + cls.editor = EditorWindow(root=cls.root) + cls.text = cls.editor.text + + def setUp(self): + self.editor.text.delete('1.0', 'end') + self.autocomplete = ac.AutoComplete(self.editor) + + def test_init(self): + self.assertEqual(self.autocomplete.editwin, self.editor) + + def test_make_autocomplete_window(self): + testwin = self.autocomplete._make_autocomplete_window() + self.assertIsInstance(testwin, acw.AutoCompleteWindow) + + def test_remove_autocomplete_window(self): + testwin = self.autocomplete._make_autocomplete_window() + self.assertIsInstance(testwin, acw.AutoCompleteWindow) + self.autocomplete._remove_autocomplete_window() + self.assertIsNone(self.autocomplete.autocompletewindow) + + def test_force_open_completions_event(self): + # Test that force_open_completions_event calls _open_completions + self.autocomplete.open_completions = ac_func() + self.autocomplete.force_open_completions_event('event') + result = self.autocomplete.open_completions.args + self.assertEqual(result, (True, False, True)) + + def test_try_open_completions_event(self): + Equal = self.assertEqual + autocomplete = self.autocomplete + trycompletions = self.autocomplete.try_open_completions_event + autocomplete._open_completions_later = ac_func() + + # _open_completions_later should not be called with no text in editor + trycompletions('event') + Equal(autocomplete._open_completions_later.args, None) + + # _open_completions_later should be called with COMPLETE_ATTRIBUTES (1) + self.text.insert('1.0', 're.') + trycompletions('event') + Equal(autocomplete._open_completions_later.args, + (False, False, False, 1)) + + # _open_completions_later should be called with COMPLETE_FILES (2) + self.text.delete('1.0', 'end') + self.text.insert('1.0', '"./Lib/') + trycompletions('event') + Equal(autocomplete._open_completions_later.args, + (False, False, False, 2)) + + def test_autocomplete_event(self): + Equal = self.assertEqual + autocomplete = self.autocomplete + ev = Event() + + # Test that the autocomplete event is ignored if user is pressing a + # modifier key in addition to the tab key + setattr(ev, 'mc_state', True) + self.assertIsNone(autocomplete.autocomplete_event(ev)) + delattr(ev, 'mc_state') + + # If autocomplete window is open, complete() method is called + testwin = self.autocomplete._make_autocomplete_window() + self.text.insert('1.0', 're.') + Equal(self.autocomplete.autocomplete_event(ev), 'break') + + # If autocomplete window is not active or does not exist, + # open_completions is called. + autocomplete._remove_autocomplete_window() + Equal(self.autocomplete.autocomplete_event(ev), 'break') + + def test_open_completions_later(self): + # Test that autocomplete._delayed_completion_id is set + pass + + def test_delayed_open_completions(self): + # Test that autocomplete._delayed_completion_id set to None and that + # open_completions only called if insertion index is the same as + # _delayed_completion_index + pass + + def test_open_completions(self): + # Test completions of files and attributes as well as non-completion + # of errors + pass + + def test_fetch_completions(self): + # Test that fetch_completions returns 2 lists: + # For attribute completion, a large list containing all variables, and + # a small list containing non-private variables. + # For file completion, a large list containing all files in the path, + # and a small list containing files that do not start with '.' + pass + + def test_get_entity(self): + # Test that a name is in the namespace of sys.modules and + # __main__.__dict__ + pass + +if __name__ == '__main__': + unittest.main(verbosity=2, exit=2)