1a46c0ec8Sopenharmony_ci/*
2a46c0ec8Sopenharmony_ci * Copyright © 2014 Red Hat, Inc.
3a46c0ec8Sopenharmony_ci *
4a46c0ec8Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
5a46c0ec8Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
6a46c0ec8Sopenharmony_ci * to deal in the Software without restriction, including without limitation
7a46c0ec8Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a46c0ec8Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
9a46c0ec8Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
10a46c0ec8Sopenharmony_ci *
11a46c0ec8Sopenharmony_ci * The above copyright notice and this permission notice (including the next
12a46c0ec8Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the
13a46c0ec8Sopenharmony_ci * Software.
14a46c0ec8Sopenharmony_ci *
15a46c0ec8Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16a46c0ec8Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17a46c0ec8Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18a46c0ec8Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19a46c0ec8Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20a46c0ec8Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21a46c0ec8Sopenharmony_ci * DEALINGS IN THE SOFTWARE.
22a46c0ec8Sopenharmony_ci */
23a46c0ec8Sopenharmony_ci
24a46c0ec8Sopenharmony_ci#include <config.h>
25a46c0ec8Sopenharmony_ci
26a46c0ec8Sopenharmony_ci#include <check.h>
27a46c0ec8Sopenharmony_ci
28a46c0ec8Sopenharmony_ci#include <valgrind/valgrind.h>
29a46c0ec8Sopenharmony_ci
30a46c0ec8Sopenharmony_ci#include "util-list.h"
31a46c0ec8Sopenharmony_ci#include "util-strings.h"
32a46c0ec8Sopenharmony_ci#include "util-time.h"
33a46c0ec8Sopenharmony_ci#include "util-prop-parsers.h"
34a46c0ec8Sopenharmony_ci#include "util-macros.h"
35a46c0ec8Sopenharmony_ci#include "util-bits.h"
36a46c0ec8Sopenharmony_ci#include "util-ratelimit.h"
37a46c0ec8Sopenharmony_ci#include "util-matrix.h"
38a46c0ec8Sopenharmony_ci
39a46c0ec8Sopenharmony_ci#define  TEST_VERSIONSORT
40a46c0ec8Sopenharmony_ci#include "libinput-versionsort.h"
41a46c0ec8Sopenharmony_ci
42a46c0ec8Sopenharmony_ci#include "check-double-macros.h"
43a46c0ec8Sopenharmony_ci
44a46c0ec8Sopenharmony_ciSTART_TEST(array_for_each)
45a46c0ec8Sopenharmony_ci{
46a46c0ec8Sopenharmony_ci	int ai[6];
47a46c0ec8Sopenharmony_ci	char ac[10];
48a46c0ec8Sopenharmony_ci	struct as {
49a46c0ec8Sopenharmony_ci		int a;
50a46c0ec8Sopenharmony_ci		char b;
51a46c0ec8Sopenharmony_ci		int *ptr;
52a46c0ec8Sopenharmony_ci	} as[32];
53a46c0ec8Sopenharmony_ci
54a46c0ec8Sopenharmony_ci	for (size_t i = 0; i < 6; i++)
55a46c0ec8Sopenharmony_ci		ai[i] = 20 + i;
56a46c0ec8Sopenharmony_ci	for (size_t i = 0; i < 10; i++)
57a46c0ec8Sopenharmony_ci		ac[i] = 100 + i;
58a46c0ec8Sopenharmony_ci	for (size_t i = 0; i < 32; i++) {
59a46c0ec8Sopenharmony_ci		as[i].a = 10 + i;
60a46c0ec8Sopenharmony_ci		as[i].b = 20 + i;
61a46c0ec8Sopenharmony_ci		as[i].ptr = (int*)0xab + i;
62a46c0ec8Sopenharmony_ci	}
63a46c0ec8Sopenharmony_ci
64a46c0ec8Sopenharmony_ci	int iexpected = 20;
65a46c0ec8Sopenharmony_ci	ARRAY_FOR_EACH(ai, entry) {
66a46c0ec8Sopenharmony_ci		ck_assert_int_eq(*entry, iexpected);
67a46c0ec8Sopenharmony_ci		++iexpected;
68a46c0ec8Sopenharmony_ci	}
69a46c0ec8Sopenharmony_ci	ck_assert_int_eq(iexpected, 26);
70a46c0ec8Sopenharmony_ci
71a46c0ec8Sopenharmony_ci	int cexpected = 100;
72a46c0ec8Sopenharmony_ci	ARRAY_FOR_EACH(ac, entry) {
73a46c0ec8Sopenharmony_ci		ck_assert_int_eq(*entry, cexpected);
74a46c0ec8Sopenharmony_ci		++cexpected;
75a46c0ec8Sopenharmony_ci	}
76a46c0ec8Sopenharmony_ci	ck_assert_int_eq(cexpected, 110);
77a46c0ec8Sopenharmony_ci
78a46c0ec8Sopenharmony_ci	struct as sexpected = {
79a46c0ec8Sopenharmony_ci		.a = 10,
80a46c0ec8Sopenharmony_ci		.b = 20,
81a46c0ec8Sopenharmony_ci		.ptr = (int*)0xab,
82a46c0ec8Sopenharmony_ci	};
83a46c0ec8Sopenharmony_ci	ARRAY_FOR_EACH(as, entry) {
84a46c0ec8Sopenharmony_ci		ck_assert_int_eq(entry->a, sexpected.a);
85a46c0ec8Sopenharmony_ci		ck_assert_int_eq(entry->b, sexpected.b);
86a46c0ec8Sopenharmony_ci		ck_assert_ptr_eq(entry->ptr, sexpected.ptr);
87a46c0ec8Sopenharmony_ci		++sexpected.a;
88a46c0ec8Sopenharmony_ci		++sexpected.b;
89a46c0ec8Sopenharmony_ci		++sexpected.ptr;
90a46c0ec8Sopenharmony_ci	}
91a46c0ec8Sopenharmony_ci	ck_assert_int_eq(sexpected.a, 42);
92a46c0ec8Sopenharmony_ci}
93a46c0ec8Sopenharmony_ciEND_TEST
94a46c0ec8Sopenharmony_ci
95a46c0ec8Sopenharmony_ciSTART_TEST(bitfield_helpers)
96a46c0ec8Sopenharmony_ci{
97a46c0ec8Sopenharmony_ci	/* This value has a bit set on all of the word boundaries we want to
98a46c0ec8Sopenharmony_ci	 * test: 0, 1, 7, 8, 31, 32, and 33
99a46c0ec8Sopenharmony_ci	 */
100a46c0ec8Sopenharmony_ci	unsigned char read_bitfield[] = { 0x83, 0x1, 0x0, 0x80, 0x3 };
101a46c0ec8Sopenharmony_ci	unsigned char write_bitfield[ARRAY_LENGTH(read_bitfield)] = {0};
102a46c0ec8Sopenharmony_ci	size_t i;
103a46c0ec8Sopenharmony_ci
104a46c0ec8Sopenharmony_ci	/* Now check that the bitfield we wrote to came out to be the same as
105a46c0ec8Sopenharmony_ci	 * the bitfield we were writing from */
106a46c0ec8Sopenharmony_ci	for (i = 0; i < ARRAY_LENGTH(read_bitfield) * 8; i++) {
107a46c0ec8Sopenharmony_ci		switch (i) {
108a46c0ec8Sopenharmony_ci		case 0:
109a46c0ec8Sopenharmony_ci		case 1:
110a46c0ec8Sopenharmony_ci		case 7:
111a46c0ec8Sopenharmony_ci		case 8:
112a46c0ec8Sopenharmony_ci		case 31:
113a46c0ec8Sopenharmony_ci		case 32:
114a46c0ec8Sopenharmony_ci		case 33:
115a46c0ec8Sopenharmony_ci			ck_assert(bit_is_set(read_bitfield, i));
116a46c0ec8Sopenharmony_ci			set_bit(write_bitfield, i);
117a46c0ec8Sopenharmony_ci			break;
118a46c0ec8Sopenharmony_ci		default:
119a46c0ec8Sopenharmony_ci			ck_assert(!bit_is_set(read_bitfield, i));
120a46c0ec8Sopenharmony_ci			clear_bit(write_bitfield, i);
121a46c0ec8Sopenharmony_ci			break;
122a46c0ec8Sopenharmony_ci		}
123a46c0ec8Sopenharmony_ci	}
124a46c0ec8Sopenharmony_ci
125a46c0ec8Sopenharmony_ci	ck_assert_int_eq(memcmp(read_bitfield,
126a46c0ec8Sopenharmony_ci				write_bitfield,
127a46c0ec8Sopenharmony_ci				sizeof(read_bitfield)),
128a46c0ec8Sopenharmony_ci			 0);
129a46c0ec8Sopenharmony_ci}
130a46c0ec8Sopenharmony_ciEND_TEST
131a46c0ec8Sopenharmony_ci
132a46c0ec8Sopenharmony_ciSTART_TEST(matrix_helpers)
133a46c0ec8Sopenharmony_ci{
134a46c0ec8Sopenharmony_ci	struct matrix m1, m2, m3;
135a46c0ec8Sopenharmony_ci	float f[6] = { 1, 2, 3, 4, 5, 6 };
136a46c0ec8Sopenharmony_ci	int x, y;
137a46c0ec8Sopenharmony_ci	int row, col;
138a46c0ec8Sopenharmony_ci
139a46c0ec8Sopenharmony_ci	matrix_init_identity(&m1);
140a46c0ec8Sopenharmony_ci
141a46c0ec8Sopenharmony_ci	for (row = 0; row < 3; row++) {
142a46c0ec8Sopenharmony_ci		for (col = 0; col < 3; col++) {
143a46c0ec8Sopenharmony_ci			ck_assert_int_eq(m1.val[row][col],
144a46c0ec8Sopenharmony_ci					 (row == col) ? 1 : 0);
145a46c0ec8Sopenharmony_ci		}
146a46c0ec8Sopenharmony_ci	}
147a46c0ec8Sopenharmony_ci	ck_assert(matrix_is_identity(&m1));
148a46c0ec8Sopenharmony_ci
149a46c0ec8Sopenharmony_ci	matrix_from_farray6(&m2, f);
150a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[0][0], 1);
151a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[0][1], 2);
152a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[0][2], 3);
153a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[1][0], 4);
154a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[1][1], 5);
155a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[1][2], 6);
156a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[2][0], 0);
157a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[2][1], 0);
158a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[2][2], 1);
159a46c0ec8Sopenharmony_ci
160a46c0ec8Sopenharmony_ci	x = 100;
161a46c0ec8Sopenharmony_ci	y = 5;
162a46c0ec8Sopenharmony_ci	matrix_mult_vec(&m1, &x, &y);
163a46c0ec8Sopenharmony_ci	ck_assert_int_eq(x, 100);
164a46c0ec8Sopenharmony_ci	ck_assert_int_eq(y, 5);
165a46c0ec8Sopenharmony_ci
166a46c0ec8Sopenharmony_ci	matrix_mult(&m3, &m1, &m1);
167a46c0ec8Sopenharmony_ci	ck_assert(matrix_is_identity(&m3));
168a46c0ec8Sopenharmony_ci
169a46c0ec8Sopenharmony_ci	matrix_init_scale(&m2, 2, 4);
170a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[0][0], 2);
171a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[0][1], 0);
172a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[0][2], 0);
173a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[1][0], 0);
174a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[1][1], 4);
175a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[1][2], 0);
176a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[2][0], 0);
177a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[2][1], 0);
178a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[2][2], 1);
179a46c0ec8Sopenharmony_ci
180a46c0ec8Sopenharmony_ci	matrix_mult_vec(&m2, &x, &y);
181a46c0ec8Sopenharmony_ci	ck_assert_int_eq(x, 200);
182a46c0ec8Sopenharmony_ci	ck_assert_int_eq(y, 20);
183a46c0ec8Sopenharmony_ci
184a46c0ec8Sopenharmony_ci	matrix_init_translate(&m2, 10, 100);
185a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[0][0], 1);
186a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[0][1], 0);
187a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[0][2], 10);
188a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[1][0], 0);
189a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[1][1], 1);
190a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[1][2], 100);
191a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[2][0], 0);
192a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[2][1], 0);
193a46c0ec8Sopenharmony_ci	ck_assert_int_eq(m2.val[2][2], 1);
194a46c0ec8Sopenharmony_ci
195a46c0ec8Sopenharmony_ci	matrix_mult_vec(&m2, &x, &y);
196a46c0ec8Sopenharmony_ci	ck_assert_int_eq(x, 210);
197a46c0ec8Sopenharmony_ci	ck_assert_int_eq(y, 120);
198a46c0ec8Sopenharmony_ci
199a46c0ec8Sopenharmony_ci	matrix_to_farray6(&m2, f);
200a46c0ec8Sopenharmony_ci	ck_assert_int_eq(f[0], 1);
201a46c0ec8Sopenharmony_ci	ck_assert_int_eq(f[1], 0);
202a46c0ec8Sopenharmony_ci	ck_assert_int_eq(f[2], 10);
203a46c0ec8Sopenharmony_ci	ck_assert_int_eq(f[3], 0);
204a46c0ec8Sopenharmony_ci	ck_assert_int_eq(f[4], 1);
205a46c0ec8Sopenharmony_ci	ck_assert_int_eq(f[5], 100);
206a46c0ec8Sopenharmony_ci}
207a46c0ec8Sopenharmony_ciEND_TEST
208a46c0ec8Sopenharmony_ci
209a46c0ec8Sopenharmony_ciSTART_TEST(ratelimit_helpers)
210a46c0ec8Sopenharmony_ci{
211a46c0ec8Sopenharmony_ci	struct ratelimit rl;
212a46c0ec8Sopenharmony_ci	unsigned int i, j;
213a46c0ec8Sopenharmony_ci
214a46c0ec8Sopenharmony_ci	/* 10 attempts every 1000ms */
215a46c0ec8Sopenharmony_ci	ratelimit_init(&rl, ms2us(1000), 10);
216a46c0ec8Sopenharmony_ci
217a46c0ec8Sopenharmony_ci	for (j = 0; j < 3; ++j) {
218a46c0ec8Sopenharmony_ci		/* a burst of 9 attempts must succeed */
219a46c0ec8Sopenharmony_ci		for (i = 0; i < 9; ++i) {
220a46c0ec8Sopenharmony_ci			ck_assert_int_eq(ratelimit_test(&rl),
221a46c0ec8Sopenharmony_ci					 RATELIMIT_PASS);
222a46c0ec8Sopenharmony_ci		}
223a46c0ec8Sopenharmony_ci
224a46c0ec8Sopenharmony_ci		/* the 10th attempt reaches the threshold */
225a46c0ec8Sopenharmony_ci		ck_assert_int_eq(ratelimit_test(&rl), RATELIMIT_THRESHOLD);
226a46c0ec8Sopenharmony_ci
227a46c0ec8Sopenharmony_ci		/* ..then further attempts must fail.. */
228a46c0ec8Sopenharmony_ci		ck_assert_int_eq(ratelimit_test(&rl), RATELIMIT_EXCEEDED);
229a46c0ec8Sopenharmony_ci
230a46c0ec8Sopenharmony_ci		/* ..regardless of how often we try. */
231a46c0ec8Sopenharmony_ci		for (i = 0; i < 100; ++i) {
232a46c0ec8Sopenharmony_ci			ck_assert_int_eq(ratelimit_test(&rl),
233a46c0ec8Sopenharmony_ci					 RATELIMIT_EXCEEDED);
234a46c0ec8Sopenharmony_ci		}
235a46c0ec8Sopenharmony_ci
236a46c0ec8Sopenharmony_ci		/* ..even after waiting 20ms */
237a46c0ec8Sopenharmony_ci		msleep(100);
238a46c0ec8Sopenharmony_ci		for (i = 0; i < 100; ++i) {
239a46c0ec8Sopenharmony_ci			ck_assert_int_eq(ratelimit_test(&rl),
240a46c0ec8Sopenharmony_ci					 RATELIMIT_EXCEEDED);
241a46c0ec8Sopenharmony_ci		}
242a46c0ec8Sopenharmony_ci
243a46c0ec8Sopenharmony_ci		/* but after 1000ms the counter is reset */
244a46c0ec8Sopenharmony_ci		msleep(950); /* +50ms to account for time drifts */
245a46c0ec8Sopenharmony_ci	}
246a46c0ec8Sopenharmony_ci}
247a46c0ec8Sopenharmony_ciEND_TEST
248a46c0ec8Sopenharmony_ci
249a46c0ec8Sopenharmony_cistruct parser_test {
250a46c0ec8Sopenharmony_ci	char *tag;
251a46c0ec8Sopenharmony_ci	int expected_value;
252a46c0ec8Sopenharmony_ci};
253a46c0ec8Sopenharmony_ci
254a46c0ec8Sopenharmony_ciSTART_TEST(dpi_parser)
255a46c0ec8Sopenharmony_ci{
256a46c0ec8Sopenharmony_ci	struct parser_test tests[] = {
257a46c0ec8Sopenharmony_ci		{ "450 *1800 3200", 1800 },
258a46c0ec8Sopenharmony_ci		{ "*450 1800 3200", 450 },
259a46c0ec8Sopenharmony_ci		{ "450 1800 *3200", 3200 },
260a46c0ec8Sopenharmony_ci		{ "450 1800 3200", 3200 },
261a46c0ec8Sopenharmony_ci		{ "450 1800 failboat", 0 },
262a46c0ec8Sopenharmony_ci		{ "450 1800 *failboat", 0 },
263a46c0ec8Sopenharmony_ci		{ "0 450 1800 *3200", 0 },
264a46c0ec8Sopenharmony_ci		{ "450@37 1800@12 *3200@6", 3200 },
265a46c0ec8Sopenharmony_ci		{ "450@125 1800@125   *3200@125  ", 3200 },
266a46c0ec8Sopenharmony_ci		{ "450@125 *1800@125  3200@125", 1800 },
267a46c0ec8Sopenharmony_ci		{ "*this @string fails", 0 },
268a46c0ec8Sopenharmony_ci		{ "12@34 *45@", 0 },
269a46c0ec8Sopenharmony_ci		{ "12@a *45@", 0 },
270a46c0ec8Sopenharmony_ci		{ "12@a *45@25", 0 },
271a46c0ec8Sopenharmony_ci		{ "                                      * 12, 450, 800", 0 },
272a46c0ec8Sopenharmony_ci		{ "                                      *12, 450, 800", 12 },
273a46c0ec8Sopenharmony_ci		{ "*12, *450, 800", 12 },
274a46c0ec8Sopenharmony_ci		{ "*-23412, 450, 800", 0 },
275a46c0ec8Sopenharmony_ci		{ "112@125, 450@125, 800@125, 900@-125", 0 },
276a46c0ec8Sopenharmony_ci		{ "", 0 },
277a46c0ec8Sopenharmony_ci		{ "   ", 0 },
278a46c0ec8Sopenharmony_ci		{ "* ", 0 },
279a46c0ec8Sopenharmony_ci		{ NULL, 0 }
280a46c0ec8Sopenharmony_ci	};
281a46c0ec8Sopenharmony_ci	int i, dpi;
282a46c0ec8Sopenharmony_ci
283a46c0ec8Sopenharmony_ci	for (i = 0; tests[i].tag != NULL; i++) {
284a46c0ec8Sopenharmony_ci		dpi = parse_mouse_dpi_property(tests[i].tag);
285a46c0ec8Sopenharmony_ci		ck_assert_int_eq(dpi, tests[i].expected_value);
286a46c0ec8Sopenharmony_ci	}
287a46c0ec8Sopenharmony_ci
288a46c0ec8Sopenharmony_ci	dpi = parse_mouse_dpi_property(NULL);
289a46c0ec8Sopenharmony_ci	ck_assert_int_eq(dpi, 0);
290a46c0ec8Sopenharmony_ci}
291a46c0ec8Sopenharmony_ciEND_TEST
292a46c0ec8Sopenharmony_ci
293a46c0ec8Sopenharmony_ciSTART_TEST(wheel_click_parser)
294a46c0ec8Sopenharmony_ci{
295a46c0ec8Sopenharmony_ci	struct parser_test tests[] = {
296a46c0ec8Sopenharmony_ci		{ "1", 1 },
297a46c0ec8Sopenharmony_ci		{ "10", 10 },
298a46c0ec8Sopenharmony_ci		{ "-12", -12 },
299a46c0ec8Sopenharmony_ci		{ "360", 360 },
300a46c0ec8Sopenharmony_ci
301a46c0ec8Sopenharmony_ci		{ "0", 0 },
302a46c0ec8Sopenharmony_ci		{ "-0", 0 },
303a46c0ec8Sopenharmony_ci		{ "a", 0 },
304a46c0ec8Sopenharmony_ci		{ "10a", 0 },
305a46c0ec8Sopenharmony_ci		{ "10-", 0 },
306a46c0ec8Sopenharmony_ci		{ "sadfasfd", 0 },
307a46c0ec8Sopenharmony_ci		{ "361", 0 },
308a46c0ec8Sopenharmony_ci		{ NULL, 0 }
309a46c0ec8Sopenharmony_ci	};
310a46c0ec8Sopenharmony_ci
311a46c0ec8Sopenharmony_ci	int i, angle;
312a46c0ec8Sopenharmony_ci
313a46c0ec8Sopenharmony_ci	for (i = 0; tests[i].tag != NULL; i++) {
314a46c0ec8Sopenharmony_ci		angle = parse_mouse_wheel_click_angle_property(tests[i].tag);
315a46c0ec8Sopenharmony_ci		ck_assert_int_eq(angle, tests[i].expected_value);
316a46c0ec8Sopenharmony_ci	}
317a46c0ec8Sopenharmony_ci}
318a46c0ec8Sopenharmony_ciEND_TEST
319a46c0ec8Sopenharmony_ci
320a46c0ec8Sopenharmony_ciSTART_TEST(wheel_click_count_parser)
321a46c0ec8Sopenharmony_ci{
322a46c0ec8Sopenharmony_ci	struct parser_test tests[] = {
323a46c0ec8Sopenharmony_ci		{ "1", 1 },
324a46c0ec8Sopenharmony_ci		{ "10", 10 },
325a46c0ec8Sopenharmony_ci		{ "-12", -12 },
326a46c0ec8Sopenharmony_ci		{ "360", 360 },
327a46c0ec8Sopenharmony_ci
328a46c0ec8Sopenharmony_ci		{ "0", 0 },
329a46c0ec8Sopenharmony_ci		{ "-0", 0 },
330a46c0ec8Sopenharmony_ci		{ "a", 0 },
331a46c0ec8Sopenharmony_ci		{ "10a", 0 },
332a46c0ec8Sopenharmony_ci		{ "10-", 0 },
333a46c0ec8Sopenharmony_ci		{ "sadfasfd", 0 },
334a46c0ec8Sopenharmony_ci		{ "361", 0 },
335a46c0ec8Sopenharmony_ci		{ NULL, 0 }
336a46c0ec8Sopenharmony_ci	};
337a46c0ec8Sopenharmony_ci
338a46c0ec8Sopenharmony_ci	int i, angle;
339a46c0ec8Sopenharmony_ci
340a46c0ec8Sopenharmony_ci	for (i = 0; tests[i].tag != NULL; i++) {
341a46c0ec8Sopenharmony_ci		angle = parse_mouse_wheel_click_count_property(tests[i].tag);
342a46c0ec8Sopenharmony_ci		ck_assert_int_eq(angle, tests[i].expected_value);
343a46c0ec8Sopenharmony_ci	}
344a46c0ec8Sopenharmony_ci
345a46c0ec8Sopenharmony_ci	angle = parse_mouse_wheel_click_count_property(NULL);
346a46c0ec8Sopenharmony_ci	ck_assert_int_eq(angle, 0);
347a46c0ec8Sopenharmony_ci}
348a46c0ec8Sopenharmony_ciEND_TEST
349a46c0ec8Sopenharmony_ci
350a46c0ec8Sopenharmony_ciSTART_TEST(dimension_prop_parser)
351a46c0ec8Sopenharmony_ci{
352a46c0ec8Sopenharmony_ci	struct parser_test_dimension {
353a46c0ec8Sopenharmony_ci		char *tag;
354a46c0ec8Sopenharmony_ci		bool success;
355a46c0ec8Sopenharmony_ci		int x, y;
356a46c0ec8Sopenharmony_ci	} tests[] = {
357a46c0ec8Sopenharmony_ci		{ "10x10", true, 10, 10 },
358a46c0ec8Sopenharmony_ci		{ "1x20", true, 1, 20 },
359a46c0ec8Sopenharmony_ci		{ "1x8000", true, 1, 8000 },
360a46c0ec8Sopenharmony_ci		{ "238492x428210", true, 238492, 428210 },
361a46c0ec8Sopenharmony_ci		{ "0x0", false, 0, 0 },
362a46c0ec8Sopenharmony_ci		{ "-10x10", false, 0, 0 },
363a46c0ec8Sopenharmony_ci		{ "-1", false, 0, 0 },
364a46c0ec8Sopenharmony_ci		{ "1x-99", false, 0, 0 },
365a46c0ec8Sopenharmony_ci		{ "0", false, 0, 0 },
366a46c0ec8Sopenharmony_ci		{ "100", false, 0, 0 },
367a46c0ec8Sopenharmony_ci		{ "", false, 0, 0 },
368a46c0ec8Sopenharmony_ci		{ "abd", false, 0, 0 },
369a46c0ec8Sopenharmony_ci		{ "xabd", false, 0, 0 },
370a46c0ec8Sopenharmony_ci		{ "0xaf", false, 0, 0 },
371a46c0ec8Sopenharmony_ci		{ "0x0x", false, 0, 0 },
372a46c0ec8Sopenharmony_ci		{ "x10", false, 0, 0 },
373a46c0ec8Sopenharmony_ci		{ NULL, false, 0, 0 }
374a46c0ec8Sopenharmony_ci	};
375a46c0ec8Sopenharmony_ci	int i;
376a46c0ec8Sopenharmony_ci	size_t x, y;
377a46c0ec8Sopenharmony_ci	bool success;
378a46c0ec8Sopenharmony_ci
379a46c0ec8Sopenharmony_ci	for (i = 0; tests[i].tag != NULL; i++) {
380a46c0ec8Sopenharmony_ci		x = y = 0xad;
381a46c0ec8Sopenharmony_ci		success = parse_dimension_property(tests[i].tag, &x, &y);
382a46c0ec8Sopenharmony_ci		ck_assert(success == tests[i].success);
383a46c0ec8Sopenharmony_ci		if (success) {
384a46c0ec8Sopenharmony_ci			ck_assert_int_eq(x, tests[i].x);
385a46c0ec8Sopenharmony_ci			ck_assert_int_eq(y, tests[i].y);
386a46c0ec8Sopenharmony_ci		} else {
387a46c0ec8Sopenharmony_ci			ck_assert_int_eq(x, 0xad);
388a46c0ec8Sopenharmony_ci			ck_assert_int_eq(y, 0xad);
389a46c0ec8Sopenharmony_ci		}
390a46c0ec8Sopenharmony_ci	}
391a46c0ec8Sopenharmony_ci
392a46c0ec8Sopenharmony_ci	success = parse_dimension_property(NULL, &x, &y);
393a46c0ec8Sopenharmony_ci	ck_assert(success == false);
394a46c0ec8Sopenharmony_ci}
395a46c0ec8Sopenharmony_ciEND_TEST
396a46c0ec8Sopenharmony_ci
397a46c0ec8Sopenharmony_ciSTART_TEST(reliability_prop_parser)
398a46c0ec8Sopenharmony_ci{
399a46c0ec8Sopenharmony_ci	struct parser_test_reliability {
400a46c0ec8Sopenharmony_ci		char *tag;
401a46c0ec8Sopenharmony_ci		bool success;
402a46c0ec8Sopenharmony_ci		enum switch_reliability reliability;
403a46c0ec8Sopenharmony_ci	} tests[] = {
404a46c0ec8Sopenharmony_ci		{ "reliable", true, RELIABILITY_RELIABLE },
405a46c0ec8Sopenharmony_ci		{ "unreliable", true, RELIABILITY_UNRELIABLE },
406a46c0ec8Sopenharmony_ci		{ "write_open", true, RELIABILITY_WRITE_OPEN },
407a46c0ec8Sopenharmony_ci		{ "", false, 0 },
408a46c0ec8Sopenharmony_ci		{ "0", false, 0 },
409a46c0ec8Sopenharmony_ci		{ "1", false, 0 },
410a46c0ec8Sopenharmony_ci		{ NULL, false, 0, }
411a46c0ec8Sopenharmony_ci	};
412a46c0ec8Sopenharmony_ci	enum switch_reliability r;
413a46c0ec8Sopenharmony_ci	bool success;
414a46c0ec8Sopenharmony_ci	int i;
415a46c0ec8Sopenharmony_ci
416a46c0ec8Sopenharmony_ci	for (i = 0; tests[i].tag != NULL; i++) {
417a46c0ec8Sopenharmony_ci		r = 0xaf;
418a46c0ec8Sopenharmony_ci		success = parse_switch_reliability_property(tests[i].tag, &r);
419a46c0ec8Sopenharmony_ci		ck_assert(success == tests[i].success);
420a46c0ec8Sopenharmony_ci		if (success)
421a46c0ec8Sopenharmony_ci			ck_assert_int_eq(r, tests[i].reliability);
422a46c0ec8Sopenharmony_ci		else
423a46c0ec8Sopenharmony_ci			ck_assert_int_eq(r, 0xaf);
424a46c0ec8Sopenharmony_ci	}
425a46c0ec8Sopenharmony_ci
426a46c0ec8Sopenharmony_ci	success = parse_switch_reliability_property(NULL, &r);
427a46c0ec8Sopenharmony_ci	ck_assert(success == true);
428a46c0ec8Sopenharmony_ci	ck_assert_int_eq(r, RELIABILITY_RELIABLE);
429a46c0ec8Sopenharmony_ci
430a46c0ec8Sopenharmony_ci	success = parse_switch_reliability_property("foo", NULL);
431a46c0ec8Sopenharmony_ci	ck_assert(success == false);
432a46c0ec8Sopenharmony_ci}
433a46c0ec8Sopenharmony_ciEND_TEST
434a46c0ec8Sopenharmony_ci
435a46c0ec8Sopenharmony_ciSTART_TEST(calibration_prop_parser)
436a46c0ec8Sopenharmony_ci{
437a46c0ec8Sopenharmony_ci#define DEFAULT_VALUES { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }
438a46c0ec8Sopenharmony_ci	const float untouched[6] = DEFAULT_VALUES;
439a46c0ec8Sopenharmony_ci	struct parser_test_calibration {
440a46c0ec8Sopenharmony_ci		char *prop;
441a46c0ec8Sopenharmony_ci		bool success;
442a46c0ec8Sopenharmony_ci		float values[6];
443a46c0ec8Sopenharmony_ci	} tests[] = {
444a46c0ec8Sopenharmony_ci		{ "", false, DEFAULT_VALUES },
445a46c0ec8Sopenharmony_ci		{ "banana", false, DEFAULT_VALUES },
446a46c0ec8Sopenharmony_ci		{ "1 2 3 a 5 6", false, DEFAULT_VALUES },
447a46c0ec8Sopenharmony_ci		{ "2", false, DEFAULT_VALUES },
448a46c0ec8Sopenharmony_ci		{ "2 3 4 5 6", false, DEFAULT_VALUES },
449a46c0ec8Sopenharmony_ci		{ "1 2 3 4 5 6", true, DEFAULT_VALUES },
450a46c0ec8Sopenharmony_ci		{ "6.00012 3.244 4.238 5.2421 6.0134 8.860", true,
451a46c0ec8Sopenharmony_ci			{ 6.00012, 3.244, 4.238, 5.2421, 6.0134, 8.860 }},
452a46c0ec8Sopenharmony_ci		{ "0xff 2 3 4 5 6", false, DEFAULT_VALUES },
453a46c0ec8Sopenharmony_ci		{ NULL, false, DEFAULT_VALUES }
454a46c0ec8Sopenharmony_ci	};
455a46c0ec8Sopenharmony_ci	bool success;
456a46c0ec8Sopenharmony_ci	float calibration[6];
457a46c0ec8Sopenharmony_ci	int rc;
458a46c0ec8Sopenharmony_ci	int i;
459a46c0ec8Sopenharmony_ci
460a46c0ec8Sopenharmony_ci	for (i = 0; tests[i].prop != NULL; i++) {
461a46c0ec8Sopenharmony_ci		memcpy(calibration, untouched, sizeof(calibration));
462a46c0ec8Sopenharmony_ci
463a46c0ec8Sopenharmony_ci		success = parse_calibration_property(tests[i].prop,
464a46c0ec8Sopenharmony_ci						     calibration);
465a46c0ec8Sopenharmony_ci		ck_assert_int_eq(success, tests[i].success);
466a46c0ec8Sopenharmony_ci		if (success)
467a46c0ec8Sopenharmony_ci			rc = memcmp(tests[i].values,
468a46c0ec8Sopenharmony_ci				    calibration,
469a46c0ec8Sopenharmony_ci				    sizeof(calibration));
470a46c0ec8Sopenharmony_ci		else
471a46c0ec8Sopenharmony_ci			rc = memcmp(untouched,
472a46c0ec8Sopenharmony_ci				    calibration,
473a46c0ec8Sopenharmony_ci				    sizeof(calibration));
474a46c0ec8Sopenharmony_ci		ck_assert_int_eq(rc, 0);
475a46c0ec8Sopenharmony_ci	}
476a46c0ec8Sopenharmony_ci
477a46c0ec8Sopenharmony_ci	memcpy(calibration, untouched, sizeof(calibration));
478a46c0ec8Sopenharmony_ci
479a46c0ec8Sopenharmony_ci	success = parse_calibration_property(NULL, calibration);
480a46c0ec8Sopenharmony_ci	ck_assert(success == false);
481a46c0ec8Sopenharmony_ci	rc = memcmp(untouched, calibration, sizeof(calibration));
482a46c0ec8Sopenharmony_ci	ck_assert_int_eq(rc, 0);
483a46c0ec8Sopenharmony_ci}
484a46c0ec8Sopenharmony_ciEND_TEST
485a46c0ec8Sopenharmony_ci
486a46c0ec8Sopenharmony_ciSTART_TEST(range_prop_parser)
487a46c0ec8Sopenharmony_ci{
488a46c0ec8Sopenharmony_ci	struct parser_test_range {
489a46c0ec8Sopenharmony_ci		char *tag;
490a46c0ec8Sopenharmony_ci		bool success;
491a46c0ec8Sopenharmony_ci		int hi, lo;
492a46c0ec8Sopenharmony_ci	} tests[] = {
493a46c0ec8Sopenharmony_ci		{ "10:8", true, 10, 8 },
494a46c0ec8Sopenharmony_ci		{ "100:-1", true, 100, -1 },
495a46c0ec8Sopenharmony_ci		{ "-203813:-502023", true, -203813, -502023 },
496a46c0ec8Sopenharmony_ci		{ "238492:28210", true, 238492, 28210 },
497a46c0ec8Sopenharmony_ci		{ "none", true, 0, 0 },
498a46c0ec8Sopenharmony_ci		{ "0:0", false, 0, 0 },
499a46c0ec8Sopenharmony_ci		{ "", false, 0, 0 },
500a46c0ec8Sopenharmony_ci		{ "abcd", false, 0, 0 },
501a46c0ec8Sopenharmony_ci		{ "10:30:10", false, 0, 0 },
502a46c0ec8Sopenharmony_ci		{ NULL, false, 0, 0 }
503a46c0ec8Sopenharmony_ci	};
504a46c0ec8Sopenharmony_ci	int i;
505a46c0ec8Sopenharmony_ci	int hi, lo;
506a46c0ec8Sopenharmony_ci	bool success;
507a46c0ec8Sopenharmony_ci
508a46c0ec8Sopenharmony_ci	for (i = 0; tests[i].tag != NULL; i++) {
509a46c0ec8Sopenharmony_ci		hi = lo = 0xad;
510a46c0ec8Sopenharmony_ci		success = parse_range_property(tests[i].tag, &hi, &lo);
511a46c0ec8Sopenharmony_ci		ck_assert(success == tests[i].success);
512a46c0ec8Sopenharmony_ci		if (success) {
513a46c0ec8Sopenharmony_ci			ck_assert_int_eq(hi, tests[i].hi);
514a46c0ec8Sopenharmony_ci			ck_assert_int_eq(lo, tests[i].lo);
515a46c0ec8Sopenharmony_ci		} else {
516a46c0ec8Sopenharmony_ci			ck_assert_int_eq(hi, 0xad);
517a46c0ec8Sopenharmony_ci			ck_assert_int_eq(lo, 0xad);
518a46c0ec8Sopenharmony_ci		}
519a46c0ec8Sopenharmony_ci	}
520a46c0ec8Sopenharmony_ci
521a46c0ec8Sopenharmony_ci	success = parse_range_property(NULL, NULL, NULL);
522a46c0ec8Sopenharmony_ci	ck_assert(success == false);
523a46c0ec8Sopenharmony_ci}
524a46c0ec8Sopenharmony_ciEND_TEST
525a46c0ec8Sopenharmony_ci
526a46c0ec8Sopenharmony_ciSTART_TEST(boolean_prop_parser)
527a46c0ec8Sopenharmony_ci{
528a46c0ec8Sopenharmony_ci	struct parser_test_range {
529a46c0ec8Sopenharmony_ci		char *tag;
530a46c0ec8Sopenharmony_ci		bool success;
531a46c0ec8Sopenharmony_ci		bool b;
532a46c0ec8Sopenharmony_ci	} tests[] = {
533a46c0ec8Sopenharmony_ci		{ "0", true, false },
534a46c0ec8Sopenharmony_ci		{ "1", true, true },
535a46c0ec8Sopenharmony_ci		{ "-1", false, false },
536a46c0ec8Sopenharmony_ci		{ "2", false, false },
537a46c0ec8Sopenharmony_ci		{ "abcd", false, false },
538a46c0ec8Sopenharmony_ci		{ NULL, false, false }
539a46c0ec8Sopenharmony_ci	};
540a46c0ec8Sopenharmony_ci	int i;
541a46c0ec8Sopenharmony_ci	bool success, b;
542a46c0ec8Sopenharmony_ci
543a46c0ec8Sopenharmony_ci	for (i = 0; tests[i].tag != NULL; i++) {
544a46c0ec8Sopenharmony_ci		b = false;
545a46c0ec8Sopenharmony_ci		success = parse_boolean_property(tests[i].tag, &b);
546a46c0ec8Sopenharmony_ci		ck_assert(success == tests[i].success);
547a46c0ec8Sopenharmony_ci		if (success)
548a46c0ec8Sopenharmony_ci			ck_assert_int_eq(b, tests[i].b);
549a46c0ec8Sopenharmony_ci		else
550a46c0ec8Sopenharmony_ci			ck_assert_int_eq(b, false);
551a46c0ec8Sopenharmony_ci	}
552a46c0ec8Sopenharmony_ci
553a46c0ec8Sopenharmony_ci	success = parse_boolean_property(NULL, NULL);
554a46c0ec8Sopenharmony_ci	ck_assert(success == false);
555a46c0ec8Sopenharmony_ci}
556a46c0ec8Sopenharmony_ciEND_TEST
557a46c0ec8Sopenharmony_ci
558a46c0ec8Sopenharmony_ciSTART_TEST(evcode_prop_parser)
559a46c0ec8Sopenharmony_ci{
560a46c0ec8Sopenharmony_ci	struct parser_test_tuple {
561a46c0ec8Sopenharmony_ci		const char *prop;
562a46c0ec8Sopenharmony_ci		bool success;
563a46c0ec8Sopenharmony_ci		size_t nevents;
564a46c0ec8Sopenharmony_ci		struct input_event events[20];
565a46c0ec8Sopenharmony_ci	} tests[] = {
566a46c0ec8Sopenharmony_ci		{ "+EV_KEY", true, 1, {{ .type = EV_KEY, .code = 0xffff, .value = 1 }} },
567a46c0ec8Sopenharmony_ci		{ "-EV_ABS;", true, 1, {{ .type = EV_ABS, .code = 0xffff, .value = 0 }} },
568a46c0ec8Sopenharmony_ci		{ "+ABS_X;", true, 1, {{ .type = EV_ABS, .code = ABS_X, .value = 1 }} },
569a46c0ec8Sopenharmony_ci		{ "-SW_TABLET_MODE;", true, 1, {{ .type = EV_SW, .code = SW_TABLET_MODE, .value = 0 }} },
570a46c0ec8Sopenharmony_ci		{ "+EV_SW", true, 1, {{ .type = EV_SW, .code = 0xffff, .value = 1 }} },
571a46c0ec8Sopenharmony_ci		{ "-ABS_Y", true, 1, {{ .type = EV_ABS, .code = ABS_Y, .value = 0 }} },
572a46c0ec8Sopenharmony_ci		{ "+EV_ABS:0x00", true, 1, {{ .type = EV_ABS, .code = ABS_X, .value = 1 }} },
573a46c0ec8Sopenharmony_ci		{ "-EV_ABS:01", true, 1, {{ .type = EV_ABS, .code = ABS_Y, .value = 0 }} },
574a46c0ec8Sopenharmony_ci		{ "+ABS_TILT_X;-ABS_TILT_Y;", true, 2,
575a46c0ec8Sopenharmony_ci			{{ .type = EV_ABS, .code = ABS_TILT_X, .value = 1 },
576a46c0ec8Sopenharmony_ci			 { .type = EV_ABS, .code = ABS_TILT_Y, .value = 0}} },
577a46c0ec8Sopenharmony_ci		{ "+BTN_TOOL_DOUBLETAP;+EV_KEY;-KEY_A", true, 3,
578a46c0ec8Sopenharmony_ci			{{ .type = EV_KEY, .code = BTN_TOOL_DOUBLETAP, .value = 1 } ,
579a46c0ec8Sopenharmony_ci			 { .type = EV_KEY, .code = 0xffff, .value = 1 },
580a46c0ec8Sopenharmony_ci			 { .type = EV_KEY, .code = KEY_A, .value = 0 }} },
581a46c0ec8Sopenharmony_ci		{ "+REL_Y;-ABS_Z;+BTN_STYLUS", true, 3,
582a46c0ec8Sopenharmony_ci			{{ .type = EV_REL, .code = REL_Y, .value = 1},
583a46c0ec8Sopenharmony_ci			 { .type = EV_ABS, .code = ABS_Z, .value = 0},
584a46c0ec8Sopenharmony_ci			 { .type = EV_KEY, .code = BTN_STYLUS, .value = 1 }} },
585a46c0ec8Sopenharmony_ci		{ "-REL_Y;+EV_KEY:0x123;-BTN_STYLUS", true, 3,
586a46c0ec8Sopenharmony_ci			{{ .type = EV_REL, .code = REL_Y, .value = 0 },
587a46c0ec8Sopenharmony_ci			 { .type = EV_KEY, .code = 0x123, .value = 1 },
588a46c0ec8Sopenharmony_ci			 { .type = EV_KEY, .code = BTN_STYLUS, .value = 0 }} },
589a46c0ec8Sopenharmony_ci		{ .prop = "", .success = false },
590a46c0ec8Sopenharmony_ci		{ .prop = "+", .success = false },
591a46c0ec8Sopenharmony_ci		{ .prop = "-", .success = false },
592a46c0ec8Sopenharmony_ci		{ .prop = "!", .success = false },
593a46c0ec8Sopenharmony_ci		{ .prop = "+EV_FOO", .success = false },
594a46c0ec8Sopenharmony_ci		{ .prop = "+EV_KEY;-EV_FOO", .success = false },
595a46c0ec8Sopenharmony_ci		{ .prop = "+BTN_STYLUS;-EV_FOO", .success = false },
596a46c0ec8Sopenharmony_ci		{ .prop = "-BTN_UNKNOWN", .success = false },
597a46c0ec8Sopenharmony_ci		{ .prop = "+BTN_UNKNOWN;+EV_KEY", .success = false },
598a46c0ec8Sopenharmony_ci		{ .prop = "-PR_UNKNOWN", .success = false },
599a46c0ec8Sopenharmony_ci		{ .prop = "-BTN_STYLUS;+PR_UNKNOWN;-ABS_X", .success = false },
600a46c0ec8Sopenharmony_ci		{ .prop = "-EV_REL:0xffff", .success = false },
601a46c0ec8Sopenharmony_ci		{ .prop = "-EV_REL:0x123.", .success = false },
602a46c0ec8Sopenharmony_ci		{ .prop = "-EV_REL:ffff", .success = false },
603a46c0ec8Sopenharmony_ci		{ .prop = "-EV_REL:blah", .success = false },
604a46c0ec8Sopenharmony_ci		{ .prop = "+KEY_A:0x11", .success = false },
605a46c0ec8Sopenharmony_ci		{ .prop = "+EV_KEY:0x11 ", .success = false },
606a46c0ec8Sopenharmony_ci		{ .prop = "+EV_KEY:0x11not", .success = false },
607a46c0ec8Sopenharmony_ci		{ .prop = "none", .success = false },
608a46c0ec8Sopenharmony_ci		{ .prop = NULL },
609a46c0ec8Sopenharmony_ci	};
610a46c0ec8Sopenharmony_ci	struct parser_test_tuple *t;
611a46c0ec8Sopenharmony_ci
612a46c0ec8Sopenharmony_ci	for (int i = 0; tests[i].prop; i++) {
613a46c0ec8Sopenharmony_ci		bool success;
614a46c0ec8Sopenharmony_ci		struct input_event events[32];
615a46c0ec8Sopenharmony_ci		size_t nevents = ARRAY_LENGTH(events);
616a46c0ec8Sopenharmony_ci
617a46c0ec8Sopenharmony_ci		t = &tests[i];
618a46c0ec8Sopenharmony_ci		success = parse_evcode_property(t->prop, events, &nevents);
619a46c0ec8Sopenharmony_ci		ck_assert(success == t->success);
620a46c0ec8Sopenharmony_ci		if (!success)
621a46c0ec8Sopenharmony_ci			continue;
622a46c0ec8Sopenharmony_ci
623a46c0ec8Sopenharmony_ci		ck_assert_int_eq(nevents, t->nevents);
624a46c0ec8Sopenharmony_ci		for (size_t j = 0; j < nevents; j++) {
625a46c0ec8Sopenharmony_ci			unsigned int type = events[j].type;
626a46c0ec8Sopenharmony_ci			unsigned int code = events[j].code;
627a46c0ec8Sopenharmony_ci			int value = events[j].value;
628a46c0ec8Sopenharmony_ci			ck_assert_int_eq(t->events[j].type, type);
629a46c0ec8Sopenharmony_ci			ck_assert_int_eq(t->events[j].code, code);
630a46c0ec8Sopenharmony_ci			ck_assert_int_eq(t->events[j].value, value);
631a46c0ec8Sopenharmony_ci		}
632a46c0ec8Sopenharmony_ci	}
633a46c0ec8Sopenharmony_ci}
634a46c0ec8Sopenharmony_ciEND_TEST
635a46c0ec8Sopenharmony_ci
636a46c0ec8Sopenharmony_ciSTART_TEST(input_prop_parser)
637a46c0ec8Sopenharmony_ci{
638a46c0ec8Sopenharmony_ci	struct parser_test_val {
639a46c0ec8Sopenharmony_ci		const char *prop;
640a46c0ec8Sopenharmony_ci		bool success;
641a46c0ec8Sopenharmony_ci		size_t nvals;
642a46c0ec8Sopenharmony_ci		struct input_prop values[20];
643a46c0ec8Sopenharmony_ci	} tests[] = {
644a46c0ec8Sopenharmony_ci		{ "+INPUT_PROP_BUTTONPAD", true, 1, {{ INPUT_PROP_BUTTONPAD, true }}},
645a46c0ec8Sopenharmony_ci		{ "+INPUT_PROP_BUTTONPAD;-INPUT_PROP_POINTER", true, 2,
646a46c0ec8Sopenharmony_ci			{ { INPUT_PROP_BUTTONPAD, true },
647a46c0ec8Sopenharmony_ci			  { INPUT_PROP_POINTER, false }}},
648a46c0ec8Sopenharmony_ci		{ "+INPUT_PROP_BUTTONPAD;-0x00;+0x03", true, 3,
649a46c0ec8Sopenharmony_ci			{ { INPUT_PROP_BUTTONPAD, true },
650a46c0ec8Sopenharmony_ci			  { INPUT_PROP_POINTER, false },
651a46c0ec8Sopenharmony_ci			  { INPUT_PROP_SEMI_MT, true }}},
652a46c0ec8Sopenharmony_ci		{ .prop = "", .success = false },
653a46c0ec8Sopenharmony_ci		{ .prop = "0xff", .success = false },
654a46c0ec8Sopenharmony_ci		{ .prop = "INPUT_PROP", .success = false },
655a46c0ec8Sopenharmony_ci		{ .prop = "INPUT_PROP_FOO", .success = false },
656a46c0ec8Sopenharmony_ci		{ .prop = "INPUT_PROP_FOO;INPUT_PROP_FOO", .success = false },
657a46c0ec8Sopenharmony_ci		{ .prop = "INPUT_PROP_POINTER;INPUT_PROP_FOO", .success = false },
658a46c0ec8Sopenharmony_ci		{ .prop = "none", .success = false },
659a46c0ec8Sopenharmony_ci		{ .prop = NULL },
660a46c0ec8Sopenharmony_ci	};
661a46c0ec8Sopenharmony_ci	struct parser_test_val *t;
662a46c0ec8Sopenharmony_ci
663a46c0ec8Sopenharmony_ci	for (int i = 0; tests[i].prop; i++) {
664a46c0ec8Sopenharmony_ci		bool success;
665a46c0ec8Sopenharmony_ci		struct input_prop props[32];
666a46c0ec8Sopenharmony_ci		size_t nprops = ARRAY_LENGTH(props);
667a46c0ec8Sopenharmony_ci
668a46c0ec8Sopenharmony_ci		t = &tests[i];
669a46c0ec8Sopenharmony_ci		success = parse_input_prop_property(t->prop, props, &nprops);
670a46c0ec8Sopenharmony_ci		ck_assert(success == t->success);
671a46c0ec8Sopenharmony_ci		if (!success)
672a46c0ec8Sopenharmony_ci			continue;
673a46c0ec8Sopenharmony_ci
674a46c0ec8Sopenharmony_ci		ck_assert_int_eq(nprops, t->nvals);
675a46c0ec8Sopenharmony_ci		for (size_t j = 0; j < t->nvals; j++) {
676a46c0ec8Sopenharmony_ci			ck_assert_int_eq(t->values[j].prop, props[j].prop);
677a46c0ec8Sopenharmony_ci			ck_assert_int_eq(t->values[j].enabled, props[j].enabled);
678a46c0ec8Sopenharmony_ci		}
679a46c0ec8Sopenharmony_ci	}
680a46c0ec8Sopenharmony_ci}
681a46c0ec8Sopenharmony_ciEND_TEST
682a46c0ec8Sopenharmony_ci
683a46c0ec8Sopenharmony_ciSTART_TEST(evdev_abs_parser)
684a46c0ec8Sopenharmony_ci{
685a46c0ec8Sopenharmony_ci	struct test {
686a46c0ec8Sopenharmony_ci		uint32_t which;
687a46c0ec8Sopenharmony_ci		const char *prop;
688a46c0ec8Sopenharmony_ci		int min, max, res, fuzz, flat;
689a46c0ec8Sopenharmony_ci
690a46c0ec8Sopenharmony_ci	} tests[] = {
691a46c0ec8Sopenharmony_ci		{ .which = (ABS_MASK_MIN|ABS_MASK_MAX),
692a46c0ec8Sopenharmony_ci		  .prop = "1:2",
693a46c0ec8Sopenharmony_ci		  .min = 1, .max = 2 },
694a46c0ec8Sopenharmony_ci		{ .which = (ABS_MASK_MIN|ABS_MASK_MAX),
695a46c0ec8Sopenharmony_ci		  .prop = "1:2:",
696a46c0ec8Sopenharmony_ci		  .min = 1, .max = 2 },
697a46c0ec8Sopenharmony_ci		{ .which = (ABS_MASK_MIN|ABS_MASK_MAX|ABS_MASK_RES),
698a46c0ec8Sopenharmony_ci		  .prop = "10:20:30",
699a46c0ec8Sopenharmony_ci		  .min = 10, .max = 20, .res = 30 },
700a46c0ec8Sopenharmony_ci		{ .which = (ABS_MASK_RES),
701a46c0ec8Sopenharmony_ci		  .prop = "::100",
702a46c0ec8Sopenharmony_ci		  .res = 100 },
703a46c0ec8Sopenharmony_ci		{ .which = (ABS_MASK_MIN),
704a46c0ec8Sopenharmony_ci		  .prop = "10:",
705a46c0ec8Sopenharmony_ci		  .min = 10 },
706a46c0ec8Sopenharmony_ci		{ .which = (ABS_MASK_MAX|ABS_MASK_RES),
707a46c0ec8Sopenharmony_ci		  .prop = ":10:1001",
708a46c0ec8Sopenharmony_ci		  .max = 10, .res = 1001 },
709a46c0ec8Sopenharmony_ci		{ .which = (ABS_MASK_MIN|ABS_MASK_MAX|ABS_MASK_RES|ABS_MASK_FUZZ),
710a46c0ec8Sopenharmony_ci		  .prop = "1:2:3:4",
711a46c0ec8Sopenharmony_ci		  .min = 1, .max = 2, .res = 3, .fuzz = 4},
712a46c0ec8Sopenharmony_ci		{ .which = (ABS_MASK_MIN|ABS_MASK_MAX|ABS_MASK_RES|ABS_MASK_FUZZ|ABS_MASK_FLAT),
713a46c0ec8Sopenharmony_ci		  .prop = "1:2:3:4:5",
714a46c0ec8Sopenharmony_ci		  .min = 1, .max = 2, .res = 3, .fuzz = 4, .flat = 5},
715a46c0ec8Sopenharmony_ci		{ .which = (ABS_MASK_MIN|ABS_MASK_RES|ABS_MASK_FUZZ|ABS_MASK_FLAT),
716a46c0ec8Sopenharmony_ci		  .prop = "1::3:4:50",
717a46c0ec8Sopenharmony_ci		  .min = 1, .res = 3, .fuzz = 4, .flat = 50},
718a46c0ec8Sopenharmony_ci		{ .which = ABS_MASK_FUZZ|ABS_MASK_FLAT,
719a46c0ec8Sopenharmony_ci		  .prop = ":::5:60",
720a46c0ec8Sopenharmony_ci		  .fuzz = 5, .flat = 60},
721a46c0ec8Sopenharmony_ci		{ .which = ABS_MASK_FUZZ,
722a46c0ec8Sopenharmony_ci		  .prop = ":::5:",
723a46c0ec8Sopenharmony_ci		  .fuzz = 5 },
724a46c0ec8Sopenharmony_ci		{ .which = ABS_MASK_RES, .prop = "::12::",
725a46c0ec8Sopenharmony_ci		  .res = 12 },
726a46c0ec8Sopenharmony_ci		/* Malformed property but parsing this one makes us more
727a46c0ec8Sopenharmony_ci		 * future proof */
728a46c0ec8Sopenharmony_ci		{ .which = (ABS_MASK_RES|ABS_MASK_FUZZ|ABS_MASK_FLAT),
729a46c0ec8Sopenharmony_ci		  .prop = "::12:1:2:3:4:5:6",
730a46c0ec8Sopenharmony_ci		  .res = 12, .fuzz = 1, .flat = 2 },
731a46c0ec8Sopenharmony_ci		{ .which = 0, .prop = ":::::" },
732a46c0ec8Sopenharmony_ci		{ .which = 0, .prop = ":" },
733a46c0ec8Sopenharmony_ci		{ .which = 0, .prop = "" },
734a46c0ec8Sopenharmony_ci		{ .which = 0, .prop = ":asb::::" },
735a46c0ec8Sopenharmony_ci		{ .which = 0, .prop = "foo" },
736a46c0ec8Sopenharmony_ci	};
737a46c0ec8Sopenharmony_ci
738a46c0ec8Sopenharmony_ci	ARRAY_FOR_EACH(tests, t) {
739a46c0ec8Sopenharmony_ci		struct input_absinfo abs;
740a46c0ec8Sopenharmony_ci		uint32_t mask;
741a46c0ec8Sopenharmony_ci
742a46c0ec8Sopenharmony_ci		mask = parse_evdev_abs_prop(t->prop, &abs);
743a46c0ec8Sopenharmony_ci		ck_assert_int_eq(mask, t->which);
744a46c0ec8Sopenharmony_ci
745a46c0ec8Sopenharmony_ci		if (t->which & ABS_MASK_MIN)
746a46c0ec8Sopenharmony_ci			ck_assert_int_eq(abs.minimum, t->min);
747a46c0ec8Sopenharmony_ci		if (t->which & ABS_MASK_MAX)
748a46c0ec8Sopenharmony_ci			ck_assert_int_eq(abs.maximum, t->max);
749a46c0ec8Sopenharmony_ci		if (t->which & ABS_MASK_RES)
750a46c0ec8Sopenharmony_ci			ck_assert_int_eq(abs.resolution, t->res);
751a46c0ec8Sopenharmony_ci		if (t->which & ABS_MASK_FUZZ)
752a46c0ec8Sopenharmony_ci			ck_assert_int_eq(abs.fuzz, t->fuzz);
753a46c0ec8Sopenharmony_ci		if (t->which & ABS_MASK_FLAT)
754a46c0ec8Sopenharmony_ci			ck_assert_int_eq(abs.flat, t->flat);
755a46c0ec8Sopenharmony_ci	}
756a46c0ec8Sopenharmony_ci}
757a46c0ec8Sopenharmony_ciEND_TEST
758a46c0ec8Sopenharmony_ci
759a46c0ec8Sopenharmony_ciSTART_TEST(time_conversion)
760a46c0ec8Sopenharmony_ci{
761a46c0ec8Sopenharmony_ci	ck_assert_int_eq(us(10), 10);
762a46c0ec8Sopenharmony_ci	ck_assert_int_eq(ns2us(10000), 10);
763a46c0ec8Sopenharmony_ci	ck_assert_int_eq(ms2us(10), 10000);
764a46c0ec8Sopenharmony_ci	ck_assert_int_eq(s2us(1), 1000000);
765a46c0ec8Sopenharmony_ci	ck_assert_int_eq(h2us(2), s2us(2 * 60 * 60));
766a46c0ec8Sopenharmony_ci	ck_assert_int_eq(us2ms(10000), 10);
767a46c0ec8Sopenharmony_ci}
768a46c0ec8Sopenharmony_ciEND_TEST
769a46c0ec8Sopenharmony_ci
770a46c0ec8Sopenharmony_ciSTART_TEST(human_time)
771a46c0ec8Sopenharmony_ci{
772a46c0ec8Sopenharmony_ci	struct ht_tests {
773a46c0ec8Sopenharmony_ci		uint64_t interval;
774a46c0ec8Sopenharmony_ci		unsigned int value;
775a46c0ec8Sopenharmony_ci		const char *unit;
776a46c0ec8Sopenharmony_ci	} tests[] = {
777a46c0ec8Sopenharmony_ci		{ 0, 0, "us" },
778a46c0ec8Sopenharmony_ci		{ 123, 123, "us" },
779a46c0ec8Sopenharmony_ci		{ ms2us(5), 5, "ms" },
780a46c0ec8Sopenharmony_ci		{ ms2us(100), 100, "ms" },
781a46c0ec8Sopenharmony_ci		{ s2us(5), 5, "s" },
782a46c0ec8Sopenharmony_ci		{ s2us(100), 100, "s" },
783a46c0ec8Sopenharmony_ci		{ s2us(120), 2, "min" },
784a46c0ec8Sopenharmony_ci		{ 5 * s2us(60), 5, "min" },
785a46c0ec8Sopenharmony_ci		{ 120 * s2us(60), 2, "h" },
786a46c0ec8Sopenharmony_ci		{ 5 * 60 * s2us(60), 5, "h" },
787a46c0ec8Sopenharmony_ci		{ 48 * 60 * s2us(60), 2, "d" },
788a46c0ec8Sopenharmony_ci		{ 1000 * 24 * 60 * s2us(60), 1000, "d" },
789a46c0ec8Sopenharmony_ci		{ 0, 0, NULL },
790a46c0ec8Sopenharmony_ci	};
791a46c0ec8Sopenharmony_ci	for (int i = 0; tests[i].unit != NULL; i++) {
792a46c0ec8Sopenharmony_ci		struct human_time ht;
793a46c0ec8Sopenharmony_ci
794a46c0ec8Sopenharmony_ci		ht = to_human_time(tests[i].interval);
795a46c0ec8Sopenharmony_ci		ck_assert_int_eq(ht.value, tests[i].value);
796a46c0ec8Sopenharmony_ci		ck_assert_str_eq(ht.unit, tests[i].unit);
797a46c0ec8Sopenharmony_ci	}
798a46c0ec8Sopenharmony_ci}
799a46c0ec8Sopenharmony_ciEND_TEST
800a46c0ec8Sopenharmony_ci
801a46c0ec8Sopenharmony_cistruct atoi_test {
802a46c0ec8Sopenharmony_ci	char *str;
803a46c0ec8Sopenharmony_ci	bool success;
804a46c0ec8Sopenharmony_ci	int val;
805a46c0ec8Sopenharmony_ci};
806a46c0ec8Sopenharmony_ci
807a46c0ec8Sopenharmony_ciSTART_TEST(safe_atoi_test)
808a46c0ec8Sopenharmony_ci{
809a46c0ec8Sopenharmony_ci	struct atoi_test tests[] = {
810a46c0ec8Sopenharmony_ci		{ "10", true, 10 },
811a46c0ec8Sopenharmony_ci		{ "20", true, 20 },
812a46c0ec8Sopenharmony_ci		{ "-1", true, -1 },
813a46c0ec8Sopenharmony_ci		{ "2147483647", true, 2147483647 },
814a46c0ec8Sopenharmony_ci		{ "-2147483648", true, -2147483648 },
815a46c0ec8Sopenharmony_ci		{ "4294967295", false, 0 },
816a46c0ec8Sopenharmony_ci		{ "0x0", false, 0 },
817a46c0ec8Sopenharmony_ci		{ "-10x10", false, 0 },
818a46c0ec8Sopenharmony_ci		{ "1x-99", false, 0 },
819a46c0ec8Sopenharmony_ci		{ "", false, 0 },
820a46c0ec8Sopenharmony_ci		{ "abd", false, 0 },
821a46c0ec8Sopenharmony_ci		{ "xabd", false, 0 },
822a46c0ec8Sopenharmony_ci		{ "0xaf", false, 0 },
823a46c0ec8Sopenharmony_ci		{ "0x0x", false, 0 },
824a46c0ec8Sopenharmony_ci		{ "x10", false, 0 },
825a46c0ec8Sopenharmony_ci		{ NULL, false, 0 }
826a46c0ec8Sopenharmony_ci	};
827a46c0ec8Sopenharmony_ci	int v;
828a46c0ec8Sopenharmony_ci	bool success;
829a46c0ec8Sopenharmony_ci
830a46c0ec8Sopenharmony_ci	for (int i = 0; tests[i].str != NULL; i++) {
831a46c0ec8Sopenharmony_ci		v = 0xad;
832a46c0ec8Sopenharmony_ci		success = safe_atoi(tests[i].str, &v);
833a46c0ec8Sopenharmony_ci		ck_assert(success == tests[i].success);
834a46c0ec8Sopenharmony_ci		if (success)
835a46c0ec8Sopenharmony_ci			ck_assert_int_eq(v, tests[i].val);
836a46c0ec8Sopenharmony_ci		else
837a46c0ec8Sopenharmony_ci			ck_assert_int_eq(v, 0xad);
838a46c0ec8Sopenharmony_ci	}
839a46c0ec8Sopenharmony_ci}
840a46c0ec8Sopenharmony_ciEND_TEST
841a46c0ec8Sopenharmony_ci
842a46c0ec8Sopenharmony_ciSTART_TEST(safe_atoi_base_16_test)
843a46c0ec8Sopenharmony_ci{
844a46c0ec8Sopenharmony_ci	struct atoi_test tests[] = {
845a46c0ec8Sopenharmony_ci		{ "10", true, 0x10 },
846a46c0ec8Sopenharmony_ci		{ "20", true, 0x20 },
847a46c0ec8Sopenharmony_ci		{ "-1", true, -1 },
848a46c0ec8Sopenharmony_ci		{ "0x10", true, 0x10 },
849a46c0ec8Sopenharmony_ci		{ "0xff", true, 0xff },
850a46c0ec8Sopenharmony_ci		{ "abc", true, 0xabc },
851a46c0ec8Sopenharmony_ci		{ "-10", true, -0x10 },
852a46c0ec8Sopenharmony_ci		{ "0x0", true, 0 },
853a46c0ec8Sopenharmony_ci		{ "0", true, 0 },
854a46c0ec8Sopenharmony_ci		{ "0x-99", false, 0 },
855a46c0ec8Sopenharmony_ci		{ "0xak", false, 0 },
856a46c0ec8Sopenharmony_ci		{ "0x", false, 0 },
857a46c0ec8Sopenharmony_ci		{ "x10", false, 0 },
858a46c0ec8Sopenharmony_ci		{ NULL, false, 0 }
859a46c0ec8Sopenharmony_ci	};
860a46c0ec8Sopenharmony_ci
861a46c0ec8Sopenharmony_ci	int v;
862a46c0ec8Sopenharmony_ci	bool success;
863a46c0ec8Sopenharmony_ci
864a46c0ec8Sopenharmony_ci	for (int i = 0; tests[i].str != NULL; i++) {
865a46c0ec8Sopenharmony_ci		v = 0xad;
866a46c0ec8Sopenharmony_ci		success = safe_atoi_base(tests[i].str, &v, 16);
867a46c0ec8Sopenharmony_ci		ck_assert(success == tests[i].success);
868a46c0ec8Sopenharmony_ci		if (success)
869a46c0ec8Sopenharmony_ci			ck_assert_int_eq(v, tests[i].val);
870a46c0ec8Sopenharmony_ci		else
871a46c0ec8Sopenharmony_ci			ck_assert_int_eq(v, 0xad);
872a46c0ec8Sopenharmony_ci	}
873a46c0ec8Sopenharmony_ci}
874a46c0ec8Sopenharmony_ciEND_TEST
875a46c0ec8Sopenharmony_ci
876a46c0ec8Sopenharmony_ciSTART_TEST(safe_atoi_base_8_test)
877a46c0ec8Sopenharmony_ci{
878a46c0ec8Sopenharmony_ci	struct atoi_test tests[] = {
879a46c0ec8Sopenharmony_ci		{ "7", true, 07 },
880a46c0ec8Sopenharmony_ci		{ "10", true, 010 },
881a46c0ec8Sopenharmony_ci		{ "20", true, 020 },
882a46c0ec8Sopenharmony_ci		{ "-1", true, -1 },
883a46c0ec8Sopenharmony_ci		{ "010", true, 010 },
884a46c0ec8Sopenharmony_ci		{ "0ff", false, 0 },
885a46c0ec8Sopenharmony_ci		{ "abc", false, 0},
886a46c0ec8Sopenharmony_ci		{ "0xabc", false, 0},
887a46c0ec8Sopenharmony_ci		{ "-10", true, -010 },
888a46c0ec8Sopenharmony_ci		{ "0", true, 0 },
889a46c0ec8Sopenharmony_ci		{ "00", true, 0 },
890a46c0ec8Sopenharmony_ci		{ "0x0", false, 0 },
891a46c0ec8Sopenharmony_ci		{ "0x-99", false, 0 },
892a46c0ec8Sopenharmony_ci		{ "0xak", false, 0 },
893a46c0ec8Sopenharmony_ci		{ "0x", false, 0 },
894a46c0ec8Sopenharmony_ci		{ "x10", false, 0 },
895a46c0ec8Sopenharmony_ci		{ NULL, false, 0 }
896a46c0ec8Sopenharmony_ci	};
897a46c0ec8Sopenharmony_ci
898a46c0ec8Sopenharmony_ci	int v;
899a46c0ec8Sopenharmony_ci	bool success;
900a46c0ec8Sopenharmony_ci
901a46c0ec8Sopenharmony_ci	for (int i = 0; tests[i].str != NULL; i++) {
902a46c0ec8Sopenharmony_ci		v = 0xad;
903a46c0ec8Sopenharmony_ci		success = safe_atoi_base(tests[i].str, &v, 8);
904a46c0ec8Sopenharmony_ci		ck_assert(success == tests[i].success);
905a46c0ec8Sopenharmony_ci		if (success)
906a46c0ec8Sopenharmony_ci			ck_assert_int_eq(v, tests[i].val);
907a46c0ec8Sopenharmony_ci		else
908a46c0ec8Sopenharmony_ci			ck_assert_int_eq(v, 0xad);
909a46c0ec8Sopenharmony_ci	}
910a46c0ec8Sopenharmony_ci}
911a46c0ec8Sopenharmony_ciEND_TEST
912a46c0ec8Sopenharmony_ci
913a46c0ec8Sopenharmony_cistruct atou_test {
914a46c0ec8Sopenharmony_ci	char *str;
915a46c0ec8Sopenharmony_ci	bool success;
916a46c0ec8Sopenharmony_ci	unsigned int val;
917a46c0ec8Sopenharmony_ci};
918a46c0ec8Sopenharmony_ci
919a46c0ec8Sopenharmony_ciSTART_TEST(safe_atou_test)
920a46c0ec8Sopenharmony_ci{
921a46c0ec8Sopenharmony_ci	struct atou_test tests[] = {
922a46c0ec8Sopenharmony_ci		{ "10", true, 10 },
923a46c0ec8Sopenharmony_ci		{ "20", true, 20 },
924a46c0ec8Sopenharmony_ci		{ "-1", false, 0 },
925a46c0ec8Sopenharmony_ci		{ "2147483647", true, 2147483647 },
926a46c0ec8Sopenharmony_ci		{ "-2147483648", false, 0},
927a46c0ec8Sopenharmony_ci		{ "0x0", false, 0 },
928a46c0ec8Sopenharmony_ci		{ "-10x10", false, 0 },
929a46c0ec8Sopenharmony_ci		{ "1x-99", false, 0 },
930a46c0ec8Sopenharmony_ci		{ "", false, 0 },
931a46c0ec8Sopenharmony_ci		{ "abd", false, 0 },
932a46c0ec8Sopenharmony_ci		{ "xabd", false, 0 },
933a46c0ec8Sopenharmony_ci		{ "0xaf", false, 0 },
934a46c0ec8Sopenharmony_ci		{ "0x0x", false, 0 },
935a46c0ec8Sopenharmony_ci		{ "x10", false, 0 },
936a46c0ec8Sopenharmony_ci		{ NULL, false, 0 }
937a46c0ec8Sopenharmony_ci	};
938a46c0ec8Sopenharmony_ci	unsigned int v;
939a46c0ec8Sopenharmony_ci	bool success;
940a46c0ec8Sopenharmony_ci
941a46c0ec8Sopenharmony_ci	for (int i = 0; tests[i].str != NULL; i++) {
942a46c0ec8Sopenharmony_ci		v = 0xad;
943a46c0ec8Sopenharmony_ci		success = safe_atou(tests[i].str, &v);
944a46c0ec8Sopenharmony_ci		ck_assert(success == tests[i].success);
945a46c0ec8Sopenharmony_ci		if (success)
946a46c0ec8Sopenharmony_ci			ck_assert_int_eq(v, tests[i].val);
947a46c0ec8Sopenharmony_ci		else
948a46c0ec8Sopenharmony_ci			ck_assert_int_eq(v, 0xad);
949a46c0ec8Sopenharmony_ci	}
950a46c0ec8Sopenharmony_ci}
951a46c0ec8Sopenharmony_ciEND_TEST
952a46c0ec8Sopenharmony_ci
953a46c0ec8Sopenharmony_ciSTART_TEST(safe_atou_base_16_test)
954a46c0ec8Sopenharmony_ci{
955a46c0ec8Sopenharmony_ci	struct atou_test tests[] = {
956a46c0ec8Sopenharmony_ci		{ "10", true, 0x10 },
957a46c0ec8Sopenharmony_ci		{ "20", true, 0x20 },
958a46c0ec8Sopenharmony_ci		{ "-1", false, 0 },
959a46c0ec8Sopenharmony_ci		{ "0x10", true, 0x10 },
960a46c0ec8Sopenharmony_ci		{ "0xff", true, 0xff },
961a46c0ec8Sopenharmony_ci		{ "abc", true, 0xabc },
962a46c0ec8Sopenharmony_ci		{ "-10", false, 0 },
963a46c0ec8Sopenharmony_ci		{ "0x0", true, 0 },
964a46c0ec8Sopenharmony_ci		{ "0", true, 0 },
965a46c0ec8Sopenharmony_ci		{ "0x-99", false, 0 },
966a46c0ec8Sopenharmony_ci		{ "0xak", false, 0 },
967a46c0ec8Sopenharmony_ci		{ "0x", false, 0 },
968a46c0ec8Sopenharmony_ci		{ "x10", false, 0 },
969a46c0ec8Sopenharmony_ci		{ NULL, false, 0 }
970a46c0ec8Sopenharmony_ci	};
971a46c0ec8Sopenharmony_ci
972a46c0ec8Sopenharmony_ci	unsigned int v;
973a46c0ec8Sopenharmony_ci	bool success;
974a46c0ec8Sopenharmony_ci
975a46c0ec8Sopenharmony_ci	for (int i = 0; tests[i].str != NULL; i++) {
976a46c0ec8Sopenharmony_ci		v = 0xad;
977a46c0ec8Sopenharmony_ci		success = safe_atou_base(tests[i].str, &v, 16);
978a46c0ec8Sopenharmony_ci		ck_assert(success == tests[i].success);
979a46c0ec8Sopenharmony_ci		if (success)
980a46c0ec8Sopenharmony_ci			ck_assert_int_eq(v, tests[i].val);
981a46c0ec8Sopenharmony_ci		else
982a46c0ec8Sopenharmony_ci			ck_assert_int_eq(v, 0xad);
983a46c0ec8Sopenharmony_ci	}
984a46c0ec8Sopenharmony_ci}
985a46c0ec8Sopenharmony_ciEND_TEST
986a46c0ec8Sopenharmony_ci
987a46c0ec8Sopenharmony_ciSTART_TEST(safe_atou_base_8_test)
988a46c0ec8Sopenharmony_ci{
989a46c0ec8Sopenharmony_ci	struct atou_test tests[] = {
990a46c0ec8Sopenharmony_ci		{ "7", true, 07 },
991a46c0ec8Sopenharmony_ci		{ "10", true, 010 },
992a46c0ec8Sopenharmony_ci		{ "20", true, 020 },
993a46c0ec8Sopenharmony_ci		{ "-1", false, 0 },
994a46c0ec8Sopenharmony_ci		{ "010", true, 010 },
995a46c0ec8Sopenharmony_ci		{ "0ff", false, 0 },
996a46c0ec8Sopenharmony_ci		{ "abc", false, 0},
997a46c0ec8Sopenharmony_ci		{ "0xabc", false, 0},
998a46c0ec8Sopenharmony_ci		{ "-10", false, 0 },
999a46c0ec8Sopenharmony_ci		{ "0", true, 0 },
1000a46c0ec8Sopenharmony_ci		{ "00", true, 0 },
1001a46c0ec8Sopenharmony_ci		{ "0x0", false, 0 },
1002a46c0ec8Sopenharmony_ci		{ "0x-99", false, 0 },
1003a46c0ec8Sopenharmony_ci		{ "0xak", false, 0 },
1004a46c0ec8Sopenharmony_ci		{ "0x", false, 0 },
1005a46c0ec8Sopenharmony_ci		{ "x10", false, 0 },
1006a46c0ec8Sopenharmony_ci		{ NULL, false, 0 }
1007a46c0ec8Sopenharmony_ci	};
1008a46c0ec8Sopenharmony_ci
1009a46c0ec8Sopenharmony_ci	unsigned int v;
1010a46c0ec8Sopenharmony_ci	bool success;
1011a46c0ec8Sopenharmony_ci
1012a46c0ec8Sopenharmony_ci	for (int i = 0; tests[i].str != NULL; i++) {
1013a46c0ec8Sopenharmony_ci		v = 0xad;
1014a46c0ec8Sopenharmony_ci		success = safe_atou_base(tests[i].str, &v, 8);
1015a46c0ec8Sopenharmony_ci		ck_assert(success == tests[i].success);
1016a46c0ec8Sopenharmony_ci		if (success)
1017a46c0ec8Sopenharmony_ci			ck_assert_int_eq(v, tests[i].val);
1018a46c0ec8Sopenharmony_ci		else
1019a46c0ec8Sopenharmony_ci			ck_assert_int_eq(v, 0xad);
1020a46c0ec8Sopenharmony_ci	}
1021a46c0ec8Sopenharmony_ci}
1022a46c0ec8Sopenharmony_ciEND_TEST
1023a46c0ec8Sopenharmony_ci
1024a46c0ec8Sopenharmony_ciSTART_TEST(safe_atod_test)
1025a46c0ec8Sopenharmony_ci{
1026a46c0ec8Sopenharmony_ci	struct atod_test {
1027a46c0ec8Sopenharmony_ci		char *str;
1028a46c0ec8Sopenharmony_ci		bool success;
1029a46c0ec8Sopenharmony_ci		double val;
1030a46c0ec8Sopenharmony_ci	} tests[] = {
1031a46c0ec8Sopenharmony_ci		{ "10", true, 10 },
1032a46c0ec8Sopenharmony_ci		{ "20", true, 20 },
1033a46c0ec8Sopenharmony_ci		{ "-1", true, -1 },
1034a46c0ec8Sopenharmony_ci		{ "2147483647", true, 2147483647 },
1035a46c0ec8Sopenharmony_ci		{ "-2147483648", true, -2147483648 },
1036a46c0ec8Sopenharmony_ci		{ "4294967295", true, 4294967295 },
1037a46c0ec8Sopenharmony_ci		{ "0x0", false, 0 },
1038a46c0ec8Sopenharmony_ci		{ "0x10", false, 0 },
1039a46c0ec8Sopenharmony_ci		{ "0xaf", false, 0 },
1040a46c0ec8Sopenharmony_ci		{ "x80", false, 0 },
1041a46c0ec8Sopenharmony_ci		{ "0.0", true, 0.0 },
1042a46c0ec8Sopenharmony_ci		{ "0.1", true, 0.1 },
1043a46c0ec8Sopenharmony_ci		{ "1.2", true, 1.2 },
1044a46c0ec8Sopenharmony_ci		{ "-324.9", true, -324.9 },
1045a46c0ec8Sopenharmony_ci		{ "9324.9", true, 9324.9 },
1046a46c0ec8Sopenharmony_ci		{ "NAN", false, 0 },
1047a46c0ec8Sopenharmony_ci		{ "INFINITY", false, 0 },
1048a46c0ec8Sopenharmony_ci		{ "-10x10", false, 0 },
1049a46c0ec8Sopenharmony_ci		{ "1x-99", false, 0 },
1050a46c0ec8Sopenharmony_ci		{ "", false, 0 },
1051a46c0ec8Sopenharmony_ci		{ "abd", false, 0 },
1052a46c0ec8Sopenharmony_ci		{ "xabd", false, 0 },
1053a46c0ec8Sopenharmony_ci		{ "0x0x", false, 0 },
1054a46c0ec8Sopenharmony_ci		{ NULL, false, 0 }
1055a46c0ec8Sopenharmony_ci	};
1056a46c0ec8Sopenharmony_ci	double v;
1057a46c0ec8Sopenharmony_ci	bool success;
1058a46c0ec8Sopenharmony_ci
1059a46c0ec8Sopenharmony_ci	for (int i = 0; tests[i].str != NULL; i++) {
1060a46c0ec8Sopenharmony_ci		v = 0xad;
1061a46c0ec8Sopenharmony_ci		success = safe_atod(tests[i].str, &v);
1062a46c0ec8Sopenharmony_ci		ck_assert(success == tests[i].success);
1063a46c0ec8Sopenharmony_ci		if (success)
1064a46c0ec8Sopenharmony_ci			ck_assert_int_eq(v, tests[i].val);
1065a46c0ec8Sopenharmony_ci		else
1066a46c0ec8Sopenharmony_ci			ck_assert_int_eq(v, 0xad);
1067a46c0ec8Sopenharmony_ci	}
1068a46c0ec8Sopenharmony_ci}
1069a46c0ec8Sopenharmony_ciEND_TEST
1070a46c0ec8Sopenharmony_ci
1071a46c0ec8Sopenharmony_ciSTART_TEST(strsplit_test)
1072a46c0ec8Sopenharmony_ci{
1073a46c0ec8Sopenharmony_ci	struct strsplit_test {
1074a46c0ec8Sopenharmony_ci		const char *string;
1075a46c0ec8Sopenharmony_ci		const char *delim;
1076a46c0ec8Sopenharmony_ci		const char *results[10];
1077a46c0ec8Sopenharmony_ci		const size_t nresults;
1078a46c0ec8Sopenharmony_ci	} tests[] = {
1079a46c0ec8Sopenharmony_ci		{ "one two three", " ", { "one", "two", "three", NULL }, 3 },
1080a46c0ec8Sopenharmony_ci		{ "one two\tthree", " \t", { "one", "two", "three", NULL }, 3 },
1081a46c0ec8Sopenharmony_ci		{ "one", " ", { "one", NULL }, 1 },
1082a46c0ec8Sopenharmony_ci		{ "one two ", " ", { "one", "two", NULL }, 2 },
1083a46c0ec8Sopenharmony_ci		{ "one  two", " ", { "one", "two", NULL }, 2 },
1084a46c0ec8Sopenharmony_ci		{ " one two", " ", { "one", "two", NULL }, 2 },
1085a46c0ec8Sopenharmony_ci		{ "one", "\t \r", { "one", NULL }, 1 },
1086a46c0ec8Sopenharmony_ci		{ "one two three", " t", { "one", "wo", "hree", NULL }, 3 },
1087a46c0ec8Sopenharmony_ci		{ " one two three", "te", { " on", " ", "wo ", "hr", NULL }, 4 },
1088a46c0ec8Sopenharmony_ci		{ "one", "ne", { "o", NULL }, 1 },
1089a46c0ec8Sopenharmony_ci		{ "onene", "ne", { "o", NULL }, 1 },
1090a46c0ec8Sopenharmony_ci		{ "+1-2++3--4++-+5-+-", "+-", { "1", "2", "3", "4", "5", NULL }, 5 },
1091a46c0ec8Sopenharmony_ci		/* special cases */
1092a46c0ec8Sopenharmony_ci		{ "", " ", { NULL }, 0 },
1093a46c0ec8Sopenharmony_ci		{ " ", " ", { NULL }, 0 },
1094a46c0ec8Sopenharmony_ci		{ "     ", " ", { NULL }, 0 },
1095a46c0ec8Sopenharmony_ci		{ "oneoneone", "one", { NULL} , 0 },
1096a46c0ec8Sopenharmony_ci		{ NULL, NULL, { NULL }, 0}
1097a46c0ec8Sopenharmony_ci	};
1098a46c0ec8Sopenharmony_ci	struct strsplit_test *t = tests;
1099a46c0ec8Sopenharmony_ci
1100a46c0ec8Sopenharmony_ci	while (t->string) {
1101a46c0ec8Sopenharmony_ci		size_t nelem;
1102a46c0ec8Sopenharmony_ci		char **strv = strv_from_string(t->string, t->delim, &nelem);
1103a46c0ec8Sopenharmony_ci
1104a46c0ec8Sopenharmony_ci		for (size_t idx = 0; idx < t->nresults; idx++)
1105a46c0ec8Sopenharmony_ci			ck_assert_str_eq(t->results[idx], strv[idx]);
1106a46c0ec8Sopenharmony_ci
1107a46c0ec8Sopenharmony_ci		ck_assert_uint_eq(nelem, t->nresults);
1108a46c0ec8Sopenharmony_ci
1109a46c0ec8Sopenharmony_ci		/* When there are no elements validate return value is Null,
1110a46c0ec8Sopenharmony_ci		   otherwise validate result array is Null terminated. */
1111a46c0ec8Sopenharmony_ci		if(t->nresults == 0)
1112a46c0ec8Sopenharmony_ci			ck_assert_ptr_eq(strv, NULL);
1113a46c0ec8Sopenharmony_ci		else
1114a46c0ec8Sopenharmony_ci			ck_assert_ptr_eq(strv[t->nresults], NULL);
1115a46c0ec8Sopenharmony_ci
1116a46c0ec8Sopenharmony_ci		strv_free(strv);
1117a46c0ec8Sopenharmony_ci		t++;
1118a46c0ec8Sopenharmony_ci	}
1119a46c0ec8Sopenharmony_ci}
1120a46c0ec8Sopenharmony_ciEND_TEST
1121a46c0ec8Sopenharmony_ci
1122a46c0ec8Sopenharmony_ciSTART_TEST(double_array_from_string_test)
1123a46c0ec8Sopenharmony_ci{
1124a46c0ec8Sopenharmony_ci	struct double_array_from_string_test {
1125a46c0ec8Sopenharmony_ci		const char *string;
1126a46c0ec8Sopenharmony_ci		const char *delim;
1127a46c0ec8Sopenharmony_ci		const double array[10];
1128a46c0ec8Sopenharmony_ci		const size_t len;
1129a46c0ec8Sopenharmony_ci		const bool result;
1130a46c0ec8Sopenharmony_ci	} tests[] = {
1131a46c0ec8Sopenharmony_ci		{ "1 2 3", " ", { 1, 2, 3 }, 3 },
1132a46c0ec8Sopenharmony_ci		{ "1", " ", { 1 }, 1 },
1133a46c0ec8Sopenharmony_ci		{ "1,2.5,", ",", { 1, 2.5 }, 2 },
1134a46c0ec8Sopenharmony_ci		{ "1.0  2", " ", { 1, 2.0 }, 2 },
1135a46c0ec8Sopenharmony_ci		{ " 1 2", " ", { 1, 2 }, 2 },
1136a46c0ec8Sopenharmony_ci		{ " ; 1;2  3.5  ;;4.1", "; ", { 1, 2, 3.5, 4.1 }, 4 },
1137a46c0ec8Sopenharmony_ci		/* special cases */
1138a46c0ec8Sopenharmony_ci		{ "1 two", " ", { 0 }, 0 },
1139a46c0ec8Sopenharmony_ci		{ "one two", " ", { 0 }, 0 },
1140a46c0ec8Sopenharmony_ci		{ "one 2", " ", { 0 }, 0 },
1141a46c0ec8Sopenharmony_ci		{ "", " ", { 0 }, 0 },
1142a46c0ec8Sopenharmony_ci		{ " ", " ", { 0 }, 0 },
1143a46c0ec8Sopenharmony_ci		{ "    ", " ", { 0 }, 0 },
1144a46c0ec8Sopenharmony_ci		{ "", " ", { 0 }, 0 },
1145a46c0ec8Sopenharmony_ci		{ "oneoneone", "one", { 0 }, 0 },
1146a46c0ec8Sopenharmony_ci		{ NULL, NULL, { 0 }, 0 }
1147a46c0ec8Sopenharmony_ci	};
1148a46c0ec8Sopenharmony_ci	struct double_array_from_string_test *t = tests;
1149a46c0ec8Sopenharmony_ci
1150a46c0ec8Sopenharmony_ci	while (t->string) {
1151a46c0ec8Sopenharmony_ci		size_t len;
1152a46c0ec8Sopenharmony_ci		double *array = double_array_from_string(t->string,
1153a46c0ec8Sopenharmony_ci							 t->delim,
1154a46c0ec8Sopenharmony_ci							 &len);
1155a46c0ec8Sopenharmony_ci		ck_assert_int_eq(len, t->len);
1156a46c0ec8Sopenharmony_ci
1157a46c0ec8Sopenharmony_ci		for (size_t idx = 0; idx < len; idx++)
1158a46c0ec8Sopenharmony_ci			ck_assert_double_eq(array[idx], t->array[idx]);
1159a46c0ec8Sopenharmony_ci
1160a46c0ec8Sopenharmony_ci		free(array);
1161a46c0ec8Sopenharmony_ci		t++;
1162a46c0ec8Sopenharmony_ci	}
1163a46c0ec8Sopenharmony_ci}
1164a46c0ec8Sopenharmony_ciEND_TEST
1165a46c0ec8Sopenharmony_ci
1166a46c0ec8Sopenharmony_ciSTART_TEST(strargv_test)
1167a46c0ec8Sopenharmony_ci{
1168a46c0ec8Sopenharmony_ci	struct argv_test {
1169a46c0ec8Sopenharmony_ci		int argc;
1170a46c0ec8Sopenharmony_ci		char *argv[10];
1171a46c0ec8Sopenharmony_ci		int expected;
1172a46c0ec8Sopenharmony_ci	} tests[] = {
1173a46c0ec8Sopenharmony_ci		{ 0, {NULL}, 0 },
1174a46c0ec8Sopenharmony_ci		{ 1, {"hello", "World"}, 1 },
1175a46c0ec8Sopenharmony_ci		{ 2, {"hello", "World"}, 2 },
1176a46c0ec8Sopenharmony_ci		{ 2, {"", " "}, 2 },
1177a46c0ec8Sopenharmony_ci		{ 2, {"", NULL}, 0 },
1178a46c0ec8Sopenharmony_ci		{ 2, {NULL, NULL}, 0 },
1179a46c0ec8Sopenharmony_ci		{ 1, {NULL, NULL}, 0 },
1180a46c0ec8Sopenharmony_ci		{ 3, {"hello", NULL, "World"}, 0 },
1181a46c0ec8Sopenharmony_ci	};
1182a46c0ec8Sopenharmony_ci
1183a46c0ec8Sopenharmony_ci	ARRAY_FOR_EACH(tests, t) {
1184a46c0ec8Sopenharmony_ci		char **strv = strv_from_argv(t->argc, t->argv);
1185a46c0ec8Sopenharmony_ci
1186a46c0ec8Sopenharmony_ci		if (t->expected == 0) {
1187a46c0ec8Sopenharmony_ci			ck_assert(strv == NULL);
1188a46c0ec8Sopenharmony_ci		} else {
1189a46c0ec8Sopenharmony_ci			int count = 0;
1190a46c0ec8Sopenharmony_ci			char **s = strv;
1191a46c0ec8Sopenharmony_ci			while (*s) {
1192a46c0ec8Sopenharmony_ci				ck_assert_str_eq(*s, t->argv[count]);
1193a46c0ec8Sopenharmony_ci				count++;
1194a46c0ec8Sopenharmony_ci				s++;
1195a46c0ec8Sopenharmony_ci			}
1196a46c0ec8Sopenharmony_ci			ck_assert_int_eq(t->expected, count);
1197a46c0ec8Sopenharmony_ci			strv_free(strv);
1198a46c0ec8Sopenharmony_ci		}
1199a46c0ec8Sopenharmony_ci	}
1200a46c0ec8Sopenharmony_ci}
1201a46c0ec8Sopenharmony_ciEND_TEST
1202a46c0ec8Sopenharmony_ci
1203a46c0ec8Sopenharmony_ciSTART_TEST(kvsplit_double_test)
1204a46c0ec8Sopenharmony_ci{
1205a46c0ec8Sopenharmony_ci	struct kvsplit_dbl_test {
1206a46c0ec8Sopenharmony_ci		const char *string;
1207a46c0ec8Sopenharmony_ci		const char *psep;
1208a46c0ec8Sopenharmony_ci		const char *kvsep;
1209a46c0ec8Sopenharmony_ci		ssize_t nresults;
1210a46c0ec8Sopenharmony_ci		struct {
1211a46c0ec8Sopenharmony_ci			double a;
1212a46c0ec8Sopenharmony_ci			double b;
1213a46c0ec8Sopenharmony_ci		} results[32];
1214a46c0ec8Sopenharmony_ci	} tests[] = {
1215a46c0ec8Sopenharmony_ci		{ "1:2;3:4;5:6", ";", ":", 3, { {1, 2}, {3, 4}, {5, 6}}},
1216a46c0ec8Sopenharmony_ci		{ "1.0x2.3 -3.2x4.5 8.090909x-6.00", " ", "x", 3, { {1.0, 2.3}, {-3.2, 4.5}, {8.090909, -6}}},
1217a46c0ec8Sopenharmony_ci
1218a46c0ec8Sopenharmony_ci		{ "1:2", "x", ":", 1, {{1, 2}}},
1219a46c0ec8Sopenharmony_ci		{ "1:2", ":", "x", -1, {}},
1220a46c0ec8Sopenharmony_ci		{ "1:2", NULL, "x", -1, {}},
1221a46c0ec8Sopenharmony_ci		{ "1:2", "", "x", -1, {}},
1222a46c0ec8Sopenharmony_ci		{ "1:2", "x", NULL, -1, {}},
1223a46c0ec8Sopenharmony_ci		{ "1:2", "x", "", -1, {}},
1224a46c0ec8Sopenharmony_ci		{ "a:b", "x", ":", -1, {}},
1225a46c0ec8Sopenharmony_ci		{ "", " ", "x", -1, {}},
1226a46c0ec8Sopenharmony_ci		{ "1.2.3.4.5", ".", "", -1, {}},
1227a46c0ec8Sopenharmony_ci		{ NULL }
1228a46c0ec8Sopenharmony_ci	};
1229a46c0ec8Sopenharmony_ci	struct kvsplit_dbl_test *t = tests;
1230a46c0ec8Sopenharmony_ci
1231a46c0ec8Sopenharmony_ci	while (t->string) {
1232a46c0ec8Sopenharmony_ci		struct key_value_double *result = NULL;
1233a46c0ec8Sopenharmony_ci		ssize_t npairs;
1234a46c0ec8Sopenharmony_ci
1235a46c0ec8Sopenharmony_ci		npairs = kv_double_from_string(t->string,
1236a46c0ec8Sopenharmony_ci					       t->psep,
1237a46c0ec8Sopenharmony_ci					       t->kvsep,
1238a46c0ec8Sopenharmony_ci					       &result);
1239a46c0ec8Sopenharmony_ci		ck_assert_int_eq(npairs, t->nresults);
1240a46c0ec8Sopenharmony_ci
1241a46c0ec8Sopenharmony_ci		for (ssize_t i = 0; i < npairs; i++) {
1242a46c0ec8Sopenharmony_ci			ck_assert_double_eq(t->results[i].a, result[i].key);
1243a46c0ec8Sopenharmony_ci			ck_assert_double_eq(t->results[i].b, result[i].value);
1244a46c0ec8Sopenharmony_ci		}
1245a46c0ec8Sopenharmony_ci
1246a46c0ec8Sopenharmony_ci
1247a46c0ec8Sopenharmony_ci		free(result);
1248a46c0ec8Sopenharmony_ci		t++;
1249a46c0ec8Sopenharmony_ci	}
1250a46c0ec8Sopenharmony_ci}
1251a46c0ec8Sopenharmony_ciEND_TEST
1252a46c0ec8Sopenharmony_ci
1253a46c0ec8Sopenharmony_ciSTART_TEST(strjoin_test)
1254a46c0ec8Sopenharmony_ci{
1255a46c0ec8Sopenharmony_ci	struct strjoin_test {
1256a46c0ec8Sopenharmony_ci		char *strv[10];
1257a46c0ec8Sopenharmony_ci		const char *joiner;
1258a46c0ec8Sopenharmony_ci		const char *result;
1259a46c0ec8Sopenharmony_ci	} tests[] = {
1260a46c0ec8Sopenharmony_ci		{ { "one", "two", "three", NULL }, " ", "one two three" },
1261a46c0ec8Sopenharmony_ci		{ { "one", NULL }, "x", "one" },
1262a46c0ec8Sopenharmony_ci		{ { "one", "two", NULL }, "x", "onextwo" },
1263a46c0ec8Sopenharmony_ci		{ { "one", "two", NULL }, ",", "one,two" },
1264a46c0ec8Sopenharmony_ci		{ { "one", "two", NULL }, ", ", "one, two" },
1265a46c0ec8Sopenharmony_ci		{ { "one", "two", NULL }, "one", "oneonetwo" },
1266a46c0ec8Sopenharmony_ci		{ { "one", "two", NULL }, NULL, NULL },
1267a46c0ec8Sopenharmony_ci		{ { "", "", "", NULL }, " ", "  " },
1268a46c0ec8Sopenharmony_ci		{ { "a", "b", "c", NULL }, "", "abc" },
1269a46c0ec8Sopenharmony_ci		{ { "", "b", "c", NULL }, "x", "xbxc" },
1270a46c0ec8Sopenharmony_ci		{ { "", "", "", NULL }, "", "" },
1271a46c0ec8Sopenharmony_ci		{ { NULL }, NULL, NULL }
1272a46c0ec8Sopenharmony_ci	};
1273a46c0ec8Sopenharmony_ci	struct strjoin_test *t = tests;
1274a46c0ec8Sopenharmony_ci	struct strjoin_test nulltest = { {NULL}, "x", NULL };
1275a46c0ec8Sopenharmony_ci
1276a46c0ec8Sopenharmony_ci	while (t->strv[0]) {
1277a46c0ec8Sopenharmony_ci		char *str;
1278a46c0ec8Sopenharmony_ci		str = strv_join(t->strv, t->joiner);
1279a46c0ec8Sopenharmony_ci		if (t->result == NULL)
1280a46c0ec8Sopenharmony_ci			ck_assert(str == NULL);
1281a46c0ec8Sopenharmony_ci		else
1282a46c0ec8Sopenharmony_ci			ck_assert_str_eq(str, t->result);
1283a46c0ec8Sopenharmony_ci		free(str);
1284a46c0ec8Sopenharmony_ci		t++;
1285a46c0ec8Sopenharmony_ci	}
1286a46c0ec8Sopenharmony_ci
1287a46c0ec8Sopenharmony_ci	ck_assert(strv_join(nulltest.strv, "x") == NULL);
1288a46c0ec8Sopenharmony_ci}
1289a46c0ec8Sopenharmony_ciEND_TEST
1290a46c0ec8Sopenharmony_ci
1291a46c0ec8Sopenharmony_ciSTART_TEST(strstrip_test)
1292a46c0ec8Sopenharmony_ci{
1293a46c0ec8Sopenharmony_ci	struct strstrip_test {
1294a46c0ec8Sopenharmony_ci		const char *string;
1295a46c0ec8Sopenharmony_ci		const char *expected;
1296a46c0ec8Sopenharmony_ci		const char *what;
1297a46c0ec8Sopenharmony_ci	} tests[] = {
1298a46c0ec8Sopenharmony_ci		{ "foo",		"foo",		"1234" },
1299a46c0ec8Sopenharmony_ci		{ "\"bar\"",		"bar",		"\"" },
1300a46c0ec8Sopenharmony_ci		{ "'bar'",		"bar",		"'" },
1301a46c0ec8Sopenharmony_ci		{ "\"bar\"",		"\"bar\"",	"'" },
1302a46c0ec8Sopenharmony_ci		{ "'bar'",		"'bar'",	"\"" },
1303a46c0ec8Sopenharmony_ci		{ "\"bar\"",		"bar",		"\"" },
1304a46c0ec8Sopenharmony_ci		{ "\"\"",		"",		"\"" },
1305a46c0ec8Sopenharmony_ci		{ "\"foo\"bar\"",	"foo\"bar",	"\"" },
1306a46c0ec8Sopenharmony_ci		{ "\"'foo\"bar\"",	"foo\"bar",	"\"'" },
1307a46c0ec8Sopenharmony_ci		{ "abcfooabcbarbca",	"fooabcbar",	"abc" },
1308a46c0ec8Sopenharmony_ci		{ "xxxxfoo",		"foo",		"x" },
1309a46c0ec8Sopenharmony_ci		{ "fooyyyy",		"foo",		"y" },
1310a46c0ec8Sopenharmony_ci		{ "xxxxfooyyyy",	"foo",		"xy" },
1311a46c0ec8Sopenharmony_ci		{ "x xfooy y",		" xfooy ",	"xy" },
1312a46c0ec8Sopenharmony_ci		{ " foo\n",		"foo",		" \n" },
1313a46c0ec8Sopenharmony_ci		{ "",			"",		"abc" },
1314a46c0ec8Sopenharmony_ci		{ "",			"",		"" },
1315a46c0ec8Sopenharmony_ci		{ NULL , NULL, NULL }
1316a46c0ec8Sopenharmony_ci	};
1317a46c0ec8Sopenharmony_ci	struct strstrip_test *t = tests;
1318a46c0ec8Sopenharmony_ci
1319a46c0ec8Sopenharmony_ci	while (t->string) {
1320a46c0ec8Sopenharmony_ci		char *str;
1321a46c0ec8Sopenharmony_ci		str = strstrip(t->string, t->what);
1322a46c0ec8Sopenharmony_ci		ck_assert_str_eq(str, t->expected);
1323a46c0ec8Sopenharmony_ci		free(str);
1324a46c0ec8Sopenharmony_ci		t++;
1325a46c0ec8Sopenharmony_ci	}
1326a46c0ec8Sopenharmony_ci}
1327a46c0ec8Sopenharmony_ciEND_TEST
1328a46c0ec8Sopenharmony_ci
1329a46c0ec8Sopenharmony_ciSTART_TEST(strendswith_test)
1330a46c0ec8Sopenharmony_ci{
1331a46c0ec8Sopenharmony_ci	struct strendswith_test {
1332a46c0ec8Sopenharmony_ci		const char *string;
1333a46c0ec8Sopenharmony_ci		const char *suffix;
1334a46c0ec8Sopenharmony_ci		bool expected;
1335a46c0ec8Sopenharmony_ci	} tests[] = {
1336a46c0ec8Sopenharmony_ci		{ "foobar", "bar", true },
1337a46c0ec8Sopenharmony_ci		{ "foobar", "foo", false },
1338a46c0ec8Sopenharmony_ci		{ "foobar", "foobar", true },
1339a46c0ec8Sopenharmony_ci		{ "foo", "foobar", false },
1340a46c0ec8Sopenharmony_ci		{ "foobar", "", false },
1341a46c0ec8Sopenharmony_ci		{ "", "", false },
1342a46c0ec8Sopenharmony_ci		{ "", "foo", false },
1343a46c0ec8Sopenharmony_ci		{ NULL, NULL, false },
1344a46c0ec8Sopenharmony_ci	};
1345a46c0ec8Sopenharmony_ci
1346a46c0ec8Sopenharmony_ci	for (struct strendswith_test *t = tests; t->string; t++) {
1347a46c0ec8Sopenharmony_ci		ck_assert_int_eq(strendswith(t->string, t->suffix),
1348a46c0ec8Sopenharmony_ci				 t->expected);
1349a46c0ec8Sopenharmony_ci	}
1350a46c0ec8Sopenharmony_ci}
1351a46c0ec8Sopenharmony_ciEND_TEST
1352a46c0ec8Sopenharmony_ci
1353a46c0ec8Sopenharmony_ciSTART_TEST(strstartswith_test)
1354a46c0ec8Sopenharmony_ci{
1355a46c0ec8Sopenharmony_ci	struct strstartswith_test {
1356a46c0ec8Sopenharmony_ci		const char *string;
1357a46c0ec8Sopenharmony_ci		const char *suffix;
1358a46c0ec8Sopenharmony_ci		bool expected;
1359a46c0ec8Sopenharmony_ci	} tests[] = {
1360a46c0ec8Sopenharmony_ci		{ "foobar", "foo", true },
1361a46c0ec8Sopenharmony_ci		{ "foobar", "bar", false },
1362a46c0ec8Sopenharmony_ci		{ "foobar", "foobar", true },
1363a46c0ec8Sopenharmony_ci		{ "foo", "foobar", false },
1364a46c0ec8Sopenharmony_ci		{ "foo", "", false },
1365a46c0ec8Sopenharmony_ci		{ "", "", false },
1366a46c0ec8Sopenharmony_ci		{ "foo", "", false },
1367a46c0ec8Sopenharmony_ci		{ NULL, NULL, false },
1368a46c0ec8Sopenharmony_ci	};
1369a46c0ec8Sopenharmony_ci
1370a46c0ec8Sopenharmony_ci	for (struct strstartswith_test *t = tests; t->string; t++) {
1371a46c0ec8Sopenharmony_ci		ck_assert_int_eq(strstartswith(t->string, t->suffix),
1372a46c0ec8Sopenharmony_ci				 t->expected);
1373a46c0ec8Sopenharmony_ci	}
1374a46c0ec8Sopenharmony_ci}
1375a46c0ec8Sopenharmony_ciEND_TEST
1376a46c0ec8Sopenharmony_ci
1377a46c0ec8Sopenharmony_ciSTART_TEST(strsanitize_test)
1378a46c0ec8Sopenharmony_ci{
1379a46c0ec8Sopenharmony_ci	struct strsanitize_test {
1380a46c0ec8Sopenharmony_ci		const char *string;
1381a46c0ec8Sopenharmony_ci		const char *expected;
1382a46c0ec8Sopenharmony_ci	} tests[] = {
1383a46c0ec8Sopenharmony_ci		{ "foobar", "foobar" },
1384a46c0ec8Sopenharmony_ci		{ "", "" },
1385a46c0ec8Sopenharmony_ci		{ "%", "%%" },
1386a46c0ec8Sopenharmony_ci		{ "%%%%", "%%%%%%%%" },
1387a46c0ec8Sopenharmony_ci		{ "x %s", "x %%s" },
1388a46c0ec8Sopenharmony_ci		{ "x %", "x %%" },
1389a46c0ec8Sopenharmony_ci		{ "%sx", "%%sx" },
1390a46c0ec8Sopenharmony_ci		{ "%s%s", "%%s%%s" },
1391a46c0ec8Sopenharmony_ci		{ NULL, NULL },
1392a46c0ec8Sopenharmony_ci	};
1393a46c0ec8Sopenharmony_ci
1394a46c0ec8Sopenharmony_ci	for (struct strsanitize_test *t = tests; t->string; t++) {
1395a46c0ec8Sopenharmony_ci		char *sanitized = str_sanitize(t->string);
1396a46c0ec8Sopenharmony_ci		ck_assert_str_eq(sanitized, t->expected);
1397a46c0ec8Sopenharmony_ci		free(sanitized);
1398a46c0ec8Sopenharmony_ci	}
1399a46c0ec8Sopenharmony_ci}
1400a46c0ec8Sopenharmony_ciEND_TEST
1401a46c0ec8Sopenharmony_ci
1402a46c0ec8Sopenharmony_ciSTART_TEST(list_test_insert)
1403a46c0ec8Sopenharmony_ci{
1404a46c0ec8Sopenharmony_ci	struct list_test {
1405a46c0ec8Sopenharmony_ci		int val;
1406a46c0ec8Sopenharmony_ci		struct list node;
1407a46c0ec8Sopenharmony_ci	} tests[] = {
1408a46c0ec8Sopenharmony_ci		{ .val  = 1 },
1409a46c0ec8Sopenharmony_ci		{ .val  = 2 },
1410a46c0ec8Sopenharmony_ci		{ .val  = 3 },
1411a46c0ec8Sopenharmony_ci		{ .val  = 4 },
1412a46c0ec8Sopenharmony_ci	};
1413a46c0ec8Sopenharmony_ci	struct list_test *t;
1414a46c0ec8Sopenharmony_ci	struct list head;
1415a46c0ec8Sopenharmony_ci	int val;
1416a46c0ec8Sopenharmony_ci
1417a46c0ec8Sopenharmony_ci	list_init(&head);
1418a46c0ec8Sopenharmony_ci
1419a46c0ec8Sopenharmony_ci	ARRAY_FOR_EACH(tests, t) {
1420a46c0ec8Sopenharmony_ci		list_insert(&head, &t->node);
1421a46c0ec8Sopenharmony_ci	}
1422a46c0ec8Sopenharmony_ci
1423a46c0ec8Sopenharmony_ci	val = 4;
1424a46c0ec8Sopenharmony_ci	list_for_each(t, &head, node) {
1425a46c0ec8Sopenharmony_ci		ck_assert_int_eq(t->val, val);
1426a46c0ec8Sopenharmony_ci		val--;
1427a46c0ec8Sopenharmony_ci	}
1428a46c0ec8Sopenharmony_ci
1429a46c0ec8Sopenharmony_ci	ck_assert_int_eq(val, 0);
1430a46c0ec8Sopenharmony_ci}
1431a46c0ec8Sopenharmony_ciEND_TEST
1432a46c0ec8Sopenharmony_ci
1433a46c0ec8Sopenharmony_ciSTART_TEST(list_test_append)
1434a46c0ec8Sopenharmony_ci{
1435a46c0ec8Sopenharmony_ci	struct list_test {
1436a46c0ec8Sopenharmony_ci		int val;
1437a46c0ec8Sopenharmony_ci		struct list node;
1438a46c0ec8Sopenharmony_ci	} tests[] = {
1439a46c0ec8Sopenharmony_ci		{ .val  = 1 },
1440a46c0ec8Sopenharmony_ci		{ .val  = 2 },
1441a46c0ec8Sopenharmony_ci		{ .val  = 3 },
1442a46c0ec8Sopenharmony_ci		{ .val  = 4 },
1443a46c0ec8Sopenharmony_ci	};
1444a46c0ec8Sopenharmony_ci	struct list_test *t;
1445a46c0ec8Sopenharmony_ci	struct list head;
1446a46c0ec8Sopenharmony_ci	int val;
1447a46c0ec8Sopenharmony_ci
1448a46c0ec8Sopenharmony_ci	list_init(&head);
1449a46c0ec8Sopenharmony_ci
1450a46c0ec8Sopenharmony_ci	ARRAY_FOR_EACH(tests, t) {
1451a46c0ec8Sopenharmony_ci		list_append(&head, &t->node);
1452a46c0ec8Sopenharmony_ci	}
1453a46c0ec8Sopenharmony_ci
1454a46c0ec8Sopenharmony_ci	val = 1;
1455a46c0ec8Sopenharmony_ci	list_for_each(t, &head, node) {
1456a46c0ec8Sopenharmony_ci		ck_assert_int_eq(t->val, val);
1457a46c0ec8Sopenharmony_ci		val++;
1458a46c0ec8Sopenharmony_ci	}
1459a46c0ec8Sopenharmony_ci	ck_assert_int_eq(val, 5);
1460a46c0ec8Sopenharmony_ci}
1461a46c0ec8Sopenharmony_ciEND_TEST
1462a46c0ec8Sopenharmony_ci
1463a46c0ec8Sopenharmony_ciSTART_TEST(list_test_foreach)
1464a46c0ec8Sopenharmony_ci{
1465a46c0ec8Sopenharmony_ci	struct list_test {
1466a46c0ec8Sopenharmony_ci		int val;
1467a46c0ec8Sopenharmony_ci		struct list node;
1468a46c0ec8Sopenharmony_ci	} tests[] = {
1469a46c0ec8Sopenharmony_ci		{ .val  = 1 },
1470a46c0ec8Sopenharmony_ci		{ .val  = 2 },
1471a46c0ec8Sopenharmony_ci		{ .val  = 3 },
1472a46c0ec8Sopenharmony_ci		{ .val  = 4 },
1473a46c0ec8Sopenharmony_ci	};
1474a46c0ec8Sopenharmony_ci	struct list_test *t;
1475a46c0ec8Sopenharmony_ci	struct list head;
1476a46c0ec8Sopenharmony_ci
1477a46c0ec8Sopenharmony_ci	list_init(&head);
1478a46c0ec8Sopenharmony_ci
1479a46c0ec8Sopenharmony_ci	ARRAY_FOR_EACH(tests, t) {
1480a46c0ec8Sopenharmony_ci		list_append(&head, &t->node);
1481a46c0ec8Sopenharmony_ci	}
1482a46c0ec8Sopenharmony_ci
1483a46c0ec8Sopenharmony_ci	/* Make sure both loop macros are a single line statement */
1484a46c0ec8Sopenharmony_ci	if (false)
1485a46c0ec8Sopenharmony_ci		list_for_each(t, &head, node) {
1486a46c0ec8Sopenharmony_ci			ck_abort_msg("We should not get here");
1487a46c0ec8Sopenharmony_ci		}
1488a46c0ec8Sopenharmony_ci
1489a46c0ec8Sopenharmony_ci	if (false)
1490a46c0ec8Sopenharmony_ci		list_for_each_safe(t, &head, node) {
1491a46c0ec8Sopenharmony_ci			ck_abort_msg("We should not get here");
1492a46c0ec8Sopenharmony_ci		}
1493a46c0ec8Sopenharmony_ci}
1494a46c0ec8Sopenharmony_ciEND_TEST
1495a46c0ec8Sopenharmony_ci
1496a46c0ec8Sopenharmony_ciSTART_TEST(strverscmp_test)
1497a46c0ec8Sopenharmony_ci{
1498a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_strverscmp("", ""), 0);
1499a46c0ec8Sopenharmony_ci	ck_assert_int_gt(libinput_strverscmp("0.0.1", ""), 0);
1500a46c0ec8Sopenharmony_ci	ck_assert_int_lt(libinput_strverscmp("", "0.0.1"), 0);
1501a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_strverscmp("0.0.1", "0.0.1"), 0);
1502a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_strverscmp("0.0.1", "0.0.2"), -1);
1503a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_strverscmp("0.0.2", "0.0.1"), 1);
1504a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_strverscmp("0.0.1", "0.1.0"), -1);
1505a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_strverscmp("0.1.0", "0.0.1"), 1);
1506a46c0ec8Sopenharmony_ci}
1507a46c0ec8Sopenharmony_ciEND_TEST
1508a46c0ec8Sopenharmony_ci
1509a46c0ec8Sopenharmony_ciSTART_TEST(streq_test)
1510a46c0ec8Sopenharmony_ci{
1511a46c0ec8Sopenharmony_ci	ck_assert(streq("", "") == true);
1512a46c0ec8Sopenharmony_ci	ck_assert(streq(NULL, NULL) == true);
1513a46c0ec8Sopenharmony_ci	ck_assert(streq("0.0.1", "") == false);
1514a46c0ec8Sopenharmony_ci	ck_assert(streq("foo", NULL) == false);
1515a46c0ec8Sopenharmony_ci	ck_assert(streq(NULL, "foo") == false);
1516a46c0ec8Sopenharmony_ci	ck_assert(streq("0.0.1", "0.0.1") == true);
1517a46c0ec8Sopenharmony_ci}
1518a46c0ec8Sopenharmony_ciEND_TEST
1519a46c0ec8Sopenharmony_ci
1520a46c0ec8Sopenharmony_ciSTART_TEST(strneq_test)
1521a46c0ec8Sopenharmony_ci{
1522a46c0ec8Sopenharmony_ci	ck_assert(strneq("", "", 1) == true);
1523a46c0ec8Sopenharmony_ci	ck_assert(strneq(NULL, NULL, 1) == true);
1524a46c0ec8Sopenharmony_ci	ck_assert(strneq("0.0.1", "", 6) == false);
1525a46c0ec8Sopenharmony_ci	ck_assert(strneq("foo", NULL, 5) == false);
1526a46c0ec8Sopenharmony_ci	ck_assert(strneq(NULL, "foo", 5) == false);
1527a46c0ec8Sopenharmony_ci	ck_assert(strneq("0.0.1", "0.0.1", 6) == true);
1528a46c0ec8Sopenharmony_ci}
1529a46c0ec8Sopenharmony_ciEND_TEST
1530a46c0ec8Sopenharmony_ci
1531a46c0ec8Sopenharmony_ciSTART_TEST(basename_test)
1532a46c0ec8Sopenharmony_ci{
1533a46c0ec8Sopenharmony_ci	struct test {
1534a46c0ec8Sopenharmony_ci		const char *path;
1535a46c0ec8Sopenharmony_ci		const char *expected;
1536a46c0ec8Sopenharmony_ci	} tests[] = {
1537a46c0ec8Sopenharmony_ci		{ "a", "a" },
1538a46c0ec8Sopenharmony_ci		{ "foo.c", "foo.c" },
1539a46c0ec8Sopenharmony_ci		{ "foo", "foo" },
1540a46c0ec8Sopenharmony_ci		{ "/path/to/foo.h", "foo.h" },
1541a46c0ec8Sopenharmony_ci		{ "../bar.foo", "bar.foo" },
1542a46c0ec8Sopenharmony_ci		{ "./bar.foo.baz", "bar.foo.baz" },
1543a46c0ec8Sopenharmony_ci		{ "./", NULL },
1544a46c0ec8Sopenharmony_ci		{ "/", NULL },
1545a46c0ec8Sopenharmony_ci		{ "/bar/", NULL },
1546a46c0ec8Sopenharmony_ci		{ "/bar", "bar" },
1547a46c0ec8Sopenharmony_ci		{ "", NULL },
1548a46c0ec8Sopenharmony_ci	};
1549a46c0ec8Sopenharmony_ci
1550a46c0ec8Sopenharmony_ci	ARRAY_FOR_EACH(tests, t) {
1551a46c0ec8Sopenharmony_ci		const char *result = safe_basename(t->path);
1552a46c0ec8Sopenharmony_ci		if (t->expected == NULL)
1553a46c0ec8Sopenharmony_ci			ck_assert(result == NULL);
1554a46c0ec8Sopenharmony_ci		else
1555a46c0ec8Sopenharmony_ci			ck_assert_str_eq(result, t->expected);
1556a46c0ec8Sopenharmony_ci	}
1557a46c0ec8Sopenharmony_ci}
1558a46c0ec8Sopenharmony_ciEND_TEST
1559a46c0ec8Sopenharmony_ciSTART_TEST(trunkname_test)
1560a46c0ec8Sopenharmony_ci{
1561a46c0ec8Sopenharmony_ci	struct test {
1562a46c0ec8Sopenharmony_ci		const char *path;
1563a46c0ec8Sopenharmony_ci		const char *expected;
1564a46c0ec8Sopenharmony_ci	} tests[] = {
1565a46c0ec8Sopenharmony_ci		{ "foo.c", "foo" },
1566a46c0ec8Sopenharmony_ci		{ "/path/to/foo.h", "foo" },
1567a46c0ec8Sopenharmony_ci		{ "/path/to/foo", "foo" },
1568a46c0ec8Sopenharmony_ci		{ "../bar.foo", "bar" },
1569a46c0ec8Sopenharmony_ci		{ "./bar.foo.baz", "bar.foo" },
1570a46c0ec8Sopenharmony_ci		{ "./", "" },
1571a46c0ec8Sopenharmony_ci		{ "/", "" },
1572a46c0ec8Sopenharmony_ci		{ "/bar/", "" },
1573a46c0ec8Sopenharmony_ci		{ "/bar", "bar" },
1574a46c0ec8Sopenharmony_ci		{ "", "" },
1575a46c0ec8Sopenharmony_ci	};
1576a46c0ec8Sopenharmony_ci
1577a46c0ec8Sopenharmony_ci	ARRAY_FOR_EACH(tests, t) {
1578a46c0ec8Sopenharmony_ci		char *result = trunkname(t->path);
1579a46c0ec8Sopenharmony_ci		ck_assert_str_eq(result, t->expected);
1580a46c0ec8Sopenharmony_ci		free(result);
1581a46c0ec8Sopenharmony_ci	}
1582a46c0ec8Sopenharmony_ci}
1583a46c0ec8Sopenharmony_ciEND_TEST
1584a46c0ec8Sopenharmony_ci
1585a46c0ec8Sopenharmony_cistatic Suite *
1586a46c0ec8Sopenharmony_cilitest_utils_suite(void)
1587a46c0ec8Sopenharmony_ci{
1588a46c0ec8Sopenharmony_ci	TCase *tc;
1589a46c0ec8Sopenharmony_ci	Suite *s;
1590a46c0ec8Sopenharmony_ci
1591a46c0ec8Sopenharmony_ci	s = suite_create("litest:utils");
1592a46c0ec8Sopenharmony_ci	tc = tcase_create("utils");
1593a46c0ec8Sopenharmony_ci
1594a46c0ec8Sopenharmony_ci	tcase_add_test(tc, array_for_each);
1595a46c0ec8Sopenharmony_ci
1596a46c0ec8Sopenharmony_ci	tcase_add_test(tc, bitfield_helpers);
1597a46c0ec8Sopenharmony_ci	tcase_add_test(tc, matrix_helpers);
1598a46c0ec8Sopenharmony_ci	tcase_add_test(tc, ratelimit_helpers);
1599a46c0ec8Sopenharmony_ci	tcase_add_test(tc, dpi_parser);
1600a46c0ec8Sopenharmony_ci	tcase_add_test(tc, wheel_click_parser);
1601a46c0ec8Sopenharmony_ci	tcase_add_test(tc, wheel_click_count_parser);
1602a46c0ec8Sopenharmony_ci	tcase_add_test(tc, dimension_prop_parser);
1603a46c0ec8Sopenharmony_ci	tcase_add_test(tc, reliability_prop_parser);
1604a46c0ec8Sopenharmony_ci	tcase_add_test(tc, calibration_prop_parser);
1605a46c0ec8Sopenharmony_ci	tcase_add_test(tc, range_prop_parser);
1606a46c0ec8Sopenharmony_ci	tcase_add_test(tc, boolean_prop_parser);
1607a46c0ec8Sopenharmony_ci	tcase_add_test(tc, evcode_prop_parser);
1608a46c0ec8Sopenharmony_ci	tcase_add_test(tc, input_prop_parser);
1609a46c0ec8Sopenharmony_ci	tcase_add_test(tc, evdev_abs_parser);
1610a46c0ec8Sopenharmony_ci	tcase_add_test(tc, safe_atoi_test);
1611a46c0ec8Sopenharmony_ci	tcase_add_test(tc, safe_atoi_base_16_test);
1612a46c0ec8Sopenharmony_ci	tcase_add_test(tc, safe_atoi_base_8_test);
1613a46c0ec8Sopenharmony_ci	tcase_add_test(tc, safe_atou_test);
1614a46c0ec8Sopenharmony_ci	tcase_add_test(tc, safe_atou_base_16_test);
1615a46c0ec8Sopenharmony_ci	tcase_add_test(tc, safe_atou_base_8_test);
1616a46c0ec8Sopenharmony_ci	tcase_add_test(tc, safe_atod_test);
1617a46c0ec8Sopenharmony_ci	tcase_add_test(tc, strsplit_test);
1618a46c0ec8Sopenharmony_ci	tcase_add_test(tc, double_array_from_string_test);
1619a46c0ec8Sopenharmony_ci	tcase_add_test(tc, strargv_test);
1620a46c0ec8Sopenharmony_ci	tcase_add_test(tc, kvsplit_double_test);
1621a46c0ec8Sopenharmony_ci	tcase_add_test(tc, strjoin_test);
1622a46c0ec8Sopenharmony_ci	tcase_add_test(tc, strstrip_test);
1623a46c0ec8Sopenharmony_ci	tcase_add_test(tc, strendswith_test);
1624a46c0ec8Sopenharmony_ci	tcase_add_test(tc, strstartswith_test);
1625a46c0ec8Sopenharmony_ci	tcase_add_test(tc, strsanitize_test);
1626a46c0ec8Sopenharmony_ci	tcase_add_test(tc, time_conversion);
1627a46c0ec8Sopenharmony_ci	tcase_add_test(tc, human_time);
1628a46c0ec8Sopenharmony_ci
1629a46c0ec8Sopenharmony_ci	tcase_add_test(tc, list_test_insert);
1630a46c0ec8Sopenharmony_ci	tcase_add_test(tc, list_test_append);
1631a46c0ec8Sopenharmony_ci	tcase_add_test(tc, list_test_foreach);
1632a46c0ec8Sopenharmony_ci	tcase_add_test(tc, strverscmp_test);
1633a46c0ec8Sopenharmony_ci	tcase_add_test(tc, streq_test);
1634a46c0ec8Sopenharmony_ci	tcase_add_test(tc, strneq_test);
1635a46c0ec8Sopenharmony_ci	tcase_add_test(tc, trunkname_test);
1636a46c0ec8Sopenharmony_ci	tcase_add_test(tc, basename_test);
1637a46c0ec8Sopenharmony_ci
1638a46c0ec8Sopenharmony_ci	suite_add_tcase(s, tc);
1639a46c0ec8Sopenharmony_ci
1640a46c0ec8Sopenharmony_ci	return s;
1641a46c0ec8Sopenharmony_ci}
1642a46c0ec8Sopenharmony_ci
1643a46c0ec8Sopenharmony_ciint main(int argc, char **argv)
1644a46c0ec8Sopenharmony_ci{
1645a46c0ec8Sopenharmony_ci	int nfailed;
1646a46c0ec8Sopenharmony_ci	Suite *s;
1647a46c0ec8Sopenharmony_ci	SRunner *sr;
1648a46c0ec8Sopenharmony_ci
1649a46c0ec8Sopenharmony_ci	s = litest_utils_suite();
1650a46c0ec8Sopenharmony_ci	sr = srunner_create(s);
1651a46c0ec8Sopenharmony_ci
1652a46c0ec8Sopenharmony_ci	srunner_run_all(sr, CK_ENV);
1653a46c0ec8Sopenharmony_ci	nfailed = srunner_ntests_failed(sr);
1654a46c0ec8Sopenharmony_ci	srunner_free(sr);
1655a46c0ec8Sopenharmony_ci
1656a46c0ec8Sopenharmony_ci	return (nfailed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
1657a46c0ec8Sopenharmony_ci}
1658