Files
2026-09-16 14:07:40 +08:00

192 lines
4.7 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @file test_io.cpp
* @brief io 模块单元测试(Json
*
*
* @version 1.0
* @author CodeBuddy
* @date 26-09-03
*
* @note
*/
#include <gtest/gtest.h>
#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);
}