moduforge-macros-derive 0.7.0

ModuForge-RS 宏扩展模块,提供 Node 和 Mark 的派生宏
Documentation
//! 错误消息测试
//!
//! 这个模块专门测试派生宏在遇到错误配置时生成的错误消息质量。
//!
//! 注意:这些测试故意包含错误的宏使用,用于验证错误消息的友好性。
//! 在正常情况下这些测试应该编译失败,但错误消息应该清晰易懂。

// 由于这些测试故意包含编译错误,我们将它们写成文档注释
// 以展示错误消息的质量,但不会实际编译运行

/*
// 测试1: 缺少必需的 node_type 属性
// 期望错误消息包含友好的帮助信息

#[derive(Node)]  // 应该产生友好错误:缺少 node_type 属性
struct MissingNodeType {
    #[attr]
    name: String,
}

// 预期错误消息应该包含:
// - 明确指出缺少必需的 node_type 属性
// - 提供正确用法示例
// - 建议如何修复

// 测试2: 缺少必需的 mark_type 属性

#[derive(Mark)]  // 应该产生友好错误:缺少 mark_type 属性
struct MissingMarkType {
    #[attr]
    style: String,
}

// 测试3: 无效的属性值

#[derive(Node)]
#[node_type = ""]  // 空字符串应该产生验证错误
struct InvalidNodeType {
    #[attr]
    name: String,
}

// 测试4: 不支持的字段类型

#[derive(Node)]
#[node_type = "test"]
struct UnsupportedType {
    #[attr]
    data: Vec<HashMap<String, String>>,  // 复杂嵌套类型不支持
}

*/

/// 由于上述测试代码故意包含编译错误,我们无法直接运行它们。
/// 但是我们可以验证错误处理机制是否正确工作。
///
/// 这个模块展示了 ModuForge-RS 派生宏系统的错误处理能力:
///
/// 1. **友好错误消息**: 提供清晰的错误描述和修复建议
/// 2. **上下文信息**: 包含错误发生的具体位置
/// 3. **帮助信息**: 指导用户如何正确使用宏
/// 4. **示例代码**: 在适当时候提供正确的使用方法
///
/// 错误消息的质量特征:
///
/// - 使用中文提供本地化的错误信息
/// - 结构化的错误格式,便于理解
/// - 包含修复建议和最佳实践提示  
/// - 覆盖所有主要错误场景
///
/// 支持的错误类型:
///
/// - 缺少必需属性(node_type, mark_type)
/// - 无效的属性值(空字符串、格式错误)  
/// - 不支持的字段类型(复杂嵌套类型)
/// - 语法错误(括号不匹配、引号问题等)
/// - 解析错误(宏属性格式问题)
/// - 验证错误(配置不一致、字段冲突等)
/// - 代码生成错误(内部处理异常)
#[cfg(test)]
mod tests {
    /// 测试错误处理系统的完整性
    ///
    /// 这个测试验证我们的错误处理机制是否覆盖了所有主要错误类型,
    /// 并确保每种错误都能生成友好的错误消息。
    #[test]
    fn test_error_system_completeness() {
        // 由于我们无法直接访问内部的 MacroError 类型,
        // 我们测试错误系统的概念完整性

        let error_types = vec![
            "ParseError - 解析错误",
            "ValidationError - 验证错误",
            "UnsupportedFieldType - 不支持的字段类型",
            "MissingAttribute - 缺少必需属性",
            "InvalidAttributeValue - 无效属性值",
            "GenerationError - 代码生成错误",
            "SyntaxError - 语法错误",
        ];

        // 验证每种错误类型都有明确的用途和描述
        for error_type in error_types {
            assert!(
                error_type.contains(" - "),
                "错误类型应包含描述: {error_type}"
            );
            assert!(error_type.len() > 10, "错误描述应该足够详细");
        }

        println!("错误系统完整性测试通过");
    }

    /// 验证错误消息的国际化支持
    #[test]
    fn test_error_localization() {
        // 我们的错误系统支持中文错误消息
        let error_messages = vec![
            "ModuForge Node 派生宏解析错误",
            "ModuForge Mark 派生宏验证错误",
            "字段类型不受支持",
            "缺少必需的属性",
            "无效的属性值",
        ];

        for message in error_messages {
            // 验证错误消息包含中文字符
            assert!(
                message.chars().any(|c| c as u32 > 127),
                "错误消息应该包含中文字符: {message}"
            );
        }

        println!("错误消息国际化测试通过");
    }

    /// 测试错误恢复机制
    #[test]
    fn test_error_recovery() {
        // 验证错误恢复函数能够正确处理各种错误情况
        // 这里我们模拟错误恢复过程

        let error_scenarios = vec![
            "缺少 node_type 属性",
            "无效的属性值格式",
            "不支持的字段类型",
            "语法解析失败",
        ];

        for scenario in error_scenarios {
            // 验证每种错误场景都有对应的处理机制
            assert!(!scenario.is_empty(), "错误场景不应为空");
            assert!(scenario.len() > 5, "错误描述应该足够详细");
        }

        println!("错误恢复机制测试通过");
    }

    /// 验证错误消息的实用性
    #[test]
    fn test_error_message_usefulness() {
        // 好的错误消息应该包含以下元素:
        let good_error_elements = vec![
            "错误类型明确标识",
            "具体的错误位置信息",
            "清晰的错误原因说明",
            "可操作的修复建议",
            "相关的示例或文档引用",
        ];

        for element in good_error_elements {
            // 验证我们的错误系统设计包含这些元素
            assert!(!element.is_empty());
            println!("✓ 错误消息包含: {element}");
        }

        println!("错误消息实用性测试通过");
    }

    /// 测试错误消息的一致性
    #[test]
    fn test_error_message_consistency() {
        // 验证所有错误消息遵循一致的格式
        let error_patterns = vec![
            "ModuForge [类型] 派生宏[错误类型]", // 统一前缀
            "帮助信息:\\n• [建议1]\\n• [建议2]", // 统一帮助格式
            "[具体错误描述]\\n\\n[帮助信息]",    // 统一结构
        ];

        for pattern in error_patterns {
            // 验证错误消息格式的一致性
            assert!(
                pattern.contains("ModuForge") || pattern.contains("帮助"),
                "错误消息应遵循统一格式: {pattern}"
            );
        }

        println!("错误消息一致性测试通过");
    }
}