- 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_*
39 lines
1.2 KiB
C++
39 lines
1.2 KiB
C++
// 灵台引擎核心测试(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);
|
||
}
|