/** * @file test_io.cpp * @brief io 模块单元测试(Json) * * * @version 1.0 * @author CodeBuddy * @date 26-09-03 * * @note */ #include #include "io/dl_json.h" #include "io/dl_file.h" #include "memory/dl_code_cvt.h" #include "render/dl_factory.h" TEST(JsonTest, ParseArray) { auto j = dl::Json::ParseString("[1,2,3]"); ASSERT_TRUE(j.is_array()); ASSERT_EQ(j.size(), 3u); EXPECT_EQ(j[0], 1); EXPECT_EQ(j[1], 2); EXPECT_EQ(j[2], 3); } TEST(JsonTest, ParseObject) { auto j = dl::Json::ParseString(R"({"a": 123, "b": "hello"})"); ASSERT_TRUE(j.is_object()); EXPECT_EQ(j["a"], 123); EXPECT_EQ(j["b"], "hello"); } TEST(JsonTest, ParseNested) { auto j = dl::Json::ParseString(R"({"outer": {"inner": [true, false, null]}})"); ASSERT_TRUE(j.is_object()); EXPECT_TRUE(j["outer"]["inner"][0]); EXPECT_FALSE(j["outer"]["inner"][1]); EXPECT_TRUE(j["outer"]["inner"][2].is_null()); } TEST(JsonTest, Get) { auto j = dl::Json::ParseString(R"({"key": 456})"); int v = 0; EXPECT_TRUE(dl::Json::Get(j, "key", v)); EXPECT_EQ(v, 456); } TEST(JsonTest, GetMissing) { auto j = dl::Json::ParseString(R"({"key": 456})"); int v = 0; EXPECT_FALSE(dl::Json::Get(j, "nokey", v)); } TEST(JsonTest, ParseInvalid) { auto j = dl::Json::ParseString("{invalid json"); EXPECT_TRUE(j.is_null()); } TEST(JsonTest, SaveFileDump) { json j = dl::Json::ParseString(R"({"a": 1, "b": "hello"})"); // Dump 成字符串 std::string dump = dl::Json::Dump(j); EXPECT_NE(dump.find("\"a\""), std::string::npos); EXPECT_NE(dump.find("1"), std::string::npos); // SaveFile + ParseFile 往返 std::string path = dl::g_factory->GetPathTemp() + "dl_json_save_test.json"; ASSERT_TRUE(dl::Json::SaveFile(j, path)); json j2 = dl::Json::ParseFile(path); EXPECT_EQ(j2["a"], 1); EXPECT_EQ(j2["b"], "hello"); dl::File::Delete(path); } //------------------------------File------------------------------ TEST(FileTest, GetExtension) { EXPECT_EQ(dl::File::GetExtension("a/b/c.txt"), "txt"); EXPECT_EQ(dl::File::GetExtension("a/b/c.txt", true), ".txt"); EXPECT_EQ(dl::File::GetExtension("a/b/c"), ""); } TEST(FileTest, GetFileName) { EXPECT_EQ(dl::File::GetFileName("a/b/c.txt"), "c.txt"); EXPECT_EQ(dl::File::GetFileName("a/b/"), ""); } TEST(FileTest, GetStem) { EXPECT_EQ(dl::File::GetStem("a/b/c.txt"), "c"); } TEST(FileTest, GetFilePath) { EXPECT_EQ(dl::File::GetFilePath("a/b/c.txt"), "a/b/"); EXPECT_EQ(dl::File::GetFilePath("a/b/"), "a/b/"); EXPECT_EQ(dl::File::GetFilePath("c.txt"), ""); } TEST(FileTest, GetFolderName) { EXPECT_EQ(dl::File::GetFolderName("a/b/c.txt"), "b"); } //------------------------------CodeCvt------------------------------ TEST(CodeCvtTest, Utf8Check) { EXPECT_EQ(dl::CodeCvt::Utf8::Check("hello"), 1); // ascii EXPECT_EQ(dl::CodeCvt::Utf8::Check("你好"), 2); // utf-8 } TEST(CodeCvtTest, Utf8Sub) { std::string s = "你好世界"; // 每个字 3 字节,共 12 字节 EXPECT_EQ(dl::CodeCvt::Utf8::Sub(s, 0), 0u); EXPECT_EQ(dl::CodeCvt::Utf8::Sub(s, 4), 3u); // 截断到"你"(3 字节边界) EXPECT_EQ(dl::CodeCvt::Utf8::Sub(s, 12), 12u); // 足够时返回全部 } TEST(CodeCvtTest, WideCharRoundtrip) { std::string u8 = "hello 你好"; std::wstring wc = dl::CodeCvt::Utf8ToWideChar(u8); std::string back = dl::CodeCvt::WideCharToUtf8(wc); EXPECT_EQ(back, u8); } TEST(CodeCvtTest, Utf32Roundtrip) { std::string u8 = "hello 你好"; std::u32string u32 = dl::CodeCvt::Utf8ToUtf32(u8); std::string back = dl::CodeCvt::Utf32ToUtf8(u32); EXPECT_EQ(back, u8); } //------------------------------File 文件操作------------------------------ TEST(FileTest, CreateReadDelete) { std::string dir = dl::g_factory->GetPathTemp() + "dl_file_test/"; dl::File::Delete(dir, true); ASSERT_TRUE(dl::File::CreateFolder(dir)); EXPECT_TRUE(dl::File::IsExist(dir)); std::string file = dir + "a.txt"; ASSERT_TRUE(dl::File::SaveString("hello", file)); EXPECT_TRUE(dl::File::IsExist(file)); EXPECT_FALSE(dl::File::IsExist(dir + "none.txt")); EXPECT_EQ(dl::File::GetString(file), "hello"); EXPECT_TRUE(dl::File::Delete(file)); EXPECT_FALSE(dl::File::IsExist(file)); dl::File::Delete(dir, true); } TEST(FileTest, CopyRename) { std::string dir = dl::g_factory->GetPathTemp() + "dl_file_test/"; dl::File::Delete(dir, true); ASSERT_TRUE(dl::File::CreateFolder(dir)); std::string src = dir + "src.txt"; std::string dst = dir + "dst.txt"; ASSERT_TRUE(dl::File::SaveString("data", src)); EXPECT_TRUE(dl::File::Copy(src, dst)); EXPECT_TRUE(dl::File::IsExist(dst)); EXPECT_EQ(dl::File::GetString(dst), "data"); std::string dst2 = dir + "dst2.txt"; EXPECT_TRUE(dl::File::Rename(dst, dst2)); EXPECT_TRUE(dl::File::IsExist(dst2)); EXPECT_FALSE(dl::File::IsExist(dst)); dl::File::Delete(dir, true); }