use std::env;
use std::path::PathBuf;
use std::process::Command;
fn vx_binary() -> PathBuf {
let mut path = env::current_exe().unwrap();
path.pop(); if path.ends_with("deps") {
path.pop(); }
path.push("vx");
if cfg!(windows) {
path.set_extension("exe");
}
path
}
fn run_vx_command(args: &[&str]) -> std::process::Output {
Command::new(vx_binary())
.args(args)
.output()
.expect("Failed to execute vx command")
}
#[test]
fn test_vx_help() {
let output = run_vx_command(&["--help"]);
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("vx"));
assert!(stdout.contains("help") || stdout.contains("Usage") || stdout.contains("USAGE"));
}
#[test]
fn test_vx_version() {
let output = run_vx_command(&["--version"]);
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("vx"));
}
#[test]
fn test_vx_list_command() {
let output = run_vx_command(&["list"]);
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(!stdout.is_empty());
}
#[test]
fn test_vx_plugin_list() {
let output = run_vx_command(&["plugin", "list"]);
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(!stdout.is_empty());
}
#[test]
fn test_vx_unsupported_tool() {
let output = run_vx_command(&["nonexistent-tool", "--version"]);
assert!(!output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(!stderr.is_empty());
}
#[test]
fn test_vx_system_path_flag() {
let output = run_vx_command(&["--use-system-path", "nonexistent-tool-xyz"]);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(!stderr.contains("unknown flag") && !stderr.contains("unrecognized option"));
}
#[cfg(test)]
mod tool_specific_tests {
use super::*;
#[test]
fn test_node_tool_help() {
let output = run_vx_command(&["node", "--help"]);
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(output.status.success() || !stderr.is_empty() || !stdout.is_empty());
}
#[test]
fn test_uv_tool_help() {
let output = run_vx_command(&["uv", "--help"]);
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(output.status.success() || !stderr.is_empty() || !stdout.is_empty());
}
#[test]
fn test_go_tool_help() {
let output = run_vx_command(&["go", "version"]);
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(output.status.success() || !stderr.is_empty() || !stdout.is_empty());
}
#[test]
fn test_cargo_tool_help() {
let output = run_vx_command(&["cargo", "--version"]);
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
output.status.success()
|| stdout.contains("cargo")
|| !stderr.is_empty()
|| !stdout.is_empty()
);
}
}
#[cfg(test)]
mod environment_isolation_tests {
use super::*;
#[test]
fn test_default_isolation_behavior() {
let output = run_vx_command(&["python", "--version"]);
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
let has_output = !stderr.is_empty() || !stdout.is_empty();
let succeeded = output.status.success();
if !succeeded && !has_output {
eprintln!("Warning: Command failed silently. This might indicate error handling needs improvement.");
}
}
#[test]
fn test_system_path_behavior() {
let output = run_vx_command(&["--use-system-path", "echo", "hello"]);
if output.status.success() {
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("hello"));
}
}
}
#[cfg(test)]
mod config_tests {
use super::*;
#[test]
fn test_vx_config_command() {
let output = run_vx_command(&["config"]);
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(output.status.success() || !stderr.is_empty() || !stdout.is_empty());
}
}
#[cfg(test)]
mod dynamic_execution_tests {
use super::*;
#[test]
fn test_dynamic_command_with_multiple_args() {
let output = run_vx_command(&["echo", "hello", "world", "test"]);
if output.status.success() {
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("hello"));
}
}
#[test]
fn test_dynamic_command_with_flags() {
let output = run_vx_command(&["cargo", "--version"]);
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(output.status.success() || !stderr.is_empty() || !stdout.is_empty());
}
#[test]
fn test_zero_learning_cost() {
let output = run_vx_command(&["echo", "vx-test"]);
if output.status.success() {
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("vx-test"));
}
}
}
#[cfg(test)]
mod error_handling_tests {
use super::*;
#[test]
fn test_clear_error_messages() {
let output = run_vx_command(&["definitely-nonexistent-tool-xyz"]);
assert!(!output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("Tool not found") || stderr.contains("not found"));
}
#[test]
fn test_no_args_behavior() {
let output = run_vx_command(&[]);
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stdout.contains("Usage")
|| stderr.contains("Usage")
|| stdout.contains("help")
|| stderr.contains("help")
|| stderr.contains("No tool specified")
);
}
}