eazygit 0.5.1

A fast TUI for Git with staging, conflicts, rebase, and palette-first UX
Documentation
//! Tests for TEA core types.

#[cfg(test)]
mod tests {
    use crate::core::{Effect, Msg};
    use crate::core::effects::ResetMode;
    use std::path::PathBuf;

    #[test]
    fn test_effect_none() {
        let effect = Effect::None;
        assert!(effect.is_none());
    }

    #[test]
    fn test_effect_batch() {
        let effects = vec![
            Effect::RefreshStatus,
            Effect::RefreshBranches,
        ];
        let batch = Effect::batch(effects);
        
        match batch {
            Effect::Batch(v) => assert_eq!(v.len(), 2),
            _ => panic!("Expected Batch"),
        }
    }

    #[test]
    fn test_effect_git_stage() {
        let path = PathBuf::from("/test/file.rs");
        let effect = Effect::GitStage { path: path.clone() };
        
        match effect {
            Effect::GitStage { path: p } => assert_eq!(p, path),
            _ => panic!("Expected GitStage"),
        }
    }

    #[test]
    fn test_effect_git_commit() {
        let effect = Effect::GitCommit {
            message: "test".to_string(),
            amend: false,
            author_name: Some("Test".to_string()),
            author_email: Some("test@example.com".to_string()),
        };
        
        match effect {
            Effect::GitCommit { message, amend, .. } => {
                assert_eq!(message, "test");
                assert!(!amend);
            }
            _ => panic!("Expected GitCommit"),
        }
    }

    #[test]
    fn test_effect_git_reset_modes() {
        assert_eq!(format!("{:?}", ResetMode::Soft), "Soft");
        assert_eq!(format!("{:?}", ResetMode::Mixed), "Mixed");
        assert_eq!(format!("{:?}", ResetMode::Hard), "Hard");
    }

    #[test]
    fn test_msg_tick() {
        let msg = Msg::Tick;
        assert!(matches!(msg, Msg::Tick));
    }

    #[test]
    fn test_msg_request_stage() {
        let msg = Msg::RequestStage { path: "/test".to_string() };
        match msg {
            Msg::RequestStage { path } => assert_eq!(path, "/test"),
            _ => panic!("Expected RequestStage"),
        }
    }

    #[test]
    fn test_msg_stage_lifecycle() {
        // Test the Request -> Success/Failed lifecycle pattern
        let request = Msg::RequestStage { path: "file.rs".to_string() };
        let success = Msg::StageSuccess { path: "file.rs".to_string() };
        let failed = Msg::StageFailed { 
            path: "file.rs".to_string(), 
            error: "Permission denied".to_string() 
        };
        
        assert!(matches!(request, Msg::RequestStage { .. }));
        assert!(matches!(success, Msg::StageSuccess { .. }));
        assert!(matches!(failed, Msg::StageFailed { .. }));
    }

    #[test]
    fn test_msg_rebase_outcome() {
        use crate::core::msg::RebaseOutcome;
        
        let completed = RebaseOutcome::Completed;
        let paused_edit = RebaseOutcome::PausedForEdit;
        let paused_reword = RebaseOutcome::PausedForReword {
            commit_hash: "abc123".to_string(),
            current_message: "test".to_string(),
        };
        let conflicts = RebaseOutcome::Conflicts {
            files: vec!["a.rs".to_string(), "b.rs".to_string()],
        };
        
        assert!(matches!(completed, RebaseOutcome::Completed));
        assert!(matches!(paused_edit, RebaseOutcome::PausedForEdit));
        assert!(matches!(paused_reword, RebaseOutcome::PausedForReword { .. }));
        assert!(matches!(conflicts, RebaseOutcome::Conflicts { .. }));
    }
}