tsl-devkit/lsp-server/test/test_lsp_any/common_test.cpp

326 lines
11 KiB
C++
Raw 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.

#include "common_test.hpp"
#include <vector>
#include <map>
#include <optional>
#include <variant>
#include "../../src/protocol/transform/common.hpp"
#include "../../src/protocol/detail/basic_types.hpp"
namespace lsp::test
{
// 用于测试的用户自定义结构体
struct UserStruct
{
int value;
std::string name;
};
void CommonTests::registerTests(TestRunner& runner)
{
// is_lsp_basic_type 测试
runner.addTest("Common - is_lsp_basic_type (integer)", testIsLSPBasicInteger);
runner.addTest("Common - is_lsp_basic_type (uinteger)", testIsLSPBasicUInteger);
runner.addTest("Common - is_lsp_basic_type (boolean)", testIsLSPBasicBoolean);
runner.addTest("Common - is_lsp_basic_type (string)", testIsLSPBasicString);
runner.addTest("Common - is_lsp_basic_type (decimal)", testIsLSPBasicDecimal);
runner.addTest("Common - is_lsp_basic_type (nullptr_t)", testIsLSPBasicNullptr);
runner.addTest("Common - is_lsp_basic_type (负面案例)", testIsLSPBasicNegativeCases);
// is_lsp_container_type 测试
runner.addTest("Common - is_lsp_container_type (LSPObject)", testIsLSPContainerObject);
runner.addTest("Common - is_lsp_container_type (LSPArray)", testIsLSPContainerArray);
runner.addTest("Common - is_lsp_container_type (LSPAny)", testIsLSPContainerAny);
runner.addTest("Common - is_lsp_container_type (负面案例)", testIsLSPContainerNegativeCases);
// is_user_struct 测试
runner.addTest("Common - is_user_struct (用户结构体)", testIsUserStructPositive);
runner.addTest("Common - is_user_struct (排除算术类型)", testIsUserStructExcludeArithmetic);
runner.addTest("Common - is_user_struct (排除字符串)", testIsUserStructExcludeString);
runner.addTest("Common - is_user_struct (排除LSP类型)", testIsUserStructExcludeLSPTypes);
runner.addTest("Common - is_user_struct (排除vector)", testIsUserStructExcludeVector);
runner.addTest("Common - is_user_struct (排除map)", testIsUserStructExcludeMap);
runner.addTest("Common - is_user_struct (排除optional)", testIsUserStructExcludeOptional);
runner.addTest("Common - is_user_struct (排除variant)", testIsUserStructExcludeVariant);
runner.addTest("Common - is_user_struct (排除指针)", testIsUserStructExcludePointers);
}
// ==================== is_lsp_basic_type 测试 ====================
TestResult CommonTests::testIsLSPBasicInteger()
{
TestResult result;
result.passed = true;
bool is_basic = transform::is_lsp_basic_type_v<protocol::integer>;
assertTrue(is_basic, "integer应该是LSP基本类型");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsLSPBasicUInteger()
{
TestResult result;
result.passed = true;
bool is_basic = transform::is_lsp_basic_type_v<protocol::uinteger>;
assertTrue(is_basic, "uinteger应该是LSP基本类型");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsLSPBasicBoolean()
{
TestResult result;
result.passed = true;
bool is_basic = transform::is_lsp_basic_type_v<protocol::boolean>;
assertTrue(is_basic, "boolean应该是LSP基本类型");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsLSPBasicString()
{
TestResult result;
result.passed = true;
bool is_basic = transform::is_lsp_basic_type_v<protocol::string>;
assertTrue(is_basic, "string应该是LSP基本类型");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsLSPBasicDecimal()
{
TestResult result;
result.passed = true;
bool is_basic = transform::is_lsp_basic_type_v<protocol::decimal>;
assertTrue(is_basic, "decimal应该是LSP基本类型");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsLSPBasicNullptr()
{
TestResult result;
result.passed = true;
bool is_basic = transform::is_lsp_basic_type_v<std::nullptr_t>;
assertTrue(is_basic, "nullptr_t应该是LSP基本类型");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsLSPBasicNegativeCases()
{
TestResult result;
result.passed = true;
// 测试明确不是 LSP 基本类型的类型
// 注意:避免测试 int/int32_t因为它们可能等于 protocol::integer
assertFalse(transform::is_lsp_basic_type_v<int64_t>,
"int64_t不应该是LSP基本类型");
assertFalse(transform::is_lsp_basic_type_v<long long>,
"long long不应该是LSP基本类型");
assertFalse(transform::is_lsp_basic_type_v<float>,
"float不应该是LSP基本类型");
assertFalse(transform::is_lsp_basic_type_v<std::vector<int>>,
"vector不应该是LSP基本类型");
assertFalse(transform::is_lsp_basic_type_v<UserStruct>,
"UserStruct不应该是LSP基本类型");
result.message = "成功";
return result;
}
// ==================== is_lsp_container_type 测试 ====================
TestResult CommonTests::testIsLSPContainerObject()
{
TestResult result;
result.passed = true;
bool is_container = transform::is_lsp_container_type_v<protocol::LSPObject>;
assertTrue(is_container, "LSPObject应该是LSP容器类型");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsLSPContainerArray()
{
TestResult result;
result.passed = true;
bool is_container = transform::is_lsp_container_type_v<protocol::LSPArray>;
assertTrue(is_container, "LSPArray应该是LSP容器类型");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsLSPContainerAny()
{
TestResult result;
result.passed = true;
bool is_container = transform::is_lsp_container_type_v<protocol::LSPAny>;
assertTrue(is_container, "LSPAny应该是LSP容器类型");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsLSPContainerNegativeCases()
{
TestResult result;
result.passed = true;
assertFalse(transform::is_lsp_container_type_v<int>,
"int不应该是LSP容器");
assertFalse(transform::is_lsp_container_type_v<std::string>,
"string不应该是LSP容器");
assertFalse(transform::is_lsp_container_type_v<std::vector<int>>,
"std::vector不应该是LSP容器");
result.message = "成功";
return result;
}
// ==================== is_user_struct 测试 ====================
TestResult CommonTests::testIsUserStructPositive()
{
TestResult result;
result.passed = true;
bool is_user = transform::is_user_struct_v<UserStruct>;
assertTrue(is_user, "UserStruct应该被识别为用户结构体");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsUserStructExcludeArithmetic()
{
TestResult result;
result.passed = true;
assertFalse(transform::is_user_struct_v<int>,
"int不应该是用户结构体");
assertFalse(transform::is_user_struct_v<double>,
"double不应该是用户结构体");
assertFalse(transform::is_user_struct_v<bool>,
"bool不应该是用户结构体");
assertFalse(transform::is_user_struct_v<char>,
"char不应该是用户结构体");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsUserStructExcludeString()
{
TestResult result;
result.passed = true;
assertFalse(transform::is_user_struct_v<std::string>,
"std::string不应该是用户结构体");
assertFalse(transform::is_user_struct_v<protocol::string>,
"protocol::string不应该是用户结构体");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsUserStructExcludeLSPTypes()
{
TestResult result;
result.passed = true;
assertFalse(transform::is_user_struct_v<protocol::LSPObject>,
"LSPObject不应该是用户结构体");
assertFalse(transform::is_user_struct_v<protocol::LSPArray>,
"LSPArray不应该是用户结构体");
assertFalse(transform::is_user_struct_v<protocol::LSPAny>,
"LSPAny不应该是用户结构体");
assertFalse(transform::is_user_struct_v<protocol::integer>,
"protocol::integer不应该是用户结构体");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsUserStructExcludeVector()
{
TestResult result;
result.passed = true;
bool is_user = transform::is_user_struct_v<std::vector<int>>;
assertFalse(is_user, "std::vector不应该是用户结构体");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsUserStructExcludeMap()
{
TestResult result;
result.passed = true;
bool is_user = transform::is_user_struct_v<std::map<std::string, int>>;
assertFalse(is_user, "std::map不应该是用户结构体");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsUserStructExcludeOptional()
{
TestResult result;
result.passed = true;
bool is_user = transform::is_user_struct_v<std::optional<int>>;
assertFalse(is_user, "std::optional不应该是用户结构体");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsUserStructExcludeVariant()
{
TestResult result;
result.passed = true;
bool is_user = transform::is_user_struct_v<std::variant<int, std::string>>;
assertFalse(is_user, "std::variant不应该是用户结构体");
result.message = "成功";
return result;
}
TestResult CommonTests::testIsUserStructExcludePointers()
{
TestResult result;
result.passed = true;
assertFalse(transform::is_user_struct_v<int*>,
"int*不应该是用户结构体");
assertFalse(transform::is_user_struct_v<const char*>,
"const char*不应该是用户结构体");
assertFalse(transform::is_user_struct_v<UserStruct*>,
"UserStruct*不应该是用户结构体");
result.message = "成功";
return result;
}
} // namespace lsp::test