summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2013-01-11 11:47:34 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2013-02-25 08:35:24 +1000
commit879f0195c6174bbf9b9b621dd876c36237209cab (patch)
tree4544d373dfbc87db9dfa936c79335261a39aa0b7
parent676b62af8cc28755e4b17b5b0d2d78f0704ebcfd (diff)
device: add HasEvent() and GetAbsData()
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--include/xorg/gtest/evemu/xorg-gtest-device.h25
-rw-r--r--src/device.cpp21
-rw-r--r--test/SynPS2-Synaptics-TouchPad.desc33
-rw-r--r--test/device-test.cpp167
4 files changed, 246 insertions, 0 deletions
diff --git a/include/xorg/gtest/evemu/xorg-gtest-device.h b/include/xorg/gtest/evemu/xorg-gtest-device.h
index 60087dd..61a9c01 100644
--- a/include/xorg/gtest/evemu/xorg-gtest-device.h
+++ b/include/xorg/gtest/evemu/xorg-gtest-device.h
@@ -102,6 +102,31 @@ class Device {
*/
const std::string& GetDeviceNode(void);
+ /**
+ * Check if a device supports a specific event.
+ *
+ * @param [in] type Type of the event (EV_REL, EV_ABS, ...)
+ * @param [in] code Event code (ABS_X, REL_Y, ...)
+ *
+ * @return true if this device supports this event or false otherwise.
+ */
+ bool HasEvent(int type, int code);
+
+ /**
+ * Retrieve data about an absolute axis on this device.
+ *
+ * @param [in] code The axis to query (e.g. ABS_X)
+ * @param [out] min Min value for this axis
+ * @param [out] max Max value for this axis
+ * @param [out] fuzz Fuzz value for this axis
+ * @param [out] flat Flat value for this axis
+ * @param [out] resolution Resolution of this axis
+ *
+ * @return false if this device doesn't have this axis, or true on success
+ */
+ bool GetAbsData(int code, int *min, int *max, int *fuzz = NULL, int *flat = NULL, int *resolution = NULL);
+
+
private:
struct Private;
std::auto_ptr<Private> d_;
diff --git a/src/device.cpp b/src/device.cpp
index ea98d17..a57864d 100644
--- a/src/device.cpp
+++ b/src/device.cpp
@@ -236,6 +236,27 @@ void xorg::testing::evemu::Device::PlayOne(int type, int code, int value, bool s
}
}
+bool xorg::testing::evemu::Device::HasEvent(int type, int code)
+{
+ return evemu_has_event(d_->device, type, code);
+}
+
+bool xorg::testing::evemu::Device::GetAbsData(int code, int *min, int *max, int *fuzz, int *flat, int *resolution)
+{
+ if (!HasEvent(EV_ABS, code))
+ return false;
+
+ *min = evemu_get_abs_minimum(d_->device, code);
+ *max = evemu_get_abs_maximum(d_->device, code);
+ if (fuzz)
+ *fuzz = evemu_get_abs_fuzz(d_->device, code);
+ if (flat)
+ *flat = evemu_get_abs_flat(d_->device, code);
+ if (resolution)
+ *resolution = evemu_get_abs_resolution(d_->device, code);
+ return true;
+}
+
const std::string& xorg::testing::evemu::Device::GetDeviceNode(void) {
if (d_->device_node.empty())
GuessDeviceNode(d_->ctime);
diff --git a/test/SynPS2-Synaptics-TouchPad.desc b/test/SynPS2-Synaptics-TouchPad.desc
new file mode 100644
index 0000000..3f4982b
--- /dev/null
+++ b/test/SynPS2-Synaptics-TouchPad.desc
@@ -0,0 +1,33 @@
+N: SynPS/2 Synaptics TouchPad
+I: 0011 0002 0007 01b1
+P: 05 00 00 00 00 00 00 00
+B: 00 0b 00 00 00 00 00 00 00
+B: 01 00 00 00 00 00 00 00 00
+B: 01 00 00 00 00 00 00 00 00
+B: 01 00 00 00 00 00 00 00 00
+B: 01 00 00 00 00 00 00 00 00
+B: 01 00 00 01 00 00 00 00 00
+B: 01 20 e5 00 00 00 00 00 00
+B: 01 00 00 00 00 00 00 00 00
+B: 01 00 00 00 00 00 00 00 00
+B: 01 00 00 00 00 00 00 00 00
+B: 01 00 00 00 00 00 00 00 00
+B: 01 00 00 00 00 00 00 00 00
+B: 01 00 00 00 00 00 00 00 00
+B: 02 00 00 00 00 00 00 00 00
+B: 03 03 00 00 11 00 80 60 06
+B: 04 00 00 00 00 00 00 00 00
+B: 05 00 00 00 00 00 00 00 00
+B: 11 00 00 00 00 00 00 00 00
+B: 12 00 00 00 00 00 00 00 00
+B: 15 00 00 00 00 00 00 00 00
+B: 15 00 00 00 00 00 00 00 00
+A: 00 1472 5472 8 0
+A: 01 1408 4448 8 0
+A: 18 0 255 0 0
+A: 1c 0 15 0 0
+A: 2f 0 1 0 0
+A: 35 1472 5472 8 0
+A: 36 1408 4448 8 0
+A: 39 0 65535 0 0
+A: 3a 0 255 0 0
diff --git a/test/device-test.cpp b/test/device-test.cpp
index 47ddb26..b7b411b 100644
--- a/test/device-test.cpp
+++ b/test/device-test.cpp
@@ -2,6 +2,9 @@
#include <xorg/gtest/xorg-gtest.h>
#ifdef HAVE_EVEMU
+#ifndef BTN_TOOL_QUINTTAP
+#define BTN_TOOL_QUINTTAP 0x148
+#endif
using namespace xorg::testing;
@@ -24,6 +27,170 @@ TEST(Device, InotifyWait)
ASSERT_FALSE(d.GetDeviceNode().empty());
}
+TEST(Device, HasEvent)
+{
+ XORG_TESTCASE("HasEvent must return the right bits.\n");
+
+ xorg::testing::evemu::Device d(TEST_ROOT_DIR "PIXART-USB-OPTICAL-MOUSE.desc");
+
+ for (int i = ABS_X; i < ABS_MAX; i++)
+ ASSERT_FALSE(d.HasEvent(EV_ABS, i)) << "Axis code " << i;
+
+ for (int i = REL_X; i < REL_MAX; i++) {
+ if (i == REL_X || i == REL_Y || i == REL_WHEEL)
+ ASSERT_TRUE(d.HasEvent(EV_REL, i)) << "Axis code " << i;
+ else
+ ASSERT_FALSE(d.HasEvent(EV_REL, i)) << "Axis code " << i;
+ }
+
+ for (int i = BTN_LEFT; i < KEY_MAX; i++) {
+ if (i == BTN_LEFT || i == BTN_RIGHT || i == BTN_MIDDLE)
+ ASSERT_TRUE(d.HasEvent(EV_KEY, i)) << "Axis code " << i;
+ else
+ ASSERT_FALSE(d.HasEvent(EV_KEY, i)) << "Axis code " << i;
+ }
+
+ xorg::testing::evemu::Device d2(TEST_ROOT_DIR "SynPS2-Synaptics-TouchPad.desc");
+
+ for (int i = REL_X; i < REL_MAX; i++)
+ ASSERT_FALSE(d2.HasEvent(EV_REL, i)) << "Axis code " << i;
+
+ for (int i = ABS_X; i < ABS_MAX; i++) {
+ switch (i) {
+ case ABS_X:
+ case ABS_Y:
+ case ABS_PRESSURE:
+ case ABS_TOOL_WIDTH:
+ case ABS_MT_SLOT:
+ case ABS_MT_POSITION_X:
+ case ABS_MT_POSITION_Y:
+ case ABS_MT_TRACKING_ID:
+ case ABS_MT_PRESSURE:
+ ASSERT_TRUE(d2.HasEvent(EV_ABS, i)) << "Axis code " << i;
+ break;
+ default:
+ ASSERT_FALSE(d2.HasEvent(EV_REL, i)) << "Axis code " << i;
+ break;
+
+ }
+ }
+
+ for (int i = BTN_LEFT; i < KEY_MAX; i++) {
+ switch (i) {
+ case BTN_LEFT:
+ case BTN_TOOL_FINGER:
+ case BTN_TOOL_QUINTTAP:
+ case BTN_TOUCH:
+ case BTN_TOOL_DOUBLETAP:
+ case BTN_TOOL_TRIPLETAP:
+ case BTN_TOOL_QUADTAP:
+ ASSERT_TRUE(d2.HasEvent(EV_KEY, i)) << "Axis code " << i;
+ break;
+ default:
+ ASSERT_FALSE(d2.HasEvent(EV_KEY, i)) << "Axis code " << i;
+ }
+ }
+
+}
+
+TEST(Device, AbsAxisData) {
+ XORG_TESTCASE("GetAbsData must return the right values.\n");
+
+ xorg::testing::evemu::Device d(TEST_ROOT_DIR "SynPS2-Synaptics-TouchPad.desc");
+
+ const int DEFAULT = -3;
+
+ for (int i = ABS_X; i < ABS_MAX; i++) {
+ int min = 0, max = 0, fuzz = 0, flat = 0, resolution = 0;
+ bool axis_exists = 1;
+
+ switch (i) {
+ case ABS_X:
+ case ABS_MT_POSITION_X:
+ min = 1472;
+ max = 5472;
+ fuzz = 8;
+ break;
+ case ABS_Y:
+ case ABS_MT_POSITION_Y:
+ min = 1408;
+ max = 4448;
+ fuzz = 8;
+ break;
+ case ABS_PRESSURE:
+ min = 0;
+ max = 255;
+ break;
+ case ABS_TOOL_WIDTH:
+ min = 0;
+ max = 15;
+ break;
+ case ABS_MT_SLOT:
+ min = 0;
+ max = 1;
+ break;
+ case ABS_MT_TRACKING_ID:
+ min = 0;
+ max = 65535;
+ break;
+ case ABS_MT_PRESSURE:
+ min = 0;
+ max = 255;
+ break;
+ default:
+ axis_exists = false;
+ break;
+ }
+
+ if (axis_exists) {
+ int min_ret = min;
+ int max_ret = max;
+ int fuzz_ret = fuzz;
+ int flat_ret = flat;
+ int res_ret = resolution;
+
+ ASSERT_TRUE(d.GetAbsData(i, &min_ret, &max_ret)) << "Axis code " << i;
+ ASSERT_EQ(min, min_ret);
+ ASSERT_EQ(max, max_ret);
+
+ ASSERT_TRUE(d.GetAbsData(i, &min_ret, &max_ret, &fuzz)) << "Axis code " << i;
+ ASSERT_EQ(min, min_ret);
+ ASSERT_EQ(max, max_ret);
+ ASSERT_EQ(fuzz, fuzz_ret);
+
+ ASSERT_TRUE(d.GetAbsData(i, &min_ret, &max_ret, &fuzz, &flat)) << "Axis code " << i;
+ ASSERT_EQ(min, min_ret);
+ ASSERT_EQ(max, max_ret);
+ ASSERT_EQ(fuzz, fuzz_ret);
+ ASSERT_EQ(flat, flat_ret);
+
+ ASSERT_TRUE(d.GetAbsData(i, &min_ret, &max_ret, &fuzz, &flat, &res_ret)) << "Axis code " << i;
+ ASSERT_EQ(min, min_ret);
+ ASSERT_EQ(max, max_ret);
+ ASSERT_EQ(fuzz, fuzz_ret);
+ ASSERT_EQ(flat, flat_ret);
+ ASSERT_EQ(res_ret, resolution);
+ } else {
+ min = DEFAULT;
+ max = DEFAULT;
+ fuzz = DEFAULT;
+ flat = DEFAULT;
+ resolution = DEFAULT;
+
+ ASSERT_FALSE(d.GetAbsData(i, &min, &max)) << "Axis code " << i;
+
+ /* make sure we didn't overwrite the values */
+ ASSERT_EQ(min, DEFAULT);
+ ASSERT_EQ(max, DEFAULT);
+ ASSERT_EQ(fuzz, DEFAULT);
+ ASSERT_EQ(flat, DEFAULT);
+ ASSERT_EQ(resolution, DEFAULT);
+ }
+
+ }
+}
+
+
#endif
int main(int argc, char *argv[]) {