diff --git a/src/update/detector.rs b/src/update/detector.rs index 20727e7f..e5b92472 100644 --- a/src/update/detector.rs +++ b/src/update/detector.rs @@ -147,3 +147,47 @@ fn has_pacman_installation() -> bool { fn has_pacman_installation() -> bool { false } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_install_method_display() { + assert_eq!(InstallMethod::Cargo.to_string(), "cargo"); + assert_eq!(InstallMethod::Homebrew.to_string(), "homebrew"); + assert_eq!(InstallMethod::Apt.to_string(), "apt"); + assert_eq!(InstallMethod::Dnf.to_string(), "dnf"); + assert_eq!(InstallMethod::Pacman.to_string(), "pacman"); + assert_eq!(InstallMethod::Windows.to_string(), "windows"); + assert_eq!(InstallMethod::Scoop.to_string(), "scoop"); + assert_eq!( + InstallMethod::Chocolatey.to_string(), + "chocolatey" + ); + assert_eq!( + InstallMethod::ScoopBucket.to_string(), + "scoop-bucket" + ); + assert_eq!(InstallMethod::Unknown.to_string(), "unknown"); + } + + #[test] + fn test_install_method_equality() { + assert_eq!(InstallMethod::Cargo, InstallMethod::Cargo); + assert_ne!(InstallMethod::Cargo, InstallMethod::Dnf); + } + + #[test] + fn test_install_method_clone() { + let method = InstallMethod::Dnf; + let cloned = method.clone(); + assert_eq!(method, cloned); + } + + #[test] + fn test_install_method_debug() { + let debug_str = format!("{:?}", InstallMethod::Cargo); + assert!(debug_str.contains("Cargo")); + } +} diff --git a/src/update/mod.rs b/src/update/mod.rs index b217d928..2077eff4 100644 --- a/src/update/mod.rs +++ b/src/update/mod.rs @@ -168,3 +168,64 @@ fn confirm(prompt: &str) -> Result { Ok(input.trim().eq_ignore_ascii_case("y")) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_is_prerelease_nightly() { + assert!(is_prerelease("0.28.1-nightly")); + assert!(is_prerelease("0.28.1-NIGHTLY")); + } + + #[test] + fn test_is_prerelease_rc() { + assert!(is_prerelease("0.28.1-rc.1")); + assert!(is_prerelease("0.28.1-RC.1")); + } + + #[test] + fn test_is_prerelease_beta() { + assert!(is_prerelease("0.28.1-beta")); + assert!(is_prerelease("0.28.0-beta.2")); + } + + #[test] + fn test_is_prerelease_alpha() { + assert!(is_prerelease("0.28.1-alpha")); + assert!(is_prerelease("0.28.0-alpha.1")); + } + + #[test] + fn test_is_prerelease_dev() { + assert!(is_prerelease("0.28.1-dev")); + assert!(is_prerelease("0.28.0-dev.20240101")); + } + + #[test] + fn test_is_prerelease_preview() { + assert!(is_prerelease("0.28.1-preview")); + assert!(is_prerelease("0.28.0-preview.3")); + } + + #[test] + fn test_is_prerelease_snapshot() { + assert!(is_prerelease("0.28.1-snapshot")); + } + + #[test] + fn test_is_not_prerelease_stable() { + assert!(!is_prerelease("0.28.1")); + assert!(!is_prerelease("0.28.0")); + assert!(!is_prerelease("1.0.0")); + } + + #[test] + fn test_is_not_prerelease_version_with_prerelease_substring() { + // Ensure we don't false-positive on versions that contain prerelease keywords + // but aren't actually prereleases (e.g., "0.28.1-nightly-feature" wouldn't be valid anyway) + assert!(is_prerelease("0.28.1-nightly")); + assert!(!is_prerelease("0.28.1")); + } +}