1c0abf9e6Sopenharmony_ci// SPDX-License-Identifier: MIT
2c0abf9e6Sopenharmony_ci/*
3c0abf9e6Sopenharmony_ci * Copyright © 2013 Red Hat, Inc.
4c0abf9e6Sopenharmony_ci */
5c0abf9e6Sopenharmony_ci
6c0abf9e6Sopenharmony_ci#include "config.h"
7c0abf9e6Sopenharmony_ci#include <linux/input.h>
8c0abf9e6Sopenharmony_ci#include <errno.h>
9c0abf9e6Sopenharmony_ci#include <unistd.h>
10c0abf9e6Sopenharmony_ci#include <limits.h>
11c0abf9e6Sopenharmony_ci#include <fcntl.h>
12c0abf9e6Sopenharmony_ci
13c0abf9e6Sopenharmony_ci#include "test-common.h"
14c0abf9e6Sopenharmony_ci
15c0abf9e6Sopenharmony_cistatic int evbits[] = {
16c0abf9e6Sopenharmony_ci	EV_SYN, EV_KEY, EV_REL, EV_ABS, EV_MSC,
17c0abf9e6Sopenharmony_ci	EV_SW, EV_LED, EV_SND, EV_FF,
18c0abf9e6Sopenharmony_ci	/* Intentionally skipping these, they're different
19c0abf9e6Sopenharmony_ci	 * EV_PWR, EV_FF_STATUS, EV_REP, */
20c0abf9e6Sopenharmony_ci	-1,
21c0abf9e6Sopenharmony_ci};
22c0abf9e6Sopenharmony_ci
23c0abf9e6Sopenharmony_ciSTART_TEST(test_has_ev_bit)
24c0abf9e6Sopenharmony_ci{
25c0abf9e6Sopenharmony_ci	int *evbit = evbits;
26c0abf9e6Sopenharmony_ci
27c0abf9e6Sopenharmony_ci	while(*evbit != -1) {
28c0abf9e6Sopenharmony_ci		struct uinput_device* uidev;
29c0abf9e6Sopenharmony_ci		struct libevdev *dev;
30c0abf9e6Sopenharmony_ci		int i;
31c0abf9e6Sopenharmony_ci
32c0abf9e6Sopenharmony_ci		if (*evbit == EV_ABS) {
33c0abf9e6Sopenharmony_ci			struct input_absinfo abs = { ABS_X, 0, 2, 0, 0, 0};
34c0abf9e6Sopenharmony_ci			test_create_abs_device(&uidev, &dev,
35c0abf9e6Sopenharmony_ci					       1, &abs,
36c0abf9e6Sopenharmony_ci					       -1);
37c0abf9e6Sopenharmony_ci		} else
38c0abf9e6Sopenharmony_ci			test_create_device(&uidev, &dev,
39c0abf9e6Sopenharmony_ci					   *evbit, 0,
40c0abf9e6Sopenharmony_ci					   -1);
41c0abf9e6Sopenharmony_ci
42c0abf9e6Sopenharmony_ci		ck_assert_msg(libevdev_has_event_type(dev, EV_SYN), "for event type %d\n", *evbit);
43c0abf9e6Sopenharmony_ci		ck_assert_msg(libevdev_has_event_type(dev, *evbit), "for event type %d\n", *evbit);
44c0abf9e6Sopenharmony_ci
45c0abf9e6Sopenharmony_ci		for (i = 0; i <= EV_MAX; i++) {
46c0abf9e6Sopenharmony_ci			if (i == EV_SYN || i == *evbit)
47c0abf9e6Sopenharmony_ci				continue;
48c0abf9e6Sopenharmony_ci
49c0abf9e6Sopenharmony_ci			ck_assert_msg(!libevdev_has_event_type(dev, i), "for event type %d\n", i);
50c0abf9e6Sopenharmony_ci		}
51c0abf9e6Sopenharmony_ci
52c0abf9e6Sopenharmony_ci		libevdev_free(dev);
53c0abf9e6Sopenharmony_ci		uinput_device_free(uidev);
54c0abf9e6Sopenharmony_ci
55c0abf9e6Sopenharmony_ci		evbit++;
56c0abf9e6Sopenharmony_ci	}
57c0abf9e6Sopenharmony_ci}
58c0abf9e6Sopenharmony_ciEND_TEST
59c0abf9e6Sopenharmony_ci
60c0abf9e6Sopenharmony_ciSTART_TEST(test_ev_bit_limits)
61c0abf9e6Sopenharmony_ci{
62c0abf9e6Sopenharmony_ci	int *evbit = evbits;
63c0abf9e6Sopenharmony_ci
64c0abf9e6Sopenharmony_ci	while(*evbit != -1) {
65c0abf9e6Sopenharmony_ci		struct uinput_device* uidev;
66c0abf9e6Sopenharmony_ci		struct libevdev *dev;
67c0abf9e6Sopenharmony_ci
68c0abf9e6Sopenharmony_ci		if (*evbit == EV_ABS) {
69c0abf9e6Sopenharmony_ci			struct input_absinfo abs = { ABS_X, 0, 2, 0, 0, 0};
70c0abf9e6Sopenharmony_ci			test_create_abs_device(&uidev, &dev,
71c0abf9e6Sopenharmony_ci					       1, &abs,
72c0abf9e6Sopenharmony_ci					       -1);
73c0abf9e6Sopenharmony_ci		} else
74c0abf9e6Sopenharmony_ci			test_create_device(&uidev, &dev,
75c0abf9e6Sopenharmony_ci					   *evbit, 0,
76c0abf9e6Sopenharmony_ci					   -1);
77c0abf9e6Sopenharmony_ci
78c0abf9e6Sopenharmony_ci		ck_assert_int_eq(libevdev_has_event_type(dev, EV_MAX + 1), 0);
79c0abf9e6Sopenharmony_ci		ck_assert_int_eq(libevdev_has_event_type(dev, INT_MAX), 0);
80c0abf9e6Sopenharmony_ci		ck_assert_int_eq(libevdev_has_event_type(dev, UINT_MAX), 0);
81c0abf9e6Sopenharmony_ci
82c0abf9e6Sopenharmony_ci		libevdev_free(dev);
83c0abf9e6Sopenharmony_ci		uinput_device_free(uidev);
84c0abf9e6Sopenharmony_ci
85c0abf9e6Sopenharmony_ci		evbit++;
86c0abf9e6Sopenharmony_ci	}
87c0abf9e6Sopenharmony_ci}
88c0abf9e6Sopenharmony_ciEND_TEST
89c0abf9e6Sopenharmony_ci
90c0abf9e6Sopenharmony_ciSTART_TEST(test_event_codes)
91c0abf9e6Sopenharmony_ci{
92c0abf9e6Sopenharmony_ci	int *evbit = evbits;
93c0abf9e6Sopenharmony_ci
94c0abf9e6Sopenharmony_ci	while(*evbit != -1) {
95c0abf9e6Sopenharmony_ci		struct uinput_device* uidev;
96c0abf9e6Sopenharmony_ci		struct libevdev *dev;
97c0abf9e6Sopenharmony_ci		int code, max;
98c0abf9e6Sopenharmony_ci		if (*evbit == EV_SYN) {
99c0abf9e6Sopenharmony_ci			evbit++;
100c0abf9e6Sopenharmony_ci			continue;
101c0abf9e6Sopenharmony_ci		}
102c0abf9e6Sopenharmony_ci
103c0abf9e6Sopenharmony_ci#ifdef __FreeBSD__
104c0abf9e6Sopenharmony_ci		/* Force feedback events are not supported by FreeBSD */
105c0abf9e6Sopenharmony_ci		if (*evbit == EV_FF) {
106c0abf9e6Sopenharmony_ci			evbit++;
107c0abf9e6Sopenharmony_ci			continue;
108c0abf9e6Sopenharmony_ci		}
109c0abf9e6Sopenharmony_ci#endif
110c0abf9e6Sopenharmony_ci
111c0abf9e6Sopenharmony_ci		max = libevdev_event_type_get_max(*evbit);
112c0abf9e6Sopenharmony_ci
113c0abf9e6Sopenharmony_ci		for (code = 1; code < max; code += 10) {
114c0abf9e6Sopenharmony_ci			if (*evbit == EV_ABS) {
115c0abf9e6Sopenharmony_ci				struct input_absinfo abs = { code, 0, 2, 0, 0, 0};
116c0abf9e6Sopenharmony_ci				test_create_abs_device(&uidev, &dev,
117c0abf9e6Sopenharmony_ci						       1, &abs,
118c0abf9e6Sopenharmony_ci						       -1);
119c0abf9e6Sopenharmony_ci			} else {
120c0abf9e6Sopenharmony_ci				test_create_device(&uidev, &dev,
121c0abf9e6Sopenharmony_ci						   *evbit, code,
122c0abf9e6Sopenharmony_ci						   -1);
123c0abf9e6Sopenharmony_ci			}
124c0abf9e6Sopenharmony_ci
125c0abf9e6Sopenharmony_ci			ck_assert_msg(libevdev_has_event_type(dev, *evbit), "for event type %d\n", *evbit);
126c0abf9e6Sopenharmony_ci			ck_assert_msg(libevdev_has_event_code(dev, *evbit, code), "for type %d code %d", *evbit, code);
127c0abf9e6Sopenharmony_ci			ck_assert_msg(libevdev_has_event_code(dev, EV_SYN, SYN_REPORT), "for EV_SYN");
128c0abf9e6Sopenharmony_ci			/* always false */
129c0abf9e6Sopenharmony_ci			ck_assert_msg(!libevdev_has_event_code(dev, EV_PWR, 0), "for EV_PWR");
130c0abf9e6Sopenharmony_ci
131c0abf9e6Sopenharmony_ci			libevdev_free(dev);
132c0abf9e6Sopenharmony_ci			uinput_device_free(uidev);
133c0abf9e6Sopenharmony_ci		}
134c0abf9e6Sopenharmony_ci
135c0abf9e6Sopenharmony_ci		evbit++;
136c0abf9e6Sopenharmony_ci	}
137c0abf9e6Sopenharmony_ci}
138c0abf9e6Sopenharmony_ciEND_TEST
139c0abf9e6Sopenharmony_ci
140c0abf9e6Sopenharmony_ciSTART_TEST(test_event_code_limits)
141c0abf9e6Sopenharmony_ci{
142c0abf9e6Sopenharmony_ci	int *evbit = evbits;
143c0abf9e6Sopenharmony_ci
144c0abf9e6Sopenharmony_ci	while(*evbit != -1) {
145c0abf9e6Sopenharmony_ci		struct uinput_device* uidev;
146c0abf9e6Sopenharmony_ci		struct libevdev *dev;
147c0abf9e6Sopenharmony_ci		int max;
148c0abf9e6Sopenharmony_ci
149c0abf9e6Sopenharmony_ci		if (*evbit == EV_SYN) {
150c0abf9e6Sopenharmony_ci			evbit++;
151c0abf9e6Sopenharmony_ci			continue;
152c0abf9e6Sopenharmony_ci		}
153c0abf9e6Sopenharmony_ci
154c0abf9e6Sopenharmony_ci		max = libevdev_event_type_get_max(*evbit);
155c0abf9e6Sopenharmony_ci		ck_assert(max != -1);
156c0abf9e6Sopenharmony_ci
157c0abf9e6Sopenharmony_ci		if (*evbit == EV_ABS) {
158c0abf9e6Sopenharmony_ci			struct input_absinfo abs = { ABS_X, 0, 2, 0, 0, 0};
159c0abf9e6Sopenharmony_ci			test_create_abs_device(&uidev, &dev,
160c0abf9e6Sopenharmony_ci					       1, &abs,
161c0abf9e6Sopenharmony_ci					       -1);
162c0abf9e6Sopenharmony_ci		} else
163c0abf9e6Sopenharmony_ci			test_create_device(&uidev, &dev,
164c0abf9e6Sopenharmony_ci					   *evbit, 1,
165c0abf9e6Sopenharmony_ci					   -1);
166c0abf9e6Sopenharmony_ci
167c0abf9e6Sopenharmony_ci		ck_assert_msg(!libevdev_has_event_code(dev, *evbit, max), "for type %d code %d", *evbit, max);
168c0abf9e6Sopenharmony_ci		ck_assert_msg(!libevdev_has_event_code(dev, *evbit, INT_MAX), "for type %d code %d", *evbit, INT_MAX);
169c0abf9e6Sopenharmony_ci		ck_assert_msg(!libevdev_has_event_code(dev, *evbit, UINT_MAX), "for type %d code %d", *evbit, UINT_MAX);
170c0abf9e6Sopenharmony_ci
171c0abf9e6Sopenharmony_ci		libevdev_free(dev);
172c0abf9e6Sopenharmony_ci		uinput_device_free(uidev);
173c0abf9e6Sopenharmony_ci
174c0abf9e6Sopenharmony_ci		evbit++;
175c0abf9e6Sopenharmony_ci	}
176c0abf9e6Sopenharmony_ci}
177c0abf9e6Sopenharmony_ciEND_TEST
178c0abf9e6Sopenharmony_ci
179c0abf9e6Sopenharmony_ciSTART_TEST(test_ev_rep)
180c0abf9e6Sopenharmony_ci{
181c0abf9e6Sopenharmony_ci	struct libevdev *dev;
182c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
183c0abf9e6Sopenharmony_ci	int rc;
184c0abf9e6Sopenharmony_ci	int rep, delay;
185c0abf9e6Sopenharmony_ci	const int KERNEL_DEFAULT_REP = 250;
186c0abf9e6Sopenharmony_ci	const int KERNEL_DEFAULT_DELAY = 33;
187c0abf9e6Sopenharmony_ci
188c0abf9e6Sopenharmony_ci	/* EV_REP is special, it's always fully set if set at all,
189c0abf9e6Sopenharmony_ci	   can't test this through uinput though */
190c0abf9e6Sopenharmony_ci	uidev = uinput_device_new(TEST_DEVICE_NAME);
191c0abf9e6Sopenharmony_ci	ck_assert(uidev != NULL);
192c0abf9e6Sopenharmony_ci	rc = uinput_device_set_bit(uidev, EV_REP);
193c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
194c0abf9e6Sopenharmony_ci
195c0abf9e6Sopenharmony_ci	rc = uinput_device_create(uidev);
196c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
197c0abf9e6Sopenharmony_ci
198c0abf9e6Sopenharmony_ci	rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
199c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
200c0abf9e6Sopenharmony_ci
201c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_has_event_type(dev, EV_REP), 1);
202c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_has_event_code(dev, EV_REP, REP_DELAY), 1);
203c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_has_event_code(dev, EV_REP, REP_PERIOD), 1);
204c0abf9e6Sopenharmony_ci
205c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_repeat(dev, &rep, &delay), 0);
206c0abf9e6Sopenharmony_ci	/* default values as set by the kernel,
207c0abf9e6Sopenharmony_ci	   see drivers/input/input.c:input_register_device() */
208c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rep, KERNEL_DEFAULT_REP);
209c0abf9e6Sopenharmony_ci	ck_assert_int_eq(delay, KERNEL_DEFAULT_DELAY);
210c0abf9e6Sopenharmony_ci
211c0abf9e6Sopenharmony_ci	libevdev_free(dev);
212c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
213c0abf9e6Sopenharmony_ci}
214c0abf9e6Sopenharmony_ciEND_TEST
215c0abf9e6Sopenharmony_ci
216c0abf9e6Sopenharmony_ciSTART_TEST(test_ev_rep_values)
217c0abf9e6Sopenharmony_ci{
218c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
219c0abf9e6Sopenharmony_ci	struct libevdev *dev;
220c0abf9e6Sopenharmony_ci	int delay = 0xab, period = 0xbc;
221c0abf9e6Sopenharmony_ci
222c0abf9e6Sopenharmony_ci	/* EV_REP is special, it's always fully set if set at all, can't set
223c0abf9e6Sopenharmony_ci	   it through uinput though. */
224c0abf9e6Sopenharmony_ci	test_create_device(&uidev, &dev, -1);
225c0abf9e6Sopenharmony_ci
226c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_repeat(dev, NULL, NULL), -1);
227c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_repeat(dev, &delay, NULL), -1);
228c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_repeat(dev, NULL, &period), -1);
229c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_repeat(dev, &delay, &period), -1);
230c0abf9e6Sopenharmony_ci
231c0abf9e6Sopenharmony_ci	ck_assert_int_eq(delay, 0xab);
232c0abf9e6Sopenharmony_ci	ck_assert_int_eq(period, 0xbc);
233c0abf9e6Sopenharmony_ci
234c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
235c0abf9e6Sopenharmony_ci	libevdev_free(dev);
236c0abf9e6Sopenharmony_ci}
237c0abf9e6Sopenharmony_ciEND_TEST
238c0abf9e6Sopenharmony_ci
239c0abf9e6Sopenharmony_ciSTART_TEST(test_input_props)
240c0abf9e6Sopenharmony_ci{
241c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
242c0abf9e6Sopenharmony_ci	struct libevdev *dev;
243c0abf9e6Sopenharmony_ci	int rc, i;
244c0abf9e6Sopenharmony_ci	struct input_absinfo abs = { .value = 0, .minimum = 0, .maximum = 2};
245c0abf9e6Sopenharmony_ci
246c0abf9e6Sopenharmony_ci	uidev = uinput_device_new(TEST_DEVICE_NAME);
247c0abf9e6Sopenharmony_ci	rc = uinput_device_set_abs_bit(uidev, ABS_X, &abs);
248c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
249c0abf9e6Sopenharmony_ci	uinput_device_set_prop(uidev, INPUT_PROP_DIRECT);
250c0abf9e6Sopenharmony_ci	uinput_device_set_prop(uidev, INPUT_PROP_BUTTONPAD);
251c0abf9e6Sopenharmony_ci	rc = uinput_device_create(uidev);
252c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
253c0abf9e6Sopenharmony_ci
254c0abf9e6Sopenharmony_ci	rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
255c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
256c0abf9e6Sopenharmony_ci
257c0abf9e6Sopenharmony_ci	for (i = 0; i < INPUT_PROP_CNT; i++) {
258c0abf9e6Sopenharmony_ci		if (i == INPUT_PROP_DIRECT || i == INPUT_PROP_BUTTONPAD)
259c0abf9e6Sopenharmony_ci			ck_assert_int_eq(libevdev_has_property(dev, i), 1);
260c0abf9e6Sopenharmony_ci		else
261c0abf9e6Sopenharmony_ci			ck_assert_int_eq(libevdev_has_property(dev, i), 0);
262c0abf9e6Sopenharmony_ci	}
263c0abf9e6Sopenharmony_ci
264c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_MAX + 1), 0);
265c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_MAX), 0);
266c0abf9e6Sopenharmony_ci
267c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
268c0abf9e6Sopenharmony_ci	libevdev_free(dev);
269c0abf9e6Sopenharmony_ci}
270c0abf9e6Sopenharmony_ciEND_TEST
271c0abf9e6Sopenharmony_ci
272c0abf9e6Sopenharmony_ciSTART_TEST(test_set_input_props)
273c0abf9e6Sopenharmony_ci{
274c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
275c0abf9e6Sopenharmony_ci	struct libevdev *dev;
276c0abf9e6Sopenharmony_ci	int rc, fd;
277c0abf9e6Sopenharmony_ci	struct input_absinfo abs = { .value = 0, .minimum = 0, .maximum = 2};
278c0abf9e6Sopenharmony_ci
279c0abf9e6Sopenharmony_ci	dev = libevdev_new();
280c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_enable_property(dev, INPUT_PROP_MAX + 1), -1);
281c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_enable_property(dev, INPUT_PROP_DIRECT), 0);
282c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_enable_property(dev, INPUT_PROP_BUTTONPAD), 0);
283c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_DIRECT), 1);
284c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_BUTTONPAD), 1);
285c0abf9e6Sopenharmony_ci
286c0abf9e6Sopenharmony_ci	uidev = uinput_device_new(TEST_DEVICE_NAME);
287c0abf9e6Sopenharmony_ci	rc = uinput_device_set_abs_bit(uidev, ABS_X, &abs);
288c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
289c0abf9e6Sopenharmony_ci	uinput_device_set_prop(uidev, INPUT_PROP_BUTTONPAD);
290c0abf9e6Sopenharmony_ci	rc = uinput_device_create(uidev);
291c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
292c0abf9e6Sopenharmony_ci
293c0abf9e6Sopenharmony_ci	fd = uinput_device_get_fd(uidev);
294c0abf9e6Sopenharmony_ci	rc = libevdev_set_fd(dev, fd);
295c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
296c0abf9e6Sopenharmony_ci
297c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_DIRECT), 0);
298c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_BUTTONPAD), 1);
299c0abf9e6Sopenharmony_ci
300c0abf9e6Sopenharmony_ci	/* Test disabling the properties too */
301c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_disable_property(dev, INPUT_PROP_MAX + 1), -1);
302c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_disable_property(dev, INPUT_PROP_DIRECT), 0);
303c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_disable_property(dev, INPUT_PROP_BUTTONPAD), 0);
304c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_DIRECT), 0);
305c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_BUTTONPAD), 0);
306c0abf9e6Sopenharmony_ci
307c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
308c0abf9e6Sopenharmony_ci	libevdev_free(dev);
309c0abf9e6Sopenharmony_ci}
310c0abf9e6Sopenharmony_ciEND_TEST
311c0abf9e6Sopenharmony_ci
312c0abf9e6Sopenharmony_ciSTART_TEST(test_slot_init_value)
313c0abf9e6Sopenharmony_ci{
314c0abf9e6Sopenharmony_ci	struct uinput_device *uidev;
315c0abf9e6Sopenharmony_ci	struct libevdev *dev;
316c0abf9e6Sopenharmony_ci	int rc;
317c0abf9e6Sopenharmony_ci	const int nabs = 6;
318c0abf9e6Sopenharmony_ci	int i;
319c0abf9e6Sopenharmony_ci	int fd;
320c0abf9e6Sopenharmony_ci	struct input_absinfo abs[] = {
321c0abf9e6Sopenharmony_ci		{ .value = ABS_X, .minimum = 0, .maximum = 1000 },
322c0abf9e6Sopenharmony_ci		{ .value = ABS_Y, .minimum = 0, .maximum = 1000 },
323c0abf9e6Sopenharmony_ci		{ .value = ABS_MT_POSITION_X, .minimum = 0, .maximum = 1000 },
324c0abf9e6Sopenharmony_ci		{ .value = ABS_MT_POSITION_Y, .minimum = 0, .maximum = 1000 },
325c0abf9e6Sopenharmony_ci		{ .value = ABS_MT_TRACKING_ID, .minimum = -1, .maximum = 2 },
326c0abf9e6Sopenharmony_ci		{ .value = ABS_MT_SLOT, .minimum = 0, .maximum = 1 }
327c0abf9e6Sopenharmony_ci	};
328c0abf9e6Sopenharmony_ci
329c0abf9e6Sopenharmony_ci	uidev = uinput_device_new(TEST_DEVICE_NAME);
330c0abf9e6Sopenharmony_ci
331c0abf9e6Sopenharmony_ci	for (i = 0; i < nabs; i++) {
332c0abf9e6Sopenharmony_ci		rc = uinput_device_set_abs_bit(uidev, abs[i].value, &abs[i]);
333c0abf9e6Sopenharmony_ci		ck_assert_int_eq(rc, 0);
334c0abf9e6Sopenharmony_ci	}
335c0abf9e6Sopenharmony_ci
336c0abf9e6Sopenharmony_ci	rc = uinput_device_create(uidev);
337c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
338c0abf9e6Sopenharmony_ci
339c0abf9e6Sopenharmony_ci	fd = uinput_device_get_fd(uidev);
340c0abf9e6Sopenharmony_ci	rc = fcntl(fd, F_SETFL, O_NONBLOCK);
341c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "fcntl failed: %s", strerror(errno));
342c0abf9e6Sopenharmony_ci
343c0abf9e6Sopenharmony_ci	uinput_device_event(uidev, EV_ABS, ABS_MT_SLOT, 0);
344c0abf9e6Sopenharmony_ci	uinput_device_event(uidev, EV_ABS, ABS_X, 100);
345c0abf9e6Sopenharmony_ci	uinput_device_event(uidev, EV_ABS, ABS_Y, 500);
346c0abf9e6Sopenharmony_ci	uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_X, 100);
347c0abf9e6Sopenharmony_ci	uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_Y, 500);
348c0abf9e6Sopenharmony_ci	uinput_device_event(uidev, EV_ABS, ABS_MT_TRACKING_ID, 1);
349c0abf9e6Sopenharmony_ci	uinput_device_event(uidev, EV_ABS, ABS_MT_SLOT, 1);
350c0abf9e6Sopenharmony_ci	uinput_device_event(uidev, EV_ABS, ABS_X, 1);
351c0abf9e6Sopenharmony_ci	uinput_device_event(uidev, EV_ABS, ABS_Y, 5);
352c0abf9e6Sopenharmony_ci	uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_X, 1);
353c0abf9e6Sopenharmony_ci	uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_Y, 5);
354c0abf9e6Sopenharmony_ci	uinput_device_event(uidev, EV_ABS, ABS_MT_TRACKING_ID, 2);
355c0abf9e6Sopenharmony_ci	uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
356c0abf9e6Sopenharmony_ci
357c0abf9e6Sopenharmony_ci	rc = libevdev_new_from_fd(fd, &dev);
358c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
359c0abf9e6Sopenharmony_ci
360c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_current_slot(dev), 1);
361c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_MT_POSITION_X), 100);
362c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_MT_POSITION_Y), 500);
363c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_slot_value(dev, 1, ABS_MT_POSITION_X), 1);
364c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_slot_value(dev, 1, ABS_MT_POSITION_Y), 5);
365c0abf9e6Sopenharmony_ci
366c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
367c0abf9e6Sopenharmony_ci	libevdev_free(dev);
368c0abf9e6Sopenharmony_ci}
369c0abf9e6Sopenharmony_ciEND_TEST
370c0abf9e6Sopenharmony_ci
371c0abf9e6Sopenharmony_ciSTART_TEST(test_no_slots)
372c0abf9e6Sopenharmony_ci{
373c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
374c0abf9e6Sopenharmony_ci	struct libevdev *dev;
375c0abf9e6Sopenharmony_ci	struct input_absinfo abs[] = {
376c0abf9e6Sopenharmony_ci		{ .value = ABS_X, .minimum = 0, .maximum = 2 },
377c0abf9e6Sopenharmony_ci		{ .value = ABS_Y, .minimum = 0, .maximum = 2 },
378c0abf9e6Sopenharmony_ci		{ .value = ABS_MT_POSITION_X, .minimum = 0, .maximum = 2 },
379c0abf9e6Sopenharmony_ci		{ .value = ABS_MT_POSITION_Y, .minimum = 0, .maximum = 2 }
380c0abf9e6Sopenharmony_ci	};
381c0abf9e6Sopenharmony_ci
382c0abf9e6Sopenharmony_ci	test_create_abs_device(&uidev, &dev, 4, abs,
383c0abf9e6Sopenharmony_ci			       -1);
384c0abf9e6Sopenharmony_ci
385c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_num_slots(dev), -1);
386c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_current_slot(dev), -1);
387c0abf9e6Sopenharmony_ci
388c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
389c0abf9e6Sopenharmony_ci	libevdev_free(dev);
390c0abf9e6Sopenharmony_ci}
391c0abf9e6Sopenharmony_ciEND_TEST
392c0abf9e6Sopenharmony_ci
393c0abf9e6Sopenharmony_ciSTART_TEST(test_slot_number)
394c0abf9e6Sopenharmony_ci{
395c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
396c0abf9e6Sopenharmony_ci	struct libevdev *dev;
397c0abf9e6Sopenharmony_ci	const int nslots = 4;
398c0abf9e6Sopenharmony_ci	struct input_absinfo abs[] = {
399c0abf9e6Sopenharmony_ci		{ .value = ABS_X, .minimum = 0, .maximum = 2 },
400c0abf9e6Sopenharmony_ci		{ .value = ABS_Y, .minimum = 0, .maximum = 2 },
401c0abf9e6Sopenharmony_ci		{ .value = ABS_MT_POSITION_X, .minimum = 0, .maximum = 2 },
402c0abf9e6Sopenharmony_ci		{ .value = ABS_MT_POSITION_Y, .minimum = 0, .maximum = 2 },
403c0abf9e6Sopenharmony_ci		{ .value = ABS_MT_SLOT, .minimum = 0, .maximum = nslots - 1 }
404c0abf9e6Sopenharmony_ci	};
405c0abf9e6Sopenharmony_ci
406c0abf9e6Sopenharmony_ci	test_create_abs_device(&uidev, &dev, 5, abs,
407c0abf9e6Sopenharmony_ci			       -1);
408c0abf9e6Sopenharmony_ci
409c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_num_slots(dev), nslots);
410c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_current_slot(dev), 0);
411c0abf9e6Sopenharmony_ci
412c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
413c0abf9e6Sopenharmony_ci	libevdev_free(dev);
414c0abf9e6Sopenharmony_ci}
415c0abf9e6Sopenharmony_ciEND_TEST
416c0abf9e6Sopenharmony_ci
417c0abf9e6Sopenharmony_ciSTART_TEST(test_invalid_mt_device)
418c0abf9e6Sopenharmony_ci{
419c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
420c0abf9e6Sopenharmony_ci	struct libevdev *dev;
421c0abf9e6Sopenharmony_ci	const int nslots = 4;
422c0abf9e6Sopenharmony_ci	int value;
423c0abf9e6Sopenharmony_ci	struct input_absinfo abs[] = {
424c0abf9e6Sopenharmony_ci		{ .value = ABS_X, .minimum = 0, .maximum = 2 },
425c0abf9e6Sopenharmony_ci		{ .value = ABS_Y, .minimum = 0, .maximum = 2 },
426c0abf9e6Sopenharmony_ci		{ .value = ABS_MT_POSITION_X, .minimum = 0, .maximum = 2 },
427c0abf9e6Sopenharmony_ci		{ .value = ABS_MT_POSITION_Y, .minimum = 0, .maximum = 2 },
428c0abf9e6Sopenharmony_ci		{ .value = ABS_MT_SLOT - 1, .minimum = 0, .maximum = 2 },
429c0abf9e6Sopenharmony_ci		{ .value = ABS_MT_SLOT, .minimum = 0, .maximum = nslots - 1 }
430c0abf9e6Sopenharmony_ci	};
431c0abf9e6Sopenharmony_ci
432c0abf9e6Sopenharmony_ci	test_create_abs_device(&uidev, &dev, 6, abs,
433c0abf9e6Sopenharmony_ci			       -1);
434c0abf9e6Sopenharmony_ci
435c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_num_slots(dev), -1);
436c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_current_slot(dev), -1);
437c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_set_slot_value(dev, 0, ABS_MT_POSITION_X, 0), -1);
438c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_fetch_slot_value(dev, 0, ABS_MT_POSITION_X, &value), 0);
439c0abf9e6Sopenharmony_ci
440c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(dev, EV_ABS, ABS_MT_SLOT - 1));
441c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(dev, EV_ABS, ABS_MT_SLOT));
442c0abf9e6Sopenharmony_ci
443c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_set_event_value(dev, EV_ABS, ABS_MT_SLOT, 1), 0);
444c0abf9e6Sopenharmony_ci	ck_assert(libevdev_get_event_value(dev, EV_ABS, ABS_MT_SLOT) == 1);
445c0abf9e6Sopenharmony_ci
446c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
447c0abf9e6Sopenharmony_ci	libevdev_free(dev);
448c0abf9e6Sopenharmony_ci}
449c0abf9e6Sopenharmony_ciEND_TEST
450c0abf9e6Sopenharmony_ci
451c0abf9e6Sopenharmony_ciSTART_TEST(test_device_name)
452c0abf9e6Sopenharmony_ci{
453c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
454c0abf9e6Sopenharmony_ci	struct libevdev *dev;
455c0abf9e6Sopenharmony_ci	struct input_id ids = {1, 2, 3, 4};
456c0abf9e6Sopenharmony_ci	const char *str;
457c0abf9e6Sopenharmony_ci	int rc;
458c0abf9e6Sopenharmony_ci
459c0abf9e6Sopenharmony_ci	dev = libevdev_new();
460c0abf9e6Sopenharmony_ci
461c0abf9e6Sopenharmony_ci	str = libevdev_get_name(dev);
462c0abf9e6Sopenharmony_ci	ck_assert(str != NULL);
463c0abf9e6Sopenharmony_ci	ck_assert_int_eq(strlen(str), 0);
464c0abf9e6Sopenharmony_ci
465c0abf9e6Sopenharmony_ci	rc = uinput_device_new_with_events(&uidev, TEST_DEVICE_NAME, &ids,
466c0abf9e6Sopenharmony_ci					   EV_REL, REL_X,
467c0abf9e6Sopenharmony_ci					   -1);
468c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
469c0abf9e6Sopenharmony_ci	rc = libevdev_set_fd(dev, uinput_device_get_fd(uidev));
470c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
471c0abf9e6Sopenharmony_ci
472c0abf9e6Sopenharmony_ci	str = libevdev_get_name(dev);
473c0abf9e6Sopenharmony_ci	ck_assert_int_eq(strcmp(str, TEST_DEVICE_NAME), 0);
474c0abf9e6Sopenharmony_ci
475c0abf9e6Sopenharmony_ci	str = libevdev_get_phys(dev);
476c0abf9e6Sopenharmony_ci	ck_assert(str == NULL);
477c0abf9e6Sopenharmony_ci
478c0abf9e6Sopenharmony_ci	str = libevdev_get_uniq(dev);
479c0abf9e6Sopenharmony_ci	ck_assert(str == NULL);
480c0abf9e6Sopenharmony_ci
481c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_bustype(dev), ids.bustype);
482c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_vendor(dev), ids.vendor);
483c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_product(dev), ids.product);
484c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_version(dev), ids.version);
485c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_driver_version(dev), EV_VERSION);
486c0abf9e6Sopenharmony_ci
487c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
488c0abf9e6Sopenharmony_ci	libevdev_free(dev);
489c0abf9e6Sopenharmony_ci}
490c0abf9e6Sopenharmony_ciEND_TEST
491c0abf9e6Sopenharmony_ci
492c0abf9e6Sopenharmony_ciSTART_TEST(test_device_set_name)
493c0abf9e6Sopenharmony_ci{
494c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
495c0abf9e6Sopenharmony_ci	struct libevdev *dev;
496c0abf9e6Sopenharmony_ci	struct input_id ids = {1, 2, 3, 4};
497c0abf9e6Sopenharmony_ci	const char *str;
498c0abf9e6Sopenharmony_ci	int rc;
499c0abf9e6Sopenharmony_ci
500c0abf9e6Sopenharmony_ci	dev = libevdev_new();
501c0abf9e6Sopenharmony_ci
502c0abf9e6Sopenharmony_ci	libevdev_set_name(dev, "the name");
503c0abf9e6Sopenharmony_ci	libevdev_set_phys(dev, "the phys");
504c0abf9e6Sopenharmony_ci	libevdev_set_uniq(dev, "the uniq");
505c0abf9e6Sopenharmony_ci
506c0abf9e6Sopenharmony_ci	str = libevdev_get_name(dev);
507c0abf9e6Sopenharmony_ci	ck_assert(str != NULL);
508c0abf9e6Sopenharmony_ci	ck_assert_int_eq(strcmp(str, "the name"), 0);
509c0abf9e6Sopenharmony_ci
510c0abf9e6Sopenharmony_ci	str = libevdev_get_phys(dev);
511c0abf9e6Sopenharmony_ci	ck_assert(str != NULL);
512c0abf9e6Sopenharmony_ci	ck_assert_int_eq(strcmp(str, "the phys"), 0);
513c0abf9e6Sopenharmony_ci
514c0abf9e6Sopenharmony_ci	str = libevdev_get_uniq(dev);
515c0abf9e6Sopenharmony_ci	ck_assert(str != NULL);
516c0abf9e6Sopenharmony_ci	ck_assert_int_eq(strcmp(str, "the uniq"), 0);
517c0abf9e6Sopenharmony_ci
518c0abf9e6Sopenharmony_ci	rc = uinput_device_new_with_events(&uidev, TEST_DEVICE_NAME, &ids,
519c0abf9e6Sopenharmony_ci					   EV_REL, REL_X,
520c0abf9e6Sopenharmony_ci					   -1);
521c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
522c0abf9e6Sopenharmony_ci	rc = libevdev_set_fd(dev, uinput_device_get_fd(uidev));
523c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
524c0abf9e6Sopenharmony_ci
525c0abf9e6Sopenharmony_ci	str = libevdev_get_name(dev);
526c0abf9e6Sopenharmony_ci	ck_assert_int_eq(strcmp(str, TEST_DEVICE_NAME), 0);
527c0abf9e6Sopenharmony_ci
528c0abf9e6Sopenharmony_ci	str = libevdev_get_phys(dev);
529c0abf9e6Sopenharmony_ci	ck_assert(str == NULL);
530c0abf9e6Sopenharmony_ci
531c0abf9e6Sopenharmony_ci	str = libevdev_get_uniq(dev);
532c0abf9e6Sopenharmony_ci	ck_assert(str == NULL);
533c0abf9e6Sopenharmony_ci
534c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
535c0abf9e6Sopenharmony_ci	libevdev_free(dev);
536c0abf9e6Sopenharmony_ci}
537c0abf9e6Sopenharmony_ciEND_TEST
538c0abf9e6Sopenharmony_ci
539c0abf9e6Sopenharmony_ciSTART_TEST(test_device_set_ids)
540c0abf9e6Sopenharmony_ci{
541c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
542c0abf9e6Sopenharmony_ci	struct libevdev *dev;
543c0abf9e6Sopenharmony_ci	struct input_id ids = {1, 2, 3, 4};
544c0abf9e6Sopenharmony_ci	int rc;
545c0abf9e6Sopenharmony_ci
546c0abf9e6Sopenharmony_ci	dev = libevdev_new();
547c0abf9e6Sopenharmony_ci
548c0abf9e6Sopenharmony_ci	libevdev_set_id_product(dev, 10);
549c0abf9e6Sopenharmony_ci	libevdev_set_id_vendor(dev, 20);
550c0abf9e6Sopenharmony_ci	libevdev_set_id_bustype(dev, 30);
551c0abf9e6Sopenharmony_ci	libevdev_set_id_version(dev, 40);
552c0abf9e6Sopenharmony_ci
553c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_product(dev), 10);
554c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_vendor(dev), 20);
555c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_bustype(dev), 30);
556c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_version(dev), 40);
557c0abf9e6Sopenharmony_ci
558c0abf9e6Sopenharmony_ci	rc = uinput_device_new_with_events(&uidev, TEST_DEVICE_NAME, &ids,
559c0abf9e6Sopenharmony_ci					   EV_REL, REL_X,
560c0abf9e6Sopenharmony_ci					   -1);
561c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
562c0abf9e6Sopenharmony_ci	rc = libevdev_set_fd(dev, uinput_device_get_fd(uidev));
563c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
564c0abf9e6Sopenharmony_ci
565c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_bustype(dev), ids.bustype);
566c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_vendor(dev), ids.vendor);
567c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_product(dev), ids.product);
568c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_id_version(dev), ids.version);
569c0abf9e6Sopenharmony_ci
570c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
571c0abf9e6Sopenharmony_ci	libevdev_free(dev);
572c0abf9e6Sopenharmony_ci}
573c0abf9e6Sopenharmony_ciEND_TEST
574c0abf9e6Sopenharmony_ci
575c0abf9e6Sopenharmony_ciSTART_TEST(test_device_get_abs_info)
576c0abf9e6Sopenharmony_ci{
577c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
578c0abf9e6Sopenharmony_ci	struct libevdev *dev;
579c0abf9e6Sopenharmony_ci	struct input_absinfo abs;
580c0abf9e6Sopenharmony_ci	const struct input_absinfo *a;
581c0abf9e6Sopenharmony_ci	int rc;
582c0abf9e6Sopenharmony_ci
583c0abf9e6Sopenharmony_ci	uidev = uinput_device_new(TEST_DEVICE_NAME);
584c0abf9e6Sopenharmony_ci	ck_assert(uidev != NULL);
585c0abf9e6Sopenharmony_ci
586c0abf9e6Sopenharmony_ci	abs.minimum = 0;
587c0abf9e6Sopenharmony_ci	abs.maximum = 1000;
588c0abf9e6Sopenharmony_ci	abs.fuzz = 1;
589c0abf9e6Sopenharmony_ci	abs.flat = 2;
590c0abf9e6Sopenharmony_ci	abs.resolution = 3;
591c0abf9e6Sopenharmony_ci	abs.value = 0;
592c0abf9e6Sopenharmony_ci
593c0abf9e6Sopenharmony_ci	uinput_device_set_abs_bit(uidev, ABS_X, &abs);
594c0abf9e6Sopenharmony_ci	uinput_device_set_abs_bit(uidev, ABS_MT_POSITION_X, &abs);
595c0abf9e6Sopenharmony_ci
596c0abf9e6Sopenharmony_ci	abs.minimum = -500;
597c0abf9e6Sopenharmony_ci	abs.maximum = 500;
598c0abf9e6Sopenharmony_ci	abs.fuzz = 10;
599c0abf9e6Sopenharmony_ci	abs.flat = 20;
600c0abf9e6Sopenharmony_ci	abs.resolution = 30;
601c0abf9e6Sopenharmony_ci	abs.value = 0;
602c0abf9e6Sopenharmony_ci
603c0abf9e6Sopenharmony_ci	uinput_device_set_abs_bit(uidev, ABS_Y, &abs);
604c0abf9e6Sopenharmony_ci	uinput_device_set_abs_bit(uidev, ABS_MT_POSITION_Y, &abs);
605c0abf9e6Sopenharmony_ci
606c0abf9e6Sopenharmony_ci	rc = uinput_device_create(uidev);
607c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
608c0abf9e6Sopenharmony_ci
609c0abf9e6Sopenharmony_ci	rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
610c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
611c0abf9e6Sopenharmony_ci
612c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_MAX + 1), 0);
613c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_MAX + 1), 0);
614c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_MAX + 1), 0);
615c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_MAX + 1), 0);
616c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_MAX + 1), 0);
617c0abf9e6Sopenharmony_ci	ck_assert(!libevdev_get_abs_info(dev, ABS_MAX + 1));
618c0abf9e6Sopenharmony_ci
619c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_X), 0);
620c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_X), 1000);
621c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_X), 1);
622c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_X), 2);
623c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_X), 3);
624c0abf9e6Sopenharmony_ci	a = libevdev_get_abs_info(dev, ABS_X);
625c0abf9e6Sopenharmony_ci	ck_assert(a != NULL);
626c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->minimum, 0);
627c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->maximum, 1000);
628c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->fuzz, 1);
629c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->flat, 2);
630c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->resolution, 3);
631c0abf9e6Sopenharmony_ci
632c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_MT_POSITION_X), 0);
633c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_MT_POSITION_X), 1000);
634c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_MT_POSITION_X), 1);
635c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_MT_POSITION_X), 2);
636c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_MT_POSITION_X), 3);
637c0abf9e6Sopenharmony_ci	a = libevdev_get_abs_info(dev, ABS_MT_POSITION_X);
638c0abf9e6Sopenharmony_ci	ck_assert(a != NULL);
639c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->minimum, 0);
640c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->maximum, 1000);
641c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->fuzz, 1);
642c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->flat, 2);
643c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->resolution, 3);
644c0abf9e6Sopenharmony_ci
645c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_Y), -500);
646c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_Y), 500);
647c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_Y), 10);
648c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_Y), 20);
649c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_Y), 30);
650c0abf9e6Sopenharmony_ci	a = libevdev_get_abs_info(dev, ABS_Y);
651c0abf9e6Sopenharmony_ci	ck_assert(a != NULL);
652c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->minimum, -500);
653c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->maximum, 500);
654c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->fuzz, 10);
655c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->flat, 20);
656c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->resolution, 30);
657c0abf9e6Sopenharmony_ci
658c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_MT_POSITION_Y), -500);
659c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_MT_POSITION_Y), 500);
660c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_MT_POSITION_Y), 10);
661c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_MT_POSITION_Y), 20);
662c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_MT_POSITION_Y), 30);
663c0abf9e6Sopenharmony_ci	a = libevdev_get_abs_info(dev, ABS_MT_POSITION_Y);
664c0abf9e6Sopenharmony_ci	ck_assert(a != NULL);
665c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->minimum, -500);
666c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->maximum, 500);
667c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->fuzz, 10);
668c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->flat, 20);
669c0abf9e6Sopenharmony_ci	ck_assert_int_eq(a->resolution, 30);
670c0abf9e6Sopenharmony_ci
671c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
672c0abf9e6Sopenharmony_ci	libevdev_free(dev);
673c0abf9e6Sopenharmony_ci}
674c0abf9e6Sopenharmony_ciEND_TEST
675c0abf9e6Sopenharmony_ci
676c0abf9e6Sopenharmony_ciSTART_TEST(test_device_set_abs)
677c0abf9e6Sopenharmony_ci{
678c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
679c0abf9e6Sopenharmony_ci	struct libevdev *dev;
680c0abf9e6Sopenharmony_ci	struct input_absinfo abs[2];
681c0abf9e6Sopenharmony_ci	struct input_absinfo a;
682c0abf9e6Sopenharmony_ci
683c0abf9e6Sopenharmony_ci	memset(abs, 0, sizeof(abs));
684c0abf9e6Sopenharmony_ci	abs[0].value = ABS_X;
685c0abf9e6Sopenharmony_ci	abs[0].maximum = 1000;
686c0abf9e6Sopenharmony_ci
687c0abf9e6Sopenharmony_ci	abs[1].value = ABS_Y;
688c0abf9e6Sopenharmony_ci	abs[1].maximum = 1000;
689c0abf9e6Sopenharmony_ci
690c0abf9e6Sopenharmony_ci	test_create_abs_device(&uidev, &dev,
691c0abf9e6Sopenharmony_ci			       2, abs,
692c0abf9e6Sopenharmony_ci			       EV_SYN,
693c0abf9e6Sopenharmony_ci			       -1);
694c0abf9e6Sopenharmony_ci
695c0abf9e6Sopenharmony_ci	libevdev_set_abs_minimum(dev, ABS_X, 1);
696c0abf9e6Sopenharmony_ci	libevdev_set_abs_minimum(dev, ABS_Y, 5);
697c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_X),  1);
698c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_Y),  5);
699c0abf9e6Sopenharmony_ci
700c0abf9e6Sopenharmony_ci	libevdev_set_abs_maximum(dev, ABS_X, 3000);
701c0abf9e6Sopenharmony_ci	libevdev_set_abs_maximum(dev, ABS_Y, 5000);
702c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_X),  3000);
703c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_Y),  5000);
704c0abf9e6Sopenharmony_ci
705c0abf9e6Sopenharmony_ci	libevdev_set_abs_fuzz(dev, ABS_X, 3);
706c0abf9e6Sopenharmony_ci	libevdev_set_abs_fuzz(dev, ABS_Y, 5);
707c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_X),  3);
708c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_Y),  5);
709c0abf9e6Sopenharmony_ci
710c0abf9e6Sopenharmony_ci	libevdev_set_abs_flat(dev, ABS_X, 8);
711c0abf9e6Sopenharmony_ci	libevdev_set_abs_flat(dev, ABS_Y, 15);
712c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_X),  8);
713c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_Y),  15);
714c0abf9e6Sopenharmony_ci
715c0abf9e6Sopenharmony_ci	libevdev_set_abs_resolution(dev, ABS_X, 80);
716c0abf9e6Sopenharmony_ci	libevdev_set_abs_resolution(dev, ABS_Y, 150);
717c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_X),  80);
718c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_Y),  150);
719c0abf9e6Sopenharmony_ci
720c0abf9e6Sopenharmony_ci	a.value = 0;
721c0abf9e6Sopenharmony_ci	a.minimum = 10;
722c0abf9e6Sopenharmony_ci	a.maximum = 100;
723c0abf9e6Sopenharmony_ci	a.fuzz = 13;
724c0abf9e6Sopenharmony_ci	a.flat = 1;
725c0abf9e6Sopenharmony_ci	a.resolution = 16;
726c0abf9e6Sopenharmony_ci
727c0abf9e6Sopenharmony_ci	libevdev_set_abs_info(dev, ABS_X, &a);
728c0abf9e6Sopenharmony_ci	ck_assert_int_eq(memcmp(&a, libevdev_get_abs_info(dev, ABS_X), sizeof(a)), 0);
729c0abf9e6Sopenharmony_ci
730c0abf9e6Sopenharmony_ci	libevdev_set_abs_minimum(dev, ABS_Z, 10);
731c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_has_event_code(dev, EV_ABS, ABS_Z),  0);
732c0abf9e6Sopenharmony_ci
733c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
734c0abf9e6Sopenharmony_ci	libevdev_free(dev);
735c0abf9e6Sopenharmony_ci}
736c0abf9e6Sopenharmony_ciEND_TEST
737c0abf9e6Sopenharmony_ci
738c0abf9e6Sopenharmony_ciSTART_TEST(test_device_enable_bit)
739c0abf9e6Sopenharmony_ci{
740c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
741c0abf9e6Sopenharmony_ci	struct libevdev *dev, *dev2;
742c0abf9e6Sopenharmony_ci	struct input_absinfo abs = { .value = ABS_X, .minimum = 0, .maximum = 2 };
743c0abf9e6Sopenharmony_ci	int rc;
744c0abf9e6Sopenharmony_ci
745c0abf9e6Sopenharmony_ci	test_create_abs_device(&uidev, &dev, 1, &abs,
746c0abf9e6Sopenharmony_ci			       -1);
747c0abf9e6Sopenharmony_ci
748c0abf9e6Sopenharmony_ci	ck_assert(!libevdev_has_event_code(dev, EV_ABS, ABS_Y));
749c0abf9e6Sopenharmony_ci	ck_assert(!libevdev_has_event_type(dev, EV_REL));
750c0abf9e6Sopenharmony_ci	ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_X));
751c0abf9e6Sopenharmony_ci
752c0abf9e6Sopenharmony_ci	abs.minimum = 0;
753c0abf9e6Sopenharmony_ci	abs.maximum = 100;
754c0abf9e6Sopenharmony_ci	abs.fuzz = 1;
755c0abf9e6Sopenharmony_ci	abs.flat = 2;
756c0abf9e6Sopenharmony_ci	abs.resolution = 3;
757c0abf9e6Sopenharmony_ci
758c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_enable_event_code(dev, EV_ABS, ABS_Y, &abs), 0);
759c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(dev, EV_ABS, ABS_Y));
760c0abf9e6Sopenharmony_ci
761c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_enable_event_type(dev, EV_REL), 0);
762c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_type(dev, EV_REL));
763c0abf9e6Sopenharmony_ci	ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_X));
764c0abf9e6Sopenharmony_ci
765c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_enable_event_code(dev, EV_REL, REL_X, NULL), 0);
766c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(dev, EV_REL, REL_X));
767c0abf9e6Sopenharmony_ci
768c0abf9e6Sopenharmony_ci	/* make sure kernel device is unchanged */
769c0abf9e6Sopenharmony_ci	rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev2);
770c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));
771c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(dev2, EV_ABS, ABS_X));
772c0abf9e6Sopenharmony_ci	ck_assert(!libevdev_has_event_code(dev2, EV_ABS, ABS_Y));
773c0abf9e6Sopenharmony_ci	ck_assert(!libevdev_has_event_type(dev2, EV_REL));
774c0abf9e6Sopenharmony_ci	ck_assert(!libevdev_has_event_code(dev2, EV_REL, REL_X));
775c0abf9e6Sopenharmony_ci	libevdev_free(dev2);
776c0abf9e6Sopenharmony_ci
777c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
778c0abf9e6Sopenharmony_ci	libevdev_free(dev);
779c0abf9e6Sopenharmony_ci}
780c0abf9e6Sopenharmony_ciEND_TEST
781c0abf9e6Sopenharmony_ci
782c0abf9e6Sopenharmony_ciSTART_TEST(test_device_enable_bit_invalid)
783c0abf9e6Sopenharmony_ci{
784c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
785c0abf9e6Sopenharmony_ci	struct libevdev *dev;
786c0abf9e6Sopenharmony_ci	struct input_absinfo abs = { .value = ABS_X, .minimum = 0, .maximum = 1 };
787c0abf9e6Sopenharmony_ci
788c0abf9e6Sopenharmony_ci	test_create_abs_device(&uidev, &dev, 1, &abs,
789c0abf9e6Sopenharmony_ci			       -1);
790c0abf9e6Sopenharmony_ci
791c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_enable_event_code(dev, EV_ABS, ABS_MAX + 1, &abs), -1);
792c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_enable_event_code(dev, EV_MAX + 1, ABS_MAX + 1, &abs), -1);
793c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_enable_event_type(dev, EV_MAX + 1), -1);
794c0abf9e6Sopenharmony_ci	/* there's a gap between EV_SW and EV_LED */
795c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_enable_event_type(dev, EV_LED - 1), -1);
796c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_enable_event_code(dev, EV_LED - 1, 0, NULL), -1);
797c0abf9e6Sopenharmony_ci
798c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_enable_event_code(dev, EV_ABS, ABS_Y, NULL), -1);
799c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_enable_event_code(dev, EV_REP, REP_DELAY, NULL), -1);
800c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_enable_event_code(dev, EV_REL, REL_X, &abs), -1);
801c0abf9e6Sopenharmony_ci
802c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
803c0abf9e6Sopenharmony_ci	libevdev_free(dev);
804c0abf9e6Sopenharmony_ci}
805c0abf9e6Sopenharmony_ciEND_TEST
806c0abf9e6Sopenharmony_ci
807c0abf9e6Sopenharmony_ciSTART_TEST(test_device_disable_bit)
808c0abf9e6Sopenharmony_ci{
809c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
810c0abf9e6Sopenharmony_ci	struct libevdev *dev, *dev2;
811c0abf9e6Sopenharmony_ci	int rc;
812c0abf9e6Sopenharmony_ci	struct input_absinfo abs[2] = {
813c0abf9e6Sopenharmony_ci		{ .value = ABS_X, .minimum = 0, .maximum = 1 },
814c0abf9e6Sopenharmony_ci		{ .value = ABS_Y, .minimum = 0, .maximum = 1 },
815c0abf9e6Sopenharmony_ci	};
816c0abf9e6Sopenharmony_ci
817c0abf9e6Sopenharmony_ci	test_create_abs_device(&uidev, &dev,
818c0abf9e6Sopenharmony_ci			       2, abs,
819c0abf9e6Sopenharmony_ci			       EV_REL, REL_X,
820c0abf9e6Sopenharmony_ci			       EV_REL, REL_Y,
821c0abf9e6Sopenharmony_ci			       -1);
822c0abf9e6Sopenharmony_ci
823c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(dev, EV_ABS, ABS_X));
824c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(dev, EV_ABS, ABS_Y));
825c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_type(dev, EV_REL));
826c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(dev, EV_REL, REL_X));
827c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(dev, EV_REL, REL_Y));
828c0abf9e6Sopenharmony_ci
829c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_disable_event_code(dev, EV_ABS, ABS_Y), 0);
830c0abf9e6Sopenharmony_ci	ck_assert(!libevdev_has_event_code(dev, EV_ABS, ABS_Y));
831c0abf9e6Sopenharmony_ci
832c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_disable_event_code(dev, EV_REL, REL_X), 0);
833c0abf9e6Sopenharmony_ci	ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_X));
834c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(dev, EV_REL, REL_Y));
835c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_type(dev, EV_REL));
836c0abf9e6Sopenharmony_ci
837c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_disable_event_type(dev, EV_REL), 0);
838c0abf9e6Sopenharmony_ci	ck_assert(!libevdev_has_event_type(dev, EV_REL));
839c0abf9e6Sopenharmony_ci	ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_X));
840c0abf9e6Sopenharmony_ci	ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_Y));
841c0abf9e6Sopenharmony_ci
842c0abf9e6Sopenharmony_ci	/* make sure kernel device is unchanged */
843c0abf9e6Sopenharmony_ci	rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev2);
844c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));
845c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(dev2, EV_ABS, ABS_X));
846c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(dev2, EV_ABS, ABS_Y));
847c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_type(dev2, EV_REL));
848c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(dev2, EV_REL, REL_X));
849c0abf9e6Sopenharmony_ci	ck_assert(libevdev_has_event_code(dev2, EV_REL, REL_Y));
850c0abf9e6Sopenharmony_ci	libevdev_free(dev2);
851c0abf9e6Sopenharmony_ci
852c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
853c0abf9e6Sopenharmony_ci	libevdev_free(dev);
854c0abf9e6Sopenharmony_ci}
855c0abf9e6Sopenharmony_ciEND_TEST
856c0abf9e6Sopenharmony_ci
857c0abf9e6Sopenharmony_ciSTART_TEST(test_device_disable_bit_invalid)
858c0abf9e6Sopenharmony_ci{
859c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
860c0abf9e6Sopenharmony_ci	struct libevdev *dev;
861c0abf9e6Sopenharmony_ci	struct input_absinfo abs = { .value = ABS_X, .minimum = 0, .maximum = 1 };
862c0abf9e6Sopenharmony_ci
863c0abf9e6Sopenharmony_ci	test_create_abs_device(&uidev, &dev, 1, &abs, -1);
864c0abf9e6Sopenharmony_ci
865c0abf9e6Sopenharmony_ci	/* there's a gap between EV_SW and EV_LED */
866c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_disable_event_type(dev, EV_LED - 1), -1);
867c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_disable_event_code(dev, EV_LED - 1, 0), -1);
868c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_disable_event_code(dev, EV_ABS, ABS_MAX + 1), -1);
869c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_disable_event_code(dev, EV_MAX + 1, ABS_MAX + 1), -1);
870c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_disable_event_type(dev, EV_MAX + 1), -1);
871c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_disable_event_type(dev, EV_SYN), -1);
872c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_disable_event_code(dev, EV_SYN, SYN_REPORT), -1);
873c0abf9e6Sopenharmony_ci
874c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
875c0abf9e6Sopenharmony_ci	libevdev_free(dev);
876c0abf9e6Sopenharmony_ci}
877c0abf9e6Sopenharmony_ciEND_TEST
878c0abf9e6Sopenharmony_ci
879c0abf9e6Sopenharmony_ciSTART_TEST(test_device_kernel_change_axis)
880c0abf9e6Sopenharmony_ci{
881c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
882c0abf9e6Sopenharmony_ci	struct libevdev *dev, *dev2;
883c0abf9e6Sopenharmony_ci	struct input_absinfo abs;
884c0abf9e6Sopenharmony_ci	int rc;
885c0abf9e6Sopenharmony_ci
886c0abf9e6Sopenharmony_ci	uidev = uinput_device_new(TEST_DEVICE_NAME);
887c0abf9e6Sopenharmony_ci	ck_assert(uidev != NULL);
888c0abf9e6Sopenharmony_ci
889c0abf9e6Sopenharmony_ci	abs.minimum = 0;
890c0abf9e6Sopenharmony_ci	abs.maximum = 1000;
891c0abf9e6Sopenharmony_ci	abs.fuzz = 1;
892c0abf9e6Sopenharmony_ci	abs.flat = 2;
893c0abf9e6Sopenharmony_ci	abs.resolution = 3;
894c0abf9e6Sopenharmony_ci	abs.value = 0;
895c0abf9e6Sopenharmony_ci
896c0abf9e6Sopenharmony_ci	uinput_device_set_abs_bit(uidev, ABS_X, &abs);
897c0abf9e6Sopenharmony_ci
898c0abf9e6Sopenharmony_ci	rc = uinput_device_create(uidev);
899c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
900c0abf9e6Sopenharmony_ci
901c0abf9e6Sopenharmony_ci	rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
902c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
903c0abf9e6Sopenharmony_ci
904c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_X), 0);
905c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_X), 1000);
906c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_X), 1);
907c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_X), 2);
908c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_X), 3);
909c0abf9e6Sopenharmony_ci
910c0abf9e6Sopenharmony_ci	abs.minimum = 500;
911c0abf9e6Sopenharmony_ci	abs.maximum = 5000;
912c0abf9e6Sopenharmony_ci	abs.fuzz = 10;
913c0abf9e6Sopenharmony_ci	abs.flat = 20;
914c0abf9e6Sopenharmony_ci	abs.resolution = 30;
915c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_abs_info(dev, ABS_X, &abs);
916c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
917c0abf9e6Sopenharmony_ci
918c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_X), 500);
919c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_X), 5000);
920c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_X), 10);
921c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_X), 20);
922c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_X), 30);
923c0abf9e6Sopenharmony_ci
924c0abf9e6Sopenharmony_ci	/* make sure kernel device is changed */
925c0abf9e6Sopenharmony_ci	rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev2);
926c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));
927c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_minimum(dev2, ABS_X), 500);
928c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_maximum(dev2, ABS_X), 5000);
929c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_fuzz(dev2, ABS_X), 10);
930c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_flat(dev2, ABS_X), 20);
931c0abf9e6Sopenharmony_ci	ck_assert_int_eq(libevdev_get_abs_resolution(dev2, ABS_X), 30);
932c0abf9e6Sopenharmony_ci	libevdev_free(dev2);
933c0abf9e6Sopenharmony_ci
934c0abf9e6Sopenharmony_ci	libevdev_free(dev);
935c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
936c0abf9e6Sopenharmony_ci}
937c0abf9e6Sopenharmony_ciEND_TEST
938c0abf9e6Sopenharmony_ci
939c0abf9e6Sopenharmony_ciSTART_TEST(test_device_kernel_change_axis_invalid)
940c0abf9e6Sopenharmony_ci{
941c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
942c0abf9e6Sopenharmony_ci	struct libevdev *dev;
943c0abf9e6Sopenharmony_ci	struct input_absinfo abs;
944c0abf9e6Sopenharmony_ci	int rc;
945c0abf9e6Sopenharmony_ci
946c0abf9e6Sopenharmony_ci	uidev = uinput_device_new(TEST_DEVICE_NAME);
947c0abf9e6Sopenharmony_ci	ck_assert(uidev != NULL);
948c0abf9e6Sopenharmony_ci
949c0abf9e6Sopenharmony_ci	abs.minimum = 0;
950c0abf9e6Sopenharmony_ci	abs.maximum = 1000;
951c0abf9e6Sopenharmony_ci	abs.fuzz = 1;
952c0abf9e6Sopenharmony_ci	abs.flat = 2;
953c0abf9e6Sopenharmony_ci	abs.resolution = 3; /* FIXME: value is unused, we can't test resolution */
954c0abf9e6Sopenharmony_ci	abs.value = 0;
955c0abf9e6Sopenharmony_ci
956c0abf9e6Sopenharmony_ci	uinput_device_set_abs_bit(uidev, ABS_X, &abs);
957c0abf9e6Sopenharmony_ci
958c0abf9e6Sopenharmony_ci	rc = uinput_device_create(uidev);
959c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
960c0abf9e6Sopenharmony_ci
961c0abf9e6Sopenharmony_ci	rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
962c0abf9e6Sopenharmony_ci	ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
963c0abf9e6Sopenharmony_ci
964c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_abs_info(dev, ABS_MAX + 1, &abs);
965c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, -EINVAL);
966c0abf9e6Sopenharmony_ci
967c0abf9e6Sopenharmony_ci	libevdev_free(dev);
968c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
969c0abf9e6Sopenharmony_ci}
970c0abf9e6Sopenharmony_ciEND_TEST
971c0abf9e6Sopenharmony_ci
972c0abf9e6Sopenharmony_ciSTART_TEST(test_device_kernel_set_abs_invalid_fd)
973c0abf9e6Sopenharmony_ci{
974c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
975c0abf9e6Sopenharmony_ci	struct libevdev *dev;
976c0abf9e6Sopenharmony_ci	struct input_absinfo abs[2];
977c0abf9e6Sopenharmony_ci	struct input_absinfo a;
978c0abf9e6Sopenharmony_ci	int rc;
979c0abf9e6Sopenharmony_ci
980c0abf9e6Sopenharmony_ci	libevdev_set_log_function(test_logfunc_ignore_error, NULL);
981c0abf9e6Sopenharmony_ci
982c0abf9e6Sopenharmony_ci	memset(abs, 0, sizeof(abs));
983c0abf9e6Sopenharmony_ci	abs[0].value = ABS_X;
984c0abf9e6Sopenharmony_ci	abs[0].maximum = 1000;
985c0abf9e6Sopenharmony_ci
986c0abf9e6Sopenharmony_ci	abs[1].value = ABS_Y;
987c0abf9e6Sopenharmony_ci	abs[1].maximum = 1000;
988c0abf9e6Sopenharmony_ci
989c0abf9e6Sopenharmony_ci	dev = libevdev_new();
990c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_abs_info(dev, ABS_X, &a);
991c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, -EBADF);
992c0abf9e6Sopenharmony_ci	libevdev_free(dev);
993c0abf9e6Sopenharmony_ci
994c0abf9e6Sopenharmony_ci	test_create_abs_device(&uidev, &dev,
995c0abf9e6Sopenharmony_ci			       2, abs,
996c0abf9e6Sopenharmony_ci			       EV_SYN,
997c0abf9e6Sopenharmony_ci			       -1);
998c0abf9e6Sopenharmony_ci
999c0abf9e6Sopenharmony_ci	libevdev_change_fd(dev, -2);
1000c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_abs_info(dev, ABS_X, &a);
1001c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, -EBADF);
1002c0abf9e6Sopenharmony_ci
1003c0abf9e6Sopenharmony_ci	libevdev_set_log_function(test_logfunc_abort_on_error, NULL);
1004c0abf9e6Sopenharmony_ci
1005c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
1006c0abf9e6Sopenharmony_ci	libevdev_free(dev);
1007c0abf9e6Sopenharmony_ci}
1008c0abf9e6Sopenharmony_ciEND_TEST
1009c0abf9e6Sopenharmony_ci
1010c0abf9e6Sopenharmony_ciSTART_TEST(test_led_valid)
1011c0abf9e6Sopenharmony_ci{
1012c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
1013c0abf9e6Sopenharmony_ci	struct libevdev *dev;
1014c0abf9e6Sopenharmony_ci	int rc;
1015c0abf9e6Sopenharmony_ci
1016c0abf9e6Sopenharmony_ci	test_create_device(&uidev, &dev,
1017c0abf9e6Sopenharmony_ci			   EV_LED, LED_NUML,
1018c0abf9e6Sopenharmony_ci			   EV_LED, LED_CAPSL,
1019c0abf9e6Sopenharmony_ci			   EV_LED, LED_COMPOSE,
1020c0abf9e6Sopenharmony_ci			   -1);
1021c0abf9e6Sopenharmony_ci
1022c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_led_value(dev, LED_NUML, LIBEVDEV_LED_ON);
1023c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
1024c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_led_value(dev, LED_NUML, LIBEVDEV_LED_OFF);
1025c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
1026c0abf9e6Sopenharmony_ci
1027c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_led_values(dev,
1028c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF,
1029c0abf9e6Sopenharmony_ci					    LED_CAPSL, LIBEVDEV_LED_ON,
1030c0abf9e6Sopenharmony_ci					    LED_COMPOSE, LIBEVDEV_LED_OFF,
1031c0abf9e6Sopenharmony_ci					    -1);
1032c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
1033c0abf9e6Sopenharmony_ci	ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_NUML));
1034c0abf9e6Sopenharmony_ci	ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_CAPSL));
1035c0abf9e6Sopenharmony_ci	ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_COMPOSE));
1036c0abf9e6Sopenharmony_ci
1037c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_led_values(dev,
1038c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_ON,
1039c0abf9e6Sopenharmony_ci					    LED_CAPSL, LIBEVDEV_LED_OFF,
1040c0abf9e6Sopenharmony_ci					    LED_COMPOSE, LIBEVDEV_LED_ON,
1041c0abf9e6Sopenharmony_ci					    -1);
1042c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
1043c0abf9e6Sopenharmony_ci	ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_NUML));
1044c0abf9e6Sopenharmony_ci	ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_CAPSL));
1045c0abf9e6Sopenharmony_ci	ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_COMPOSE));
1046c0abf9e6Sopenharmony_ci
1047c0abf9e6Sopenharmony_ci	/* make sure we ignore unset leds */
1048c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_led_values(dev,
1049c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_ON,
1050c0abf9e6Sopenharmony_ci					    LED_CAPSL, LIBEVDEV_LED_OFF,
1051c0abf9e6Sopenharmony_ci					    LED_SCROLLL, LIBEVDEV_LED_OFF,
1052c0abf9e6Sopenharmony_ci					    LED_COMPOSE, LIBEVDEV_LED_ON,
1053c0abf9e6Sopenharmony_ci					    -1);
1054c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
1055c0abf9e6Sopenharmony_ci	ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_NUML));
1056c0abf9e6Sopenharmony_ci	ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_CAPSL));
1057c0abf9e6Sopenharmony_ci	ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_COMPOSE));
1058c0abf9e6Sopenharmony_ci
1059c0abf9e6Sopenharmony_ci	libevdev_free(dev);
1060c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
1061c0abf9e6Sopenharmony_ci}
1062c0abf9e6Sopenharmony_ciEND_TEST
1063c0abf9e6Sopenharmony_ci
1064c0abf9e6Sopenharmony_ciSTART_TEST(test_led_invalid)
1065c0abf9e6Sopenharmony_ci{
1066c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
1067c0abf9e6Sopenharmony_ci	struct libevdev *dev;
1068c0abf9e6Sopenharmony_ci	int rc;
1069c0abf9e6Sopenharmony_ci
1070c0abf9e6Sopenharmony_ci	test_create_device(&uidev, &dev,
1071c0abf9e6Sopenharmony_ci			   EV_LED, LED_NUML,
1072c0abf9e6Sopenharmony_ci			   EV_LED, LED_CAPSL,
1073c0abf9e6Sopenharmony_ci			   EV_LED, LED_COMPOSE,
1074c0abf9e6Sopenharmony_ci			   -1);
1075c0abf9e6Sopenharmony_ci
1076c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_led_value(dev, LED_MAX + 1, LIBEVDEV_LED_ON);
1077c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, -EINVAL);
1078c0abf9e6Sopenharmony_ci
1079c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_led_value(dev, LED_NUML, LIBEVDEV_LED_OFF + 1);
1080c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, -EINVAL);
1081c0abf9e6Sopenharmony_ci
1082c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_led_value(dev, LED_SCROLLL, LIBEVDEV_LED_ON);
1083c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
1084c0abf9e6Sopenharmony_ci
1085c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_led_values(dev,
1086c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF + 1,
1087c0abf9e6Sopenharmony_ci					    -1);
1088c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, -EINVAL);
1089c0abf9e6Sopenharmony_ci
1090c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_led_values(dev,
1091c0abf9e6Sopenharmony_ci					    LED_MAX + 1, LIBEVDEV_LED_ON,
1092c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF + 1,
1093c0abf9e6Sopenharmony_ci					    -1);
1094c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, -EINVAL);
1095c0abf9e6Sopenharmony_ci
1096c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_led_values(dev,
1097c0abf9e6Sopenharmony_ci					    LED_SCROLLL, LIBEVDEV_LED_OFF,
1098c0abf9e6Sopenharmony_ci					    -1);
1099c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
1100c0abf9e6Sopenharmony_ci
1101c0abf9e6Sopenharmony_ci	libevdev_free(dev);
1102c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
1103c0abf9e6Sopenharmony_ci}
1104c0abf9e6Sopenharmony_ciEND_TEST
1105c0abf9e6Sopenharmony_ci
1106c0abf9e6Sopenharmony_ciSTART_TEST(test_led_same)
1107c0abf9e6Sopenharmony_ci{
1108c0abf9e6Sopenharmony_ci	struct uinput_device* uidev;
1109c0abf9e6Sopenharmony_ci	struct libevdev *dev;
1110c0abf9e6Sopenharmony_ci	int rc;
1111c0abf9e6Sopenharmony_ci
1112c0abf9e6Sopenharmony_ci	test_create_device(&uidev, &dev,
1113c0abf9e6Sopenharmony_ci			   EV_LED, LED_NUML,
1114c0abf9e6Sopenharmony_ci			   EV_LED, LED_CAPSL,
1115c0abf9e6Sopenharmony_ci			   EV_LED, LED_COMPOSE,
1116c0abf9e6Sopenharmony_ci			   -1);
1117c0abf9e6Sopenharmony_ci
1118c0abf9e6Sopenharmony_ci	rc = libevdev_kernel_set_led_values(dev,
1119c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF,
1120c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_ON,
1121c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF,
1122c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_ON,
1123c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF,
1124c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_ON,
1125c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF,
1126c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_ON,
1127c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF,
1128c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_ON,
1129c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF,
1130c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_ON,
1131c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF,
1132c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_ON,
1133c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF,
1134c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_ON,
1135c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF,
1136c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_ON,
1137c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF,
1138c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_ON,
1139c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF,
1140c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_ON,
1141c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_OFF,
1142c0abf9e6Sopenharmony_ci					    LED_NUML, LIBEVDEV_LED_ON,
1143c0abf9e6Sopenharmony_ci					    /* more than LED_CNT */
1144c0abf9e6Sopenharmony_ci					    -1);
1145c0abf9e6Sopenharmony_ci	ck_assert_int_eq(rc, 0);
1146c0abf9e6Sopenharmony_ci	ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_NUML));
1147c0abf9e6Sopenharmony_ci	ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_CAPSL));
1148c0abf9e6Sopenharmony_ci	ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_COMPOSE));
1149c0abf9e6Sopenharmony_ci
1150c0abf9e6Sopenharmony_ci	libevdev_free(dev);
1151c0abf9e6Sopenharmony_ci	uinput_device_free(uidev);
1152c0abf9e6Sopenharmony_ci}
1153c0abf9e6Sopenharmony_ciEND_TEST
1154c0abf9e6Sopenharmony_ci
1155c0abf9e6Sopenharmony_ciTEST_SUITE_ROOT_PRIVILEGES(has_events)
1156c0abf9e6Sopenharmony_ci{
1157c0abf9e6Sopenharmony_ci	Suite *s = suite_create("libevdev_has_event tests");
1158c0abf9e6Sopenharmony_ci
1159c0abf9e6Sopenharmony_ci	add_test(s, test_ev_bit_limits);
1160c0abf9e6Sopenharmony_ci	add_test(s, test_has_ev_bit);
1161c0abf9e6Sopenharmony_ci
1162c0abf9e6Sopenharmony_ci	add_test(s, test_event_codes);
1163c0abf9e6Sopenharmony_ci	add_test(s, test_event_code_limits);
1164c0abf9e6Sopenharmony_ci
1165c0abf9e6Sopenharmony_ci	add_test(s, test_ev_rep);
1166c0abf9e6Sopenharmony_ci	add_test(s, test_ev_rep_values);
1167c0abf9e6Sopenharmony_ci
1168c0abf9e6Sopenharmony_ci	add_test(s, test_input_props);
1169c0abf9e6Sopenharmony_ci	add_test(s, test_set_input_props);
1170c0abf9e6Sopenharmony_ci
1171c0abf9e6Sopenharmony_ci	add_test(s, test_no_slots);
1172c0abf9e6Sopenharmony_ci	add_test(s, test_slot_number);
1173c0abf9e6Sopenharmony_ci	add_test(s, test_slot_init_value);
1174c0abf9e6Sopenharmony_ci	add_test(s, test_invalid_mt_device);
1175c0abf9e6Sopenharmony_ci
1176c0abf9e6Sopenharmony_ci	add_test(s, test_device_name);
1177c0abf9e6Sopenharmony_ci	add_test(s, test_device_set_name);
1178c0abf9e6Sopenharmony_ci	add_test(s, test_device_set_ids);
1179c0abf9e6Sopenharmony_ci	add_test(s, test_device_get_abs_info);
1180c0abf9e6Sopenharmony_ci
1181c0abf9e6Sopenharmony_ci	add_test(s, test_device_set_abs);
1182c0abf9e6Sopenharmony_ci	add_test(s, test_device_enable_bit);
1183c0abf9e6Sopenharmony_ci	add_test(s, test_device_enable_bit_invalid);
1184c0abf9e6Sopenharmony_ci	add_test(s, test_device_disable_bit);
1185c0abf9e6Sopenharmony_ci	add_test(s, test_device_disable_bit_invalid);
1186c0abf9e6Sopenharmony_ci	add_test(s, test_device_kernel_change_axis);
1187c0abf9e6Sopenharmony_ci	add_test(s, test_device_kernel_change_axis_invalid);
1188c0abf9e6Sopenharmony_ci	add_test(s, test_device_kernel_set_abs_invalid_fd);
1189c0abf9e6Sopenharmony_ci
1190c0abf9e6Sopenharmony_ci	add_test(s, test_led_valid);
1191c0abf9e6Sopenharmony_ci	add_test(s, test_led_invalid);
1192c0abf9e6Sopenharmony_ci	add_test(s, test_led_same);
1193c0abf9e6Sopenharmony_ci
1194c0abf9e6Sopenharmony_ci	return s;
1195c0abf9e6Sopenharmony_ci}
1196