* Add decimals to int when using `into string --decimals` * Add tests for `into string` when converting int with `--decimals` * Apply formatting * Merge `into_str` test files * Comment out unused code and add TODOs * Use decimal separator depending on system locale * Add test helper to run closure in different locale * Add tests for int-to-string conversion using different locales * Add utils function to get system locale * Add panic message when locking mutex fails * Catch and resume panic later to prevent Mutex poisoning when test fails * Move test to `nu-test-support` to keep `nu-utils` free of `nu-*` dependencies See https://github.com/nushell/nushell/pull/6085#issuecomment-1193131694 * Rename test support fn `with_fake_locale` to `with_locale_override` * Move `get_system_locale()` to `locale` module * Allow overriding locale with special env variable (when not in release) * Use special env var to override locale during testing * Allow callback to return a value in `with_locale_override()` * Allow multiple options in `nu!` macro * Allow to set locale as `nu!` macro option * Use new `locale` option of `nu!` macro instead of `with_locale_override` Using the `locale` options does not lock the `LOCALE_OVERRIDE_MUTEX` mutex in `nu-test-support::locale_override` but instead calls the `nu` command directly with the `NU_LOCALE_OVERRIDE` environment variable. This allows for parallel test excecution. * Fix: Add option identifier for `cwd` in usage of `nu!` macro * Rely on `Display` trait for formatting `nu!` macro command - Removed the `DisplayPath` trait - Implement `Display` for `AbsolutePath`, `RelativePath` and `AbsoluteFile` * Default to locale `en_US.UTF-8` for tests when using `nu!` macro * Add doc comment to `nu!` macro * Format code using `cargo fmt --all` * Pass function directly instead of wrapping the call in a closure https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure * Pass function to `or_else()` instead of calling it inside `or()` https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call * Fix: Add option identifier for `cwd` in usage of `nu!` macro
47 lines
1.5 KiB
Rust
47 lines
1.5 KiB
Rust
#![cfg(debug_assertions)]
|
|
|
|
use std::sync::{Arc, Mutex};
|
|
|
|
use lazy_static::lazy_static;
|
|
use nu_utils::locale::LOCALE_OVERRIDE_ENV_VAR;
|
|
|
|
lazy_static! {
|
|
static ref LOCALE_OVERRIDE_MUTEX: Arc<Mutex<()>> = Arc::new(Mutex::new(()));
|
|
}
|
|
|
|
/// Run a closure in a fake locale environment.
|
|
///
|
|
/// Before the closure is executed, an environment variable whose name is
|
|
/// defined in `nu_utils::locale::LOCALE_OVERRIDE_ENV_VAR` is set to the value
|
|
/// provided by `locale_string`. When the closure is done, the previous value is
|
|
/// restored.
|
|
///
|
|
/// Environment variables are global values. So when they are changed by one
|
|
/// thread they are changed for all others. To prevent a test from overwriting
|
|
/// the environment variable of another test, a mutex is used.
|
|
pub fn with_locale_override<T>(locale_string: &str, func: fn() -> T) -> T {
|
|
let result = {
|
|
let _lock = LOCALE_OVERRIDE_MUTEX
|
|
.lock()
|
|
.expect("Failed to get mutex lock for locale override");
|
|
|
|
let saved = std::env::var(LOCALE_OVERRIDE_ENV_VAR).ok();
|
|
std::env::set_var(LOCALE_OVERRIDE_ENV_VAR, locale_string);
|
|
|
|
let result = std::panic::catch_unwind(func);
|
|
|
|
if let Some(locale_str) = saved {
|
|
std::env::set_var(LOCALE_OVERRIDE_ENV_VAR, locale_str);
|
|
} else {
|
|
std::env::remove_var(LOCALE_OVERRIDE_ENV_VAR);
|
|
}
|
|
|
|
result
|
|
};
|
|
|
|
match result {
|
|
Ok(result) => result,
|
|
Err(err) => std::panic::resume_unwind(err),
|
|
}
|
|
}
|