Skip to content

Commit 3ac77a3

Browse files
committed
Window direct key simulated behaviour tests.
1 parent f9503ba commit 3ac77a3

File tree

3 files changed

+75
-2
lines changed

3 files changed

+75
-2
lines changed

src/aturtle/window.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,11 @@ def _direct_key_release(self, event):
201201
"""
202202
keysym = event.keysym
203203
# Idle handler will only run when key is raised.
204-
after_id = self._tk_window.after_idle(self._direct_handle_release, event)
204+
after_id = self._tk_window.after_idle(self._direct_key_idle, event)
205205
self._direct_key_after_ids[keysym] = after_id
206206

207207

208-
def _direct_handle_release(self, event):
208+
def _direct_key_idle(self, event):
209209
"""
210210
Idle handler, called when keys are raised.
211211
"""

tests/fake_tkinter.py

+2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ def __init__(self, screen_width, screen_height):
4949
self._h = None
5050
self.bind = mock.Mock()
5151
self.unbind = mock.Mock()
52+
self.after_idle = mock.Mock()
53+
self.after_cancel = mock.Mock()
5254
self.update = mock.Mock()
5355
self.destroy = mock.Mock()
5456

tests/test_window.py

+71
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,77 @@ def test_unbind_direct_key_default_unbinds_all_direct_keys(self):
449449
self.assertEqual(len(unbind_call_args), 4, 'unbind call count')
450450

451451

452+
def _event(self, keysym):
453+
454+
event = mock.Mock()
455+
event.keysym = keysym
456+
return event
457+
458+
459+
def test_bind_direct_key_press_and_release(self):
460+
461+
press_cb = mock.Mock()
462+
release_cb = mock.Mock()
463+
self.w.bind_direct_key('a', press_cb, release_cb)
464+
465+
# KeyPress event.
466+
event = self._event('a')
467+
self.w._direct_key_press(event)
468+
469+
# Press callback called.
470+
press_cb.assert_called_once()
471+
press_cb.assert_called_with(event)
472+
release_cb.assert_not_called()
473+
474+
press_cb.reset_mock()
475+
476+
# KeyRelease event. Not held down so _direct_key_idle called.
477+
self.w._direct_key_release(event)
478+
self.w._direct_key_idle(event)
479+
480+
# Release callback called.
481+
press_cb.assert_not_called()
482+
release_cb.assert_called_once()
483+
release_cb.assert_called_with(event)
484+
485+
486+
def test_bind_direct_key_press_hold_and_release(self):
487+
488+
press_cb = mock.Mock()
489+
release_cb = mock.Mock()
490+
self.w.bind_direct_key('a', press_cb, release_cb)
491+
492+
# KeyPress event.
493+
event = self._event('a')
494+
self.w._direct_key_press(event)
495+
496+
# Press callback called.
497+
press_cb.assert_called_once()
498+
press_cb.assert_called_with(event)
499+
release_cb.assert_not_called()
500+
501+
press_cb.reset_mock()
502+
503+
# Holding the key triggers KeyPress/KeyReleases repeatedly.
504+
# But never idle, so _direct_key_idle never called.
505+
for _ in range(10):
506+
self.w._direct_key_release(event)
507+
self.w._direct_key_press(event)
508+
509+
# No callbacks while key held down.
510+
press_cb.assert_not_called()
511+
release_cb.assert_not_called()
512+
513+
# Last KeyRelease event. Not held down so _direct_key_idle called.
514+
self.w._direct_key_release(event)
515+
self.w._direct_key_idle(event)
516+
517+
# Release callback called.
518+
press_cb.assert_not_called()
519+
release_cb.assert_called_once()
520+
release_cb.assert_called_with(event)
521+
522+
452523

453524
class TestMultipleWindows(FakedTkinterTestCase):
454525

0 commit comments

Comments
 (0)