use rez_next_version::parser::StateMachineParser;
use std::time::Instant;
fn main() {
println!("ð Rez-Core Version Parser Performance Test");
println!("============================================");
let parser = StateMachineParser::new();
let test_versions = vec![
"1.2.3",
"1.2.3-alpha.1",
"2.0.0-beta.2",
"1.0.0-rc.1",
"3.1.4-dev.123",
"10.20.30",
"1.2.3-alpha1.beta2.gamma3",
"0.1.0",
"1.0.0-alpha",
"2.1.0-beta.1",
];
println!("\nð Testing State Machine Parser Performance");
println!("-------------------------------------------");
for _ in 0..1000 {
for version_str in &test_versions {
let _ = parser.parse_tokens(version_str);
}
}
let iterations = 10000;
let start = Instant::now();
for _ in 0..iterations {
for version_str in &test_versions {
match parser.parse_tokens(version_str) {
Ok((tokens, _separators)) => {
if tokens.is_empty() && !version_str.is_empty() {
eprintln!("â Failed to parse: {}", version_str);
}
}
Err(e) => {
eprintln!("â Error parsing '{}': {}", version_str, e);
}
}
}
}
let duration = start.elapsed();
let total_parses = iterations * test_versions.len();
let parses_per_second = total_parses as f64 / duration.as_secs_f64();
println!("â
Completed {} parses in {:?}", total_parses, duration);
println!("ðŊ Performance: {:.0} parses/second", parses_per_second);
println!(
"ð Average time per parse: {:.2} Ξs",
duration.as_micros() as f64 / total_parses as f64
);
println!("\nð Individual Version Analysis");
println!("------------------------------");
for version_str in &test_versions {
let start = Instant::now();
match parser.parse_tokens(version_str) {
Ok((tokens, separators)) => {
let duration = start.elapsed();
println!(
"â
'{}' -> {} tokens, {} separators ({:.2} Ξs)",
version_str,
tokens.len(),
separators.len(),
duration.as_micros()
);
for (i, token) in tokens.iter().enumerate() {
println!(" Token {}: {:?}", i, token);
}
}
Err(e) => {
println!("â '{}' -> Error: {}", version_str, e);
}
}
}
println!("\nðĻ Error Handling Test");
println!("----------------------");
let error_cases = vec![
".1.2.3", "1.2.3.", "1.2.3@", "_invalid", "invalid_", "", "1..2", "not", "version", ];
for error_case in &error_cases {
match parser.parse_tokens(error_case) {
Ok((tokens, separators)) => {
if error_case.is_empty() {
println!(
"â
'{}' -> {} tokens, {} separators (empty is OK)",
error_case,
tokens.len(),
separators.len()
);
} else {
println!(
"â ïļ '{}' -> {} tokens, {} separators (expected error)",
error_case,
tokens.len(),
separators.len()
);
}
}
Err(e) => {
println!("â
'{}' -> Error: {} (expected)", error_case, e);
}
}
}
println!("\nð Performance test completed!");
if parses_per_second > 5000.0 {
println!("ðŊ SUCCESS: Achieved target of >5000 parses/second!");
} else {
println!(
"â ïļ Target not met: {} < 5000 parses/second",
parses_per_second as u64
);
}
}