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-US") {
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());
}
}
}