Commit 881ccc36 authored by Benjamin Tissoires's avatar Benjamin Tissoires
Browse files

selftests/hid: tablets: move move_to function to PenDigitizer



We can easily subclass PenDigitizer for introducing firmware bugs when
subclassing Pen is harder.

Move move_to from Pen to PenDigitizer so we get that ability

Reviewed-by: default avatarPeter Hutterer <peter.hutterer@who-t.net>
Acked-by: default avatarJiri Kosina <jkosina@suse.com>
Link: https://lore.kernel.org/r/20231206-wip-selftests-v2-6-c0350c2f5986@kernel.org


Signed-off-by: default avatarBenjamin Tissoires <bentiss@kernel.org>
parent d52f5206
Loading
Loading
Loading
Loading
+50 −47
Original line number Diff line number Diff line
@@ -282,7 +282,7 @@ class Pen(object):
        self._old_values = None
        self.current_state = None

    def _restore(self):
    def restore(self):
        if self._old_values is not None:
            for i in [
                "x",
@@ -297,50 +297,8 @@ class Pen(object):
            ]:
                setattr(self, i, getattr(self._old_values, i))

    def move_to(self, state):
        # fill in the previous values
        if self.current_state == PenState.PEN_IS_OUT_OF_RANGE:
            self._restore()

        print(f"\n  *** pen is moving to {state} ***")

        if state == PenState.PEN_IS_OUT_OF_RANGE:
    def backup(self):
        self._old_values = copy.copy(self)
            self.x = 0
            self.y = 0
            self.tipswitch = False
            self.tippressure = 0
            self.azimuth = 0
            self.inrange = False
            self.width = 0
            self.height = 0
            self.invert = False
            self.eraser = False
            self.x_tilt = 0
            self.y_tilt = 0
            self.twist = 0
        elif state == PenState.PEN_IS_IN_RANGE:
            self.tipswitch = False
            self.inrange = True
            self.invert = False
            self.eraser = False
        elif state == PenState.PEN_IS_IN_CONTACT:
            self.tipswitch = True
            self.inrange = True
            self.invert = False
            self.eraser = False
        elif state == PenState.PEN_IS_IN_RANGE_WITH_ERASING_INTENT:
            self.tipswitch = False
            self.inrange = True
            self.invert = True
            self.eraser = False
        elif state == PenState.PEN_IS_ERASING:
            self.tipswitch = False
            self.inrange = True
            self.invert = True
            self.eraser = True

        self.current_state = state

    def __assert_axis(self, evdev, axis, value):
        if (
@@ -384,6 +342,51 @@ class PenDigitizer(base.UHIDTestDevice):
                    continue
                self.fields = [f.usage_name for f in r]

    def move_to(self, pen, state):
        # fill in the previous values
        if pen.current_state == PenState.PEN_IS_OUT_OF_RANGE:
            pen.restore()

        print(f"\n  *** pen is moving to {state} ***")

        if state == PenState.PEN_IS_OUT_OF_RANGE:
            pen.backup()
            pen.x = 0
            pen.y = 0
            pen.tipswitch = False
            pen.tippressure = 0
            pen.azimuth = 0
            pen.inrange = False
            pen.width = 0
            pen.height = 0
            pen.invert = False
            pen.eraser = False
            pen.x_tilt = 0
            pen.y_tilt = 0
            pen.twist = 0
        elif state == PenState.PEN_IS_IN_RANGE:
            pen.tipswitch = False
            pen.inrange = True
            pen.invert = False
            pen.eraser = False
        elif state == PenState.PEN_IS_IN_CONTACT:
            pen.tipswitch = True
            pen.inrange = True
            pen.invert = False
            pen.eraser = False
        elif state == PenState.PEN_IS_IN_RANGE_WITH_ERASING_INTENT:
            pen.tipswitch = False
            pen.inrange = True
            pen.invert = True
            pen.eraser = False
        elif state == PenState.PEN_IS_ERASING:
            pen.tipswitch = False
            pen.inrange = True
            pen.invert = True
            pen.eraser = True

        pen.current_state = state

    def event(self, pen):
        rs = []
        r = self.create_report(application=self.cur_application, data=pen)
@@ -462,7 +465,7 @@ class BaseTest:
            cur_state = PenState.PEN_IS_OUT_OF_RANGE

            p = Pen(50, 60)
            p.move_to(PenState.PEN_IS_OUT_OF_RANGE)
            uhdev.move_to(p, PenState.PEN_IS_OUT_OF_RANGE)
            events = self.post(uhdev, p)
            self.validate_transitions(cur_state, p, evdev, events)

@@ -475,7 +478,7 @@ class BaseTest:
                    events = self.post(uhdev, p)
                    self.validate_transitions(cur_state, p, evdev, events)
                    assert len(events) >= 3  # X, Y, SYN
                p.move_to(state)
                uhdev.move_to(p, state)
                if scribble and state != PenState.PEN_IS_OUT_OF_RANGE:
                    p.x += 1
                    p.y -= 1