//! 主题三档(Ink / Silver / 跟随系统)的落点测试(M229;从 `app/tests.rs` 拆出守 400 行)。 //! //! 这一份只管**用户点设置页那三枚 chip 之后**发生的事:换色板、同步设置组状态、落盘。 //! `Auto`(跟随系统)那条路在 `app::tests::the_system_theme_never_overrides_an_explicit_one`。 use crate::app::message::Message; use crate::app::state::App; use crate::cli::Options; use crate::pages; use crate::theme::Families; use unlucky_design::color::SchemeFlavor; use unlucky_presenter::mock::MockBackend; use unlucky_presenter::prefs::ThemeMode; use unlucky_presenter::settings_bridge::SettingsBridge; const FAMILIES: Families = Families { text: "Segoe UI", display: "Segoe UI", mono: "Consolas", }; /// 一个把配置写在临时文件里的 App:测「落盘」必须真的过文件(内存桥读回来永远是出厂值)。 fn with_config() -> (App, std::path::PathBuf) { let dir = std::env::temp_dir().join(format!("ull-theme-m229-{}", std::process::id())); std::fs::create_dir_all(dir.join("config")).expect("临时目录"); let path = dir.join("config/launcher.json"); std::fs::write(&path, "{}").expect("写配置文件"); let app = App::with_presenter( Options::default(), FAMILIES, SchemeFlavor::Light, Box::new(MockBackend::new()), SettingsBridge::with_path(&path), ); (app, dir) } /// M229:设置页「通用 → 主题」三档(Ink / Silver / 跟随系统)真的换色板、真的落盘。 /// /// 抓得住:①`pages::Message::Theme` 没接进 `on_page`(点了没反应)②接了但不换 `Ui` /// (只有选中态变了,界面颜色还是旧的)③同步设置组状态漏了(设置页首帧/刷新后画错档) /// ④落盘漏了(重启回旧值——这里**真的过文件**:`with_config` 用 `SettingsBridge::with_path` 写临时 /// 配置,再用同一路径重新 `load()` 读回;内存桥读回来永远是出厂值,验不了落盘)。 /// 抓不住:色板好不好看、像素级差异(那要截图,见 `DevDocs/artifacts/m229/`)。 #[test] fn the_theme_message_switches_the_board_and_persists_it() { let (mut app, dir) = with_config(); assert_eq!(app.board_name(), "silver", "首帧是浅色主方案(Silver)"); // 选 Ink(= 深色主方案) let _ = app.update(Message::Page(pages::Message::Theme(ThemeMode::Dark))); assert_eq!(app.theme_mode(), ThemeMode::Dark); assert_eq!(app.board_name(), "ink", "Ink 深板要真切过去"); assert_eq!(app.ui().flavor(), SchemeFlavor::Dark); assert_eq!( app.settings.language_appearance.theme, ThemeMode::Dark, "设置页那一行的档位要跟着改" ); // 落盘:真的过了文件(重新打开同一个配置读回来就是 dark) assert_eq!( SettingsBridge::with_path(dir.join("config/launcher.json")) .load() .1, ThemeMode::Dark, "主题档要落盘" ); // 选 Silver(= 浅色主方案) let _ = app.update(Message::Page(pages::Message::Theme(ThemeMode::Light))); assert_eq!(app.board_name(), "silver"); assert_eq!(app.ui().flavor(), SchemeFlavor::Light); assert_eq!( SettingsBridge::with_path(dir.join("config/launcher.json")) .load() .1, ThemeMode::Light ); // 同一档再点一次:不许白重建 let refreshes = app.refreshes; let _ = app.update(Message::Page(pages::Message::Theme(ThemeMode::Light))); assert_eq!(app.refreshes, refreshes, "同一档不该再重建视图模型"); std::fs::remove_dir_all(&dir).ok(); }