use mermaid_cli::agents::AgentAction;
use mermaid_cli::tui::{AppState, GenerationStatus};
#[test]
fn test_app_state_is_generating_method() {
let state = AppState::Idle;
assert!(!state.is_generating());
assert!(state.is_idle());
let generating_state = AppState::Generating {
status: GenerationStatus::Thinking,
start_time: std::time::Instant::now(),
tokens_received: 0,
abort_handle: None,
response_buffer: String::new(),
};
assert!(generating_state.is_generating());
assert!(!generating_state.is_idle());
}
#[test]
fn test_app_state_generation_status_method() {
let idle_state = AppState::Idle;
assert_eq!(idle_state.generation_status(), None);
let generating_state = AppState::Generating {
status: GenerationStatus::Streaming,
start_time: std::time::Instant::now(),
tokens_received: 42,
abort_handle: None,
response_buffer: String::new(),
};
assert_eq!(
generating_state.generation_status(),
Some(GenerationStatus::Streaming)
);
}
#[test]
fn test_generation_status_display_text() {
assert_eq!(GenerationStatus::Idle.display_text(), "Idle");
assert_eq!(GenerationStatus::Sending.display_text(), "Sending");
assert_eq!(GenerationStatus::Thinking.display_text(), "Thinking");
assert_eq!(GenerationStatus::Streaming.display_text(), "Streaming");
}
#[test]
fn test_app_state_variants_are_distinct() {
let idle = AppState::Idle;
let generating = AppState::Generating {
status: GenerationStatus::Thinking,
start_time: std::time::Instant::now(),
tokens_received: 0,
abort_handle: None,
response_buffer: String::new(),
};
assert!(matches!(idle, AppState::Idle));
assert!(matches!(generating, AppState::Generating { .. }));
assert!(!matches!(idle, AppState::Generating { .. }));
assert!(!matches!(generating, AppState::Idle));
}
#[test]
fn test_state_transition_idle_to_generating() {
let mut state = AppState::Idle;
assert!(state.is_idle());
state = AppState::Generating {
status: GenerationStatus::Thinking,
start_time: std::time::Instant::now(),
tokens_received: 0,
abort_handle: None,
response_buffer: String::new(),
};
assert!(!state.is_idle());
assert!(state.is_generating());
assert_eq!(state.generation_status(), Some(GenerationStatus::Thinking));
}
#[test]
fn test_state_transition_generating_to_idle() {
let mut state = AppState::Generating {
status: GenerationStatus::Streaming,
start_time: std::time::Instant::now(),
tokens_received: 100,
abort_handle: None,
response_buffer: String::new(),
};
assert!(state.is_generating());
state = AppState::Idle;
assert!(!state.is_generating());
assert!(state.is_idle());
assert_eq!(state.generation_status(), None);
}
#[test]
fn test_generation_status_can_be_updated() {
let mut state = AppState::Generating {
status: GenerationStatus::Sending,
start_time: std::time::Instant::now(),
tokens_received: 0,
abort_handle: None,
response_buffer: String::new(),
};
assert_eq!(state.generation_status(), Some(GenerationStatus::Sending));
if let AppState::Generating { status, .. } = &mut state {
*status = GenerationStatus::Streaming;
}
assert_eq!(state.generation_status(), Some(GenerationStatus::Streaming));
}
#[test]
fn test_tokens_received_can_be_incremented() {
let mut state = AppState::Generating {
status: GenerationStatus::Streaming,
start_time: std::time::Instant::now(),
tokens_received: 0,
abort_handle: None,
response_buffer: String::new(),
};
if let AppState::Generating {
tokens_received, ..
} = &mut state
{
*tokens_received += 10;
}
if let AppState::Generating {
tokens_received, ..
} = state
{
assert_eq!(tokens_received, 10);
}
}
#[test]
fn test_message_roles_exist() {
use mermaid_cli::models::MessageRole;
let user = MessageRole::User;
let assistant = MessageRole::Assistant;
let system = MessageRole::System;
assert!(matches!(user, MessageRole::User));
assert!(matches!(assistant, MessageRole::Assistant));
assert!(matches!(system, MessageRole::System));
}
#[test]
fn test_agent_actions_can_be_created() {
let read_file = AgentAction::ReadFile {
paths: vec!["test.rs".to_string()],
};
let write_file = AgentAction::WriteFile {
path: "output.txt".to_string(),
content: "Hello, world!".to_string(),
};
let execute_command = AgentAction::ExecuteCommand {
command: "ls -la".to_string(),
working_dir: None,
timeout: None,
};
assert!(matches!(read_file, AgentAction::ReadFile { .. }));
assert!(matches!(write_file, AgentAction::WriteFile { .. }));
assert!(matches!(
execute_command,
AgentAction::ExecuteCommand { .. }
));
}
#[test]
fn test_agent_actions_can_be_cloned() {
let action = AgentAction::ReadFile {
paths: vec!["test.rs".to_string()],
};
let cloned = action.clone();
if let (AgentAction::ReadFile { paths: p1 }, AgentAction::ReadFile { paths: p2 }) =
(&action, &cloned)
{
assert_eq!(p1, p2);
}
}
#[test]
fn test_characterization_app_state_must_match_flags() {
let idle = AppState::Idle;
let generating = AppState::Generating {
status: GenerationStatus::Thinking,
start_time: std::time::Instant::now(),
tokens_received: 0,
abort_handle: None,
response_buffer: String::new(),
};
assert_eq!(idle.is_generating(), false);
assert_eq!(generating.is_generating(), true);
}