use assert_cmd::Command;
use predicates::prelude::*;
use std::time::Duration;
use tempfile::TempDir;
#[test]
fn test_screen_reader_compatibility() {
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("--help")
.assert()
.success()
.stdout(predicate::function(|output: &str| {
output.contains("Usage:") &&
output.contains("Commands:") &&
output.contains("Options:") &&
output.lines().count() > 5
}));
}
#[test]
fn test_keyboard_navigation_support() {
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("interactive")
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("Interactive"));
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("guide")
.arg("--getting-started")
.assert()
.success()
.stdout(predicate::function(|output: &str| {
output.to_lowercase().contains("command")
|| output.to_lowercase().contains("type")
|| output.to_lowercase().contains("enter")
}));
}
#[test]
fn test_color_contrast_validation() {
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("invalid-command")
.assert()
.failure()
.stderr(predicate::function(|output: &str| {
!output.is_empty()
&& (output.to_lowercase().contains("error")
|| output.to_lowercase().contains("invalid")
|| output.to_lowercase().contains("not found"))
}));
}
#[test]
fn test_text_scaling_support() {
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("--help")
.assert()
.success()
.stdout(predicate::function(|output: &str| {
let lines: Vec<&str> = output.lines().collect();
let average_line_length =
lines.iter().map(|line| line.len()).sum::<usize>() / lines.len().max(1);
average_line_length < 120 &&
lines.len() > 3
}));
}
#[test]
fn test_alternative_text_for_audio_output() {
let temp_dir = TempDir::new().unwrap();
let output_file = temp_dir.path().join("accessibility_test.wav");
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("synthesize")
.arg("This is an accessibility test")
.arg(output_file.to_str().unwrap())
.timeout(Duration::from_secs(120))
.assert()
.success();
assert!(output_file.exists());
}
#[test]
fn test_verbose_output_for_accessibility() {
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("--verbose")
.arg("list-voices")
.timeout(Duration::from_secs(10))
.assert()
.success();
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("-v")
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("verbose"));
}
#[test]
fn test_clear_progress_indication() {
let temp_dir = TempDir::new().unwrap();
let input_file = temp_dir.path().join("progress_test.txt");
let output_dir = temp_dir.path().join("output");
std::fs::write(
&input_file,
"Test sentence one.\nTest sentence two.\nTest sentence three.",
)
.unwrap();
std::fs::create_dir_all(&output_dir).unwrap();
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("--verbose")
.arg("batch")
.arg(input_file.to_str().unwrap())
.arg("--output-dir")
.arg(output_dir.to_str().unwrap())
.timeout(Duration::from_secs(300))
.assert()
.success();
}
#[test]
fn test_error_message_accessibility() {
let error_scenarios = vec![
(vec!["synthesize"], "Missing required argument"),
(vec!["invalid-command"], "Invalid command"),
(
vec!["synthesize", "test", "--output", "/invalid/path/file.wav"],
"File operation",
),
];
for (args, expected_context) in error_scenarios {
let mut cmd = Command::cargo_bin("voirs").unwrap();
for arg in args {
cmd.arg(arg);
}
cmd.assert()
.failure()
.stderr(predicate::function(move |output: &str| {
!output.is_empty() &&
(output.to_lowercase().contains("error") ||
output.to_lowercase().contains("invalid") ||
output.to_lowercase().contains("failed") ||
output.to_lowercase().contains("required"))
}));
}
}
#[test]
fn test_command_completion_accessibility() {
let temp_dir = TempDir::new().unwrap();
let completion_file = temp_dir.path().join("test_completion.bash");
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("generate-completion")
.arg("bash")
.arg("--output")
.arg(completion_file.to_str().unwrap())
.assert()
.success();
let content = std::fs::read_to_string(&completion_file).unwrap();
assert!(!content.is_empty());
assert!(content.contains("voirs"));
}
#[test]
fn test_consistent_interface_patterns() {
let commands = vec!["list-voices", "list-models", "config"];
for command in commands {
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg(command)
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("Usage:"))
.stdout(predicate::function(|output: &str| {
output.contains("Usage:") && output.lines().count() > 3
}));
}
}
#[test]
fn test_alternative_input_methods() {
let temp_dir = TempDir::new().unwrap();
let input_file = temp_dir.path().join("input_test.txt");
let output_file = temp_dir.path().join("output_test.wav");
std::fs::write(&input_file, "This is a test of alternative input methods.").unwrap();
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("synthesize-file")
.arg(input_file.to_str().unwrap())
.arg("--output-dir")
.arg(temp_dir.path().to_str().unwrap())
.timeout(Duration::from_secs(120))
.assert()
.success();
}
#[test]
fn test_clear_status_reporting() {
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("list-voices")
.timeout(Duration::from_secs(100))
.assert()
.success()
.stdout(predicate::function(|output: &str| {
!output.trim().is_empty()
}));
}
#[test]
fn test_internationalization_friendly() {
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.env("LANG", "C")
.arg("--help")
.assert()
.success()
.stdout(predicate::function(|output: &str| {
output.contains("Usage:")
}));
}
#[test]
fn test_timeout_handling_accessibility() {
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("--version")
.timeout(Duration::from_secs(5))
.assert()
.success()
.stdout(predicate::str::is_match(r"\d+\.\d+\.\d+").unwrap());
}
#[test]
fn test_configuration_accessibility() {
let temp_dir = TempDir::new().unwrap();
let config_file = temp_dir.path().join("accessibility_config.toml");
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("config")
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("Configuration"))
.stdout(predicate::function(|output: &str| {
output.contains("show") || output.contains("init")
}));
}
#[test]
fn test_audio_alternatives() {
let temp_dir = TempDir::new().unwrap();
let output_file = temp_dir.path().join("audio_alternative.wav");
let mut cmd = Command::cargo_bin("voirs").unwrap();
cmd.arg("synthesize")
.arg("Testing audio alternatives for accessibility")
.arg(output_file.to_str().unwrap())
.timeout(Duration::from_secs(120))
.assert()
.success();
assert!(output_file.exists());
let metadata = std::fs::metadata(&output_file).unwrap();
assert!(metadata.len() > 100); }