- 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 = 只试一次)。
96 lines
4.3 KiB
Rust
96 lines
4.3 KiB
Rust
//! 「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}"
|
||
);
|
||
}
|
||
}
|