1"""Unit tests for idlelib.AutoExpand"""
2import unittest
3from test.test_support import requires
4from Tkinter import Text, Tk
5#from idlelib.idle_test.mock_tk import Text
6from idlelib.AutoExpand import AutoExpand
7
8
9class Dummy_Editwin:
10    # AutoExpand.__init__ only needs .text
11    def __init__(self, text):
12        self.text = text
13
14class AutoExpandTest(unittest.TestCase):
15
16    @classmethod
17    def setUpClass(cls):
18        if 'Tkinter' in str(Text):
19            requires('gui')
20            cls.tk = Tk()
21            cls.text = Text(cls.tk)
22        else:
23            cls.text = Text()
24        cls.auto_expand = AutoExpand(Dummy_Editwin(cls.text))
25
26    @classmethod
27    def tearDownClass(cls):
28        del cls.text, cls.auto_expand
29        if hasattr(cls, 'tk'):
30            cls.tk.destroy()
31            del cls.tk
32
33    def tearDown(self):
34        self.text.delete('1.0', 'end')
35
36    def test_get_prevword(self):
37        text = self.text
38        previous = self.auto_expand.getprevword
39        equal = self.assertEqual
40
41        equal(previous(), '')
42
43        text.insert('insert', 't')
44        equal(previous(), 't')
45
46        text.insert('insert', 'his')
47        equal(previous(), 'this')
48
49        text.insert('insert', ' ')
50        equal(previous(), '')
51
52        text.insert('insert', 'is')
53        equal(previous(), 'is')
54
55        text.insert('insert', '\nsample\nstring')
56        equal(previous(), 'string')
57
58        text.delete('3.0', 'insert')
59        equal(previous(), '')
60
61        text.delete('1.0', 'end')
62        equal(previous(), '')
63
64    def test_before_only(self):
65        previous = self.auto_expand.getprevword
66        expand = self.auto_expand.expand_word_event
67        equal = self.assertEqual
68
69        self.text.insert('insert', 'ab ac bx ad ab a')
70        equal(self.auto_expand.getwords(), ['ab', 'ad', 'ac', 'a'])
71        expand('event')
72        equal(previous(), 'ab')
73        expand('event')
74        equal(previous(), 'ad')
75        expand('event')
76        equal(previous(), 'ac')
77        expand('event')
78        equal(previous(), 'a')
79
80    def test_after_only(self):
81        # Also add punctuation 'noise' that shoud be ignored.
82        text = self.text
83        previous = self.auto_expand.getprevword
84        expand = self.auto_expand.expand_word_event
85        equal = self.assertEqual
86
87        text.insert('insert', 'a, [ab] ac: () bx"" cd ac= ad ya')
88        text.mark_set('insert', '1.1')
89        equal(self.auto_expand.getwords(), ['ab', 'ac', 'ad', 'a'])
90        expand('event')
91        equal(previous(), 'ab')
92        expand('event')
93        equal(previous(), 'ac')
94        expand('event')
95        equal(previous(), 'ad')
96        expand('event')
97        equal(previous(), 'a')
98
99    def test_both_before_after(self):
100        text = self.text
101        previous = self.auto_expand.getprevword
102        expand = self.auto_expand.expand_word_event
103        equal = self.assertEqual
104
105        text.insert('insert', 'ab xy yz\n')
106        text.insert('insert', 'a ac by ac')
107
108        text.mark_set('insert', '2.1')
109        equal(self.auto_expand.getwords(), ['ab', 'ac', 'a'])
110        expand('event')
111        equal(previous(), 'ab')
112        expand('event')
113        equal(previous(), 'ac')
114        expand('event')
115        equal(previous(), 'a')
116
117    def test_other_expand_cases(self):
118        text = self.text
119        expand = self.auto_expand.expand_word_event
120        equal = self.assertEqual
121
122        # no expansion candidate found
123        equal(self.auto_expand.getwords(), [])
124        equal(expand('event'), 'break')
125
126        text.insert('insert', 'bx cy dz a')
127        equal(self.auto_expand.getwords(), [])
128
129        # reset state by successfully expanding once
130        # move cursor to another position and expand again
131        text.insert('insert', 'ac xy a ac ad a')
132        text.mark_set('insert', '1.7')
133        expand('event')
134        initial_state = self.auto_expand.state
135        text.mark_set('insert', '1.end')
136        expand('event')
137        new_state = self.auto_expand.state
138        self.assertNotEqual(initial_state, new_state)
139
140if __name__ == '__main__':
141    unittest.main(verbosity=2)
142