Skip to content

Commit 288aa3b

Browse files
committed
tests: deduplicate locale availability checks into shared is_locale_available()
1 parent 2da58aa commit 288aa3b

3 files changed

Lines changed: 41 additions & 70 deletions

File tree

tests/by-util/test_date.rs

Lines changed: 5 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ use regex::Regex;
1313
#[cfg(all(unix, not(target_os = "macos")))]
1414
use uucore::process::geteuid;
1515
use uutests::util::TestScenario;
16+
#[cfg(unix)]
17+
use uutests::util::is_locale_available;
1618
use uutests::{at_and_ucmd, new_ucmd, util_name};
1719

1820
#[test]
@@ -1840,20 +1842,7 @@ fn test_date_parenthesis_vs_other_special_chars() {
18401842
fn test_date_iranian_locale_solar_hijri_calendar() {
18411843
// Test Iranian locale uses Solar Hijri calendar
18421844
// Verify the Solar Hijri calendar is used in the Iranian locale
1843-
use std::process::Command;
1844-
1845-
// Check if Iranian locale is available
1846-
let locale_check = Command::new("locale")
1847-
.env("LC_ALL", "fa_IR.UTF-8")
1848-
.arg("charmap")
1849-
.output();
1850-
1851-
let locale_available = match locale_check {
1852-
Ok(output) => String::from_utf8_lossy(&output.stdout).trim() == "UTF-8",
1853-
Err(_) => false,
1854-
};
1855-
1856-
if !locale_available {
1845+
if !is_locale_available("fa_IR.UTF-8") {
18571846
println!("Skipping Iranian locale test - fa_IR.UTF-8 locale not available");
18581847
return;
18591848
}
@@ -1920,20 +1909,7 @@ fn test_date_iranian_locale_solar_hijri_calendar() {
19201909
fn test_date_ethiopian_locale_calendar() {
19211910
// Test Ethiopian locale uses Ethiopian calendar
19221911
// Verify the Ethiopian calendar is used in the Ethiopian locale
1923-
use std::process::Command;
1924-
1925-
// Check if Ethiopian locale is available
1926-
let locale_check = Command::new("locale")
1927-
.env("LC_ALL", "am_ET.UTF-8")
1928-
.arg("charmap")
1929-
.output();
1930-
1931-
let locale_available = match locale_check {
1932-
Ok(output) => String::from_utf8_lossy(&output.stdout).trim() == "UTF-8",
1933-
Err(_) => false,
1934-
};
1935-
1936-
if !locale_available {
1912+
if !is_locale_available("am_ET.UTF-8") {
19371913
println!("Skipping Ethiopian locale test - am_ET.UTF-8 locale not available");
19381914
return;
19391915
}
@@ -2000,20 +1976,7 @@ fn test_date_ethiopian_locale_calendar() {
20001976
fn test_date_thai_locale_solar_calendar() {
20011977
// Test Thai locale uses Thai solar calendar
20021978
// Verify the Thai solar calendar is used with the Thai locale
2003-
use std::process::Command;
2004-
2005-
// Check if Thai locale is available
2006-
let locale_check = Command::new("locale")
2007-
.env("LC_ALL", "th_TH.UTF-8")
2008-
.arg("charmap")
2009-
.output();
2010-
2011-
let locale_available = match locale_check {
2012-
Ok(output) => String::from_utf8_lossy(&output.stdout).trim() == "UTF-8",
2013-
Err(_) => false,
2014-
};
2015-
2016-
if !locale_available {
1979+
if !is_locale_available("th_TH.UTF-8") {
20171980
println!("Skipping Thai locale test - th_TH.UTF-8 locale not available");
20181981
return;
20191982
}

tests/by-util/test_sort.rs

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ use std::time::Duration;
1515
use uutests::at_and_ucmd;
1616
use uutests::new_ucmd;
1717
use uutests::util::TestScenario;
18+
#[cfg(unix)]
19+
use uutests::util::is_locale_available;
1820

1921
fn test_helper(file_name: &str, possible_args: &[&str]) {
2022
for args in possible_args {
@@ -604,57 +606,50 @@ fn test_month_default2() {
604606
}
605607

606608
#[test]
609+
#[cfg(unix)]
607610
fn test_month_sort_french_locale() {
611+
if !is_locale_available("fr_FR.UTF-8") {
612+
return;
613+
}
608614
// Test locale-aware month sorting (mirrors GNU sort-month.sh test).
609615
// Uses French UTF-8 locale where abbreviated months are:
610616
// janv. févr. mars avril mai juin juil. août sept. oct. nov. déc.
611-
let result = new_ucmd!()
617+
new_ucmd!()
612618
.env("LC_ALL", "fr_FR.UTF-8")
613619
.arg("-M")
614620
.pipe_in("mai\ndéc.\njanv.\njuin\nfévr.\nmars\navril\njuil.\naoût\nsept.\noct.\nnov.\n")
615-
.run();
616-
617-
// Skip if locale is not available on the system
618-
if result.succeeded() {
619-
assert_eq!(
620-
result.stdout_str(),
621-
"janv.\nfévr.\nmars\navril\nmai\njuin\njuil.\naoût\nsept.\noct.\nnov.\ndéc.\n",
622-
);
623-
}
621+
.succeeds()
622+
.stdout_is("janv.\nfévr.\nmars\navril\nmai\njuin\njuil.\naoût\nsept.\noct.\nnov.\ndéc.\n");
624623
}
625624

626625
#[test]
626+
#[cfg(unix)]
627627
fn test_month_sort_hungarian_locale() {
628+
if !is_locale_available("hu_HU.UTF-8") {
629+
return;
630+
}
628631
// Hungarian abbreviated months: jan febr márc ápr máj jún júl aug szept okt nov dec
629-
let result = new_ucmd!()
632+
new_ucmd!()
630633
.env("LC_ALL", "hu_HU.UTF-8")
631634
.arg("-M")
632635
.pipe_in("máj\ndec\njan\njún\nfebr\nmárc\nápr\njúl\naug\nszept\nokt\nnov\n")
633-
.run();
634-
635-
if result.succeeded() {
636-
assert_eq!(
637-
result.stdout_str(),
638-
"jan\nfebr\nmárc\nápr\nmáj\njún\njúl\naug\nszept\nokt\nnov\ndec\n",
639-
);
640-
}
636+
.succeeds()
637+
.stdout_is("jan\nfebr\nmárc\nápr\nmáj\njún\njúl\naug\nszept\nokt\nnov\ndec\n");
641638
}
642639

643640
#[test]
641+
#[cfg(unix)]
644642
fn test_month_sort_japanese_locale() {
643+
if !is_locale_available("ja_JP.UTF-8") {
644+
return;
645+
}
645646
// Japanese abbreviated months have leading spaces: " 1月" " 2月" ... "10月" "11月" "12月"
646-
let result = new_ucmd!()
647+
new_ucmd!()
647648
.env("LC_ALL", "ja_JP.UTF-8")
648649
.arg("-M")
649650
.pipe_in("5月\n12月\n1月\n6月\n2月\n3月\n4月\n7月\n8月\n9月\n10月\n11月\n")
650-
.run();
651-
652-
if result.succeeded() {
653-
assert_eq!(
654-
result.stdout_str(),
655-
"1月\n2月\n3月\n4月\n5月\n6月\n7月\n8月\n9月\n10月\n11月\n12月\n",
656-
);
657-
}
651+
.succeeds()
652+
.stdout_is("1月\n2月\n3月\n4月\n5月\n6月\n7月\n8月\n9月\n10月\n11月\n12月\n");
658653
}
659654

660655
#[test]

tests/uutests/src/lib/util.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,19 @@ pub fn is_ci() -> bool {
100100
env::var("CI").is_ok_and(|s| s.eq_ignore_ascii_case("true"))
101101
}
102102

103+
/// Check if a locale is available on the system by verifying that
104+
/// `locale charmap` returns `"UTF-8"` when `LC_ALL` is set to the given locale.
105+
#[cfg(unix)]
106+
pub fn is_locale_available(locale: &str) -> bool {
107+
use std::process::Command;
108+
Command::new("locale")
109+
.env("LC_ALL", locale)
110+
.arg("charmap")
111+
.output()
112+
.map(|o| String::from_utf8_lossy(&o.stdout).trim() == "UTF-8")
113+
.unwrap_or(false)
114+
}
115+
103116
/// Read a test scenario fixture, returning its bytes
104117
fn read_scenario_fixture<S: AsRef<OsStr>>(tmpd: Option<&Rc<TempDir>>, file_rel_path: S) -> Vec<u8> {
105118
let tmpdir_path = tmpd.as_ref().unwrap().as_ref().path();

0 commit comments

Comments
 (0)