/* 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);
}
