Files
Unlucky-Launcher/crates/app-iced/src/pages/settings/tests/download_section.rs
T
worker-dlmsettings 94f56f9d9c fix(m193): 复审 r1 三条 P2——版本史还原、retry_limit 0 有诚实语义、装配点措辞更正
- P2-2:keys.rs 的 schema 版本史按原文逐字还原(1.4.0/1.5.0 的键名、1.2.0 的迁移口径、
  旧读新的完整结论),不再用版本文档换行数;腾行改从我自己新加的注释里出。
- P2-1:download.retry_limit 范围恢复 0~10,并把 0 的语义定成「只试一次」(attempts = max(1, 0)):
  老配置合法、零迁移、ull config get 读到的 0 与引擎真做的事一致(不再回落出厂 3)。
  schema 描述与 presenter/iced 两处 UI 都写清「0 与 1 都 = 只试一次,不代表不下载」。
- P2-3:shared.rs 的「唯一一处装配」更正为「presenter 侧唯一一处」(CLI 还有三处自建),
  docs 加「哪些路径吃这套设置」表,并立 finding(CLI install/java/pack 不读设置、并发 64→8)。
- P3-3:mirrors.rs 的 gh_proxies 注释改成「无生产读者,仅解析留档」。
- P3-4(presenter 侧):并发/重试描述的出厂值与上限改用常量 format!,不再是第二处字面量。
- 出图重拍(含 0/1 = 只试一次)。
2026-11-09 05:24:12 +08:00

96 lines
4.3 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! 「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::<Vec<_>>()
.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}"
);
}
}