🎉 feat: 建立阶段 0 工程骨架与 OpenAPI 契约机器化(WP-01 起步)
- Makefile:统一命令入口(backend/engine/docker/openapi/generate,含 make help) - backend:FastAPI + uv 最小工程,统一错误体(契约第 7 节)、ADR-015 平台 ID 生成与校验(uuid-utils);pytest 7 项、ruff、mypy strict、启动冒烟全部通过 - engine:灵台引擎 C++23/CMake 骨架,按 Lingtai C ABI 契约实现 lingtai.h(13 个 HjStatus、版本协商、句柄表防二次释放、线程局部错误上下文);doctest 5 用例通过,nm 验证仅导出 hj_* 符号 - openapi:OpenAPI 3.1 单一真源初始版(错误体/分页/Money/首批平台 ID/ContentBlock 全 21 类型/流事件 envelope),Redocly lint 0 错误、bundle 通过 - frontend:Next.js 最小骨架,openapi-typescript 生成 API 类型并通过 strict tsc - docker:hunjing-postgres(pgvector:17)compose;.env.example 与 config 示例 - ADR-025:登记测试与契约工具链(doctest/libFuzzer/Redocly/openapi-typescript/uuid-utils) - desktop:Tauri v2 占位与初始化说明(WP-10 启动)
This commit is contained in:
1 parent
5da1efe921
commit
3fbcd0437c
32 files changed
+11459
No files matched your search
@@ -0,0 +1,39 @@
|
||||
// 灵台引擎核心测试(doctest,ADR-025)。
|
||||
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
||||
#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);
|
||||
}
|
||||
Reference in new issue
Block a user