/* 统一测试辅助头：
 * - 提供轻量断言宏，失败时打印上下文并返回 1 终止当前测试程序
 * - 所有测试文件可直接 include 本头，减少重复样板代码
 */
#ifndef DTU_TEST_COMMON_H
#define DTU_TEST_COMMON_H

/* 标准库依赖：
 * - stdio.h  : fprintf
 * - stdlib.h : 通用工具（当前宏未直接使用，预留）
 * - string.h : strcmp
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* 断言：表达式为真
 * 失败输出：失败表达式 + 文件 + 行号
 * 失败返回：1（约定 main 返回非 0 表示测试失败）
 */
#define ASSERT_TRUE(expr)                                                        \
    do {                                                                         \
        if (!(expr)) {                                                           \
            fprintf(stderr, "ASSERT_TRUE failed: %s (%s:%d)\n", #expr, __FILE__,\
                    __LINE__);                                                   \
            return 1;                                                            \
        }                                                                        \
    } while (0)

/* 断言：两个整数值相等（按 int 比较） */
#define ASSERT_EQ_INT(expected, actual)                                          \
    do {                                                                         \
        int _exp = (int)(expected);                                              \
        int _act = (int)(actual);                                                \
        if (_exp != _act) {                                                      \
            fprintf(stderr,                                                       \
                    "ASSERT_EQ_INT failed: expected=%d actual=%d (%s:%d)\n",     \
                    _exp, _act, __FILE__, __LINE__);                             \
            return 1;                                                            \
        }                                                                        \
    } while (0)

/* 断言：两个无符号 32 位值相等（按 unsigned int 比较） */
#define ASSERT_EQ_U32(expected, actual)                                          \
    do {                                                                         \
        unsigned int _exp = (unsigned int)(expected);                            \
        unsigned int _act = (unsigned int)(actual);                              \
        if (_exp != _act) {                                                      \
            fprintf(stderr,                                                       \
                    "ASSERT_EQ_U32 failed: expected=%u actual=%u (%s:%d)\n",     \
                    _exp, _act, __FILE__, __LINE__);                             \
            return 1;                                                            \
        }                                                                        \
    } while (0)

/* 断言：两个 C 字符串内容相等（区分大小写） */
#define ASSERT_STREQ(expected, actual)                                           \
    do {                                                                         \
        if (strcmp((expected), (actual)) != 0) {                                 \
            fprintf(stderr, "ASSERT_STREQ failed: expected=\"%s\" actual=\"%s\" (%s:%d)\n", \
                    (expected), (actual), __FILE__, __LINE__);                   \
            return 1;                                                            \
        }                                                                        \
    } while (0)

#endif
