#pragma once

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

#include <stdio.h>
#include <kmalloc.h>

/* Macros for assertions.
 * They depend on <stdbool.h> and printk() to be included in the source file.
 */
#define KT_ASSERT_M(message, test)                                             \
do {                                                                           \
	if (!(test)) {                                                         \
		extern char *kern_test_msg;                                    \
		char prefix[] = "Assertion failed: ";                          \
		int msg_size = sizeof(prefix) + sizeof(message) - 1;           \
		kern_test_msg = (char*) kmalloc(msg_size, 0);                  \
		snprintf(kern_test_msg, msg_size, "%s%s", prefix, message);    \
		return false;                                                  \
	}                                                                      \
} while (0)

#define KT_ASSERT(test)                                                        \
do {                                                                           \
	if (!(test)) {                                                         \
		return false;                                                  \
	}                                                                      \
} while (0)


/* Postboot kernel tests: tests ran after boot in kernel mode. */

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

/* A macro for testing if another macro has been #defined or not.  Can be used
 * wherever you need a boolean defined.  Returns 0 or 1. */
#define is_defined(macro) is_defined_(macro)
#define is_defined_test_1 ,
#define is_defined_(value) is_defined__(is_defined_test_##value, value)
#define is_defined__(comma, value) is_defined___(comma value, 0)
#define is_defined___(_, v, ...) v

/* Macro for registering a postboot kernel test. */
#define PB_K_TEST_REG(name, config) \
	{"test_" #name, test_##name, is_defined(config)}

extern struct pb_kernel_test pb_kernel_tests[];
extern int num_pb_kernel_tests;
