#include "transformer_test.hpp" #include "../../src/protocol/transform/transformer.hpp" #include "../../src/protocol/transform/common.hpp" #include "../../src/protocol/detail/basic_types.hpp" #include #include #include namespace lsp::test { void TransformerTests::registerTests(TestRunner& runner) { // ToLSPAny 基本类型 runner.addTest("Transformer - ToLSPAny Boolean", testToLSPAnyBoolean); runner.addTest("Transformer - ToLSPAny Integer", testToLSPAnyInteger); runner.addTest("Transformer - ToLSPAny UInteger", testToLSPAnyUInteger); runner.addTest("Transformer - ToLSPAny Float", testToLSPAnyFloat); runner.addTest("Transformer - ToLSPAny Double", testToLSPAnyDouble); runner.addTest("Transformer - ToLSPAny String", testToLSPAnyString); runner.addTest("Transformer - ToLSPAny CString", testToLSPAnyCString); // ToLSPAny 容器类型 runner.addTest("Transformer - ToLSPAny Vector", testToLSPAnyVector); runner.addTest("Transformer - ToLSPAny Map", testToLSPAnyMap); runner.addTest("Transformer - ToLSPAny Optional (有值)", testToLSPAnyOptionalValue); runner.addTest("Transformer - ToLSPAny Optional (nullopt)", testToLSPAnyOptionalNullopt); // ToLSPAny LSP类型 runner.addTest("Transformer - ToLSPAny LSPObject", testToLSPAnyLSPObject); runner.addTest("Transformer - ToLSPAny LSPArray", testToLSPAnyLSPArray); runner.addTest("Transformer - ToLSPAny LSPAny", testToLSPAnyLSPAny); // FromLSPAny 基本类型 runner.addTest("Transformer - FromLSPAny Boolean", testFromLSPAnyBoolean); runner.addTest("Transformer - FromLSPAny Integer", testFromLSPAnyInteger); runner.addTest("Transformer - FromLSPAny String", testFromLSPAnyString); runner.addTest("Transformer - FromLSPAny Double", testFromLSPAnyDouble); // FromLSPAny 容器类型 runner.addTest("Transformer - FromLSPAny Vector", testFromLSPAnyVector); runner.addTest("Transformer - FromLSPAny Optional (有值)", testFromLSPAnyOptionalValue); runner.addTest("Transformer - FromLSPAny Optional (null)", testFromLSPAnyOptionalNull); runner.addTest("Transformer - FromLSPAny LSPObject", testFromLSPAnyLSPObject); runner.addTest("Transformer - FromLSPAny LSPArray", testFromLSPAnyLSPArray); // 数字类型转换 runner.addTest("Transformer - 提取Integer", testExtractNumberFromInteger); runner.addTest("Transformer - 提取UInteger", testExtractNumberFromUInteger); runner.addTest("Transformer - 提取Decimal", testExtractNumberFromDecimal); runner.addTest("Transformer - 跨类型数字提取", testExtractNumberCrossType); // 错误处理 runner.addTest("Transformer - 类型不匹配错误", testFromLSPAnyTypeMismatch); runner.addTest("Transformer - 无效数字错误", testFromLSPAnyInvalidNumber); runner.addTest("Transformer - 无效数组错误", testFromLSPAnyInvalidArray); // 嵌套结构 runner.addTest("Transformer - 嵌套Vector", testNestedVector); runner.addTest("Transformer - 嵌套LSPObject", testNestedLSPObject); runner.addTest("Transformer - 混合类型嵌套", testMixedTypeNesting); } // ==================== ToLSPAny 基本类型测试 ==================== TestResult TransformerTests::testToLSPAnyBoolean() { TestResult result; result.passed = true; auto any = transform::LSPAnyConverter::ToLSPAny(true); assertTrue(any.Is(), "应该转换为boolean类型"); assertEqual(true, any.Get(), "值应该为true"); auto any_false = transform::LSPAnyConverter::ToLSPAny(false); assertEqual(false, any_false.Get(), "值应该为false"); result.message = "成功"; return result; } TestResult TransformerTests::testToLSPAnyInteger() { TestResult result; result.passed = true; auto any = transform::LSPAnyConverter::ToLSPAny(42); assertTrue(any.Is(), "应该转换为integer类型"); assertEqual(42, any.Get(), "值应该为42"); auto any_negative = transform::LSPAnyConverter::ToLSPAny(-100); assertEqual(-100, any_negative.Get(), "负数应该正确转换"); result.message = "成功"; return result; } TestResult TransformerTests::testToLSPAnyUInteger() { TestResult result; result.passed = true; auto any = transform::LSPAnyConverter::ToLSPAny(42u); assertTrue(any.Is(), "应该转换为uinteger类型"); assertEqual(42u, any.Get(), "值应该为42"); result.message = "成功"; return result; } TestResult TransformerTests::testToLSPAnyFloat() { TestResult result; result.passed = true; auto any = transform::LSPAnyConverter::ToLSPAny(3.14f); assertTrue(any.Is(), "float应该转换为decimal类型"); result.message = "成功"; return result; } TestResult TransformerTests::testToLSPAnyDouble() { TestResult result; result.passed = true; auto any = transform::LSPAnyConverter::ToLSPAny(2.718); assertTrue(any.Is(), "应该转换为decimal类型"); assertEqual(2.718, any.Get(), "值应该为2.718"); result.message = "成功"; return result; } TestResult TransformerTests::testToLSPAnyString() { TestResult result; result.passed = true; std::string str = "hello world"; auto any = transform::LSPAnyConverter::ToLSPAny(str); assertTrue(any.Is(), "应该转换为string类型"); assertEqual(str, any.Get(), "值应该为'hello world'"); result.message = "成功"; return result; } TestResult TransformerTests::testToLSPAnyCString() { TestResult result; result.passed = true; auto any = transform::LSPAnyConverter::ToLSPAny("test"); assertTrue(any.Is(), "C字符串应该转换为string类型"); assertEqual(std::string("test"), any.Get(), "值应该为'test'"); result.message = "成功"; return result; } // ==================== ToLSPAny 容器类型测试 ==================== TestResult TransformerTests::testToLSPAnyVector() { TestResult result; result.passed = true; std::vector vec = { 1, 2, 3, 4, 5 }; auto any = transform::LSPAnyConverter::ToLSPAny(vec); assertTrue(any.Is(), "应该转换为LSPArray类型"); const auto& arr = any.Get(); assertEqual(size_t(5), arr.size(), "数组大小应该为5"); assertTrue(arr[0].Is(), "元素应该是integer类型"); assertEqual(1, arr[0].Get(), "第一个元素应该为1"); assertEqual(5, arr[4].Get(), "最后一个元素应该为5"); result.message = "成功"; return result; } TestResult TransformerTests::testToLSPAnyMap() { TestResult result; result.passed = true; std::map map = { { "a", 1 }, { "b", 2 }, { "c", 3 } }; auto any = transform::LSPAnyConverter::ToLSPAny(map); assertTrue(any.Is(), "应该转换为LSPObject类型"); const auto& obj = any.Get(); assertEqual(size_t(3), obj.size(), "对象大小应该为3"); assertTrue(obj.count("a") > 0, "应该包含键'a'"); assertEqual(1, obj.at("a").Get(), "键'a'的值应该为1"); result.message = "成功"; return result; } TestResult TransformerTests::testToLSPAnyOptionalValue() { TestResult result; result.passed = true; std::optional opt = 100; auto any = transform::LSPAnyConverter::ToLSPAny(opt); assertTrue(any.Is(), "有值的optional应该转换为对应类型"); assertEqual(100, any.Get(), "值应该为100"); result.message = "成功"; return result; } TestResult TransformerTests::testToLSPAnyOptionalNullopt() { TestResult result; result.passed = true; std::optional opt = std::nullopt; auto any = transform::LSPAnyConverter::ToLSPAny(opt); assertTrue(any.Is(), "nullopt应该转换为null"); result.message = "成功"; return result; } // ==================== ToLSPAny LSP类型测试 ==================== TestResult TransformerTests::testToLSPAnyLSPObject() { TestResult result; result.passed = true; protocol::LSPObject obj; obj["key"] = protocol::LSPAny(42); auto any = transform::LSPAnyConverter::ToLSPAny(obj); assertTrue(any.Is(), "应该保持LSPObject类型"); const auto& retrieved = any.Get(); assertEqual(size_t(1), retrieved.size(), "对象应该包含1个元素"); result.message = "成功"; return result; } TestResult TransformerTests::testToLSPAnyLSPArray() { TestResult result; result.passed = true; protocol::LSPArray arr; arr.push_back(protocol::LSPAny(1)); arr.push_back(protocol::LSPAny(2)); auto any = transform::LSPAnyConverter::ToLSPAny(arr); assertTrue(any.Is(), "应该保持LSPArray类型"); const auto& retrieved = any.Get(); assertEqual(size_t(2), retrieved.size(), "数组应该包含2个元素"); result.message = "成功"; return result; } TestResult TransformerTests::testToLSPAnyLSPAny() { TestResult result; result.passed = true; protocol::LSPAny original(42); auto any = transform::LSPAnyConverter::ToLSPAny(original); assertTrue(any.Is(), "应该保持类型"); assertEqual(42, any.Get(), "应该保持值"); result.message = "成功"; return result; } // ==================== FromLSPAny 基本类型测试 ==================== TestResult TransformerTests::testFromLSPAnyBoolean() { TestResult result; result.passed = true; protocol::LSPAny any(true); bool value = transform::LSPAnyConverter::FromLSPAny(any); assertEqual(true, value, "应该提取出true"); protocol::LSPAny any_false(false); bool value_false = transform::LSPAnyConverter::FromLSPAny(any_false); assertEqual(false, value_false, "应该提取出false"); result.message = "成功"; return result; } TestResult TransformerTests::testFromLSPAnyInteger() { TestResult result; result.passed = true; protocol::LSPAny any(42); int value = transform::LSPAnyConverter::FromLSPAny(any); assertEqual(42, value, "应该提取出42"); result.message = "成功"; return result; } TestResult TransformerTests::testFromLSPAnyString() { TestResult result; result.passed = true; protocol::LSPAny any("test string"); std::string value = transform::LSPAnyConverter::FromLSPAny(any); assertEqual(std::string("test string"), value, "应该提取出'test string'"); result.message = "成功"; return result; } TestResult TransformerTests::testFromLSPAnyDouble() { TestResult result; result.passed = true; protocol::LSPAny any(3.14159); double value = transform::LSPAnyConverter::FromLSPAny(any); assertEqual(3.14159, value, "应该提取出3.14159"); result.message = "成功"; return result; } // ==================== FromLSPAny 容器类型测试 ==================== TestResult TransformerTests::testFromLSPAnyVector() { TestResult result; result.passed = true; protocol::LSPArray arr; arr.push_back(protocol::LSPAny(10)); arr.push_back(protocol::LSPAny(20)); arr.push_back(protocol::LSPAny(30)); protocol::LSPAny any(arr); auto vec = transform::LSPAnyConverter::FromLSPAny>(any); assertEqual(size_t(3), vec.size(), "vector大小应该为3"); assertEqual(10, vec[0], "第一个元素应该为10"); assertEqual(20, vec[1], "第二个元素应该为20"); assertEqual(30, vec[2], "第三个元素应该为30"); result.message = "成功"; return result; } TestResult TransformerTests::testFromLSPAnyOptionalValue() { TestResult result; result.passed = true; protocol::LSPAny any(42); auto opt = transform::LSPAnyConverter::FromLSPAny>(any); assertTrue(opt.has_value(), "optional应该有值"); assertEqual(42, opt.value(), "值应该为42"); result.message = "成功"; return result; } TestResult TransformerTests::testFromLSPAnyOptionalNull() { TestResult result; result.passed = true; protocol::LSPAny any(nullptr); auto opt = transform::LSPAnyConverter::FromLSPAny>(any); assertFalse(opt.has_value(), "optional应该为nullopt"); result.message = "成功"; return result; } TestResult TransformerTests::testFromLSPAnyLSPObject() { TestResult result; result.passed = true; protocol::LSPObject obj; obj["key1"] = protocol::LSPAny(100); obj["key2"] = protocol::LSPAny("value"); protocol::LSPAny any(obj); auto retrieved = transform::LSPAnyConverter::FromLSPAny(any); assertEqual(size_t(2), retrieved.size(), "对象应该有2个键"); assertTrue(retrieved.count("key1") > 0, "应该包含key1"); assertTrue(retrieved.count("key2") > 0, "应该包含key2"); result.message = "成功"; return result; } TestResult TransformerTests::testFromLSPAnyLSPArray() { TestResult result; result.passed = true; protocol::LSPArray arr; arr.push_back(protocol::LSPAny(1)); arr.push_back(protocol::LSPAny(2)); protocol::LSPAny any(arr); auto retrieved = transform::LSPAnyConverter::FromLSPAny(any); assertEqual(size_t(2), retrieved.size(), "数组应该有2个元素"); result.message = "成功"; return result; } // ==================== 数字类型转换测试 ==================== TestResult TransformerTests::testExtractNumberFromInteger() { TestResult result; result.passed = true; protocol::LSPAny any(static_cast(42)); int value = transform::LSPAnyConverter::FromLSPAny(any); assertEqual(42, value, "应该从integer提取出42"); result.message = "成功"; return result; } TestResult TransformerTests::testExtractNumberFromUInteger() { TestResult result; result.passed = true; protocol::LSPAny any(static_cast(100)); unsigned int value = transform::LSPAnyConverter::FromLSPAny(any); assertEqual(100u, value, "应该从uinteger提取出100"); result.message = "成功"; return result; } TestResult TransformerTests::testExtractNumberFromDecimal() { TestResult result; result.passed = true; protocol::LSPAny any(static_cast(3.14)); double value = transform::LSPAnyConverter::FromLSPAny(any); assertEqual(3.14, value, "应该从decimal提取出3.14"); result.message = "成功"; return result; } TestResult TransformerTests::testExtractNumberCrossType() { TestResult result; result.passed = true; // integer -> double protocol::LSPAny int_any(42); double double_value = transform::LSPAnyConverter::FromLSPAny(int_any); assertEqual(42.0, double_value, "integer应该能转换为double"); // uinteger -> int protocol::LSPAny uint_any(100u); int int_value = transform::LSPAnyConverter::FromLSPAny(uint_any); assertEqual(100, int_value, "uinteger应该能转换为int"); result.message = "成功"; return result; } // ==================== 错误处理测试 ==================== TestResult TransformerTests::testFromLSPAnyTypeMismatch() { TestResult result; result.passed = true; protocol::LSPAny any(42); try { // 尝试将integer提取为string应该抛出异常 (void)transform::LSPAnyConverter::FromLSPAny(any); result.passed = false; result.message = "应该抛出ConversionError异常"; } catch (const transform::ConversionError& e) { // 预期的异常 result.message = "成功"; } catch (...) { result.passed = false; result.message = "抛出了错误的异常类型"; } return result; } TestResult TransformerTests::testFromLSPAnyInvalidNumber() { TestResult result; result.passed = true; protocol::LSPAny any("not a number"); try { // 尝试将string提取为int应该抛出异常 (void)transform::LSPAnyConverter::FromLSPAny(any); result.passed = false; result.message = "应该抛出ConversionError异常"; } catch (const transform::ConversionError& e) { // 预期的异常 result.message = "成功"; } catch (...) { result.passed = false; result.message = "抛出了错误的异常类型"; } return result; } TestResult TransformerTests::testFromLSPAnyInvalidArray() { TestResult result; result.passed = true; protocol::LSPAny any(42); try { // 尝试将integer提取为vector应该抛出异常 (void)transform::LSPAnyConverter::FromLSPAny>(any); result.passed = false; result.message = "应该抛出ConversionError异常"; } catch (const transform::ConversionError& e) { // 预期的异常 result.message = "成功"; } catch (...) { result.passed = false; result.message = "抛出了错误的异常类型"; } return result; } // ==================== 嵌套结构测试 ==================== TestResult TransformerTests::testNestedVector() { TestResult result; result.passed = true; std::vector> nested = { { 1, 2 }, { 3, 4, 5 } }; auto any = transform::LSPAnyConverter::ToLSPAny(nested); assertTrue(any.Is(), "应该转换为LSPArray"); const auto& arr = any.Get(); assertEqual(size_t(2), arr.size(), "外层数组应该有2个元素"); assertTrue(arr[0].Is(), "第一个元素应该是LSPArray"); auto result_vec = transform::LSPAnyConverter::FromLSPAny>>(any); assertEqual(size_t(2), result_vec.size(), "应该有2个子vector"); assertEqual(size_t(2), result_vec[0].size(), "第一个子vector应该有2个元素"); assertEqual(1, result_vec[0][0], "第一个元素应该为1"); result.message = "成功"; return result; } TestResult TransformerTests::testNestedLSPObject() { TestResult result; result.passed = true; // 直接使用 LSPObject 创建嵌套结构:{"outer": {"inner": 42}} protocol::LSPObject innerObj; innerObj["inner"] = protocol::LSPAny(42); protocol::LSPObject outerObj; outerObj["outer"] = protocol::LSPAny(innerObj); auto any = transform::LSPAnyConverter::ToLSPAny(outerObj); assertTrue(any.Is(), "应该保持为LSPObject"); // 提取为 LSPObject,然后手动检查嵌套值 auto result_obj = transform::LSPAnyConverter::FromLSPAny(any); assertTrue(result_obj.count("outer") > 0, "应该包含'outer'键"); assertTrue(result_obj.at("outer").Is(), "'outer'应该是LSPObject"); const auto& inner_obj = result_obj.at("outer").Get(); assertTrue(inner_obj.count("inner") > 0, "应该包含'inner'键"); assertEqual(42, inner_obj.at("inner").Get(), "嵌套值应该为42"); result.message = "成功"; return result; } TestResult TransformerTests::testMixedTypeNesting() { TestResult result; result.passed = true; // 直接使用 LSPArray 和 LSPObject 创建混合嵌套结构 protocol::LSPArray arr; arr.push_back(protocol::LSPAny(1)); arr.push_back(protocol::LSPAny(nullptr)); // 表示 nullopt arr.push_back(protocol::LSPAny(3)); protocol::LSPObject obj; obj["data"] = protocol::LSPAny(arr); auto any = transform::LSPAnyConverter::ToLSPAny(obj); assertTrue(any.Is(), "应该保持为LSPObject"); const auto& retrieved_obj = any.Get(); const auto& retrieved_arr = retrieved_obj.at("data").Get(); assertEqual(size_t(3), retrieved_arr.size(), "数组应该有3个元素"); assertTrue(retrieved_arr[0].Is(), "第一个元素应该是integer"); assertTrue(retrieved_arr[1].Is(), "第二个元素应该是null"); assertTrue(retrieved_arr[2].Is(), "第三个元素应该是integer"); result.message = "成功"; return result; } } // namespace lsp::test