use gemini_cost::{default_pricing, Pricing, Usage};
#[test]
fn computes_basic_cost_short_prompt() {
let pricing = default_pricing("gemini-2.5-pro").unwrap();
let usage = Usage {
input_tokens: 100_000,
output_tokens: 50_000,
cached_input_tokens: 0,
};
let cost = pricing.cost_for(&usage);
assert!((cost - 0.625).abs() < 1e-6, "got {cost}");
}
#[test]
fn long_prompt_tier_kicks_in_above_200k() {
let pricing = default_pricing("gemini-2.5-pro").unwrap();
let usage = Usage {
input_tokens: 300_000,
output_tokens: 0,
cached_input_tokens: 0,
};
let cost = pricing.cost_for(&usage);
assert!((cost - 0.75).abs() < 1e-6, "got {cost}");
}
#[test]
fn short_prompt_tier_is_cheaper_per_token() {
let pricing = default_pricing("gemini-2.5-pro").unwrap();
let short = pricing.cost_for(&Usage {
input_tokens: 200_000,
output_tokens: 0,
cached_input_tokens: 0,
});
let long = pricing.cost_for(&Usage {
input_tokens: 200_001,
output_tokens: 0,
cached_input_tokens: 0,
});
assert!(long > short * 1.9, "short {short} long {long}");
}
#[test]
fn flash_has_no_long_uplift() {
let pricing = default_pricing("gemini-2.5-flash").unwrap();
let short = pricing.cost_for(&Usage {
input_tokens: 100_000,
output_tokens: 0,
cached_input_tokens: 0,
});
let long = pricing.cost_for(&Usage {
input_tokens: 300_000,
output_tokens: 0,
cached_input_tokens: 0,
});
assert!((long - short * 3.0).abs() < 1e-6);
}
#[test]
fn vertex_resource_path_resolves() {
let id = "projects/p/locations/us-central1/publishers/google/models/gemini-2.5-pro";
assert_eq!(default_pricing(id), default_pricing("gemini-2.5-pro"));
}
#[test]
fn dated_preview_resolves() {
assert_eq!(
default_pricing("gemini-2.5-pro-preview-05-06"),
default_pricing("gemini-2.5-pro")
);
}
#[test]
fn gemini_usage_constructor_subtracts_cached() {
let u = Usage::from_gemini(1000, 500, 300);
assert_eq!(u.input_tokens, 700);
assert_eq!(u.output_tokens, 500);
assert_eq!(u.cached_input_tokens, 300);
assert_eq!(u.total_tokens(), 1500);
}
#[test]
fn flat_pricing_helper() {
let p = Pricing::flat(1.0, 4.0, 0.25);
assert_eq!(p.input_per_mtok, p.input_long_per_mtok);
assert_eq!(p.output_per_mtok, p.output_long_per_mtok);
}
#[test]
fn unknown_model_is_none() {
assert!(default_pricing("gemini-9000").is_none());
}