#pragma once

#include <stdint.h>
#include <stdio.h>

#define ASSERT(expr)                                                        \
    do {                                                                       \
        if (!(expr)) {                                                         \
            printf("ASSERTION FAILED: %s at %s:%d\n", #expr, __FILE__,         \
                   __LINE__);                                                  \
            while (1);                                                         \
        }                                                                      \
    } while (0)

#define ASSERT_EQ(expr, expected)                                              \
    do {                                                                       \
        uint64_t result = (expr);                                              \
        if (result != (expected)) {                                            \
            printf("ASSERTION FAILED: %s at %s:%d\n", #expr, __FILE__,         \
                   __LINE__);                                                  \
            printf("Expected: %lu, Got: %lu\n", (unsigned long)(expected),     \
                   (unsigned long)result);                                     \
            while (1);                                                         \
        }                                                                      \
    } while (0)