#pragma once

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