diff --git a/internal/mappingrules/mapping_rule_axis_to_button.go b/internal/mappingrules/mapping_rule_axis_to_button.go index ec4145c..0873913 100644 --- a/internal/mappingrules/mapping_rule_axis_to_button.go +++ b/internal/mappingrules/mapping_rule_axis_to_button.go @@ -8,8 +8,6 @@ import ( // MappingRuleAxisToButton represents a rule that converts an axis input into a (potentially repeating) // button output. -// -// TODO: Add Tests type MappingRuleAxisToButton struct { MappingRuleBase Input *RuleTargetAxis @@ -38,9 +36,8 @@ func NewMappingRuleAxisToButton(base MappingRuleBase, input *RuleTargetAxis, out } } -func (rule *MappingRuleAxisToButton) MatchEvent(device *evdev.InputDevice, event *evdev.InputEvent, mode *string) (*evdev.InputDevice, *evdev.InputEvent) { - // TODO: we're using this instead of the RuleTarget's MatchEvent because we need to check inside the deadzone - // We should find a cleaner way to do this... +func (rule *MappingRuleAxisToButton) MatchEvent(device RuleTargetDevice, event *evdev.InputEvent, mode *string) (*evdev.InputDevice, *evdev.InputEvent) { + if !rule.MappingRuleBase.modeCheck(mode) || !rule.Input.MatchEventDeviceAndCode(device, event) { return nil, nil diff --git a/internal/mappingrules/mapping_rule_axis_to_button_test.go b/internal/mappingrules/mapping_rule_axis_to_button_test.go new file mode 100644 index 0000000..a79f64f --- /dev/null +++ b/internal/mappingrules/mapping_rule_axis_to_button_test.go @@ -0,0 +1,59 @@ +package mappingrules + +import ( + "github.com/holoplot/go-evdev" + "github.com/stretchr/testify/suite" +) + +type MappingRuleAxisToButtonTests struct { + suite.Suite + inputDevice *InputDeviceMock + inputRule *RuleTargetAxis + outputDevice *evdev.InputDevice + outputRule *RuleTargetButton + mode *string + base MappingRuleBase +} + +func (t *MappingRuleAxisToButtonTests) SetupTest() { + mode := "*" + t.mode = &mode + t.inputDevice = new(InputDeviceMock) + t.inputDevice.On("AbsInfos").Return(map[evdev.EvCode]evdev.AbsInfo{ + evdev.ABS_X: { + Minimum: 0, + Maximum: 10000, + }, + }, nil) + t.inputRule, _ = NewRuleTargetAxis("test-input", t.inputDevice, evdev.ABS_X, false, int32(0), int32(1000)) + + t.outputDevice = &evdev.InputDevice{} + t.outputRule, _ = NewRuleTargetButton("test-output", t.outputDevice, evdev.ABS_X, false) + t.base = NewMappingRuleBase("", []string{"*"}) +} + +func (t *MappingRuleAxisToButtonTests) TestMatchEvent() { + testRule := NewMappingRuleAxisToButton(t.base, t.inputRule, t.outputRule, 0, 0) + + // A valid input should set a nextevent + testRule.MatchEvent(t.inputDevice, &evdev.InputEvent{ + Type: evdev.EV_ABS, + Code: evdev.ABS_X, + Value: 1001, + }, t.mode) + t.NotEqual(NoNextEvent, testRule.nextEvent) + + // And a deadzone value should clear it + testRule.MatchEvent(t.inputDevice, &evdev.InputEvent{ + Type: evdev.EV_ABS, + Code: evdev.ABS_X, + Value: 500, + }, t.mode) + t.Equal(NoNextEvent, testRule.nextEvent) + + // TODO: more tests here... check repeats +} + +func (t *MappingRuleAxisToButtonTests) TestTimerEvent() { + // STUB +} diff --git a/internal/mappingrules/rule_target_axis_test.go b/internal/mappingrules/rule_target_axis_test.go index 6d6e632..b4bb4c0 100644 --- a/internal/mappingrules/rule_target_axis_test.go +++ b/internal/mappingrules/rule_target_axis_test.go @@ -15,15 +15,6 @@ type RuleTargetAxisTests struct { call *mock.Call } -type InputDeviceMock struct { - mock.Mock -} - -func (m *InputDeviceMock) AbsInfos() (map[evdev.EvCode]evdev.AbsInfo, error) { - args := m.Called() - return args.Get(0).(map[evdev.EvCode]evdev.AbsInfo), args.Error(1) -} - func (t *RuleTargetAxisTests) SetupTest() { t.mock = new(InputDeviceMock) t.call = t.mock.On("AbsInfos").Return(map[evdev.EvCode]evdev.AbsInfo{ diff --git a/internal/mappingrules/test_mocks.go b/internal/mappingrules/test_mocks.go new file mode 100644 index 0000000..9838731 --- /dev/null +++ b/internal/mappingrules/test_mocks.go @@ -0,0 +1,15 @@ +package mappingrules + +import ( + "github.com/holoplot/go-evdev" + "github.com/stretchr/testify/mock" +) + +type InputDeviceMock struct { + mock.Mock +} + +func (m *InputDeviceMock) AbsInfos() (map[evdev.EvCode]evdev.AbsInfo, error) { + args := m.Called() + return args.Get(0).(map[evdev.EvCode]evdev.AbsInfo), args.Error(1) +}