From 166342b021a2b886a6a234d6b21064016bcf796e Mon Sep 17 00:00:00 2001 From: AskaEth Date: Fri, 6 Nov 2026 20:19:03 +0800 Subject: [PATCH] =?UTF-8?q?fix(core,design):=20M147=20=E4=BF=AE=E6=8E=89?= =?UTF-8?q?=20test(ubuntu)=20=E5=89=A9=E4=B8=8B=E7=9A=84=E4=B8=A4=E6=9D=A1?= =?UTF-8?q?=E7=BA=A2=EF=BC=88M144=20=E8=A2=AB=20fail-fast=20=E6=8C=A1?= =?UTF-8?q?=E4=BD=8F=E6=B2=A1=E7=9C=8B=E8=A7=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `cargo test --workspace --all-targets --no-fail-fast` 在 docker 里(Debian 12 / rustc 1.99.1) 第一次跑全:app-iced 那条修好后,还有两个 target 各有一条 **Linux 专有**的确定性失败—— M144 只看到第一条,因为 cargo 默认在第一个失败 target 就停。两条都是「夹具/断言按 Windows 语义写死」,不是产品逻辑错。 1. `unlucky-core`:`platform::wallpaper::windows::tests::current_theme_expands_local_app_data_env_var` (crates/core/src/platform/wallpaper/windows.rs:286,460 passed / 1 failed) 夹具用了**混合分隔符**:`LOCAL_APP_DATA` 写 `C:/Users/u/AppData/Local`,而 `CUSTOM_THEME` 写 `C:\Users\u\AppData\Local\…`。探针把 `%LOCALAPPDATA%` 展开后拼上 `\Microsoft\…`,得到 `C:/Users/u/AppData/Local\Microsoft\…`;`FakeIo` 却按 `CUSTOM_THEME` 建键。Windows 的 `Path` 把 `/` 与 `\` 都当分隔符 ⇒ 两个 PathBuf 相等;Linux 不 ⇒ 查不到文件 ⇒ 0 个候选。 修法:`LOCAL_APP_DATA` 改成反斜杠原样(`r"C:\Users\u\AppData\Local"`),展开结果与 `CUSTOM_THEME` 逐字节相同。测试仍能在 Linux 跑,不丢覆盖(不是加 cfg 门躲开)。 2. `unlucky-design`:`color::palettes::tests::accent_on_fixed_neutral_only_moves_the_neutral_hue` (crates/design/src/color/palettes.rs,162 passed / 1 failed) `assert_eq!(Palettes, Palettes)` 做 f64 位相等,而两侧算中性色相的路径不同:一侧取 `NEUTRAL_HUE_DEG` 字面量,一侧经 `atan2()` 现算——glibc 与 UCRT 差 1 ulp (239.51420577630955 vs …964)。这正是 palettes.rs:361-365 那条注释自己警告过的坑。 修法:把「固定中性色相」喂成**种子色相的实测值**(`per_seed.neutral.hue_deg()`),两侧同源 ⇒ 断言保持**逐位相等**(比放宽容差更紧),零额外行。`NEUTRAL_HUE_DEG` 与种子色相的绑定仍由 隔壁 `neutral_hue_is_the_default_seed_hue` 用 1e-9° 容差钉着。 ⚠️ 这里没有照 tower 建议的「1e-9° 容差逐项比」:那个写法在 rustfmt 下要多 9 行,而本文件正好 400 行、顶在 guards.yml 的红线上。改完 399 行(比改前还少 1 行)。 验证(命令与 ci.yml 逐字一致,容器 ull-linux-check:bookworm): - `cargo test --workspace --all-targets --no-fail-fast` → **exit 0**(原 exit 101,2 targets failed) - `cargo clippy --workspace --all-targets -- -D warnings` → exit 0 - Windows:`cargo test -p unlucky-core --lib` → 464 passed / 0 failed; `cargo test -p unlucky-design --lib` → 163 passed / 0 failed(不回归) --- crates/core/src/platform/wallpaper/windows.rs | 6 +++++- crates/design/src/color/palettes.rs | 11 +++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/crates/core/src/platform/wallpaper/windows.rs b/crates/core/src/platform/wallpaper/windows.rs index f10ad58..041c01a 100644 --- a/crates/core/src/platform/wallpaper/windows.rs +++ b/crates/core/src/platform/wallpaper/windows.rs @@ -203,7 +203,11 @@ mod tests { use crate::platform::paths::{MapEnv, Platform}; const APP_DATA: &str = "C:/Users/u/AppData/Roaming"; - const LOCAL_APP_DATA: &str = "C:/Users/u/AppData/Local"; + // 反斜杠原样:本常量经 `%LOCALAPPDATA%` 展开后要与 `CUSTOM_THEME`(反斜杠原文)拼出**同一个 + // `PathBuf` 键**。写成 `C:/…` 会得到 `C:/Users/u/AppData/Local\Microsoft\…` 这种混合串—— + // Windows 的 `Path` 把 `/` 与 `\` 都当分隔符,Linux 只认 `/`,于是同一份夹具在 Linux 上永远 + // 查不到那个文件(M147 实测:CI 的 test(ubuntu) 就红在这条上)。 + const LOCAL_APP_DATA: &str = r"C:\Users\u\AppData\Local"; const DESKTOP_QUERY: &str = "reg.exe query HKCU\\Control Panel\\Desktop /v WallPaper"; const THEMES_QUERY: &str = "reg.exe query HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes /v CurrentTheme"; diff --git a/crates/design/src/color/palettes.rs b/crates/design/src/color/palettes.rs index e2a492e..e5b2d03 100644 --- a/crates/design/src/color/palettes.rs +++ b/crates/design/src/color/palettes.rs @@ -374,13 +374,12 @@ mod tests { #[test] fn accent_on_fixed_neutral_only_moves_the_neutral_hue() { let official = Palettes::official_baseline(); - // 中性色相 = 基线色相时,与官方的 from_seed 完全等价(不放宽算法)。 - let same = Palettes::accent_on_fixed_neutral(DEFAULT_SEED, NEUTRAL_HUE_DEG, 12.0); + // 中性色相取**种子色相的实测值**而不是 `NEUTRAL_HUE_DEG` 字面量:两者只差 `atan2()` 的末位 + // (见下一条测试),逐位比会在 glibc 与 UCRT 之间翻脸;取实测值两侧同源,断言仍是逐位相等。 let per_seed = Palettes::from_seed_with_neutral_chroma(DEFAULT_SEED, 12.0); - assert_eq!( - same, per_seed, - "中性色相取种子色相时必须与 TonalSpot 逐项相同" - ); + let seed_hue = per_seed.neutral.hue_deg(); + let same = Palettes::accent_on_fixed_neutral(DEFAULT_SEED, seed_hue, 12.0); + assert_eq!(same, per_seed, "中性色相取种子色相时须与 TonalSpot 相同"); // 换一个中性色相:只有中性两族的色相动,彩度与强调族一律不动。 let moved = Palettes::accent_on_fixed_neutral(DEFAULT_SEED, 120.0, 12.0);