Files
chenxin 127191c889 ✨ feat: 灵台引擎脾神(hj_transform)确定性 Markdown 解析器(WP-15)
- C ABI 新增 hj_transform_version / hj_transform_markdown(契约登记同步);HjBuffer 真实实现(头部+紧随数据)
- v1 解析(hunjing-markdown-v1):fenced code/mermaid 提取、独占行 $$ 块级数学、未闭合结构保持源码态、其余归并 markdown block;canonical JSON 键序确定、UTF-8 校验、1MiB/256 block/64KiB 行硬限额
- 引擎内部设施抽取(engine_internal.h:last_error/句柄表/buffer 共享)
- doctest 12 个用例(含 1 万次随机鲁棒性冒烟,固定种子可复现);libFuzzer 目标(-DHJ_BUILD_FUZZER,Apple clang 无 fuzzer 运行时,正式跑在 Linux CI)
- nm 验证 9 个导出符号全部 hj_*
2026-09-10 11:01:45 +08:00

39 lines
1.2 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 灵台引擎核心测试(doctest,ADR-025)。
#include <doctest/doctest.h>
#include "hunjing/lingtai.h"
TEST_CASE("ABI 版本协商") {
CHECK(hj_abi_version() == HJ_ABI_VERSION);
}
TEST_CASE("引擎创建与释放") {
HjEngine *engine = nullptr;
REQUIRE(hj_engine_new(HJ_ABI_VERSION, &engine) == HJ_OK);
REQUIRE(engine != nullptr);
CHECK(hj_engine_free(engine) == HJ_OK);
}
TEST_CASE("major 不匹配时拒绝初始化且不产生句柄") {
HjEngine *engine = reinterpret_cast<HjEngine *>(0x1);
CHECK(hj_engine_new(HJ_ABI_VERSION + 100, &engine) == HJ_ERR_UNSUPPORTED_ABI);
CHECK(engine == nullptr);
CHECK(std::string(hj_last_error()).find("ABI") != std::string::npos);
}
TEST_CASE("非法参数与二次释放不崩溃") {
CHECK(hj_engine_new(HJ_ABI_VERSION, nullptr) == HJ_ERR_INVALID_ARGUMENT);
CHECK(hj_last_error()[0] != '\0');
HjEngine *engine = nullptr;
REQUIRE(hj_engine_new(HJ_ABI_VERSION, &engine) == HJ_OK);
REQUIRE(hj_engine_free(engine) == HJ_OK);
CHECK(hj_engine_free(engine) == HJ_ERR_HANDLE_INVALID);
}
TEST_CASE("缓冲防御行为") {
CHECK(hj_buffer_free(nullptr) == HJ_ERR_INVALID_ARGUMENT);
CHECK(hj_buffer_data(nullptr) == nullptr);
CHECK(hj_buffer_len(nullptr) == 0);
}