//! 「Downloads」分组自己的断言(M100 **新增**:`settings/tests.rs` 那 7 条全是跨 section 的, //! 一条 section 断言都没有;这 3 条是新增,不是搬移)。 //! //! **归 download 线**。接真控件那天要改**两个**文件(M101 r2 删掉了原先的第 3 处跨 section 绊线): //! `settings/download.rs` + 本文件。 //! //! 别把它和下载页(`pages/download*`)搞混:那是「装哪个版本」,这一组是「怎么下」的默认值。 use super::super::download; use unlucky_design::icons::IconKind; /// 这一组的行集合(标签 + 值)。 /// /// 抓得住:① 四条线并行合并时把别人的行粘到本文件(六份 `GROUP` 长得几乎一样,最容易整块贴错); /// ② 漏掉/多出一条行;③ 标签与值错位。 /// 抓不住:值对不对——这三行**本来就不是值**(M193 起改成语义行,见下一条用例)。 #[test] fn the_downloads_group_shows_concurrency_retries_and_the_gh_proxy_key() { let rows: Vec<(&str, &str)> = download::GROUP.rows.to_vec(); assert_eq!( rows, vec![ ("并发数", "出厂 8 · 可调 1~64"), ("单源尝试次数", "出厂 3 · 含首次 · 0/1 = 只试一次"), ("GitHub 加速前缀", "留空 = 跟随内置默认"), ("关掉它", "填 off = 关闭"), ("换掉它", "填 URL 前缀 = 覆盖"), ] ); } /// 左列图标(`IconKind::Download`)。与导航轨的「下载」同族,换掉就与 rail 语汇不一致。 #[test] fn the_downloads_group_keeps_its_icon() { assert_eq!(download::GROUP.icon, IconKind::Download); } /// **M193 换了绊线的内容,但没撤绊线**。 /// /// 原绊线是 `the_downloads_group_is_still_demo_rows`:断言 `body.is_none()`(这一组还没接真控件)。 /// 它存在的意义是「防止演示值回潮」。M193 撤掉的只是**演示值**(`("Concurrency", "8 threads")` /// 这类):那个 8 与引擎真实的 64 对不上,用户按它调设置自然没效果。 /// /// 现在改成两条更硬的断言: /// /// 1. **仍然没有真控件**(`body.is_none()`)——真值的通路还没接(`State` 是空 struct、 /// iced 侧没有设置快照),所以这一组还是静态行;接上那天把这条改成 `is_some()` 并接数据。 /// 2. **行里不许再出现「当前值」形态的字面量**:三行必须把「出厂值 / 区间 / 三态」讲清楚, /// 且 gh-proxy 那一行必须**同时**说清「留空 = 跟随内置默认」与「填 off = 关闭」—— /// 这两者最容易被混(一个「我没决定」,一个是「我明确不要」)。 /// /// 变异证明:把 `download.rs` 的 gh_proxy 行改回 `("Preferred source", "Automatic (region)")` /// ⇒ 第 2 条红;把 `enabled` 语义写成「留空 = 关闭」⇒ 第 2 条红。 #[test] fn the_downloads_rows_state_semantics_and_never_fake_a_current_value() { assert!( download::GROUP.body.is_none(), "Downloads 还没接真控件:接了就改成 is_some() 并接数据通路" ); let joined = download::GROUP .rows .iter() .map(|(label, value)| format!("{label} {value}")) .collect::>() .join(" | "); for required in [ // 三态里最容易被混的两档,必须都在(缺一个就是「设置项说假话」的种子)。 "留空 = 跟随内置默认", "填 off = 关闭", "填 URL 前缀 = 覆盖", // 硬上限必须在界面上说清(任务书的边界条款)。 "1~64", // P2-1:0 是旧版提供过的档位,界面必须说清它 = 只试一次(不是「不下载」)。 "0/1 = 只试一次", // 三个键各自是哪一行(标签本身也是契约:用户按它认设置)。 "并发数", "单源尝试次数", "GitHub 加速前缀", ] { assert!( joined.contains(required), "行里缺少「{required}」:{joined}" ); } // 「当前值」形态的假数据:`8 threads` / `On` / `Automatic (region)` 都是当年被投诉的那类。 for forbidden in ["threads", "Automatic (region)", "Verify checksums"] { assert!( !joined.contains(forbidden), "又出现假的当前值「{forbidden}」:{joined}" ); } }