diff --git a/i3pystatus/core/modules.py b/i3pystatus/core/modules.py index 152f754..c9b66d9 100644 --- a/i3pystatus/core/modules.py +++ b/i3pystatus/core/modules.py @@ -40,8 +40,8 @@ class Module(SettingsBase): It then triggers the callback depending on the nature (ie type) of the callback variable: 1. if null callback, do nothing - 2. if it's a python function - 3. if it's a method of the current module + 2. if it's a python function () + 3. if it's the name of a method of the current module (string) To setup the callbacks, you can set the settings 'on_leftclick', 'on_rightclick', 'on_upscroll', 'on_downscroll'. @@ -58,6 +58,7 @@ class Module(SettingsBase): ], on_leftclick= ["urxvtc"] , # launch urxvtc on left click on_rightclick= ["scroll_format", 2] , # update format by steps of 2 + on_upscroll= [print, "hello world"] , # call python function print log_level=logging.DEBUG, ) """ diff --git a/tests/test_callbacks.py b/tests/test_callbacks.py new file mode 100644 index 0000000..5b2fbd0 --- /dev/null +++ b/tests/test_callbacks.py @@ -0,0 +1,68 @@ +import unittest + + +from i3pystatus.core.modules import Module + + +class CallbacksMetaTest(unittest.TestCase): + + valid_msg_count = "hello world" + notmuch_config = "notmuch-config" + + @staticmethod + def send_clicks(module): + # simulate click events for buttons 1 to 10 + for button in range(1, 10): + module.on_click(button) + + class NoDefaultCounter(Module): + + counter = 0 + + def update_counter(self, step=1): + self.counter = self.counter + step + + class WithDefaultsCounter(NoDefaultCounter): + on_leftclick = "update_counter" + on_rightclick = ["update_counter", 2] + on_upscroll = ["callable_callback", "i3 is", "awesome"] + on_downscroll = ["update_counter", -1] + + def test_count_is_correct(self): + """Checks module works in the intended way, ie increase correctly + a counter""" + counter = self.NoDefaultCounter() + self.assertEqual(counter.counter, 0) + counter.update_counter(1) + self.assertEqual(counter.counter, 1) + counter.update_counter(2) + self.assertEqual(counter.counter, 3) + counter.update_counter(-2) + self.assertEqual(counter.counter, 1) + + CallbacksMetaTest.send_clicks(counter) + + # retcode, out, err = run_through_shell("notmuch --config=%s new" % (self.notmuch_config), enable_shell=True) + + # self.assertEqual(out.strip(), self.valid_output) + def test_callback_set_post_instanciation(self): + + counter = self.NoDefaultCounter() + + # set callbacks + counter.on_leftclick = "update_counter" + counter.on_rightclick = ["update_counter", 2] + counter.on_upscroll = [print, "i3 is", "awesome"] + counter.on_downscroll = ["update_counter", -1] + + self.assertEqual(counter.counter, 0) + counter.on_click(1) # left_click + self.assertEqual(counter.counter, 1) + counter.on_click(2) # middle button + self.assertEqual(counter.counter, 1) + counter.on_click(3) # right click + self.assertEqual(counter.counter, 3) + counter.on_click(4) # upscroll + self.assertEqual(counter.counter, 3) + counter.on_click(5) # downscroll + self.assertEqual(counter.counter, 2)