From ab192fe69c9faa9a2bf4318a1d2b391f6a829f3c Mon Sep 17 00:00:00 2001 From: LING71671 <1739677116@qq.com> Date: Wed, 27 May 2026 23:34:05 +0800 Subject: [PATCH] fix(config): normalize cost currency display comparison --- crates/tui/src/tui/views/mod.rs | 73 +++++++++++++++++++++++++++++---- 1 file changed, 66 insertions(+), 7 deletions(-) diff --git a/crates/tui/src/tui/views/mod.rs b/crates/tui/src/tui/views/mod.rs index 0b6a805f..26c381d5 100644 --- a/crates/tui/src/tui/views/mod.rs +++ b/crates/tui/src/tui/views/mod.rs @@ -1124,14 +1124,16 @@ impl ConfigView { } fn row_display_value(&self, row: &ConfigRow) -> String { - if row.key == "cost_currency" - && row.scope == ConfigScope::Saved - && row.value != self.effective_cost_currency - { - format!("{} (effective {})", row.value, self.effective_cost_currency) - } else { - row.value.clone() + if row.key == "cost_currency" && row.scope == ConfigScope::Saved { + let saved_cost_currency = crate::pricing::CostCurrency::from_setting(&row.value); + let effective_cost_currency = + crate::pricing::CostCurrency::from_setting(&self.effective_cost_currency); + if saved_cost_currency != effective_cost_currency { + return format!("{} (effective {})", row.value, self.effective_cost_currency); + } } + + row.value.clone() } } @@ -2120,6 +2122,26 @@ mod tests { App::new(options, &Config::default()) } + fn cost_currency_row_for_settings( + settings_toml: &str, + ) -> (String, String, crate::pricing::CostCurrency, Locale) { + let _guard = ConfigSettingsEnvGuard::new(settings_toml); + let app = create_test_app(); + let view = ConfigView::new_for_app(&app); + let row = view + .rows + .iter() + .find(|row| row.key == "cost_currency") + .expect("cost_currency row"); + + ( + row.value.clone(), + view.row_display_value(row), + app.cost_currency, + app.ui_locale, + ) + } + fn type_filter(view: &mut ConfigView, text: &str) { for ch in text.chars() { let action = view.handle_key(KeyEvent::new(KeyCode::Char(ch), KeyModifiers::NONE)); @@ -2319,6 +2341,43 @@ mod tests { assert_eq!(Settings::load().expect("settings").cost_currency, "usd"); } + #[test] + fn config_view_cost_currency_aliases_matching_effective_currency_are_silent() { + for alias in ["rmb", "yuan", "¥"] { + let (saved_value, display_value, effective_currency, locale) = + cost_currency_row_for_settings(&format!( + "locale = \"zh-Hans\"\ncost_currency = \"{alias}\"\n" + )); + + assert_eq!(locale, Locale::ZhHans); + assert_eq!(effective_currency, crate::pricing::CostCurrency::Cny); + assert_eq!(saved_value, alias); + assert_eq!(display_value, alias); + } + } + + #[test] + fn config_view_cost_currency_matching_cny_setting_is_silent() { + let (saved_value, display_value, effective_currency, locale) = + cost_currency_row_for_settings("locale = \"zh-Hans\"\ncost_currency = \"cny\"\n"); + + assert_eq!(locale, Locale::ZhHans); + assert_eq!(effective_currency, crate::pricing::CostCurrency::Cny); + assert_eq!(saved_value, "cny"); + assert_eq!(display_value, "cny"); + } + + #[test] + fn config_view_cost_currency_non_zh_hans_locale_uses_saved_currency() { + let (saved_value, display_value, effective_currency, locale) = + cost_currency_row_for_settings("locale = \"en\"\ncost_currency = \"cny\"\n"); + + assert_eq!(locale, Locale::En); + assert_eq!(effective_currency, crate::pricing::CostCurrency::Cny); + assert_eq!(saved_value, "cny"); + assert_eq!(display_value, "cny"); + } + #[test] fn config_view_exposes_all_available_saved_settings() { let app = create_test_app();