/*
 * Copyright (c) 2022 Meta
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include "_common.h"

#ifdef CONFIG_POSIX_API
#include <pthread.h>
#else
#include <zephyr/posix/pthread.h>
#endif

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
/**
 * @brief existence test for `<pthread.h>`
 *
 * @see <a href="https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/pthread.h.html">pthread.h</a>
 */
ZTEST(posix_headers, test_pthread_h)
{
	zassert_not_equal(-1, PTHREAD_BARRIER_SERIAL_THREAD);

	zassert_not_equal(-1, PTHREAD_CANCEL_ASYNCHRONOUS);
	zassert_not_equal(-1, PTHREAD_CANCEL_DEFERRED);

	zassert_not_equal(-1, PTHREAD_CANCEL_ENABLE);
	zassert_not_equal(-1, PTHREAD_CANCEL_DISABLE);

	zassert_not_equal((void *)-42, PTHREAD_CANCELED);

	zassert_not_equal(-1, PTHREAD_CREATE_DETACHED);
	zassert_not_equal(-1, PTHREAD_CREATE_JOINABLE);

	zassert_not_equal(-1, PTHREAD_EXPLICIT_SCHED);
	zassert_not_equal(-1, PTHREAD_INHERIT_SCHED);

	zassert_not_equal(-1, PTHREAD_MUTEX_DEFAULT);
	zassert_not_equal(-1, PTHREAD_MUTEX_ERRORCHECK);
	zassert_not_equal(-1, PTHREAD_MUTEX_ERRORCHECK);
	zassert_not_equal(-1, PTHREAD_MUTEX_RECURSIVE);
	/* zassert_not_equal(-1, PTHREAD_MUTEX_ROBUST); */ /* not implemented */
	/* zassert_not_equal(-1, PTHREAD_MUTEX_STALLED); */ /* not implemented */

	pthread_once_t once = PTHREAD_ONCE_INIT;

	/* zassert_not_equal(-1, PTHREAD_PRIO_INHERIT); */ /* not implemented */
	zassert_not_equal(-1, PTHREAD_PRIO_NONE);
	/* zassert_not_equal(-1, PTHREAD_PRIO_PROTECT); */ /* not implemented */

	zassert_not_equal(-1, PTHREAD_PROCESS_SHARED);
	zassert_not_equal(-1, PTHREAD_PROCESS_PRIVATE);

	zassert_not_equal(-1, PTHREAD_SCOPE_PROCESS);
	zassert_not_equal(-1, PTHREAD_SCOPE_SYSTEM);

	pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
	pthread_mutex_t mu = PTHREAD_MUTEX_INITIALIZER;
	/* pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER; */ /* not implemented */

	if (IS_ENABLED(CONFIG_POSIX_API)) {
		zassert_not_null(pthread_atfork);
		zassert_not_null(pthread_attr_destroy);
		zassert_not_null(pthread_attr_getdetachstate);
		zassert_not_null(pthread_attr_getguardsize);
		zassert_not_null(pthread_attr_getinheritsched);
		zassert_not_null(pthread_attr_getschedparam);
		zassert_not_null(pthread_attr_getschedpolicy);
		zassert_not_null(pthread_attr_getscope);
		zassert_not_null(pthread_attr_getstack);
		zassert_not_null(pthread_attr_getstacksize);
		zassert_not_null(pthread_attr_init);
		zassert_not_null(pthread_attr_setdetachstate);
		zassert_not_null(pthread_attr_setguardsize);
		zassert_not_null(pthread_attr_setinheritsched);
		zassert_not_null(pthread_attr_setschedparam);
		zassert_not_null(pthread_attr_setschedpolicy);
		zassert_not_null(pthread_attr_setscope);
		zassert_not_null(pthread_attr_setstack);
		zassert_not_null(pthread_attr_setstacksize);
		zassert_not_null(pthread_barrier_destroy);
		zassert_not_null(pthread_barrier_init);
		zassert_not_null(pthread_barrier_wait);
		zassert_not_null(pthread_barrierattr_destroy);
		/* zassert_not_null(pthread_barrierattr_getpshared); */ /* not implemented */
		zassert_not_null(pthread_barrierattr_init);
		/* zassert_not_null(pthread_barrierattr_setpshared); */ /* not implemented */
		zassert_not_null(pthread_cancel);
		zassert_not_null(pthread_cond_broadcast);
		zassert_not_null(pthread_cond_destroy);
		zassert_not_null(pthread_cond_init);
		zassert_not_null(pthread_cond_signal);
		zassert_not_null(pthread_cond_timedwait);
		zassert_not_null(pthread_cond_wait);
		zassert_not_null(pthread_condattr_destroy);
		zassert_not_null(pthread_condattr_getclock);
		/* zassert_not_null(pthread_condattr_getpshared); */ /* not implemented */
		zassert_not_null(pthread_condattr_init);
		zassert_not_null(pthread_condattr_setclock);
		/* zassert_not_null(pthread_condattr_setpshared); */ /* not implemented */
		zassert_not_null(pthread_create);
		zassert_not_null(pthread_detach);
		zassert_not_null(pthread_equal);
		zassert_not_null(pthread_exit);
		zassert_not_null(pthread_getconcurrency);
		/* zassert_not_null(pthread_getcpuclockid); */ /* not implemented */
		zassert_not_null(pthread_getschedparam);
		zassert_not_null(pthread_getspecific);
		zassert_not_null(pthread_join);
		zassert_not_null(pthread_key_create);
		zassert_not_null(pthread_key_delete);
		/* zassert_not_null(pthread_mutex_consistent); */ /* not implemented */
		zassert_not_null(pthread_mutex_destroy);
		/* zassert_not_null(pthread_mutex_getprioceiling); */ /* not implemented */
		zassert_not_null(pthread_mutex_init);
		zassert_not_null(pthread_mutex_lock);
		/* zassert_not_null(pthread_mutex_setprioceiling); */ /* not implemented */
		zassert_not_null(pthread_mutex_timedlock);
		zassert_not_null(pthread_mutex_trylock);
		zassert_not_null(pthread_mutex_unlock);
		zassert_not_null(pthread_mutexattr_destroy);
		/* zassert_not_null(pthread_mutexattr_getprioceiling); */ /* not implemented */
		zassert_not_null(pthread_mutexattr_getprotocol);
		/* zassert_not_null(pthread_mutexattr_getpshared); */ /* not implemented */
		/* zassert_not_null(pthread_mutexattr_getrobust); */ /* not implemented */
		zassert_not_null(pthread_mutexattr_gettype);
		zassert_not_null(pthread_mutexattr_init);
		/* zassert_not_null(pthread_mutexattr_setprioceiling); */ /* not implemented */
		/* zassert_not_null(pthread_mutexattr_setprotocol); */ /* not implemented */
		/* zassert_not_null(pthread_mutexattr_setpshared); */ /* not implemented */
		/* zassert_not_null(pthread_mutexattr_setrobust); */ /* not implemented */
		zassert_not_null(pthread_mutexattr_settype);
		zassert_not_null(pthread_once);
		zassert_not_null(pthread_rwlock_destroy);
		zassert_not_null(pthread_rwlock_init);
		zassert_not_null(pthread_rwlock_rdlock);
		zassert_not_null(pthread_rwlock_timedrdlock);
		zassert_not_null(pthread_rwlock_timedwrlock);
		zassert_not_null(pthread_rwlock_tryrdlock);
		zassert_not_null(pthread_rwlock_trywrlock);
		zassert_not_null(pthread_rwlock_unlock);
		zassert_not_null(pthread_rwlock_wrlock);
		zassert_not_null(pthread_rwlockattr_destroy);
		zassert_not_null(pthread_rwlockattr_getpshared);
		zassert_not_null(pthread_rwlockattr_init);
		zassert_not_null(pthread_rwlockattr_setpshared);
		zassert_not_null(pthread_self);
		zassert_not_null(pthread_setcancelstate);
		zassert_not_null(pthread_setcanceltype);
		zassert_not_null(pthread_setconcurrency);
		zassert_not_null(pthread_setschedparam);
		zassert_not_null(pthread_setschedprio);
		zassert_not_null(pthread_setspecific);
		zassert_not_null(pthread_spin_destroy);
		zassert_not_null(pthread_spin_init);
		zassert_not_null(pthread_spin_lock);
		zassert_not_null(pthread_spin_trylock);
		zassert_not_null(pthread_spin_unlock);
		zassert_not_null(pthread_testcancel);
	}
}
#pragma GCC diagnostic pop
