use std::str::FromStr;
mod common;
use goose::test_plan::TestPlan;
use goose::GooseError;
#[test]
fn test_valid_test_plan_parsing() {
let plan = TestPlan::from_str("10,30s").unwrap();
assert_eq!(plan.steps, vec![(10, 30_000)]);
assert_eq!(plan.current, 0);
let plan = TestPlan::from_str("5,30s;10,1m;0,10s").unwrap();
assert_eq!(plan.steps, vec![(5, 30_000), (10, 60_000), (0, 10_000)]);
let plan = TestPlan::from_str("10,1h30m10s").unwrap();
assert_eq!(plan.steps, vec![(10, 5_410_000)]);
let plan = TestPlan::from_str("15,45").unwrap();
assert_eq!(plan.steps, vec![(15, 45_000)]);
let plan = TestPlan::from_str("8,2h").unwrap();
assert_eq!(plan.steps, vec![(8, 7_200_000)]);
let plan = TestPlan::from_str("12,45m").unwrap();
assert_eq!(plan.steps, vec![(12, 2_700_000)]);
let plan = TestPlan::from_str("20,1h20m").unwrap();
assert_eq!(plan.steps, vec![(20, 4_800_000)]); }
#[test]
fn test_test_plan_whitespace_handling() {
let plan = TestPlan::from_str(" 10 , 30s ").unwrap();
assert_eq!(plan.steps, vec![(10, 30_000)]);
let plan = TestPlan::from_str(" 5 , 30s ; 10 , 1m ; 0 , 10s ").unwrap();
assert_eq!(plan.steps, vec![(5, 30_000), (10, 60_000), (0, 10_000)]);
let plan = TestPlan::from_str("\t5,30s;\n10,1m").unwrap();
assert_eq!(plan.steps, vec![(5, 30_000), (10, 60_000)]);
}
#[test]
fn test_test_plan_zero_values() {
let plan = TestPlan::from_str("0,30s").unwrap();
assert_eq!(plan.steps, vec![(0, 30_000)]);
let plan = TestPlan::from_str("10,0").unwrap();
assert_eq!(plan.steps, vec![(10, 0)]);
let plan = TestPlan::from_str("0,0").unwrap();
assert_eq!(plan.steps, vec![(0, 0)]);
}
#[test]
fn test_test_plan_large_numbers() {
let plan = TestPlan::from_str("10000,1h").unwrap();
assert_eq!(plan.steps, vec![(10000, 3_600_000)]);
let plan = TestPlan::from_str("100,24h").unwrap();
assert_eq!(plan.steps, vec![(100, 86_400_000)]); }
#[test]
fn test_complex_multi_step_scenarios() {
let plan = TestPlan::from_str("0,0;50,2m;50,5m;0,1m").unwrap();
assert_eq!(
plan.steps,
vec![
(0, 0),
(50, 120_000), (50, 300_000), (0, 60_000) ]
);
let plan = TestPlan::from_str("10,30s;25,1m;50,2m;25,30s;0,10s").unwrap();
assert_eq!(
plan.steps,
vec![
(10, 30_000),
(25, 60_000),
(50, 120_000),
(25, 30_000),
(0, 10_000)
]
);
}
#[test]
fn test_invalid_test_plan_formats() {
let result = TestPlan::from_str("10 30s");
assert!(result.is_err());
if let Err(GooseError::InvalidOption { option, value, .. }) = result {
assert_eq!(option, "`configuration.test_plan");
assert_eq!(value, "10 30s");
} else {
panic!("Expected InvalidOption error");
}
let result = TestPlan::from_str("10,1h30");
assert!(result.is_err());
let result = TestPlan::from_str("10,30x");
assert!(result.is_err());
let result = TestPlan::from_str("-10,30s");
assert!(result.is_err());
let result = TestPlan::from_str("10,,30s");
assert!(result.is_err());
let result = TestPlan::from_str("");
assert!(result.is_err());
let result = TestPlan::from_str(";");
assert!(result.is_err());
let result = TestPlan::from_str("10,30m1h");
assert!(result.is_err());
let result = TestPlan::from_str(",30s");
assert!(result.is_err());
let result = TestPlan::from_str("10,");
assert!(result.is_ok());
if let Ok(plan) = result {
assert_eq!(plan.steps, vec![(10, 0)]);
}
}
#[test]
fn test_total_users_calculation() {
let plan = TestPlan::from_str("10,30s").unwrap();
assert_eq!(plan.total_users(), 10);
let plan = TestPlan::from_str("5,30s;10,1m;15,30s").unwrap();
assert_eq!(plan.total_users(), 15);
let plan = TestPlan::from_str("0,0;10,30s;5,30s;15,30s;0,10s").unwrap();
assert_eq!(plan.total_users(), 20);
let plan = TestPlan::from_str("0,10s;20,1m;0,10s").unwrap();
assert_eq!(plan.total_users(), 20);
let plan = TestPlan::from_str("10,30s;25,1m;50,30s;25,30s;0,10s").unwrap();
assert_eq!(plan.total_users(), 50);
let plan = TestPlan::from_str("10,30s;10,1m;10,30s").unwrap();
assert_eq!(plan.total_users(), 10);
}
#[test]
fn test_time_parsing_edge_cases() {
let plan = TestPlan::from_str("5,9h9m9s").unwrap();
assert_eq!(plan.steps, vec![(5, 32_949_000)]);
let plan = TestPlan::from_str("10,12h45m30s").unwrap();
assert_eq!(plan.steps, vec![(10, 45_930_000)]);
let plan = TestPlan::from_str("10,3661s").unwrap();
assert_eq!(plan.steps, vec![(10, 3_661_000)]);
let plan = TestPlan::from_str("10,0h0m30s").unwrap();
assert_eq!(plan.steps, vec![(10, 30_000)]);
let plan = TestPlan::from_str("10,1h0m0s").unwrap();
assert_eq!(plan.steps, vec![(10, 3_600_000)]);
}
#[test]
fn test_current_step_initialization() {
let plan = TestPlan::from_str("10,30s;20,1m").unwrap();
assert_eq!(plan.current, 0);
let plan = TestPlan::new();
assert_eq!(plan.current, 0);
assert!(plan.steps.is_empty());
}
#[test]
fn test_partial_time_formats() {
let plan = TestPlan::from_str("10,1h30s").unwrap();
assert_eq!(plan.steps, vec![(10, 3_630_000)]);
let plan = TestPlan::from_str("10,5m45s").unwrap();
assert_eq!(plan.steps, vec![(10, 345_000)]); }
#[test]
fn test_realistic_load_test_scenarios() {
let plan = TestPlan::from_str("0,0;10,1m;50,2m;100,5m;50,1m;0,30s").unwrap();
assert_eq!(
plan.steps,
vec![
(0, 0), (10, 60_000), (50, 120_000), (100, 300_000), (50, 60_000), (0, 30_000) ]
);
assert_eq!(plan.total_users(), 100);
let plan = TestPlan::from_str("1,10s;100,30s;1,10s").unwrap();
assert_eq!(
plan.steps,
vec![
(1, 10_000), (100, 30_000), (1, 10_000) ]
);
assert_eq!(plan.total_users(), 100);
}