use langchainrust::{
GeminiChat, GeminiConfig, GeminiError,
BaseChatModel, BaseLanguageModel, LLMResult,
Message,
};
use langchainrust::core::runnables::Runnable;
#[test]
fn test_gemini_config_default() {
let config = GeminiConfig::default();
assert_eq!(config.model, "gemini-1.5-flash");
assert_eq!(config.base_url, "https://generativelanguage.googleapis.com/v1beta");
assert!(config.api_key.is_empty());
assert!(config.temperature.is_none());
assert!(config.max_output_tokens.is_none());
}
#[test]
fn test_gemini_config_new() {
let config = GeminiConfig::new("test-key");
assert_eq!(config.api_key, "test-key");
assert_eq!(config.model, "gemini-1.5-flash");
}
#[test]
fn test_gemini_config_with_model() {
let config = GeminiConfig::new("test-key")
.with_model("gemini-2.0-flash");
assert_eq!(config.model, "gemini-2.0-flash");
}
#[test]
fn test_gemini_config_with_temperature() {
let config = GeminiConfig::new("test-key")
.with_temperature(0.7);
assert_eq!(config.temperature, Some(0.7));
}
#[test]
fn test_gemini_config_with_max_tokens() {
let config = GeminiConfig::new("test-key")
.with_max_output_tokens(4096);
assert_eq!(config.max_output_tokens, Some(4096));
}
#[test]
fn test_gemini_chat_new() {
let config = GeminiConfig::new("test-key");
let chat = GeminiChat::new(config);
assert_eq!(chat.model_name(), "gemini-1.5-flash");
assert!(chat.temperature().is_none());
assert!(chat.max_tokens().is_none());
}
#[test]
fn test_gemini_chat_with_model() {
let chat = GeminiChat::new(
GeminiConfig::new("test-key").with_model("gemini-2.0-flash")
);
assert_eq!(chat.model_name(), "gemini-2.0-flash");
}
#[test]
fn test_gemini_constants() {
use langchainrust::language_models::providers::gemini::{GEMINI_BASE_URL, GEMINI_MODELS};
assert_eq!(GEMINI_BASE_URL, "https://generativelanguage.googleapis.com/v1beta");
assert!(GEMINI_MODELS.contains(&"gemini-1.5-flash"));
assert!(GEMINI_MODELS.contains(&"gemini-2.0-flash"));
assert!(GEMINI_MODELS.contains(&"gemini-1.5-pro"));
}
#[test]
fn test_gemini_config_chaining() {
let config = GeminiConfig::new("test-key")
.with_model("gemini-1.5-pro")
.with_temperature(0.3)
.with_max_output_tokens(2048);
assert_eq!(config.model, "gemini-1.5-pro");
assert_eq!(config.temperature, Some(0.3));
assert_eq!(config.max_output_tokens, Some(2048));
}
#[test]
fn test_gemini_error_display() {
let api_err = GeminiError::ApiError("rate limit".to_string());
assert!(api_err.to_string().contains("rate limit"));
let http_err = GeminiError::HttpError("connection failed".to_string());
assert!(http_err.to_string().contains("connection failed"));
let parse_err = GeminiError::ParseError("invalid json".to_string());
assert!(parse_err.to_string().contains("invalid json"));
let no_resp = GeminiError::NoResponse;
assert!(no_resp.to_string().contains("no response"));
let safety = GeminiError::SafetyBlock("unsafe content".to_string());
assert!(safety.to_string().contains("unsafe content"));
}
#[test]
fn test_gemini_base_language_model() {
let chat = GeminiChat::new(
GeminiConfig::new("test-key")
.with_temperature(0.5)
.with_max_output_tokens(1024)
);
assert_eq!(chat.model_name(), "gemini-1.5-flash");
assert_eq!(chat.temperature(), Some(0.5));
assert_eq!(chat.max_tokens(), Some(1024));
assert_eq!(chat.get_num_tokens("Hello world"), 2); }
#[test]
fn test_gemini_with_temperature() {
let chat = GeminiChat::new(GeminiConfig::new("test-key"))
.with_temperature(0.8);
assert_eq!(chat.temperature(), Some(0.8));
}
#[test]
fn test_gemini_with_max_tokens() {
let chat = GeminiChat::new(GeminiConfig::new("test-key"))
.with_max_tokens(8192);
assert_eq!(chat.max_tokens(), Some(8192));
}
#[test]
fn test_gemini_build_contents_basic() {
let chat = GeminiChat::new(GeminiConfig::new("test-key"));
let messages = vec![
Message::human("Hello"),
];
assert_eq!(messages.len(), 1);
let _ = chat; }
#[test]
fn test_gemini_build_contents_with_system() {
let messages = vec![
Message::system("You are a helpful assistant"),
Message::human("Tell me about Rust"),
];
assert_eq!(messages.len(), 2);
assert_eq!(messages[0].content, "You are a helpful assistant");
}
#[test]
fn test_gemini_build_multi_turn() {
let messages = vec![
Message::human("Hi"),
Message::ai("Hello! How can I help?"),
Message::human("What is Rust?"),
];
assert_eq!(messages.len(), 3);
}
#[test]
fn test_gemini_runnable_trait() {
fn check_trait<T: Runnable<Vec<Message>, LLMResult>>() {}
check_trait::<GeminiChat>();
}
#[test]
fn test_gemini_chat_trait() {
fn check_trait<T: BaseChatModel>() {}
check_trait::<GeminiChat>();
}