192 lines
4.7 KiB
C++
192 lines
4.7 KiB
C++
/**
|
||
* @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);
|
||
}
|