16e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy"""Unit tests for idlelib.AutoExpand"""
26e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedyimport unittest
36e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedyfrom test.test_support import requires
46e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedyfrom Tkinter import Text, Tk
56e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy#from idlelib.idle_test.mock_tk import Text
66e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedyfrom idlelib.AutoExpand import AutoExpand
76e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
86e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
96e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedyclass Dummy_Editwin:
106e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy    # AutoExpand.__init__ only needs .text
116e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy    def __init__(self, text):
126e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        self.text = text
136e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
146e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedyclass AutoExpandTest(unittest.TestCase):
156e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
166e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy    @classmethod
176e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy    def setUpClass(cls):
1890bcdd71a5802faeb2d64f1d20914d01afb2f249Zachary Ware        if 'Tkinter' in str(Text):
196e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy            requires('gui')
206e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy            cls.tk = Tk()
216e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy            cls.text = Text(cls.tk)
226e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        else:
236e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy            cls.text = Text()
246e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        cls.auto_expand = AutoExpand(Dummy_Editwin(cls.text))
256e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
266e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy    @classmethod
276e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy    def tearDownClass(cls):
28bbf29ee6e4c5d46dfd48685cd65ef4bdd132dd40Terry Jan Reedy        del cls.text, cls.auto_expand
296e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        if hasattr(cls, 'tk'):
306e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy            cls.tk.destroy()
316e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy            del cls.tk
326e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
336e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy    def tearDown(self):
346e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        self.text.delete('1.0', 'end')
356e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
366e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy    def test_get_prevword(self):
376e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text = self.text
386e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        previous = self.auto_expand.getprevword
396e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal = self.assertEqual
406e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
416e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), '')
426e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
436e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.insert('insert', 't')
446e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 't')
456e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
466e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.insert('insert', 'his')
476e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 'this')
486e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
496e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.insert('insert', ' ')
506e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), '')
516e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
526e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.insert('insert', 'is')
536e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 'is')
546e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
556e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.insert('insert', '\nsample\nstring')
566e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 'string')
576e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
586e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.delete('3.0', 'insert')
596e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), '')
606e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
616e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.delete('1.0', 'end')
626e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), '')
636e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
646e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy    def test_before_only(self):
656e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        previous = self.auto_expand.getprevword
666e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand = self.auto_expand.expand_word_event
676e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal = self.assertEqual
686e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
696e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        self.text.insert('insert', 'ab ac bx ad ab a')
706e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(self.auto_expand.getwords(), ['ab', 'ad', 'ac', 'a'])
716e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand('event')
726e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 'ab')
736e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand('event')
746e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 'ad')
756e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand('event')
766e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 'ac')
776e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand('event')
786e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 'a')
796e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
806e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy    def test_after_only(self):
816e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        # Also add punctuation 'noise' that shoud be ignored.
826e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text = self.text
836e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        previous = self.auto_expand.getprevword
846e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand = self.auto_expand.expand_word_event
856e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal = self.assertEqual
866e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
876e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.insert('insert', 'a, [ab] ac: () bx"" cd ac= ad ya')
886e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.mark_set('insert', '1.1')
896e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(self.auto_expand.getwords(), ['ab', 'ac', 'ad', 'a'])
906e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand('event')
916e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 'ab')
926e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand('event')
936e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 'ac')
946e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand('event')
956e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 'ad')
966e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand('event')
976e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 'a')
986e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
996e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy    def test_both_before_after(self):
1006e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text = self.text
1016e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        previous = self.auto_expand.getprevword
1026e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand = self.auto_expand.expand_word_event
1036e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal = self.assertEqual
1046e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
1056e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.insert('insert', 'ab xy yz\n')
1066e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.insert('insert', 'a ac by ac')
1076e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
1086e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.mark_set('insert', '2.1')
1096e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(self.auto_expand.getwords(), ['ab', 'ac', 'a'])
1106e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand('event')
1116e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 'ab')
1126e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand('event')
1136e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 'ac')
1146e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand('event')
1156e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(previous(), 'a')
1166e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
1176e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy    def test_other_expand_cases(self):
1186e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text = self.text
1196e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand = self.auto_expand.expand_word_event
1206e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal = self.assertEqual
1216e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
1226e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        # no expansion candidate found
1236e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(self.auto_expand.getwords(), [])
1246e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(expand('event'), 'break')
1256e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
1266e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.insert('insert', 'bx cy dz a')
1276e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        equal(self.auto_expand.getwords(), [])
1286e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
1296e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        # reset state by successfully expanding once
1306e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        # move cursor to another position and expand again
1316e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.insert('insert', 'ac xy a ac ad a')
1326e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.mark_set('insert', '1.7')
1336e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand('event')
1346e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        initial_state = self.auto_expand.state
1356e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        text.mark_set('insert', '1.end')
1366e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        expand('event')
1376e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        new_state = self.auto_expand.state
1386e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy        self.assertNotEqual(initial_state, new_state)
1396e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy
1406e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedyif __name__ == '__main__':
1416e66cb03b7b8ee12d95f66175fe8061cdb188fa4Terry Jan Reedy    unittest.main(verbosity=2)
142