#ifndef ROS_INC_KTEST_H
#define ROS_INC_KTEST_H

/*
 * Header file with infrastructure needed for kernel unit tests:
 *  - Assertion functions.
 *  - Test structures.
 */

#include <common.h>
#include <stdio.h>
#include <stdbool.h>
#include <kmalloc.h>
#include <arch/arch.h>
#include <time.h>
#include <sys/queue.h>

/* Macros for assertions. 
 */
#define KT_ASSERT(test)                                                          \
	KT_ASSERT_M("", test)

#define KT_ASSERT_M(message, test)                                               \
	do {                                                                         \
		if (!(test)) {                                                           \
			char fmt[] = "Assertion failure in %s() at %s:%d: %s";               \
			snprintf(ktest_msg, sizeof(ktest_msg), fmt, __FUNCTION__,            \
			         __FILE__, __LINE__, message);                               \
			return false;                                                        \
		}                                                                        \
	} while (0)

struct ktest {
	char name[256]; // Name of the test function.
	bool (*func)(void); // Name of the test function, should be equal to 'name'.
	bool enabled; // Whether to run or not the test.
};

struct ktest_suite {
    SLIST_ENTRY(ktest_suite) link;
	char name[256];
	struct ktest *ktests;
	int num_ktests;
};

#define KTEST_SUITE(name) \
	static struct ktest_suite ktest_suite = {{}, name, NULL, 0};

#define KTEST_REG(name, config) \
	{"test_" #name, test_##name, is_defined(config)}

#define REGISTER_KTESTS(ktests, num_ktests)                                      \
	do {                                                                         \
		ktest_suite.ktests = ktests;                                             \
		ktest_suite.num_ktests = num_ktests;                                     \
		register_ktest_suite(&ktest_suite);                                      \
	} while (0)

/* Global string used to report info about the last completed test */
extern char ktest_msg[1024];

void register_ktest_suite(struct ktest_suite *suite);
void run_ktest_suite(struct ktest_suite *suite);
void run_registered_ktest_suites();

#endif // ROS_INC_KTEST_H
