File: test_user_interface.py

package info (click to toggle)
input-remapper 2.1.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,856 kB
  • sloc: python: 27,277; sh: 191; xml: 33; makefile: 3
file content (113 lines) | stat: -rw-r--r-- 4,061 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import unittest
from unittest.mock import MagicMock

import gi
from evdev.ecodes import EV_KEY, KEY_A

gi.require_version("Gdk", "3.0")
gi.require_version("Gtk", "3.0")
gi.require_version("GLib", "2.0")
gi.require_version("GtkSource", "4")
from gi.repository import Gtk, Gdk, GLib

from inputremapper.gui.utils import gtk_iteration
from inputremapper.gui.messages.message_broker import MessageBroker, MessageType
from inputremapper.gui.user_interface import UserInterface
from inputremapper.configs.mapping import MappingData
from inputremapper.configs.input_config import InputCombination, InputConfig
from tests.lib.test_setup import test_setup


@test_setup
class TestUserInterface(unittest.TestCase):
    def setUp(self) -> None:
        self.message_broker = MessageBroker()
        self.controller_mock = MagicMock()
        self.user_interface = UserInterface(self.message_broker, self.controller_mock)

    def tearDown(self) -> None:
        super().tearDown()
        self.message_broker.signal(MessageType.terminate)
        GLib.timeout_add(0, self.user_interface.window.destroy)
        GLib.timeout_add(0, Gtk.main_quit)
        Gtk.main()

    def test_shortcut(self):
        mock = MagicMock()
        self.user_interface.shortcuts[Gdk.KEY_x] = mock

        event = Gdk.Event()
        event.key.keyval = Gdk.KEY_x
        event.key.state = Gdk.ModifierType.SHIFT_MASK
        self.user_interface.window.emit("key-press-event", event)
        gtk_iteration()
        mock.assert_not_called()

        event.key.state = Gdk.ModifierType.CONTROL_MASK
        self.user_interface.window.emit("key-press-event", event)
        gtk_iteration()
        mock.assert_called_once()

        mock.reset_mock()
        event.key.keyval = Gdk.KEY_y
        self.user_interface.window.emit("key-press-event", event)
        gtk_iteration()
        mock.assert_not_called()

    def test_connected_shortcuts(self):
        should_be_connected = {Gdk.KEY_q, Gdk.KEY_r, Gdk.KEY_Delete, Gdk.KEY_n}
        connected = set(self.user_interface.shortcuts.keys())
        self.assertEqual(connected, should_be_connected)

        self.assertIs(
            self.user_interface.shortcuts[Gdk.KEY_q], self.controller_mock.close
        )
        self.assertIs(
            self.user_interface.shortcuts[Gdk.KEY_r],
            self.controller_mock.refresh_groups,
        )
        self.assertIs(
            self.user_interface.shortcuts[Gdk.KEY_Delete],
            self.controller_mock.stop_injecting,
        )

    def test_connect_disconnect_shortcuts(self):
        mock = MagicMock()
        self.user_interface.shortcuts[Gdk.KEY_x] = mock

        event = Gdk.Event()
        event.key.keyval = Gdk.KEY_x
        event.key.state = Gdk.ModifierType.CONTROL_MASK
        self.user_interface.disconnect_shortcuts()
        self.user_interface.window.emit("key-press-event", event)
        gtk_iteration()
        mock.assert_not_called()

        self.user_interface.connect_shortcuts()
        gtk_iteration()
        self.user_interface.window.emit("key-press-event", event)
        gtk_iteration()
        mock.assert_called_once()

    def test_combination_label_shows_combination(self):
        self.message_broker.publish(
            MappingData(
                input_combination=InputCombination(
                    [InputConfig(type=EV_KEY, code=KEY_A)]
                ),
                name="foo",
            )
        )
        gtk_iteration()
        label: Gtk.Label = self.user_interface.get("combination-label")
        self.assertEqual(label.get_text(), "a")
        self.assertEqual(label.get_opacity(), 1)

    def test_combination_label_shows_text_when_empty_mapping(self):
        self.message_broker.publish(MappingData())
        gtk_iteration()
        label: Gtk.Label = self.user_interface.get("combination-label")
        self.assertEqual(label.get_text(), "no input configured")

        # 0.5 != 0.501960..., for whatever reason this number is all screwed up
        self.assertAlmostEqual(label.get_opacity(), 0.5, delta=0.1)