use workspace_tools :: { Workspace, WorkspaceError };
use std :: { env, path ::PathBuf };
use tempfile ::TempDir;
#[ test ]
fn test_environment_variable_missing_display()
{
let error = WorkspaceError ::EnvironmentVariableMissing( "TEST_VAR".to_string() );
let display = format!( "{error}" );
assert!( display.contains( "TEST_VAR" ) );
assert!( display.contains( "WORKSPACE_PATH" ) );
assert!( display.to_lowercase().contains( "environment" ) );
}
#[ test ]
fn test_path_not_found_display()
{
let test_path = PathBuf ::from( "/nonexistent/test/path" );
let error = WorkspaceError ::PathNotFound( test_path.clone() );
let display = format!( "{error}" );
assert!( display.contains( "/nonexistent/test/path" ) );
assert!( display.to_lowercase().contains( "not found" ) || display.to_lowercase().contains( "does not exist" ) );
}
#[ test ]
fn test_io_error_display()
{
let error = WorkspaceError ::IoError( "Access denied".to_string() );
let display = format!( "{error}" );
assert!( display.contains( "Access denied" ) || display.contains( "permission denied" ) );
}
#[ test ]
fn test_path_outside_workspace_display()
{
let test_path = PathBuf ::from( "/outside/workspace/path" );
let error = WorkspaceError ::PathOutsideWorkspace( test_path.clone() );
let display = format!( "{error}" );
assert!( display.contains( "/outside/workspace/path" ) );
assert!( display.to_lowercase().contains( "outside" ) );
assert!( display.to_lowercase().contains( "workspace" ) );
}
#[ test ]
fn test_cargo_error_display()
{
let error = WorkspaceError ::CargoError( "Failed to parse Cargo.toml".to_string() );
let display = format!( "{error}" );
assert!( display.contains( "Failed to parse Cargo.toml" ) );
assert!( display.to_lowercase().contains( "cargo" ) );
}
#[ test ]
fn test_toml_error_display()
{
let error = WorkspaceError ::TomlError( "Invalid TOML syntax".to_string() );
let display = format!( "{error}" );
assert!( display.contains( "Invalid TOML syntax" ) );
assert!( display.to_lowercase().contains( "toml" ) );
}
#[ cfg( feature = "serde" ) ]
#[ test ]
fn test_serde_error_display()
{
let error = WorkspaceError ::SerdeError( "Deserialization failed".to_string() );
let display = format!( "{error}" );
assert!( display.contains( "Deserialization failed" ) );
assert!( display.to_lowercase().contains( "serde" ) || display.to_lowercase().contains( "serialization" ) );
}
#[ test ]
fn test_error_trait_implementation()
{
use core ::error ::Error;
let mut errors: Vec< WorkspaceError > = vec![
WorkspaceError ::EnvironmentVariableMissing( "TEST".to_string() ),
WorkspaceError ::PathNotFound( PathBuf ::from( "/test" ) ),
WorkspaceError ::IoError( "test io error".to_string() ),
WorkspaceError ::PathOutsideWorkspace( PathBuf ::from( "/test" ) ),
];
errors.push( WorkspaceError ::CargoError( "test".to_string() ) );
errors.push( WorkspaceError ::TomlError( "test".to_string() ) );
#[ cfg( feature = "serde" ) ]
errors.push( WorkspaceError ::SerdeError( "test".to_string() ) );
for error in errors
{
let _description = error.to_string();
let _source = error.source();
assert!( !format!( "{error}" ).is_empty() );
assert!( !format!( "{error:?}" ).is_empty() );
}
}
#[ test ]
fn test_error_clone()
{
let original = WorkspaceError ::EnvironmentVariableMissing( "TEST".to_string() );
let cloned = original.clone();
assert_eq!( format!( "{original:?}" ), format!( "{:?}", cloned ) );
assert_eq!( original.to_string(), cloned.to_string() );
let original2 = WorkspaceError ::PathNotFound( PathBuf ::from( "/test" ) );
let cloned2 = original2.clone();
assert_eq!( format!( "{original2:?}" ), format!( "{:?}", cloned2 ) );
assert_eq!( original2.to_string(), cloned2.to_string() );
}
#[ test ]
fn test_error_debug_format()
{
let error = WorkspaceError ::EnvironmentVariableMissing( "DEBUG_TEST".to_string() );
let debug = format!( "{error:?}" );
assert!( debug.contains( "EnvironmentVariableMissing" ) );
assert!( debug.contains( "DEBUG_TEST" ) );
}
#[ test ]
fn test_error_display_distinctness()
{
let error1 = WorkspaceError ::EnvironmentVariableMissing( "SAME".to_string() );
let error2 = WorkspaceError ::EnvironmentVariableMissing( "SAME".to_string() );
let error3 = WorkspaceError ::EnvironmentVariableMissing( "DIFFERENT".to_string() );
assert_eq!( error1.to_string(), error2.to_string() );
assert_ne!( error1.to_string(), error3.to_string() );
let path_error1 = WorkspaceError ::PathNotFound( PathBuf ::from( "/same" ) );
let path_error2 = WorkspaceError ::PathNotFound( PathBuf ::from( "/same" ) );
let path_error3 = WorkspaceError ::PathNotFound( PathBuf ::from( "/different" ) );
assert_eq!( path_error1.to_string(), path_error2.to_string() );
assert_ne!( path_error1.to_string(), path_error3.to_string() );
assert_ne!( error1.to_string(), path_error1.to_string() );
}
#[ test ]
fn test_error_creation_missing_env_var()
{
let original = env ::var( "WORKSPACE_PATH" ).ok();
env ::remove_var( "WORKSPACE_PATH" );
let result = Workspace ::resolve();
match original
{
Some( value ) => env ::set_var( "WORKSPACE_PATH", value ),
None => env ::remove_var( "WORKSPACE_PATH" ),
}
assert!( result.is_err() );
match result.unwrap_err()
{
WorkspaceError ::EnvironmentVariableMissing( var ) => assert_eq!( var, "WORKSPACE_PATH" ),
other => panic!( "Expected EnvironmentVariableMissing, got {other:?}" ),
}
}
#[ test ]
fn test_error_creation_invalid_path()
{
let original = env ::var( "WORKSPACE_PATH" ).ok();
#[ cfg( windows ) ]
let invalid_path = PathBuf ::from( "C:\\nonexistent\\invalid\\workspace\\path\\12345" );
#[ cfg( not( windows ) ) ]
let invalid_path = PathBuf ::from( "/nonexistent/invalid/workspace/path/12345" );
env ::set_var( "WORKSPACE_PATH", &invalid_path );
let result = Workspace ::resolve();
match original
{
Some( value ) => env ::set_var( "WORKSPACE_PATH", value ),
None => env ::remove_var( "WORKSPACE_PATH" ),
}
assert!( result.is_err() );
match result.unwrap_err()
{
WorkspaceError ::PathNotFound( path ) =>
{
assert!( path.to_string_lossy().contains( "nonexistent" ) );
assert!( path.to_string_lossy().contains( "12345" ) );
}
other => panic!( "Expected PathNotFound, got {other:?}" ),
}
}
#[ test ]
fn test_error_creation_validate_invalid()
{
let temp_dir = TempDir ::new().unwrap();
let invalid_path = temp_dir.path().join( "nonexistent" );
let original = env ::var( "WORKSPACE_PATH" ).ok();
env ::set_var( "WORKSPACE_PATH", &invalid_path );
let workspace_result = Workspace ::resolve();
match original
{
Some( value ) => env ::set_var( "WORKSPACE_PATH", value ),
None => env ::remove_var( "WORKSPACE_PATH" ),
}
assert!( workspace_result.is_err() );
match workspace_result.unwrap_err()
{
WorkspaceError ::PathNotFound( path ) => assert_eq!( path, invalid_path ),
other => panic!( "Expected PathNotFound, got {other:?}" ),
}
}
#[ test ]
fn test_error_creation_path_outside_workspace()
{
let temp_dir = TempDir ::new().unwrap();
let original = env ::var( "WORKSPACE_PATH" ).ok();
env ::set_var( "WORKSPACE_PATH", temp_dir.path() );
let _workspace = Workspace ::resolve().unwrap();
match original
{
Some( value ) => env ::set_var( "WORKSPACE_PATH", value ),
None => env ::remove_var( "WORKSPACE_PATH" ),
}
let outside_path = PathBuf ::from( "/etc/passwd" );
let error = WorkspaceError ::PathOutsideWorkspace( outside_path.clone() );
assert!( matches!( error, WorkspaceError ::PathOutsideWorkspace( ref path ) if path == &outside_path ) );
}
#[ test ]
fn test_io_error_wrapping()
{
let error_message = "Test permission denied";
let workspace_err = WorkspaceError ::IoError( error_message.to_string() );
match workspace_err
{
WorkspaceError ::IoError( ref message ) =>
{
assert_eq!( message, "Test permission denied" );
assert!( message.contains( "Test permission denied" ) );
},
other => panic!( "Expected IoError, got {other:?}" ),
}
}
#[ test ]
fn test_error_source_chain()
{
use core ::error ::Error;
let workspace_err = WorkspaceError ::IoError( "Invalid data format".to_string() );
let source = workspace_err.source();
assert!( source.is_none() );
assert!( workspace_err.to_string().contains( "Invalid data format" ) );
}
#[ test ]
fn test_all_error_display_completeness()
{
let test_cases = vec![
( WorkspaceError ::EnvironmentVariableMissing( "VAR".to_string() ), vec![ "VAR", "environment" ] ),
( WorkspaceError ::PathNotFound( PathBuf ::from( "/missing" ) ), vec![ "/missing", "not found" ] ),
( WorkspaceError ::PathOutsideWorkspace( PathBuf ::from( "/outside" ) ), vec![ "/outside", "outside" ] ),
];
for ( error, expected_substrings ) in test_cases
{
let display = error.to_string().to_lowercase();
for expected in expected_substrings
{
assert!( display.contains( &expected.to_lowercase() ),
"Error '{error}' should contain '{expected}' in display message" );
}
}
}