1import unittest 2import tkinter 3from test import support 4from tkinter.test.support import AbstractTkTest, AbstractDefaultRootTest 5 6support.requires('gui') 7 8class MiscTest(AbstractTkTest, unittest.TestCase): 9 10 def test_all(self): 11 self.assertIn("Widget", tkinter.__all__) 12 # Check that variables from tkinter.constants are also in tkinter.__all__ 13 self.assertIn("CASCADE", tkinter.__all__) 14 self.assertIsNotNone(tkinter.CASCADE) 15 # Check that sys, re, and constants are not in tkinter.__all__ 16 self.assertNotIn("re", tkinter.__all__) 17 self.assertNotIn("sys", tkinter.__all__) 18 self.assertNotIn("constants", tkinter.__all__) 19 # Check that an underscored functions is not in tkinter.__all__ 20 self.assertNotIn("_tkerror", tkinter.__all__) 21 # Check that wantobjects is not in tkinter.__all__ 22 self.assertNotIn("wantobjects", tkinter.__all__) 23 24 def test_repr(self): 25 t = tkinter.Toplevel(self.root, name='top') 26 f = tkinter.Frame(t, name='child') 27 self.assertEqual(repr(f), '<tkinter.Frame object .top.child>') 28 29 def test_generated_names(self): 30 t = tkinter.Toplevel(self.root) 31 f = tkinter.Frame(t) 32 f2 = tkinter.Frame(t) 33 b = tkinter.Button(f2) 34 for name in str(b).split('.'): 35 self.assertFalse(name.isidentifier(), msg=repr(name)) 36 37 def test_tk_setPalette(self): 38 root = self.root 39 root.tk_setPalette('black') 40 self.assertEqual(root['background'], 'black') 41 root.tk_setPalette('white') 42 self.assertEqual(root['background'], 'white') 43 self.assertRaisesRegex(tkinter.TclError, 44 '^unknown color name "spam"$', 45 root.tk_setPalette, 'spam') 46 47 root.tk_setPalette(background='black') 48 self.assertEqual(root['background'], 'black') 49 root.tk_setPalette(background='blue', highlightColor='yellow') 50 self.assertEqual(root['background'], 'blue') 51 self.assertEqual(root['highlightcolor'], 'yellow') 52 root.tk_setPalette(background='yellow', highlightColor='blue') 53 self.assertEqual(root['background'], 'yellow') 54 self.assertEqual(root['highlightcolor'], 'blue') 55 self.assertRaisesRegex(tkinter.TclError, 56 '^unknown color name "spam"$', 57 root.tk_setPalette, background='spam') 58 self.assertRaisesRegex(tkinter.TclError, 59 '^must specify a background color$', 60 root.tk_setPalette, spam='white') 61 self.assertRaisesRegex(tkinter.TclError, 62 '^must specify a background color$', 63 root.tk_setPalette, highlightColor='blue') 64 65 def test_after(self): 66 root = self.root 67 68 def callback(start=0, step=1): 69 nonlocal count 70 count = start + step 71 72 # Without function, sleeps for ms. 73 self.assertIsNone(root.after(1)) 74 75 # Set up with callback with no args. 76 count = 0 77 timer1 = root.after(0, callback) 78 self.assertIn(timer1, root.tk.call('after', 'info')) 79 (script, _) = root.tk.splitlist(root.tk.call('after', 'info', timer1)) 80 root.update() # Process all pending events. 81 self.assertEqual(count, 1) 82 with self.assertRaises(tkinter.TclError): 83 root.tk.call(script) 84 85 # Set up with callback with args. 86 count = 0 87 timer1 = root.after(0, callback, 42, 11) 88 root.update() # Process all pending events. 89 self.assertEqual(count, 53) 90 91 # Cancel before called. 92 timer1 = root.after(1000, callback) 93 self.assertIn(timer1, root.tk.call('after', 'info')) 94 (script, _) = root.tk.splitlist(root.tk.call('after', 'info', timer1)) 95 root.after_cancel(timer1) # Cancel this event. 96 self.assertEqual(count, 53) 97 with self.assertRaises(tkinter.TclError): 98 root.tk.call(script) 99 100 def test_after_idle(self): 101 root = self.root 102 103 def callback(start=0, step=1): 104 nonlocal count 105 count = start + step 106 107 # Set up with callback with no args. 108 count = 0 109 idle1 = root.after_idle(callback) 110 self.assertIn(idle1, root.tk.call('after', 'info')) 111 (script, _) = root.tk.splitlist(root.tk.call('after', 'info', idle1)) 112 root.update_idletasks() # Process all pending events. 113 self.assertEqual(count, 1) 114 with self.assertRaises(tkinter.TclError): 115 root.tk.call(script) 116 117 # Set up with callback with args. 118 count = 0 119 idle1 = root.after_idle(callback, 42, 11) 120 root.update_idletasks() # Process all pending events. 121 self.assertEqual(count, 53) 122 123 # Cancel before called. 124 idle1 = root.after_idle(callback) 125 self.assertIn(idle1, root.tk.call('after', 'info')) 126 (script, _) = root.tk.splitlist(root.tk.call('after', 'info', idle1)) 127 root.after_cancel(idle1) # Cancel this event. 128 self.assertEqual(count, 53) 129 with self.assertRaises(tkinter.TclError): 130 root.tk.call(script) 131 132 def test_after_cancel(self): 133 root = self.root 134 135 def callback(): 136 nonlocal count 137 count += 1 138 139 timer1 = root.after(5000, callback) 140 idle1 = root.after_idle(callback) 141 142 # No value for id raises a ValueError. 143 with self.assertRaises(ValueError): 144 root.after_cancel(None) 145 146 # Cancel timer event. 147 count = 0 148 (script, _) = root.tk.splitlist(root.tk.call('after', 'info', timer1)) 149 root.tk.call(script) 150 self.assertEqual(count, 1) 151 root.after_cancel(timer1) 152 with self.assertRaises(tkinter.TclError): 153 root.tk.call(script) 154 self.assertEqual(count, 1) 155 with self.assertRaises(tkinter.TclError): 156 root.tk.call('after', 'info', timer1) 157 158 # Cancel same event - nothing happens. 159 root.after_cancel(timer1) 160 161 # Cancel idle event. 162 count = 0 163 (script, _) = root.tk.splitlist(root.tk.call('after', 'info', idle1)) 164 root.tk.call(script) 165 self.assertEqual(count, 1) 166 root.after_cancel(idle1) 167 with self.assertRaises(tkinter.TclError): 168 root.tk.call(script) 169 self.assertEqual(count, 1) 170 with self.assertRaises(tkinter.TclError): 171 root.tk.call('after', 'info', idle1) 172 173 def test_clipboard(self): 174 root = self.root 175 root.clipboard_clear() 176 root.clipboard_append('Ùñî') 177 self.assertEqual(root.clipboard_get(), 'Ùñî') 178 root.clipboard_append('çōđě') 179 self.assertEqual(root.clipboard_get(), 'Ùñîçōđě') 180 root.clipboard_clear() 181 with self.assertRaises(tkinter.TclError): 182 root.clipboard_get() 183 184 def test_clipboard_astral(self): 185 root = self.root 186 root.clipboard_clear() 187 root.clipboard_append('������') 188 self.assertEqual(root.clipboard_get(), '������') 189 root.clipboard_append('��������') 190 self.assertEqual(root.clipboard_get(), '��������������') 191 root.clipboard_clear() 192 with self.assertRaises(tkinter.TclError): 193 root.clipboard_get() 194 195 def test_winfo_rgb(self): 196 root = self.root 197 rgb = root.winfo_rgb 198 199 # Color name. 200 self.assertEqual(rgb('red'), (65535, 0, 0)) 201 self.assertEqual(rgb('dark slate blue'), (18504, 15677, 35723)) 202 # #RGB - extends each 4-bit hex value to be 16-bit. 203 self.assertEqual(rgb('#F0F'), (0xFFFF, 0x0000, 0xFFFF)) 204 # #RRGGBB - extends each 8-bit hex value to be 16-bit. 205 self.assertEqual(rgb('#4a3c8c'), (0x4a4a, 0x3c3c, 0x8c8c)) 206 # #RRRRGGGGBBBB 207 self.assertEqual(rgb('#dede14143939'), (0xdede, 0x1414, 0x3939)) 208 # Invalid string. 209 with self.assertRaises(tkinter.TclError): 210 rgb('#123456789a') 211 # RGB triplet is invalid input. 212 with self.assertRaises(tkinter.TclError): 213 rgb((111, 78, 55)) 214 215 def test_event_repr_defaults(self): 216 e = tkinter.Event() 217 e.serial = 12345 218 e.num = '??' 219 e.height = '??' 220 e.keycode = '??' 221 e.state = 0 222 e.time = 123456789 223 e.width = '??' 224 e.x = '??' 225 e.y = '??' 226 e.char = '' 227 e.keysym = '??' 228 e.keysym_num = '??' 229 e.type = '100' 230 e.widget = '??' 231 e.x_root = '??' 232 e.y_root = '??' 233 e.delta = 0 234 self.assertEqual(repr(e), '<100 event>') 235 236 def test_event_repr(self): 237 e = tkinter.Event() 238 e.serial = 12345 239 e.num = 3 240 e.focus = True 241 e.height = 200 242 e.keycode = 65 243 e.state = 0x30405 244 e.time = 123456789 245 e.width = 300 246 e.x = 10 247 e.y = 20 248 e.char = 'A' 249 e.send_event = True 250 e.keysym = 'Key-A' 251 e.keysym_num = ord('A') 252 e.type = tkinter.EventType.Configure 253 e.widget = '.text' 254 e.x_root = 1010 255 e.y_root = 1020 256 e.delta = -1 257 self.assertEqual(repr(e), 258 "<Configure event send_event=True" 259 " state=Shift|Control|Button3|0x30000" 260 " keysym=Key-A keycode=65 char='A'" 261 " num=3 delta=-1 focus=True" 262 " x=10 y=20 width=300 height=200>") 263 264 def test_getboolean(self): 265 for v in 'true', 'yes', 'on', '1', 't', 'y', 1, True: 266 self.assertIs(self.root.getboolean(v), True) 267 for v in 'false', 'no', 'off', '0', 'f', 'n', 0, False: 268 self.assertIs(self.root.getboolean(v), False) 269 self.assertRaises(ValueError, self.root.getboolean, 'yea') 270 self.assertRaises(ValueError, self.root.getboolean, '') 271 self.assertRaises(TypeError, self.root.getboolean, None) 272 self.assertRaises(TypeError, self.root.getboolean, ()) 273 274 def test_mainloop(self): 275 log = [] 276 def callback(): 277 log.append(1) 278 self.root.after(100, self.root.quit) 279 self.root.after(100, callback) 280 self.root.mainloop(1) 281 self.assertEqual(log, []) 282 self.root.mainloop(0) 283 self.assertEqual(log, [1]) 284 self.assertTrue(self.root.winfo_exists()) 285 286 287class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): 288 289 def test_default_root(self): 290 self.assertIs(tkinter._support_default_root, True) 291 self.assertIsNone(tkinter._default_root) 292 root = tkinter.Tk() 293 root2 = tkinter.Tk() 294 root3 = tkinter.Tk() 295 self.assertIs(tkinter._default_root, root) 296 root2.destroy() 297 self.assertIs(tkinter._default_root, root) 298 root.destroy() 299 self.assertIsNone(tkinter._default_root) 300 root3.destroy() 301 self.assertIsNone(tkinter._default_root) 302 303 def test_no_default_root(self): 304 self.assertIs(tkinter._support_default_root, True) 305 self.assertIsNone(tkinter._default_root) 306 root = tkinter.Tk() 307 self.assertIs(tkinter._default_root, root) 308 tkinter.NoDefaultRoot() 309 self.assertIs(tkinter._support_default_root, False) 310 self.assertFalse(hasattr(tkinter, '_default_root')) 311 # repeated call is no-op 312 tkinter.NoDefaultRoot() 313 self.assertIs(tkinter._support_default_root, False) 314 self.assertFalse(hasattr(tkinter, '_default_root')) 315 root.destroy() 316 self.assertIs(tkinter._support_default_root, False) 317 self.assertFalse(hasattr(tkinter, '_default_root')) 318 root = tkinter.Tk() 319 self.assertIs(tkinter._support_default_root, False) 320 self.assertFalse(hasattr(tkinter, '_default_root')) 321 root.destroy() 322 323 def test_getboolean(self): 324 self.assertRaises(RuntimeError, tkinter.getboolean, '1') 325 root = tkinter.Tk() 326 self.assertIs(tkinter.getboolean('1'), True) 327 self.assertRaises(ValueError, tkinter.getboolean, 'yea') 328 root.destroy() 329 tkinter.NoDefaultRoot() 330 self.assertRaises(RuntimeError, tkinter.getboolean, '1') 331 332 def test_mainloop(self): 333 self.assertRaises(RuntimeError, tkinter.mainloop) 334 root = tkinter.Tk() 335 root.after_idle(root.quit) 336 tkinter.mainloop() 337 root.destroy() 338 tkinter.NoDefaultRoot() 339 self.assertRaises(RuntimeError, tkinter.mainloop) 340 341 342tests_gui = (MiscTest, DefaultRootTest) 343 344if __name__ == "__main__": 345 support.run_unittest(*tests_gui) 346