/* SPDX-License-Identifier: GPL-2.0-only */

#include <stdlib.h>
#include <tests/test.h>
#include <string.h>

static const char test_data1[] =
	"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
static const size_t test_data1_sz = sizeof(test_data1);
static const char test_data2[] = {
	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
	0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
	0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
	0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
	0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
	0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
	0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61,
	0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
	0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d,
	0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b,
	0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
	0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
	0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
	0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3,
	0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1,
	0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
	0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed,
	0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
	0xfc, 0xfd, 0xfe, 0xff};
static const size_t test_data2_sz = sizeof(test_data2);

static void test_memchr_existing_value(void **state)
{
	/* Test using character string */
	void *v1 = memchr(test_data1, 'A', test_data1_sz);
	void *v2 = memchr(test_data1 + 26, 'A', test_data1_sz - 26);

	assert_non_null(v1);
	assert_non_null(v2);
	assert_ptr_equal(v1, v2);
	assert_ptr_equal(v1, &test_data1[26]);

	/* Test using full byte range array */
	v1 = memchr(test_data2, 0x33, test_data2_sz);
	v2 = memchr(test_data2 + 0x15, 0x33, test_data2_sz - 0x15);

	assert_non_null(v1);
	assert_non_null(v2);
	assert_ptr_equal(v1, v2);
	assert_ptr_equal(v1, &test_data2[0x33]);
}

static void test_memchr_last_character_in_string(void **state)
{
	void *v1 = memchr(test_data1, '9', test_data1_sz);
	void *v2 = memchr(&test_data1[test_data1_sz - 2], '9', 2);
	void *v3 = memchr(test_data2, 0xff, test_data2_sz);
	void *v4 = memchr(&test_data2[test_data2_sz - 1], 0xff, 1);

	assert_non_null(v1);
	assert_non_null(v2);
	assert_ptr_equal(v1, v2);
	assert_ptr_equal(v1, &test_data1[test_data1_sz - 2]);

	assert_non_null(v3);
	assert_non_null(v4);
	assert_ptr_equal(v3, v4);
	assert_ptr_equal(v3, &test_data2[test_data2_sz - 1]);
}

static void test_memchr_nonexistent_value(void **state)
{
	assert_null(memchr(test_data1, '@', test_data1_sz));
}

static void test_memchr_zero_size(void **state)
{
	assert_null(memchr(test_data2, 0x56, 0));
}

int main(void)
{
	const struct CMUnitTest tests[] = {
		cmocka_unit_test(test_memchr_existing_value),
		cmocka_unit_test(test_memchr_last_character_in_string),
		cmocka_unit_test(test_memchr_nonexistent_value),
		cmocka_unit_test(test_memchr_zero_size),
	};

	return cb_run_group_tests(tests, NULL, NULL);
}
