fix(m157): r4 修复未收集的周快照用例 + 两处 clippy 红,并补整环回归(复审 p1-2)
P1-1 crates/core/src/launch/overrides/tests.rs:modded_weekly_snapshot_needs_the_root_version_for_the_gate 原先写在 backend_allowed_combines_capability_and_threshold 函数体内(unnameable_test_items,永不执行)。移到模块层;移动后首次真正执行暴露出用例自身的 EmptyJavaPath(AdapterOptions 默认 java 为空),补 JavaSelection 后绿。--list 现在 10 条 launch::overrides::tests::(含该名字)。
P1-2 clippy -D warnings 两处:cli/commands/instance_launch.rs needless_borrows_for_generic_args(去 &);presenter/mock_data.rs items_after_test_module(mock_launch 移到 mod tests 之前)。
P3-a 新增整环回归 app/tests/instances_save_loop.rs:真 Message → dispatch → 后端回错误 Toast → pump → refresh_view → sync_launch_form,断言 4g 草稿与脏标记都还在。
P3-b LaunchForm::matches 内存改按数值比(解析失败退文本),补 memory_is_compared_by_value_not_by_text(04096 / +4096 / 清空三档)。
P3-c 门槛文案不再在 catalog 硬编码 26.2:InstancesLaunchBackendGated 改用 {min} 占位符,页面从 LaunchFacts::min_version(← core GRAPHICS_BACKEND_MIN_VERSION)代入;金表同步;灰化态截图重拍。
This commit is contained in:
1 parent
211e07b470
commit
ee67965b9b
11 files changed
+285
-87
No files matched your search
@@ -196,7 +196,7 @@ fn backend_row<'a>(
|
||||
ui,
|
||||
TypeRole::BodySmall,
|
||||
false,
|
||||
texts.launch_backend_gated(&facts.mc_version),
|
||||
texts.launch_backend_gated(&facts.mc_version, &facts.min_version),
|
||||
ui.color(Role::Error),
|
||||
));
|
||||
}
|
||||
|
||||
@@ -87,17 +87,30 @@ impl LaunchForm {
|
||||
|
||||
/// 表单当前内容是否与一份快照(= 盘上已持久化的值)完全一致。
|
||||
///
|
||||
/// 比较的是**文本口径**:内存按「快照有值 → 十进制串,无值 → 空串」对齐,其余直接比原文。
|
||||
/// **内存按数值比**:host 会把 `"04096"` / `"+4096"` 归一成 `4096` 落盘,回程快照给的是
|
||||
/// `Some(4096)`——按文本比会永远不等,于是表单一直脏、也不再跟随外部改动(r4 复审 P3-b)。
|
||||
/// 解析失败(用户正在敲半截)才退回文本口径。
|
||||
/// 其余字段直接比原文(JVM/游戏参数由 core 的 `tokenize` 消费,不做归一)。
|
||||
#[must_use]
|
||||
pub fn matches(&self, view: &LaunchArgsView) -> bool {
|
||||
let memory = view.memory_mb.map(|mb| mb.to_string()).unwrap_or_default();
|
||||
self.jvm.trim() == view.jvm_args.trim()
|
||||
&& self.game.trim() == view.game_args.trim()
|
||||
&& self.memory.trim() == memory
|
||||
&& self.memory_matches(view.memory_mb)
|
||||
&& self.java.trim() == view.java_path.trim()
|
||||
&& self.backend == view.graphics_backend
|
||||
}
|
||||
|
||||
/// 内存字段是否等于快照里的值(数值优先,解析失败退文本)。
|
||||
fn memory_matches(&self, persisted: Option<u32>) -> bool {
|
||||
let typed = self.memory.trim();
|
||||
match (typed.parse::<u32>(), persisted) {
|
||||
(Ok(typed), Some(persisted)) => typed == persisted,
|
||||
// 空输入 = 跟随全局:快照那边也应当是「没有实例覆盖」。
|
||||
(Err(_), None) => typed.is_empty(),
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
/// 提交补丁:**五项全给**(表单是整份可见的,不用增量语义会让「清空」无法表达)。
|
||||
#[must_use]
|
||||
pub fn patch(&self) -> LaunchArgsPatch {
|
||||
@@ -229,6 +242,34 @@ mod tests {
|
||||
assert_eq!(form.jvm, "-Xss4m");
|
||||
}
|
||||
|
||||
/// **内存按数值比**(r4 复审 P3-b):`04096` / `+4096` 落盘后回程是 `4096`,必须判等。
|
||||
///
|
||||
/// 抓得住:`matches` 退回文本比较——那样这两类输入会永远「没保存成功」,表单一直脏、
|
||||
/// 之后外部改配置也不再重播种。
|
||||
#[test]
|
||||
fn memory_is_compared_by_value_not_by_text() {
|
||||
for typed in ["04096", "+4096", " 4096 "] {
|
||||
let mut form = LaunchForm::from_view(Some("a"), &view("a", "", Some(4096), "default"));
|
||||
form.memory = typed.to_string();
|
||||
form.dirty = true;
|
||||
assert!(
|
||||
form.matches(&view("a", "", Some(4096), "default")),
|
||||
"`{typed}` 应判等"
|
||||
);
|
||||
form.sync(&view("a", "", Some(4096), "default"));
|
||||
assert!(!form.dirty, "`{typed}` 保存确认后要清脏");
|
||||
}
|
||||
// 数值不等就是不等于;半截输入(解析失败)也不许判等。
|
||||
let mut form = LaunchForm::from_view(Some("a"), &view("a", "", Some(4096), "default"));
|
||||
form.memory = "8".to_string();
|
||||
assert!(!form.matches(&view("a", "", Some(4096), "default")));
|
||||
form.memory = "4g".to_string();
|
||||
assert!(!form.matches(&view("a", "", Some(4096), "default")));
|
||||
// 清空 = 跟随全局:快照也得是「没有实例覆盖」。
|
||||
form.memory.clear();
|
||||
assert!(form.matches(&view("a", "", None, "default")));
|
||||
}
|
||||
|
||||
/// 补丁五项全给:空串就是「清空」,不留 `None` 让 host 猜。
|
||||
#[test]
|
||||
fn patch_always_covers_all_five_fields() {
|
||||
|
||||
@@ -61,7 +61,7 @@ const PAGE_SOURCES: [(&str, &str); 6] = [
|
||||
/// | `isolated` / `shared` | core 的隔离档位**稳定 id**(`IsolationMode::as_str`),`isolation()` 只认这两档,其余原样上屏 |
|
||||
/// | `pid` / `reason` | `Catalog::render` 的**占位符名**(与 catalog 里的 `{pid}` / `{reason}` 对应) |
|
||||
/// | `Instances` | `Texts::keys()` 的**族名前缀**(`Key::ALL` 的过滤条件,不是文案) |
|
||||
const ALLOWED_LITERALS: [&str; 18] = [
|
||||
const ALLOWED_LITERALS: [&str; 19] = [
|
||||
"{date} {time} UTC",
|
||||
"isolated",
|
||||
"shared",
|
||||
@@ -76,6 +76,8 @@ const ALLOWED_LITERALS: [&str; 18] = [
|
||||
// M157:`Catalog::render` 的占位符名(`{version}` / `{value}` / `{default}`),不是文案。
|
||||
"version",
|
||||
"value",
|
||||
// M157 r4:门槛文案的占位符名(版本号由 DTO 给,目录里不写死)。
|
||||
"min",
|
||||
// M157:`instances/demo.rs` 的**出图夹具**(用户数据的形状,不是界面文案):
|
||||
// 一个示例 JVM 参数、两个示例 MC 版本、一个示例 Java 路径,以及夹具开关的环境变量名与取值。
|
||||
"-XX:+UseG1GC",
|
||||
|
||||
@@ -120,10 +120,15 @@ impl Texts {
|
||||
pub(super) fn launch_backend(self) -> &'static str {
|
||||
self.text(Key::InstancesLaunchBackend)
|
||||
}
|
||||
/// 「需游戏版本 26.2 及以上(本实例 1.20.4)」。
|
||||
pub(super) fn launch_backend_gated(self, version: &str) -> String {
|
||||
self.0
|
||||
.render(Key::InstancesLaunchBackendGated, &[("version", version)])
|
||||
/// 「需游戏版本 {min} 及以上(本实例 {version})」。
|
||||
///
|
||||
/// `min` 来自 DTO(`LaunchFacts::min_version` ← core 的 `GRAPHICS_BACKEND_MIN_VERSION`),
|
||||
/// **不在目录里硬编码版本号**——否则 core 一改门槛,文案会继续骗人(r4 复审 P3-c)。
|
||||
pub(super) fn launch_backend_gated(self, version: &str, min: &str) -> String {
|
||||
self.0.render(
|
||||
Key::InstancesLaunchBackendGated,
|
||||
&[("version", version), ("min", min)],
|
||||
)
|
||||
}
|
||||
/// 「生效:vulkan」。
|
||||
pub(super) fn launch_effective(self, value: &str) -> String {
|
||||
|
||||
Reference in new issue
Block a user