#include "KMInfoJson.h"
#include <gtest/gtest.h>
#include <fstream>

TEST(KMInfoJsonTest, BaseParseBasicTest)
{
    KMInfoJson::InfoBase info;

    // 构造符合格式的 baseString，例如 "channel:id/version"
    info.m_baseString = "stable:core/1.0.2";

    // 调用函数
    info.baseParse();

    // 断言字段是否被正确分离
    EXPECT_EQ(info.m_baseId, "core");
    EXPECT_EQ(info.m_baseVersion, "1.0.2");
}

TEST(KMInfoJsonTest, VersionParseBasicTest)
{
    KMInfoJson::InfoBase info;

    // 设置 m_baseVersion 为合法格式
    info.m_baseVersion = "2.5";

    // 执行解析逻辑
    info.versionParse();

    // 验证 major 和 minor 是否被正确提取
    EXPECT_EQ(info.m_versionMajor, "2");
    EXPECT_EQ(info.m_versionMinor, "5");
}

TEST(KMInfoJsonTest, CheckVersionTest)
{
    KMInfoJson::InfoBase info1;
    KMInfoJson::InfoBase info2;

    // 设置两个对象的主版本号
    info1.m_versionMajor = "1";
    info2.m_versionMajor = "1";

    // 应返回 true
    EXPECT_TRUE(info1.checkVersion(info2));

    // 设置不同主版本号
    info2.m_versionMajor = "2";

    // 应返回 false
    EXPECT_FALSE(info1.checkVersion(info2));
}

TEST(KMInfoJsonTest, SetAndGetRootTest)
{
    KMInfoJson infoJson;

    // 构造一个 JSON 对象并设置
    nlohmann::json rootJson;
    rootJson["name"] = "test";
    rootJson["version"] = "1.0";

    infoJson.setRoot(rootJson);

    // 获取设置后的 root，并断言值是否一致
    nlohmann::json result = infoJson.root();
    EXPECT_EQ(result["name"], "test");
    EXPECT_EQ(result["version"], "1.0");
}

TEST(KMInfoJsonTest, SaveFileTest)
{
    KMInfoJson infoJson;

    // 构造 root 内容
    nlohmann::json root;
    root["test_key"] = "test_value";
    infoJson.setRoot(root);

    // 保存文件路径
    std::string filePath = "test_output/test_file.json";

    // 调用保存函数
    ASSERT_NO_THROW(infoJson.saveFile(filePath));

    // 检查文件是否存在
    std::ifstream inFile(filePath);
    ASSERT_TRUE(inFile.is_open());

    // 验证 JSON 内容
    nlohmann::json loadedJson;
    inFile >> loadedJson;
    EXPECT_EQ(loadedJson["test_key"], "test_value");

    inFile.close();

    // 清理测试文件
    std::remove(filePath.c_str());
    std::filesystem::remove_all("test_output");
}

TEST(KMInfoJsonTest, OperatorSquareBracketsTest)
{
    KMInfoJson info;

    // base 访问与赋值
    info["base"] = "base_value";
    EXPECT_EQ(info["base"], "base_value");

    // runtime 访问与赋值
    info["runtime"] = "runtime_value";
    EXPECT_EQ(info["runtime"], "runtime_value");

    // depend 访问与赋值
    info["depend"] = "depend_value";
    EXPECT_EQ(info["depend"], "depend_value");

    // 非法 key 抛出异常
    EXPECT_THROW({
        info["invalid"];
    },
                 std::invalid_argument);
}