use browsing::actor::get_key_info;
use browsing::actor::mouse::MouseButton;
#[test]
fn test_key_info_navigation_keys() {
let test_cases = vec![
("Backspace", "Backspace", Some(8)),
("Tab", "Tab", Some(9)),
("Enter", "Enter", Some(13)),
("Escape", "Escape", Some(27)),
("Space", "Space", Some(32)),
(" ", "Space", Some(32)),
("PageUp", "PageUp", Some(33)),
("PageDown", "PageDown", Some(34)),
("End", "End", Some(35)),
("Home", "Home", Some(36)),
("ArrowLeft", "ArrowLeft", Some(37)),
("ArrowUp", "ArrowUp", Some(38)),
("ArrowRight", "ArrowRight", Some(39)),
("ArrowDown", "ArrowDown", Some(40)),
("Insert", "Insert", Some(45)),
("Delete", "Delete", Some(46)),
];
for (key, expected_code, expected_vk) in test_cases {
let (code, vk) = get_key_info(key);
assert_eq!(code, expected_code, "Key code mismatch for {key}");
assert_eq!(vk, expected_vk, "Virtual key code mismatch for {key}");
}
}
#[test]
fn test_key_info_modifier_keys() {
let test_cases = vec![
("Shift", "ShiftLeft", Some(16)),
("ShiftLeft", "ShiftLeft", Some(16)),
("ShiftRight", "ShiftRight", Some(16)),
("Control", "ControlLeft", Some(17)),
("ControlLeft", "ControlLeft", Some(17)),
("ControlRight", "ControlRight", Some(17)),
("Alt", "AltLeft", Some(18)),
("AltLeft", "AltLeft", Some(18)),
("AltRight", "AltRight", Some(18)),
("Meta", "MetaLeft", Some(91)),
("MetaLeft", "MetaLeft", Some(91)),
("MetaRight", "MetaRight", Some(92)),
];
for (key, expected_code, expected_vk) in test_cases {
let (code, vk) = get_key_info(key);
assert_eq!(code, expected_code, "Key code mismatch for {key}");
assert_eq!(vk, expected_vk, "Virtual key code mismatch for {key}");
}
}
#[test]
fn test_key_info_function_keys() {
let test_cases = vec![
("F1", "F1", Some(112)),
("F2", "F2", Some(113)),
("F3", "F3", Some(114)),
("F4", "F4", Some(115)),
("F5", "F5", Some(116)),
("F6", "F6", Some(117)),
("F7", "F7", Some(118)),
("F8", "F8", Some(119)),
("F9", "F9", Some(120)),
("F10", "F10", Some(121)),
("F11", "F11", Some(122)),
("F12", "F12", Some(123)),
];
for (key, expected_code, expected_vk) in test_cases {
let (code, vk) = get_key_info(key);
assert_eq!(code, expected_code, "Key code mismatch for {key}");
assert_eq!(vk, expected_vk, "Virtual key code mismatch for {key}");
}
}
#[test]
fn test_key_info_alphabetic_keys() {
let test_cases = vec![
('A', "KeyA", 65),
('B', "KeyB", 66),
('C', "KeyC", 67),
('Z', "KeyZ", 90),
('a', "KeyA", 65),
('z', "KeyZ", 90),
];
for (ch, expected_code, expected_vk) in test_cases {
let (code, vk) = get_key_info(&ch.to_string());
assert_eq!(code, expected_code, "Key code mismatch for {ch}");
assert_eq!(vk, Some(expected_vk), "Virtual key code mismatch for {ch}");
}
}
#[test]
fn test_key_info_digit_keys() {
let test_cases = vec![
('0', "Digit0", 48),
('1', "Digit1", 49),
('5', "Digit5", 53),
('9', "Digit9", 57),
];
for (ch, expected_code, expected_vk) in test_cases {
let (code, vk) = get_key_info(&ch.to_string());
assert_eq!(code, expected_code, "Key code mismatch for {ch}");
assert_eq!(vk, Some(expected_vk), "Virtual key code mismatch for {ch}");
}
}
#[test]
fn test_key_info_unknown_keys() {
let unknown_keys = vec!["Plus", "Minus", "Comma", "Period"];
for key in unknown_keys {
let (code, vk) = get_key_info(key);
assert_eq!(code, key, "Unknown key should use key name as code");
assert_eq!(vk, None, "Unknown key should have no virtual key code");
}
}
#[test]
fn test_mouse_button_to_cdp_string() {
assert_eq!(MouseButton::Left.to_cdp_string(), "left");
assert_eq!(MouseButton::Right.to_cdp_string(), "right");
assert_eq!(MouseButton::Middle.to_cdp_string(), "middle");
}
#[test]
fn test_mouse_button_copy() {
let left = MouseButton::Left;
let copied = left;
assert_eq!(left.to_cdp_string(), copied.to_cdp_string());
}
#[test]
fn test_element_creation() {
let backend_node_id = 12345u32;
assert!(backend_node_id > 0);
}
#[test]
fn test_element_backend_node_id_validation() {
let valid_ids = vec![1u32, 1000, 999999, u32::MAX];
for id in valid_ids {
assert!(id > 0, "Backend node ID {id} should be valid");
}
}
#[test]
fn test_key_combination_parsing() {
let combinations = vec![
"Control+A",
"Control+Shift+A",
"Control+Shift+Alt+Delete",
"Meta+C",
"Shift+End",
];
for combo in combinations {
let parts: Vec<&str> = combo.split('+').collect();
assert!(
parts.len() > 1,
"Key combination '{combo}' should contain multiple parts"
);
let modifiers = &parts[..parts.len() - 1];
let main_key = parts.last().unwrap();
assert!(!modifiers.is_empty(), "Should have at least one modifier");
assert!(!main_key.is_empty(), "Should have a main key");
}
}
#[test]
fn test_key_modifier_ordering() {
let combo = "Control+Shift+A";
let parts: Vec<&str> = combo.split('+').collect();
let modifiers = &parts[..parts.len() - 1];
let main_key = parts.last().unwrap();
for (i, modifier) in modifiers.iter().enumerate() {
assert!(
matches!(*modifier, "Alt" | "Control" | "Meta" | "Shift"),
"Modifier at index {i} should be valid: {modifier}"
);
}
assert_eq!(*main_key, "A");
for modifier in modifiers.iter().rev() {
assert!(
matches!(*modifier, "Alt" | "Control" | "Meta" | "Shift"),
"Modifier should be valid during release"
);
}
}
#[test]
fn test_modifier_bitmask_calculation() {
let modifier_map: std::collections::HashMap<&str, u32> =
[("Alt", 1), ("Control", 2), ("Meta", 4), ("Shift", 8)]
.iter()
.cloned()
.collect();
assert_eq!(modifier_map["Alt"], 1);
assert_eq!(modifier_map["Control"], 2);
assert_eq!(modifier_map["Meta"], 4);
assert_eq!(modifier_map["Shift"], 8);
let alt_control = modifier_map["Alt"] | modifier_map["Control"];
assert_eq!(alt_control, 3);
let all_modifiers = modifier_map["Alt"]
| modifier_map["Control"]
| modifier_map["Meta"]
| modifier_map["Shift"];
assert_eq!(all_modifiers, 15);
}
#[test]
fn test_screenshot_format_validation() {
let valid_formats = vec!["png", "jpeg", "webp"];
for format in valid_formats {
assert!(!format.is_empty(), "Screenshot format should not be empty");
assert!(format.len() <= 4, "Screenshot format should be short");
}
}
#[test]
fn test_screenshot_quality_range() {
let valid_qualities = vec![0u32, 50, 75, 100];
for quality in valid_qualities {
assert!(quality <= 100, "JPEG quality should be <= 100");
}
}
#[test]
fn test_screenshot_clip_parameters() {
let clip = (100.0f64, 200.0f64, 800.0f64, 600.0f64);
let (x, y, width, height) = clip;
assert!(x >= 0.0, "Clip x should be non-negative");
assert!(y >= 0.0, "Clip y should be non-negative");
assert!(width > 0.0, "Clip width should be positive");
assert!(height > 0.0, "Clip height should be positive");
}
#[test]
fn test_viewport_size_validation() {
let valid_sizes = vec![
(1920u32, 1080u32),
(1280, 720),
(800, 600),
(3840, 2160),
(1, 1),
];
for (width, height) in valid_sizes {
assert!(width > 0, "Viewport width should be positive");
assert!(height > 0, "Viewport height should be positive");
}
}
#[test]
fn test_device_scale_factor() {
let valid_scale_factors = vec![1.0f64, 1.5, 2.0, 3.0, 0.5];
for scale in valid_scale_factors {
assert!(scale > 0.0, "Device scale factor should be positive");
}
}
#[test]
fn test_coordinate_clamping() {
let viewport_width = 1920.0f64;
let viewport_height = 1080.0f64;
let test_coords: Vec<(f64, f64)> = vec![
(-100.0, -100.0),
(0.0, 0.0),
(100.0, 100.0),
(1919.0, 1079.0),
(2000.0, 1100.0),
];
for (x, y) in test_coords {
let clamped_x = x.max(0.0).min(viewport_width - 1.0);
let clamped_y = y.max(0.0).min(viewport_height - 1.0);
assert!(clamped_x >= 0.0, "Clamped x should be >= 0");
assert!(clamped_x < viewport_width, "Clamped x should be < width");
assert!(clamped_y >= 0.0, "Clamped y should be >= 0");
assert!(clamped_y < viewport_height, "Clamped y should be < height");
}
}
#[test]
fn test_quad_center_calculation() {
let quad = vec![100.0f64, 100.0, 200.0, 100.0, 200.0, 200.0, 100.0, 200.0];
let x_coords: Vec<f64> = quad.iter().step_by(2).cloned().collect();
let y_coords: Vec<f64> = quad.iter().skip(1).step_by(2).cloned().collect();
let center_x = x_coords.iter().sum::<f64>() / x_coords.len() as f64;
let center_y = y_coords.iter().sum::<f64>() / y_coords.len() as f64;
assert!((center_x - 150.0).abs() < 0.01, "Center x should be ~150");
assert!((center_y - 150.0).abs() < 0.01, "Center y should be ~150");
}
#[test]
fn test_js_expression_validation() {
let valid_expressions = vec![
"document.title",
"window.location.href",
"1 + 1",
"'hello world'",
"document.querySelectorAll('a').length",
];
for expr in valid_expressions {
assert!(!expr.is_empty(), "JS expression should not be empty");
}
}
#[test]
fn test_js_await_promise_flag() {
let await_promise = true;
assert!(await_promise, "Should await promises by default");
}
#[test]
fn test_js_return_by_value_flag() {
let return_by_value = true;
assert!(return_by_value, "Should return values by default");
}
#[test]
fn test_page_navigation_flow() {
let (back_key, back_vk) = get_key_info("ArrowLeft");
assert_eq!(back_key, "ArrowLeft");
assert_eq!(back_vk, Some(37));
let (forward_key, forward_vk) = get_key_info("ArrowRight");
assert_eq!(forward_key, "ArrowRight");
assert_eq!(forward_vk, Some(39));
}
#[test]
fn test_element_click_interaction() {
let quad = vec![
(0.0, 0.0), (100.0, 0.0), (100.0, 50.0), (0.0, 50.0), ];
let center_x = quad.iter().map(|p| p.0).sum::<f64>() / 4.0;
let center_y = quad.iter().map(|p| p.1).sum::<f64>() / 4.0;
assert_eq!(center_x, 50.0);
assert_eq!(center_y, 25.0);
}
#[test]
fn test_element_fill_text() {
let test_text = "test input";
assert!(!test_text.is_empty());
assert_eq!(test_text.len(), 10);
let (a_key, a_vk) = get_key_info("a");
assert_eq!(a_key, "KeyA");
assert_eq!(a_vk, Some(65));
}
#[test]
fn test_page_screenshot_capture() {
let clip_params = vec![(0, 0, 100, 100), (10, 10, 200, 150), (0, 0, 1920, 1080)];
for (x, y, width, height) in clip_params {
assert!(width > 0 && height > 0);
assert!(x >= 0 && y >= 0);
}
}
#[test]
fn test_mouse_click_and_move() {
let test_coords = vec![(0, 0), (100, 50), (500, 300)];
assert_eq!(MouseButton::Left.to_cdp_string(), "left");
assert_eq!(MouseButton::Right.to_cdp_string(), "right");
assert_eq!(MouseButton::Middle.to_cdp_string(), "middle");
for (x, y) in test_coords {
assert!(x >= 0 && y >= 0);
}
}
#[test]
fn test_keyboard_press_key_combination() {
let modifier_keys = vec!["Control", "Shift", "Alt", "Meta"];
for key in modifier_keys {
let (code, vk) = get_key_info(key);
assert!(!code.is_empty());
assert!(vk.is_some());
assert!(vk.unwrap() >= 16 && vk.unwrap() <= 92);
}
let (ctrl_code, _) = get_key_info("Control");
let (a_code, _) = get_key_info("a");
assert_eq!(ctrl_code, "ControlLeft");
assert_eq!(a_code, "KeyA");
}