OXYGENHUB
◆ main openmsx / src / unittest / AnalogInput_test.cc
5.7 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
e8555c89 Andy McCall 1
#include "catch.hpp"
2
#include "AnalogInput.hh"
3
4
#include <SDL.h>
5
6
using namespace openmsx;
7
8
TEST_CASE("AnalogInput: toString, parse")
9
{
10
	auto compare = [](const AnalogInput& input, const std::string& str) {
11
		auto str2 = toString(input);
12
		CHECK(str2 == str);
13
14
		auto input2 = parseAnalogInput(str);
15
		CHECK(input2);
16
		CHECK(*input2 == input);
17
	};
18
	using ID = JoystickId;
19
20
	SECTION("mouse axis") {
21
		compare(AnalogMouseAxis(0), "mouse X-axis");
22
		compare(AnalogMouseAxis(1), "mouse Y-axis");
23
		// alternative spelling
24
		CHECK(parseAnalogInput("mouse x-axis") == AnalogMouseAxis(0));
25
		CHECK(parseAnalogInput("mouse y-axis") == AnalogMouseAxis(1));
26
	}
27
	SECTION("joystick axis") {
28
		compare(AnalogJoystickAxis(ID(0), 1), "joy1 axis1");
29
		compare(AnalogJoystickAxis(ID(3), 2), "joy4 axis2");
30
	}
31
	SECTION("parse error") {
32
		CHECK(!parseAnalogInput("")); // no type
33
		CHECK(!parseAnalogInput("bla")); // invalid type
34
35
		CHECK(!parseAnalogInput("mouse")); // missing name
36
		CHECK(!parseAnalogInput("mouse invalid-key"));
37
		CHECK(!parseAnalogInput("mouse A-axis"));
38
		CHECK(!parseAnalogInput("mouse X-axis too-much"));
39
40
		CHECK(!parseAnalogInput("joyBLA")); // no number
41
		CHECK(!parseAnalogInput("joy2")); // missing axis
42
		CHECK(!parseAnalogInput("joy0 axis3")); // joy 0
43
		CHECK(!parseAnalogInput("joy2 bla")); // no axis
44
		CHECK(!parseAnalogInput("joy2 axisXYZ")); // no valid axis
45
		CHECK(!parseAnalogInput("joy2 axis256")); // axis does not fit in uint8_t
46
	}
47
}
48
49
TEST_CASE("AnalogInput: capture")
50
{
51
	auto getJoyDeadThreshold = [](JoystickId /*joystick*/) { return 8192; };
52
	auto check = [&](const Event& event, std::string_view expected) {
53
		auto input = captureAnalogInput(event, getJoyDeadThreshold);
54
		if (expected.empty()) {
55
			CHECK(!input);
56
		} else {
57
			CHECK(toString(*input) == expected);
58
		}
59
	};
60
61
	SDL_Event sdl = {};
62
63
	SECTION("mouse") {
64
		sdl.motion = SDL_MouseMotionEvent{};
65
		sdl.motion.type = SDL_MOUSEMOTION;
66
		sdl.motion.xrel = 0;
67
		sdl.motion.yrel = 0;
68
		sdl.motion.x = 30;
69
		sdl.motion.y = 40;
70
		check(MouseMotionEvent(sdl), "");
71
		sdl.motion.xrel = 10;
72
		sdl.motion.yrel = 2;
73
		check(MouseMotionEvent(sdl), "mouse X-axis");
74
		sdl.motion.xrel = 3;
75
		sdl.motion.yrel = -9;
76
		check(MouseMotionEvent(sdl), "mouse Y-axis");
77
	}
78
	SECTION("joystick") {
79
		sdl.jaxis = SDL_JoyAxisEvent{};
80
		sdl.jaxis.type = SDL_JOYAXISMOTION;
81
		sdl.jaxis.which = 2;
82
		sdl.jaxis.axis = 1;
83
		sdl.jaxis.value = 32000;
84
		check(JoystickAxisMotionEvent(sdl), "joy3 axis1");
85
		sdl.jaxis.value = -32000;
86
		check(JoystickAxisMotionEvent(sdl), "joy3 axis1");
87
		sdl.jaxis.value = 20; // close to center
88
		check(JoystickAxisMotionEvent(sdl), "");
89
	}
90
}
91
92
TEST_CASE("AnalogInput: match")
93
{
94
	// define various events
95
	SDL_Event sdl;
96
97
	sdl.motion = SDL_MouseMotionEvent{};
98
	sdl.motion.type = SDL_MOUSEMOTION;
99
	sdl.motion.xrel = 0;
100
	sdl.motion.yrel = 1; // small movement
101
	sdl.motion.x = 30;
102
	sdl.motion.y = 40;
103
	auto mouseCenter = MouseMotionEvent(sdl);
104
	sdl.motion.xrel = 0;
105
	sdl.motion.yrel = -15;
106
	auto mouseUp = MouseMotionEvent(sdl);
107
	sdl.motion.xrel = 0;
108
	sdl.motion.yrel = 8;
109
	auto mouseDown = MouseMotionEvent(sdl);
110
	sdl.motion.xrel = -9;
111
	sdl.motion.yrel = 0;
112
	auto mouseLeft = MouseMotionEvent(sdl);
113
	sdl.motion.xrel = 12;
114
	sdl.motion.yrel = 0;
115
	auto mouseRight = MouseMotionEvent(sdl);
116
117
	sdl.jaxis = SDL_JoyAxisEvent{};
118
	sdl.jaxis.type = SDL_JOYAXISMOTION;
119
	sdl.jaxis.which = 0;
120
	sdl.jaxis.axis = 1;
121
	sdl.jaxis.value = 1; // not fully center
122
	auto joyCenter = JoystickAxisMotionEvent(sdl);
123
	sdl.jaxis.axis = 2;
124
	sdl.jaxis.value = -20123;
125
	auto joyUp = JoystickAxisMotionEvent(sdl);
126
	sdl.jaxis.axis = 2;
127
	sdl.jaxis.value = 30789;
128
	auto joyDown = JoystickAxisMotionEvent(sdl);
129
	sdl.jaxis.axis = 1;
130
	sdl.jaxis.value = -30001;
131
	auto joyLeft = JoystickAxisMotionEvent(sdl);
132
	sdl.jaxis.axis = 1;
133
	sdl.jaxis.value = 20222;
134
	auto joyRight = JoystickAxisMotionEvent(sdl);
135
136
	// check against various BooleanInputs
137
	auto getJoyValue = [](JoystickId /*joystick*/, const JoystickAxisMotionEvent& e) {
138
		return (std::abs(e.getValue()) > 25) ? float(e.getValue()) : 0.0f;
139
	};
140
	auto check = [&](const std::optional<AnalogInput>& binding, const Event& event, std::optional<float> expected) {
141
		REQUIRE(binding);
142
		CHECK(match(*binding, event, getJoyValue) == expected);
143
	};
144
145
	auto bMouseXaxis = parseAnalogInput("mouse X-axis");
146
	check(bMouseXaxis, mouseCenter, 0);
147
	check(bMouseXaxis, mouseUp, 0);
148
	check(bMouseXaxis, mouseDown, 0);
149
	check(bMouseXaxis, mouseLeft, -9);
150
	check(bMouseXaxis, mouseRight, 12);
151
	check(bMouseXaxis, joyCenter, {});
152
	check(bMouseXaxis, joyUp, {});
153
	check(bMouseXaxis, joyDown, {});
154
	check(bMouseXaxis, joyLeft, {});
155
	check(bMouseXaxis, joyRight, {});
156
157
	auto bMouseYaxis = parseAnalogInput("mouse Y-axis");
158
	check(bMouseYaxis, mouseCenter, 0);
159
	check(bMouseYaxis, mouseUp, -15);
160
	check(bMouseYaxis, mouseDown, 8);
161
	check(bMouseYaxis, mouseLeft, 0);
162
	check(bMouseYaxis, mouseRight, 0);
163
	check(bMouseYaxis, joyCenter, {});
164
	check(bMouseYaxis, joyUp, {});
165
	check(bMouseYaxis, joyDown, {});
166
	check(bMouseYaxis, joyLeft, {});
167
	check(bMouseYaxis, joyRight, {});
168
169
	auto bJoy1Axis1 = parseAnalogInput("joy1 axis1");
170
	check(bJoy1Axis1, mouseCenter, {});
171
	check(bJoy1Axis1, mouseUp, {});
172
	check(bJoy1Axis1, mouseDown, {});
173
	check(bJoy1Axis1, mouseLeft, {});
174
	check(bJoy1Axis1, mouseRight, {});
175
	check(bJoy1Axis1, joyCenter, 0);
176
	check(bJoy1Axis1, joyUp, {});
177
	check(bJoy1Axis1, joyDown, {});
178
	check(bJoy1Axis1, joyLeft, -30001);
179
	check(bJoy1Axis1, joyRight, 20222);
180
181
	auto bJoy1Axis2 = parseAnalogInput("joy1 axis2");
182
	check(bJoy1Axis2, mouseCenter, {});
183
	check(bJoy1Axis2, mouseUp, {});
184
	check(bJoy1Axis2, mouseDown, {});
185
	check(bJoy1Axis2, mouseLeft, {});
186
	check(bJoy1Axis2, mouseRight, {});
187
	check(bJoy1Axis2, joyCenter, {});
188
	check(bJoy1Axis2, joyUp, -20123);
189
	check(bJoy1Axis2, joyDown, 30789);
190
	check(bJoy1Axis2, joyLeft, {});
191
	check(bJoy1Axis2, joyRight, {});
192
}