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