use ruchy::stdlib::process;
#[test]
fn test_execute_echo_success() {
let result = process::execute("echo", &["hello", "world"]);
assert!(result.is_ok());
let (stdout, stderr, exit_code) = result.unwrap();
assert!(stdout.contains("hello"));
assert!(stdout.contains("world"));
assert!(stderr.is_empty() || stderr.trim().is_empty());
assert_eq!(exit_code, 0);
}
#[test]
fn test_execute_no_args() {
let result = process::execute("pwd", &[]);
assert!(result.is_ok());
let (stdout, _stderr, exit_code) = result.unwrap();
assert!(!stdout.is_empty());
assert_eq!(exit_code, 0);
}
#[test]
fn test_execute_stderr() {
let result = process::execute("ls", &["/nonexistent/file/xyz123"]);
assert!(result.is_ok());
let (stdout, stderr, exit_code) = result.unwrap();
assert!(stdout.is_empty() || stdout.trim().is_empty());
assert!(!stderr.is_empty()); assert_ne!(exit_code, 0); }
#[test]
fn test_execute_exit_code_nonzero() {
let result = process::execute("false", &[]);
assert!(result.is_ok());
let (_stdout, _stderr, exit_code) = result.unwrap();
assert_eq!(exit_code, 1);
}
#[test]
fn test_execute_invalid_command() {
let result = process::execute("nonexistent_command_xyz_999", &[]);
assert!(result.is_err());
let err = result.unwrap_err();
assert!(err.contains("No such file") || err.contains("not found") || err.contains("NotFound"));
}
#[test]
fn test_current_pid_positive() {
let result = process::current_pid();
assert!(result.is_ok());
let pid = result.unwrap();
assert!(pid > 0);
}
#[test]
fn test_current_pid_consistent() {
let pid1 = process::current_pid().unwrap();
let pid2 = process::current_pid().unwrap();
assert_eq!(pid1, pid2);
}
use proptest::prelude::*;
proptest! {
#[test]
fn property_echo_roundtrip(
input in "[a-zA-Z0-9]+[ a-zA-Z0-9]*" ) {
let result = process::execute("echo", &[&input]).unwrap();
let (stdout, _stderr, exit_code) = result;
prop_assert!(stdout.contains(input.trim()));
prop_assert_eq!(exit_code, 0);
}
#[test]
fn property_current_pid_always_positive(
_dummy in 0..100i32
) {
let pid = process::current_pid().unwrap();
prop_assert!(pid > 0);
}
#[test]
fn property_execute_args_order(
arg1 in "[a-z]{3,10}",
arg2 in "[a-z]{3,10}",
arg3 in "[a-z]{3,10}"
) {
let result = process::execute("echo", &[&arg1, &arg2, &arg3]).unwrap();
let (stdout, _, _) = result;
let stdout_clean = stdout.trim();
let pos1 = stdout_clean.find(&arg1);
let pos2 = stdout_clean.find(&arg2);
let pos3 = stdout_clean.find(&arg3);
prop_assert!(pos1.is_some());
prop_assert!(pos2.is_some());
prop_assert!(pos3.is_some());
prop_assert!(pos1.unwrap() < pos2.unwrap());
prop_assert!(pos2.unwrap() < pos3.unwrap());
}
}
#[test]
fn test_execute_empty_output() {
let result = process::execute("true", &[]);
assert!(result.is_ok());
let (stdout, stderr, exit_code) = result.unwrap();
assert!(stdout.is_empty() || stdout.trim().is_empty());
assert!(stderr.is_empty() || stderr.trim().is_empty());
assert_eq!(exit_code, 0);
}
#[test]
fn test_execute_unicode_args() {
let result = process::execute("echo", &["Hello", "δΈη", "π"]);
assert!(result.is_ok());
let (stdout, _stderr, exit_code) = result.unwrap();
assert!(stdout.contains("Hello"));
assert!(stdout.contains("δΈη"));
assert!(stdout.contains("π"));
assert_eq!(exit_code, 0);
}
#[test]
fn test_execute_special_chars() {
let result = process::execute("echo", &["test!@#$%"]);
assert!(result.is_ok());
let (stdout, _stderr, exit_code) = result.unwrap();
assert!(stdout.contains("test"));
assert_eq!(exit_code, 0);
}
#[test]
fn test_execute_long_output() {
let result = process::execute("echo", &["x".repeat(1000).as_str()]);
assert!(result.is_ok());
let (stdout, _stderr, exit_code) = result.unwrap();
assert!(stdout.len() >= 1000);
assert_eq!(exit_code, 0);
}
#[test]
fn test_process_workflow() {
let pid = process::current_pid().unwrap();
assert!(pid > 0);
let (stdout, _stderr, exit_code) = process::execute("echo", &["workflow"]).unwrap();
assert!(stdout.contains("workflow"));
assert_eq!(exit_code, 0);
let pid2 = process::current_pid().unwrap();
assert_eq!(pid, pid2);
}
#[test]
fn test_multiple_executions() {
for i in 0..5 {
let arg = format!("test{i}");
let result = process::execute("echo", &[&arg]);
assert!(result.is_ok());
let (stdout, _stderr, exit_code) = result.unwrap();
assert!(stdout.contains(&arg));
assert_eq!(exit_code, 0);
}
}