mirror of
https://github.com/Palm1r/QodeAssist.git
synced 2026-07-10 21:31:03 -04:00
fix: Found and fix review mistakes
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QJsonArray>
|
||||
#include <QTemporaryDir>
|
||||
|
||||
#include <AgentConfig.hpp>
|
||||
@@ -25,13 +26,14 @@ void writeFile(const QString &dir, const QString &name, const QByteArray &conten
|
||||
|
||||
QByteArray minimalAgent(const QByteArray &name, const QByteArray &extra = {})
|
||||
{
|
||||
return "name = \"" + name + "\"\n"
|
||||
"provider_instance = \"P\"\n"
|
||||
"model = \"m\"\n"
|
||||
"endpoint = \"/e\"\n"
|
||||
+ extra +
|
||||
"[body]\n"
|
||||
"stream = true\n";
|
||||
return "name = \"" + name
|
||||
+ "\"\n"
|
||||
"provider_instance = \"P\"\n"
|
||||
"model = \"m\"\n"
|
||||
"endpoint = \"/e\"\n"
|
||||
+ extra
|
||||
+ "[body]\n"
|
||||
"stream = true\n";
|
||||
}
|
||||
|
||||
const AgentConfig *findConfig(const AgentLoader::LoadResult &result, const QString &name)
|
||||
@@ -58,11 +60,14 @@ TEST(AgentLoaderTest, WarnsOnUnknownTopLevelAndMatchKeys)
|
||||
{
|
||||
QTemporaryDir dir;
|
||||
ASSERT_TRUE(dir.isValid());
|
||||
writeFile(dir.path(), "a.toml",
|
||||
minimalAgent("A",
|
||||
"enable_thinkin = true\n"
|
||||
"[match]\n"
|
||||
"file_pattern = [\"*.cpp\"]\n"));
|
||||
writeFile(
|
||||
dir.path(),
|
||||
"a.toml",
|
||||
minimalAgent(
|
||||
"A",
|
||||
"enable_thinkin = true\n"
|
||||
"[match]\n"
|
||||
"file_pattern = [\"*.cpp\"]\n"));
|
||||
|
||||
const auto result = AgentLoader::load(QString(), dir.path());
|
||||
EXPECT_TRUE(result.errors.isEmpty()) << result.errors.join("; ").toStdString();
|
||||
@@ -124,23 +129,29 @@ TEST(AgentLoaderTest, UserAgentExtendsBundledProviderBase)
|
||||
QTemporaryDir user;
|
||||
ASSERT_TRUE(bundled.isValid());
|
||||
ASSERT_TRUE(user.isValid());
|
||||
writeFile(bundled.path(), "base.toml",
|
||||
"name = \"Provider Base\"\n"
|
||||
"abstract = true\n"
|
||||
"provider_instance = \"P\"\n"
|
||||
"endpoint = \"/e\"\n"
|
||||
"[body]\n"
|
||||
"stream = true\n");
|
||||
writeFile(bundled.path(), "a.toml",
|
||||
"name = \"A\"\n"
|
||||
"extends = \"Provider Base\"\n"
|
||||
"model = \"stock-model\"\n");
|
||||
writeFile(user.path(), "mine.toml",
|
||||
"name = \"My A\"\n"
|
||||
"extends = \"Provider Base\"\n"
|
||||
"model = \"my-model\"\n"
|
||||
"[body]\n"
|
||||
"temperature = 0.2\n");
|
||||
writeFile(
|
||||
bundled.path(),
|
||||
"base.toml",
|
||||
"name = \"Provider Base\"\n"
|
||||
"abstract = true\n"
|
||||
"provider_instance = \"P\"\n"
|
||||
"endpoint = \"/e\"\n"
|
||||
"[body]\n"
|
||||
"stream = true\n");
|
||||
writeFile(
|
||||
bundled.path(),
|
||||
"a.toml",
|
||||
"name = \"A\"\n"
|
||||
"extends = \"Provider Base\"\n"
|
||||
"model = \"stock-model\"\n");
|
||||
writeFile(
|
||||
user.path(),
|
||||
"mine.toml",
|
||||
"name = \"My A\"\n"
|
||||
"extends = \"Provider Base\"\n"
|
||||
"model = \"my-model\"\n"
|
||||
"[body]\n"
|
||||
"temperature = 0.2\n");
|
||||
|
||||
const auto result = AgentLoader::load(bundled.path(), user.path());
|
||||
EXPECT_TRUE(result.errors.isEmpty()) << result.errors.join("; ").toStdString();
|
||||
@@ -163,7 +174,8 @@ TEST(AgentLoaderTest, ExtendsUnknownParentErrorNamesChild)
|
||||
writeFile(dir.path(), "child.toml", minimalAgent("Child", "extends = \"NoSuchBase\"\n"));
|
||||
|
||||
const auto result = AgentLoader::load(QString(), dir.path());
|
||||
EXPECT_TRUE(anyContains(result.errors, QStringLiteral("'Child' extends unknown agent 'NoSuchBase'")));
|
||||
EXPECT_TRUE(
|
||||
anyContains(result.errors, QStringLiteral("'Child' extends unknown agent 'NoSuchBase'")));
|
||||
EXPECT_EQ(findConfig(result, QStringLiteral("Child")), nullptr);
|
||||
}
|
||||
|
||||
@@ -182,3 +194,91 @@ TEST(AgentLoaderTest, ParseFileReportsWarningsForOwnFileOnly)
|
||||
EXPECT_TRUE(anyContains(warnings, QStringLiteral("another_bogus")));
|
||||
EXPECT_FALSE(anyContains(warnings, QStringLiteral("bogus_key")));
|
||||
}
|
||||
|
||||
TEST(AgentLoaderTest, CyclicExtendsRejectsAllInvolvedAgents)
|
||||
{
|
||||
QTemporaryDir dir;
|
||||
ASSERT_TRUE(dir.isValid());
|
||||
writeFile(dir.path(), "a.toml", minimalAgent("A", "extends = \"B\"\n"));
|
||||
writeFile(dir.path(), "b.toml", minimalAgent("B", "extends = \"A\"\n"));
|
||||
|
||||
const auto result = AgentLoader::load(QString(), dir.path());
|
||||
EXPECT_TRUE(anyContains(result.errors, QStringLiteral("Cyclic 'extends'")));
|
||||
EXPECT_EQ(findConfig(result, QStringLiteral("A")), nullptr);
|
||||
EXPECT_EQ(findConfig(result, QStringLiteral("B")), nullptr);
|
||||
}
|
||||
|
||||
TEST(AgentLoaderTest, SelfExtendsIsRejected)
|
||||
{
|
||||
QTemporaryDir dir;
|
||||
ASSERT_TRUE(dir.isValid());
|
||||
writeFile(dir.path(), "a.toml", minimalAgent("A", "extends = \"A\"\n"));
|
||||
|
||||
const auto result = AgentLoader::load(QString(), dir.path());
|
||||
EXPECT_TRUE(anyContains(result.errors, QStringLiteral("Cyclic 'extends'")));
|
||||
EXPECT_EQ(findConfig(result, QStringLiteral("A")), nullptr);
|
||||
}
|
||||
|
||||
TEST(AgentLoaderTest, ExtendsChainTooDeepRejectsChain)
|
||||
{
|
||||
QTemporaryDir dir;
|
||||
ASSERT_TRUE(dir.isValid());
|
||||
const int chainLength = 40;
|
||||
writeFile(dir.path(), "agent0.toml", minimalAgent("Agent0"));
|
||||
for (int i = 1; i <= chainLength; ++i) {
|
||||
writeFile(
|
||||
dir.path(),
|
||||
QStringLiteral("agent%1.toml").arg(i),
|
||||
minimalAgent(
|
||||
QStringLiteral("Agent%1").arg(i).toUtf8(),
|
||||
QStringLiteral("extends = \"Agent%1\"\n").arg(i - 1).toUtf8()));
|
||||
}
|
||||
|
||||
const auto result = AgentLoader::load(QString(), dir.path());
|
||||
EXPECT_TRUE(anyContains(result.errors, QStringLiteral("too deep")));
|
||||
EXPECT_EQ(findConfig(result, QStringLiteral("Agent%1").arg(chainLength)), nullptr);
|
||||
EXPECT_NE(findConfig(result, QStringLiteral("Agent0")), nullptr);
|
||||
}
|
||||
|
||||
TEST(AgentLoaderTest, ParseFileRejectsBundledAgentShadow)
|
||||
{
|
||||
QTemporaryDir bundled;
|
||||
QTemporaryDir user;
|
||||
ASSERT_TRUE(bundled.isValid());
|
||||
ASSERT_TRUE(user.isValid());
|
||||
writeFile(bundled.path(), "a.toml", minimalAgent("A", "description = \"base\"\n"));
|
||||
writeFile(user.path(), "shadow.toml", minimalAgent("A", "description = \"mine\"\n"));
|
||||
|
||||
QString error;
|
||||
const auto cfg = AgentLoader::parseFile(
|
||||
user.path() + QStringLiteral("/shadow.toml"), bundled.path(), &error);
|
||||
EXPECT_FALSE(cfg.has_value());
|
||||
EXPECT_TRUE(error.contains(QStringLiteral("cannot be replaced"))) << error.toStdString();
|
||||
}
|
||||
|
||||
TEST(AgentLoaderTest, ChildArrayReplacesParentArray)
|
||||
{
|
||||
QTemporaryDir dir;
|
||||
ASSERT_TRUE(dir.isValid());
|
||||
writeFile(
|
||||
dir.path(),
|
||||
"parent.toml",
|
||||
minimalAgent("Parent", "tags = [\"a\", \"b\"]\n") + "stop = [\"one\", \"two\"]\n");
|
||||
writeFile(
|
||||
dir.path(),
|
||||
"child.toml",
|
||||
"name = \"Child\"\n"
|
||||
"extends = \"Parent\"\n"
|
||||
"tags = [\"c\"]\n"
|
||||
"[body]\n"
|
||||
"stop = [\"three\"]\n");
|
||||
|
||||
const auto result = AgentLoader::load(QString(), dir.path());
|
||||
EXPECT_TRUE(result.errors.isEmpty()) << result.errors.join("; ").toStdString();
|
||||
const AgentConfig *child = findConfig(result, QStringLiteral("Child"));
|
||||
ASSERT_NE(child, nullptr);
|
||||
EXPECT_EQ(child->tags, QStringList{QStringLiteral("c")});
|
||||
const auto stops = child->body.value(QStringLiteral("stop")).toArray();
|
||||
ASSERT_EQ(stops.size(), 1);
|
||||
EXPECT_EQ(stops.first().toString(), QStringLiteral("three"));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user