use crate::{AVAILABLE_LOCALES, Locale};
use std::str::FromStr;
#[test]
fn test_all_locales_round_trip() {
for &locale_str in AVAILABLE_LOCALES.iter() {
let locale = Locale::from_str(locale_str)
.expect(&format!("Failed to parse valid locale: {}", locale_str));
assert_eq!(locale.as_str(), locale_str);
assert_eq!(format!("{}", locale), locale_str);
let s: &'static str = locale.into();
assert_eq!(s, locale_str);
let string_res: String = locale.into();
assert_eq!(string_res, locale_str);
}
}
#[test]
fn test_reference_conversion() {
let locale = Locale::from_str(AVAILABLE_LOCALES[0]).unwrap();
let s: &'static str = (&locale).into();
assert_eq!(s, AVAILABLE_LOCALES[0]);
}
#[test]
fn test_invalid_locale() {
let invalid_inputs = vec!["", "invalid_locale", "en-US-12345", "123"];
for input in invalid_inputs {
let result = Locale::from_str(input);
assert!(result.is_err(), "Input '{}' should have failed", input);
let try_result = Locale::try_from(input);
assert!(try_result.is_err());
}
}
#[test]
fn test_traits() {
let loc1 = Locale::from_str(AVAILABLE_LOCALES[0]).unwrap();
let loc2 = loc1; let loc3 = loc1.clone();
assert_eq!(loc1, loc2);
assert_eq!(loc1, loc3);
use std::collections::HashSet;
let mut set = HashSet::new();
set.insert(loc1);
assert!(set.contains(&loc2));
}
#[test]
fn test_debug_print() {
let loc = Locale::from_str(AVAILABLE_LOCALES[0]).unwrap();
let debug_str = format!("{:?}", loc);
assert!(!debug_str.is_empty());
}
#[test]
fn test_fallback_logic() {
if let Ok(regional) = Locale::from_str("en-GB") {
if let Some(fallback) = regional.fallback() {
assert_eq!(fallback.as_str(), "en");
}
}
if let Ok(base) = Locale::from_str("en") {
assert!(
base.fallback().is_none(),
"Base language 'en' should not have a fallback"
);
}
}
#[test]
fn test_recursive_fallback() {
let mut current = Locale::from_str("zh-Hant-HK").ok();
let mut steps = 0;
while let Some(loc) = current {
current = loc.fallback();
steps += 1;
}
assert!(steps >= 1);
}
#[test]
fn test_all_fallbacks_are_valid() {
for name in AVAILABLE_LOCALES {
let loc = Locale::from_str(name).unwrap();
if let Some(fallback) = loc.fallback() {
assert!(name.starts_with(fallback.as_str()));
assert_ne!(name, fallback.as_str());
}
}
}
#[test]
fn test_from_flexible_parsing() {
assert_eq!(Locale::from_flexible("en-GB"), Ok(Locale::en_GB));
assert_eq!(Locale::from_flexible("en_gb"), Ok(Locale::en_GB));
assert_eq!(Locale::from_flexible("EN-gb"), Ok(Locale::en_GB));
assert!(Locale::from_flexible("invalid-locale").is_err());
}
#[test]
fn test_negotiate_exact_match() {
let available = vec![Locale::en, Locale::de, Locale::fr];
assert_eq!(Locale::en_GB.negotiate(&available), Some(Locale::en));
}
#[test]
fn test_negotiate_fallback_chain() {
let available = vec![Locale::en, Locale::de];
assert_eq!(Locale::en_GB.negotiate(&available), Some(Locale::en));
assert_eq!(Locale::en_AU.negotiate(&available), Some(Locale::en));
}
#[test]
fn test_negotiate_no_match() {
let available = vec![Locale::de, Locale::fr];
assert_eq!(Locale::en_GB.negotiate(&available), None);
}
#[test]
fn test_suggest_similar_locales() {
let suggestions = Locale::suggest("en-gbb");
assert!(!suggestions.is_empty());
assert!(suggestions.iter().any(|l| l.as_str() == "en-GB"));
}
#[test]
fn test_suggest_case_insensitive() {
let suggestions = Locale::suggest("EN-gb");
assert!(!suggestions.is_empty());
assert!(suggestions.iter().any(|l| l.as_str() == "en-GB"));
}
#[test]
fn test_language_code() {
assert_eq!(Locale::en_GB.language_code(), "en");
assert_eq!(Locale::de_AT.language_code(), "de");
assert_eq!(Locale::zh_Hans.language_code(), "zh");
assert_eq!(Locale::en.language_code(), "en");
}
#[test]
fn test_region_code() {
assert_eq!(Locale::en_GB.region_code(), Some("GB"));
assert_eq!(Locale::de_AT.region_code(), Some("AT"));
assert_eq!(Locale::en.region_code(), None);
assert_eq!(Locale::zh_Hans.region_code(), None);
}
#[test]
fn test_region_code_with_script() {
assert_eq!(Locale::zh_Hans.region_code(), None);
assert_eq!(Locale::zh_Hans_HK.region_code(), Some("HK"));
}