/*
 * 模块名称：CH395F Driver Test Suite
 * 模块功能：CH395F 驱动各功能模块的测试入口，分阶段组织测试用例，
 *          覆盖 SPI 命令路径、协议栈配置、Socket 状态机、大文件传输、
 *          边界条件、KeepAlive、PHY 链路恢复等，基于单连接 socket 模式
 * 适用平台：STM32F4 系列（CH395F 以太网芯片）
 * 作者：王建锋
 * 创建日期：2026-07-19
 * 修改记录：
 *     2026-07-22  全面重构为单连接模式，增加大文件传输、边界条件等测试
 *
 * === 测试阶段一览（硬件层 1~5 → NET 层 6~10，严格顺序执行） ===
 * Phase    | 层       | 描述
 * ---------|----------|-----------------------------------------------
 * Phase 1  | 硬件层   | 独立运行：寄存器读写 + SPI 命令路径验证
 * Phase 2  | 硬件层   | PC 配合：TCP Client 收发 + 关闭重连
 * Phase 3  | 硬件层   | PC 配合：UDP Server Echo（60 轮动态源地址回显，HELLO 探针不计数）
 * Phase 4  | 硬件层   | PC 配合：DHCP 自动获取 IP
 * Phase 5  | 硬件层   | PC 配合：大文件分块回传（裸命令，tcp_server 配合）
 * Phase 6  | NET 层   | testTask：TCP Echo（单连接模式，基础收发验证）
 * Phase 7  | NET 层   | testTask：大文件传输（20KB+ 分块收发）
 * Phase 8  | NET 层   | testTask：Select/Poll I/O 多路复用
 * Phase 9  | NET 层   | testTask：边界条件测试（零长度、DMA 边界、缓冲溢出）
 * Phase 10 | NET 层   | testTask：KeepAlive 超时断开测试
 */

#ifndef __CH395F_TEST_H
#define __CH395F_TEST_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>

/*
 * 阶段使能开关（取消注释即启用对应阶段）
 *
 * 构建模式互斥（详见 docs/CH395F_Test_Guide.md「构建模式与执行顺序」）：
 *   硬件层模式（阶段 1~5）：netTask 不创建，ch395fTestTask 独占 CH395F
 *   NET 层模式 （阶段 6~10）：完整网络栈，netTask 轮询 + ch395fTestTask 监听循环
 *
 * 注意：同层内可多选（Phase 6~10 共享 testTask 循环）；
 *       Phase 4 (DHCP) 会改变 IP，必须独立运行；
 *       两层同时启用会在下方触发 #error。
 */
/* ---- 硬件层（阶段 1~5）---- */
//#define ENABLE_PHASE1_TESTS     /* [硬] 寄存器读写 + SPI 命令路径 */
//#define ENABLE_PHASE2_TESTS     /* [硬] TCP Client 收发 + 关闭重连 */
//#define ENABLE_PHASE3_TESTS     /* [硬] UDP Server Echo */
//#define ENABLE_PHASE4_TESTS     /* [硬] DHCP 自动获取 IP（会改 IP！独立运行） */
#define ENABLE_PHASE5_TESTS     /* [硬] 大文件传输（硬件层，PC 配合） */
/* ---- NET 层（阶段 6~10）---- */
//#define ENABLE_PHASE6_TESTS     /* [网] TCP Echo（单连接基础收发） */
//#define ENABLE_PHASE7_TESTS     /* [网] 大文件传输（20KB+ 分块） */
//#define ENABLE_PHASE8_TESTS     /* [网] Select/Poll I/O 多路复用 */
//#define ENABLE_PHASE9_TESTS     /* [网] 边界条件测试 */
//#define ENABLE_PHASE10_TESTS    /* [网] KeepAlive 超时断开测试 */

#if defined(ENABLE_PHASE1_TESTS) || defined(ENABLE_PHASE2_TESTS) || \
    defined(ENABLE_PHASE3_TESTS) || defined(ENABLE_PHASE4_TESTS) || \
    defined(ENABLE_PHASE5_TESTS)
#define ENABLE_HW_LAYER_TESTS   1
#endif

#if defined(ENABLE_PHASE6_TESTS) || defined(ENABLE_PHASE7_TESTS) || \
    defined(ENABLE_PHASE8_TESTS) || defined(ENABLE_PHASE9_TESTS) || \
    defined(ENABLE_PHASE10_TESTS)
#define ENABLE_NET_LAYER_TESTS  1
#endif

#if defined(ENABLE_HW_LAYER_TESTS) && defined(ENABLE_NET_LAYER_TESTS)
#error "硬件层(1~5)与NET层(6~10)测试互斥：请分两次构建，见 CH395F_Test_Guide 构建模式与执行顺序"
#endif

/* 测试统计 */
typedef struct {
    uint16_t total;
    uint16_t passed;
    uint16_t failed;
} test_stats_t;

extern test_stats_t g_test_stats;

#define TEST_CHECK(cond, fmt, ...) do { \
    g_test_stats.total++; \
    if (cond) { \
        g_test_stats.passed++; \
        DBG_INFO("[PASS] " fmt, ##__VA_ARGS__); \
    } else { \
        g_test_stats.failed++; \
        DBG_ERROR("[FAIL] " fmt, ##__VA_ARGS__); \
    } \
} while (0)

#define TEST_REPORT(name) do { \
    DBG_INFO("=== %s: %d/%d PASSED (failed=%d) ===", \
             name, g_test_stats.passed, g_test_stats.total, g_test_stats.failed); \
} while (0)

#ifdef __cplusplus
}
#endif

#endif /* __CH395F_TEST_H */
