Spaces:
Sleeping
Sleeping
File size: 2,234 Bytes
9bd4ce5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #[cfg(test)]
mod tests {
use crate::core::logic::card_db::CardDatabase;
use crate::core::logic::card_db::MemberCard;
use crate::core::logic::filter::CardFilter;
use crate::core::logic::models::AbilityContext;
use crate::core::logic::GameState;
use std::time::Instant;
#[test]
fn test_filter_performance_baseline() {
let mut db = CardDatabase::default();
// Create 100 member cards with names
for i in 1..=100 {
let mut m = MemberCard::default();
m.card_id = i;
m.name = format!("Member {}", i);
if i % 10 == 0 {
m.name = "優木せつ菜".to_string();
} else if i % 5 == 0 {
m.name = "澁谷かのん".to_string();
}
m.normalized_name = m.name.replace(" ", "");
db.enrich_member(&mut m);
db.members.insert(i, m.clone());
let lid = CardDatabase::to_logic_id(i);
db.members_vec[lid] = Some(m);
}
let state = GameState::default();
let ctx = AbilityContext::default();
// Create a filter for "せつ菜" (Character ID 27)
let filter = CardFilter::from_attr(map_char_id_to_filter_attr(27));
println!("Starting benchmark with character filter...");
let start = Instant::now();
let iterations = 100_000;
let mut match_count = 0;
for _ in 0..iterations {
for cid in 1..=100 {
if filter.matches(&state, &db, cid, None, false, None, &ctx) {
match_count += 1;
}
}
}
let duration = start.elapsed();
println!("Completed {} iterations ({} total checks) in {:?}", iterations, iterations * 100, duration);
println!("Average time per match check: {:?}", duration / (iterations as u32 * 100));
assert!(match_count > 0);
}
fn map_char_id_to_filter_attr(char_id: u8) -> i64 {
// Simple mock of from_attr logic for character ID 1
let mut a: u64 = 0;
// Bits 39-45: Character ID #1 (7 bits)
a |= (char_id as u64 & 0x7F) << 39;
a as i64
}
}
|