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