1'''Test (selected) IDLE Edit menu items.
2
3Edit modules have their own test files
4'''
5from test.support import requires
6requires('gui')
7import tkinter as tk
8from tkinter import ttk
9import unittest
10from idlelib import pyshell
11
12class PasteTest(unittest.TestCase):
13    '''Test pasting into widgets that allow pasting.
14
15    On X11, replacing selections requires tk fix.
16    '''
17    @classmethod
18    def setUpClass(cls):
19        cls.root = root = tk.Tk()
20        cls.root.withdraw()
21        pyshell.fix_x11_paste(root)
22        cls.text = tk.Text(root)
23        cls.entry = tk.Entry(root)
24        cls.tentry = ttk.Entry(root)
25        cls.spin = tk.Spinbox(root)
26        root.clipboard_clear()
27        root.clipboard_append('two')
28
29    @classmethod
30    def tearDownClass(cls):
31        del cls.text, cls.entry, cls.tentry
32        cls.root.clipboard_clear()
33        cls.root.update_idletasks()
34        cls.root.destroy()
35        del cls.root
36
37    def test_paste_text(self):
38        "Test pasting into text with and without a selection."
39        text = self.text
40        for tag, ans in ('', 'onetwo\n'), ('sel', 'two\n'):
41            with self.subTest(tag=tag, ans=ans):
42                text.delete('1.0', 'end')
43                text.insert('1.0', 'one', tag)
44                text.event_generate('<<Paste>>')
45                self.assertEqual(text.get('1.0', 'end'), ans)
46
47    def test_paste_entry(self):
48        "Test pasting into an entry with and without a selection."
49        # Generated <<Paste>> fails for tk entry without empty select
50        # range for 'no selection'.  Live widget works fine.
51        for entry in self.entry, self.tentry:
52            for end, ans in (0, 'onetwo'), ('end', 'two'):
53                with self.subTest(entry=entry, end=end, ans=ans):
54                    entry.delete(0, 'end')
55                    entry.insert(0, 'one')
56                    entry.select_range(0, end)
57                    entry.event_generate('<<Paste>>')
58                    self.assertEqual(entry.get(), ans)
59
60    def test_paste_spin(self):
61        "Test pasting into a spinbox with and without a selection."
62        # See note above for entry.
63        spin = self.spin
64        for end, ans in (0, 'onetwo'), ('end', 'two'):
65            with self.subTest(end=end, ans=ans):
66                spin.delete(0, 'end')
67                spin.insert(0, 'one')
68                spin.selection('range', 0, end)  # see note
69                spin.event_generate('<<Paste>>')
70                self.assertEqual(spin.get(), ans)
71
72
73if __name__ == '__main__':
74    unittest.main(verbosity=2)
75