/*
 * 模块名称：CH395F Driver Test Suite
 * 模块功能：CH395F 驱动各功能模块的测试入口，分阶段组织测试用例，
 *          覆盖 SPI 命令路径、协议栈配置、Socket 状态机等
 * 适用平台：STM32F4 系列（CH395F 以太网芯片）
 * 作者：王建锋
 * 创建日期：2026-07-19
 * 修改记录：
 *
 * === 通过标准速查 ===
 *
 * Phase    | 通过条件                          | 失败特征
 * ---------|-----------------------------------|--------------------------------
 * Phase 1  | 9 项全部打印 OK/SUCCESS/YES/0x00   | 任何一项显示 FAIL、ERROR、MISMATCH
 * Phase 2  | 3 轮 "PASS" 打印                   | 任何一轮打印 "FAIL" 或超时
 * Phase 3  | 20/20 回显 + PING 5/5 + 大包 10/10 | 任何回显超时或丢包
 * Phase 4  | PC 脚本显示 10/10 sent/received     | 断连、数据错乱
 * Phase 5  | PC 脚本显示 10/10 sent/received     | 断连、数据错乱
 * Phase 6  | 日志打印 IP/GW/MASK 非零 IP         | DHCP timeout 或 0.0.0.0
 * Phase 7  | PC 脚本显示 10/10 sent/received     | 断连、数据错乱
 * Phase 8  | 70/70 成功率 100%                   | 任何连接失败或丢包
 */

#ifndef __CH395F_TEST_H
#define __CH395F_TEST_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>

/*
 * 阶段使能开关（取消注释即启用对应阶段）
 * 注意：Phase 6 (DHCP) 会改变 IP，建议独立运行
 */
//#define ENABLE_PHASE1_TESTS     /* 寄存器读写 + 中断一致性 */
//#define ENABLE_PHASE2_TESTS     /* TCP Client 收发 + 关闭重连 */
//#define ENABLE_PHASE3_TESTS     /* UDP Server Echo */
#define ENABLE_PHASE4_TESTS     /* NET 层 TCP Echo（netTask 中运行） */
//#define ENABLE_PHASE5_TESTS     /* NET 层 UDP Echo（netTask 中运行） */
//#define ENABLE_PHASE6_TESTS     /* DHCP 自动获取 IP（会改 IP！） */
//#define ENABLE_PHASE7_TESTS     /* Select/Poll I/O 多路复用（netTask 中运行） */

/* 测试统计 */
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)

/*
 * Phase 1: 底层寄存器测试
 * 通过: 9 项全部打印 OK/SUCCESS/YES/0x00
 * 失败: 任何一项 FAIL/ERROR/MISMATCH
 */
void ch395f_phase1_tests(void);

/*
 * Phase 2: TCP Client 收发 + 关闭重连 ×3 轮
 * 通过: 日志打印 3 轮 "PASS"
 * 失败: 任何一轮打印 "FAIL" 或超时
 * PC 端预启动:
 *   python test/ch395f_socket_test.py tcp_server --port 8081
 */
void ch395f_phase2_tests(void);

/*
 * Phase 3: UDP Server Echo + PING + 大包
 * 通过: 20/20 回显 + PING 5/5 + 大包 10/10
 * 失败: 任何回显超时或丢包
 * PC 端：
 *   ping 192.168.1.100
 *   python test/ch395f_socket_test.py udp_client --ip 192.168.1.100 --port 60000
 */
void ch395f_phase3_tests(void);

/*
 * Phase 4: NET 层 TCP Echo（netTask 中运行）
 * 通过: PC 脚本 10/10 sent/received
 * 失败: 断连或数据错乱
 * PC 端：
 *   python test/ch395f_socket_test.py tcp_client --ip 192.168.1.100 --port 8080
 */
void ch395f_phase4_tests(void);

/*
 * Phase 5: NET 层 UDP Echo（netTask 中运行）
 * 通过: PC 脚本 10/10 sent/received
 * 失败: 断连或数据错乱
 * 注：init 在 USER CODE BEGIN 2 中调用，echo 在 netTask 中运行
 * PC 端：
 *   python test/ch395f_socket_test.py udp_client --ip 192.168.1.100 --port 60000
 */
void ch395f_phase5_init(void);
void ch395f_phase5_tests(void);

/*
 * Phase 6: DHCP 自动获取 IP
 * 通过: DHCP SUCCESS + IP 非零 + 广播宣告 + HELLO 回显
 * 失败: DHCP timeout 或宣告/HELLO 失败
 * 注意: 会改变 IP，需独立运行
 * PC 端：管理员权限
 *    python test/ch395f_socket_test.py dhcp_server --dhcp-iface 192.168.1.2 --ip 192.168.1.100
 */
void ch395f_phase6_tests(void);

/*
 * Phase 7: Select/Poll 测试（netTask 中运行）
 * 通过: PC 脚本 10/10 sent/received
 * 失败: 断连或数据错乱
 * PC 端：
 *   python test/ch395f_socket_test.py tcp_client --ip 192.168.1.100 --port 8080
 */
void ch395f_phase7_tests(void);

#ifdef __cplusplus
}
#endif

#endif /* __CH395F_TEST_H */
