use mixtape_core::{
ClaudeSonnet4_5, ContentBlock, DocumentFormat, ImageFormat, Message, Model, ToolResult,
ToolResultBlock, ToolResultStatus, ToolUseBlock,
};
#[test]
fn test_estimate_token_count_basic() {
let model = ClaudeSonnet4_5;
assert_eq!(model.estimate_token_count(""), 0);
assert_eq!(model.estimate_token_count("test"), 1);
assert_eq!(model.estimate_token_count("testtest"), 2);
let long_text = "x".repeat(100);
assert_eq!(model.estimate_token_count(&long_text), 25);
}
#[test]
fn test_estimate_message_tokens_user_text() {
let model = ClaudeSonnet4_5;
let messages = vec![Message::user("Hello, world!")];
let estimate = model.estimate_message_tokens(&messages);
assert!(estimate > 0);
assert_eq!(estimate, 8);
}
#[test]
fn test_estimate_message_tokens_multiple_messages() {
let model = ClaudeSonnet4_5;
let messages = vec![
Message::user("Hello"), Message::assistant("Hi"), Message::user("How are you"), ];
let estimate = model.estimate_message_tokens(&messages);
assert_eq!(estimate, 18);
}
#[test]
fn test_estimate_content_block_tokens_text() {
let model = ClaudeSonnet4_5;
let block = ContentBlock::Text("This is a test message".to_string());
let estimate = model.estimate_content_block_tokens(&block);
assert_eq!(estimate, 6);
}
#[test]
fn test_estimate_content_block_tokens_tool_use() {
let model = ClaudeSonnet4_5;
let tool_use = ToolUseBlock {
id: "tool_123".to_string(),
name: "read_file".to_string(),
input: serde_json::json!({"path": "/tmp/test.txt"}),
};
let block = ContentBlock::ToolUse(tool_use);
let estimate = model.estimate_content_block_tokens(&block);
assert!(estimate > 10, "Tool use should have reasonable token count");
assert!(estimate < 50, "Tool use shouldn't be excessive");
}
#[test]
fn test_estimate_content_block_tokens_tool_result_text() {
let model = ClaudeSonnet4_5;
let result = ToolResultBlock {
tool_use_id: "tool_123".to_string(),
content: ToolResult::Text("File contents here".to_string()),
status: ToolResultStatus::Success,
};
let block = ContentBlock::ToolResult(result);
let estimate = model.estimate_content_block_tokens(&block);
assert!(estimate > 5);
assert!(estimate < 30);
}
#[test]
fn test_estimate_content_block_tokens_tool_result_json() {
let model = ClaudeSonnet4_5;
let result = ToolResultBlock {
tool_use_id: "id".to_string(),
content: ToolResult::Json(serde_json::json!({
"files": ["a.txt", "b.txt", "c.txt"],
"count": 3
})),
status: ToolResultStatus::Success,
};
let block = ContentBlock::ToolResult(result);
let estimate = model.estimate_content_block_tokens(&block);
assert!(
estimate > 10,
"JSON result should have meaningful token count"
);
}
#[test]
fn test_estimate_content_block_tokens_tool_result_image() {
let model = ClaudeSonnet4_5;
let image_data = vec![0u8; 7500];
let result = ToolResultBlock {
tool_use_id: "img_1".to_string(),
content: ToolResult::Image {
format: ImageFormat::Png,
data: image_data,
},
status: ToolResultStatus::Success,
};
let block = ContentBlock::ToolResult(result);
let estimate = model.estimate_content_block_tokens(&block);
assert!(
estimate > 90,
"Image should have significant token overhead"
);
assert!(estimate < 150);
}
#[test]
fn test_estimate_content_block_tokens_tool_result_document() {
let model = ClaudeSonnet4_5;
let doc_data = vec![0u8; 5000];
let result = ToolResultBlock {
tool_use_id: "doc_1".to_string(),
content: ToolResult::Document {
format: DocumentFormat::Pdf,
data: doc_data,
name: Some("report.pdf".to_string()),
},
status: ToolResultStatus::Success,
};
let block = ContentBlock::ToolResult(result);
let estimate = model.estimate_content_block_tokens(&block);
assert!(
estimate > 50,
"Document should have significant token overhead"
);
assert!(estimate < 100);
}
#[test]
fn test_estimate_message_tokens_with_tool_content() {
let model = ClaudeSonnet4_5;
let tool_use = ToolUseBlock {
id: "t1".to_string(),
name: "test".to_string(),
input: serde_json::json!({}),
};
let message = Message {
role: mixtape_core::Role::Assistant,
content: vec![
ContentBlock::Text("Let me help you.".to_string()),
ContentBlock::ToolUse(tool_use),
],
};
let estimate = model.estimate_message_tokens(&[message]);
assert!(estimate > 10);
}
#[test]
fn test_estimate_empty_messages() {
let model = ClaudeSonnet4_5;
let messages: Vec<Message> = vec![];
let estimate = model.estimate_message_tokens(&messages);
assert_eq!(estimate, 0);
}