1c0abf9e6Sopenharmony_ci// SPDX-License-Identifier: MIT
2c0abf9e6Sopenharmony_ci/*
3c0abf9e6Sopenharmony_ci * Copyright © 2019 Red Hat, Inc.
4c0abf9e6Sopenharmony_ci */
5c0abf9e6Sopenharmony_ci
6c0abf9e6Sopenharmony_ci#include "config.h"
7c0abf9e6Sopenharmony_ci#include "test-common.h"
8c0abf9e6Sopenharmony_ci
9c0abf9e6Sopenharmony_ciSTART_TEST(test_info)
10c0abf9e6Sopenharmony_ci{
11c0abf9e6Sopenharmony_ci	struct libevdev *d = libevdev_new();
12c0abf9e6Sopenharmony_ci
13c0abf9e6Sopenharmony_ci	libevdev_set_name(d, "some name");
14c0abf9e6Sopenharmony_ci	ck_assert_str_eq(libevdev_get_name(d), "some name");
15c0abf9e6Sopenharmony_ci	libevdev_set_phys(d, "physical");
16c0abf9e6Sopenharmony_ci	ck_assert_str_eq(libevdev_get_phys(d), "physical");
17c0abf9e6Sopenharmony_ci	libevdev_set_uniq(d, "very unique");
18c0abf9e6Sopenharmony_ci	ck_assert_str_eq(libevdev_get_uniq(d), "very unique");
19c0abf9e6Sopenharmony_ci
20c0abf9e6Sopenharmony_ci	libevdev_set_id_bustype(d, 1);
21c0abf9e6Sopenharmony_ci	libevdev_set_id_vendor(d, 2);
22c0abf9e6Sopenharmony_ci	libevdev_set_id_product(d, 3);
23c0abf9e6Sopenharmony_ci	libevdev_set_id_version(d, 4);
24c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_bustype(d), 1);
25c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_vendor(d), 2);
26c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_product(d), 3);
27c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_version(d), 4);
28c0abf9e6Sopenharmony_ci
29c0abf9e6Sopenharmony_ci	libevdev_free(d);
30c0abf9e6Sopenharmony_ci}
31c0abf9e6Sopenharmony_ciEND_TEST
32c0abf9e6Sopenharmony_ci
33c0abf9e6Sopenharmony_ciSTART_TEST(test_properties)
34c0abf9e6Sopenharmony_ci{
35c0abf9e6Sopenharmony_ci	for (unsigned prop = 0; prop < INPUT_PROP_CNT; prop++) {
36c0abf9e6Sopenharmony_ci		struct libevdev *d = libevdev_new();
37c0abf9e6Sopenharmony_ci
38c0abf9e6Sopenharmony_ci		ck_assert(!libevdev_has_property(d, prop));
39c0abf9e6Sopenharmony_ci		libevdev_enable_property(d, prop);
40c0abf9e6Sopenharmony_ci		ck_assert(libevdev_has_property(d, prop));
41c0abf9e6Sopenharmony_ci		libevdev_free(d);
42c0abf9e6Sopenharmony_ci	}
43c0abf9e6Sopenharmony_ci}
44c0abf9e6Sopenharmony_ciEND_TEST
45c0abf9e6Sopenharmony_ci
46c0abf9e6Sopenharmony_ciSTART_TEST(test_bits)
47c0abf9e6Sopenharmony_ci{
48c0abf9e6Sopenharmony_ci	for (unsigned type = 1; type < EV_CNT; type++) {
49c0abf9e6Sopenharmony_ci		unsigned max = libevdev_event_type_get_max(type);
50c0abf9e6Sopenharmony_ci
51c0abf9e6Sopenharmony_ci		if((int)max == -1)
52c0abf9e6Sopenharmony_ci			continue;
53c0abf9e6Sopenharmony_ci
54c0abf9e6Sopenharmony_ci		for (unsigned code = 0; code <= max; code++) {
55c0abf9e6Sopenharmony_ci			struct libevdev *d = libevdev_new();
56c0abf9e6Sopenharmony_ci			const struct input_absinfo abs = {
57c0abf9e6Sopenharmony_ci				.minimum = 10,
58c0abf9e6Sopenharmony_ci				.maximum = 20,
59c0abf9e6Sopenharmony_ci				.fuzz = 30,
60c0abf9e6Sopenharmony_ci				.flat = 40,
61c0abf9e6Sopenharmony_ci				.resolution = 50,
62c0abf9e6Sopenharmony_ci			};
63c0abf9e6Sopenharmony_ci			const void *data = NULL;
64c0abf9e6Sopenharmony_ci
65c0abf9e6Sopenharmony_ci			if (type == EV_ABS || type == EV_REP)
66c0abf9e6Sopenharmony_ci				data = &abs;
67c0abf9e6Sopenharmony_ci
68c0abf9e6Sopenharmony_ci			ck_assert(!libevdev_has_event_code(d, type, code));
69c0abf9e6Sopenharmony_ci			libevdev_enable_event_code(d, type, code, data);
70c0abf9e6Sopenharmony_ci			ck_assert(libevdev_has_event_code(d, type, code));
71c0abf9e6Sopenharmony_ci			libevdev_free(d);
72c0abf9e6Sopenharmony_ci		}
73c0abf9e6Sopenharmony_ci	}
74c0abf9e6Sopenharmony_ci}
75c0abf9e6Sopenharmony_ciEND_TEST
76c0abf9e6Sopenharmony_ci
77c0abf9e6Sopenharmony_ciSTART_TEST(test_mt_slots_enable_disable)
78c0abf9e6Sopenharmony_ci{
79c0abf9e6Sopenharmony_ci	struct libevdev *d = libevdev_new();
80c0abf9e6Sopenharmony_ci	struct input_absinfo abs = {0};
81c0abf9e6Sopenharmony_ci
82c0abf9e6Sopenharmony_ci	abs.maximum = 5;
83c0abf9e6Sopenharmony_ci	libevdev_enable_event_code(d, EV_ABS, ABS_MT_SLOT, &abs);
84c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(d, EV_ABS, ABS_MT_SLOT));
85c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_num_slots(d), 6);
86c0abf9e6Sopenharmony_ci
87c0abf9e6Sopenharmony_ci	libevdev_disable_event_code(d, EV_ABS, ABS_MT_SLOT);
88c0abf9e6Sopenharmony_ci	ck_assert(!libevdev_has_event_code(d, EV_ABS, ABS_MT_SLOT));
89c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_num_slots(d), -1);
90c0abf9e6Sopenharmony_ci
91c0abf9e6Sopenharmony_ci	abs.maximum = 2;
92c0abf9e6Sopenharmony_ci	libevdev_enable_event_code(d, EV_ABS, ABS_MT_SLOT, &abs);
93c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(d, EV_ABS, ABS_MT_SLOT));
94c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_num_slots(d), 3);
95c0abf9e6Sopenharmony_ci
96c0abf9e6Sopenharmony_ci	libevdev_free(d);
97c0abf9e6Sopenharmony_ci}
98c0abf9e6Sopenharmony_ciEND_TEST
99c0abf9e6Sopenharmony_ci
100c0abf9e6Sopenharmony_ciSTART_TEST(test_mt_slots_increase_decrease)
101c0abf9e6Sopenharmony_ci{
102c0abf9e6Sopenharmony_ci	struct libevdev *d = libevdev_new();
103c0abf9e6Sopenharmony_ci	struct input_absinfo abs = {0};
104c0abf9e6Sopenharmony_ci
105c0abf9e6Sopenharmony_ci	abs.maximum = 5;
106c0abf9e6Sopenharmony_ci	libevdev_enable_event_code(d, EV_ABS, ABS_MT_SLOT, &abs);
107c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(d, EV_ABS, ABS_MT_SLOT));
108c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_num_slots(d), 6);
109c0abf9e6Sopenharmony_ci
110c0abf9e6Sopenharmony_ci	abs.maximum = 2;
111c0abf9e6Sopenharmony_ci	libevdev_enable_event_code(d, EV_ABS, ABS_MT_SLOT, &abs);
112c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(d, EV_ABS, ABS_MT_SLOT));
113c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_num_slots(d), 3);
114c0abf9e6Sopenharmony_ci
115c0abf9e6Sopenharmony_ci	abs.maximum = 6;
116c0abf9e6Sopenharmony_ci	libevdev_enable_event_code(d, EV_ABS, ABS_MT_SLOT, &abs);
117c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(d, EV_ABS, ABS_MT_SLOT));
118c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_num_slots(d), 7);
119c0abf9e6Sopenharmony_ci
120c0abf9e6Sopenharmony_ci	abs.maximum = 10;
121c0abf9e6Sopenharmony_ci	libevdev_enable_event_code(d, EV_ABS, ABS_MT_SLOT, &abs);
122c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(d, EV_ABS, ABS_MT_SLOT));
123c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_num_slots(d), 11);
124c0abf9e6Sopenharmony_ci
125c0abf9e6Sopenharmony_ci	libevdev_free(d);
126c0abf9e6Sopenharmony_ci}
127c0abf9e6Sopenharmony_ciEND_TEST
128c0abf9e6Sopenharmony_ci
129c0abf9e6Sopenharmony_ciSTART_TEST(test_mt_tracking_id)
130c0abf9e6Sopenharmony_ci{
131c0abf9e6Sopenharmony_ci	struct libevdev *d = libevdev_new();
132c0abf9e6Sopenharmony_ci	struct input_absinfo abs = { .maximum = 5 };
133c0abf9e6Sopenharmony_ci
134c0abf9e6Sopenharmony_ci	libevdev_enable_event_code(d, EV_ABS, ABS_MT_SLOT, &abs);
135c0abf9e6Sopenharmony_ci
136c0abf9e6Sopenharmony_ci	/* Not yet enabled, so 0. This is technically undefined */
137c0abf9e6Sopenharmony_ci	for (int slot = 0; slot < 5; slot++)
138c0abf9e6Sopenharmony_ci		ck_assert_int_eq(libevdev_get_slot_value(d, 0, ABS_MT_TRACKING_ID), 0);
139c0abf9e6Sopenharmony_ci
140c0abf9e6Sopenharmony_ci	libevdev_enable_event_code(d, EV_ABS, ABS_MT_TRACKING_ID, &abs);
141c0abf9e6Sopenharmony_ci
142c0abf9e6Sopenharmony_ci	for (int slot = 0; slot < 5; slot++)
143c0abf9e6Sopenharmony_ci		ck_assert_int_eq(libevdev_get_slot_value(d, 0, ABS_MT_TRACKING_ID), -1);
144c0abf9e6Sopenharmony_ci
145c0abf9e6Sopenharmony_ci	libevdev_free(d);
146c0abf9e6Sopenharmony_ci}
147c0abf9e6Sopenharmony_ciEND_TEST
148c0abf9e6Sopenharmony_ci
149c0abf9e6Sopenharmony_ciTEST_SUITE(event_name_suite)
150c0abf9e6Sopenharmony_ci{
151c0abf9e6Sopenharmony_ci	Suite *s = suite_create("Context manipulation");
152c0abf9e6Sopenharmony_ci
153c0abf9e6Sopenharmony_ci	add_test(s, test_info);
154c0abf9e6Sopenharmony_ci	add_test(s, test_properties);
155c0abf9e6Sopenharmony_ci	add_test(s, test_bits);
156c0abf9e6Sopenharmony_ci	add_test(s, test_mt_slots_enable_disable);
157c0abf9e6Sopenharmony_ci	add_test(s, test_mt_slots_increase_decrease);
158c0abf9e6Sopenharmony_ci	add_test(s, test_mt_tracking_id);
159c0abf9e6Sopenharmony_ci
160c0abf9e6Sopenharmony_ci	return s;
161c0abf9e6Sopenharmony_ci}
162