diff --git a/docs/architecture.md b/docs/architecture.md index d0cef7b..b5c4367 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -292,6 +292,11 @@ replaced the previously exposed `ignoreManager()`. asserts the assistant message is stamped with the request id, history is built correctly (thinking + text + tool use/result), the typed event stream is emitted, and wire errors are categorized. +- `BundledAgentsTest` — loads every bundled agent through the real loader (extends + + partials resolved from the qrc) and renders each `[body]` against the synthetic + validation context. This is the load-time validation guarantee run in CI: a broken + bundled body, partial, or `extends` chain fails the test instead of surfacing as a + silent runtime drop. --- @@ -300,8 +305,8 @@ replaced the previously exposed `ignoreManager()`. 1. **Qt-Creator-free core build + CI** — `AgentFactory` / `ContextRenderer` still call `Core::ICore::userResourcePath`, so the core targets link `QtCreator::Core`. A `ResourcePaths` port + adapter would let the core build without Qt Creator and - enable a CI job that fails on a layering-violating include, plus golden - rendered-body snapshots over the bundled agents loaded through the real loader. + enable a CI job that fails on a layering-violating include. (The bundled-agent + render check already runs in the QtC-linked test binary — see §8.) 2. **§9 target module layout** — the `core/ ide/ features/ hosts/` physical target split in `target-architecture.md` is not yet reflected in the directory layout. ``` diff --git a/test/BundledAgentsTest.cpp b/test/BundledAgentsTest.cpp new file mode 100644 index 0000000..ee5b822 --- /dev/null +++ b/test/BundledAgentsTest.cpp @@ -0,0 +1,34 @@ +// Copyright (C) 2024-2026 Petr Mironychev +// SPDX-License-Identifier: GPL-3.0-or-later +// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE + +#include + +#include + +#include +#include +#include + +using QodeAssist::Agents::AgentLoader; +using QodeAssist::Templates::JsonPromptTemplate; + +TEST(BundledAgentsTest, AllBundledAgentsLoadResolveAndRender) +{ + Q_INIT_RESOURCE(agents); + + const AgentLoader::LoadResult result = AgentLoader::load(QStringLiteral(":/agents"), QString()); + + EXPECT_TRUE(result.errors.isEmpty()) + << "bundled agent load errors: " + << result.errors.join(QStringLiteral("; ")).toStdString(); + + ASSERT_FALSE(result.configs.empty()) << "no bundled agents were loaded from :/agents"; + + for (const auto &cfg : result.configs) { + QString error; + const auto tmpl = JsonPromptTemplate::fromConfig(cfg, &error); + EXPECT_NE(tmpl, nullptr) << "bundled agent '" << cfg.name.toStdString() + << "' body failed to render: " << error.toStdString(); + } +} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9e7ded4..0e6b472 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -6,6 +6,7 @@ add_executable(QodeAssistTest LLMSuggestionTest.cpp JsonPromptTemplateTest.cpp ResponseRouterTest.cpp + BundledAgentsTest.cpp # LLMClientInterfaceTests.cpp unittest_main.cpp )