Unlucky Launcher v0.2.0
CI / fmt (rustfmt --check) (push) Waiting to run
CI / clippy (ubuntu-latest) (push) Waiting to run
CI / clippy (windows-latest) (push) Waiting to run
CI / test (ubuntu-latest) (push) Waiting to run
CI / test (windows-latest) (push) Waiting to run
CI / build release (ubuntu-latest) (push) Waiting to run
CI / build release (windows-latest) (push) Waiting to run
CI / runtime smoke (ubuntu x64, xvfb) (push) Waiting to run
CI / runtime smoke (macos arm64, probe) (push) Skipped
Guards / core 零 UI 守门 (push) Waiting to run
Guards / presenter 零 UI 守门 (push) Waiting to run
Guards / design 零第三方依赖守门 (push) Waiting to run
Guards / unsafe 落点守门(集合必须恰好一个文件) (push) Waiting to run
Guards / 文件行数 ≤400 守门 (push) Waiting to run
Guards / 依赖许可与来源(cargo-deny) (push) Waiting to run

首个 iced + Material 3 Expressive 版本的源码快照。
完整历史与日常提交在 dev 分支;main 只放阶段性快照。
This commit is contained in:
AskaEth committed 2026-11-05 14:22:11 +08:00
commit 8a8e5ca0c0
1079 files changed
+208035

No files matched your search

+125
View File
@@ -0,0 +1,125 @@
//! 版本能力位:从版本 JSON 的库表推 `has_vulkan_backend`。
//!
//! 事实基线(`research/05-mc-vulkan.md` §2.2,piston-meta 921 个版本逐版扫过):
//! `org.lwjgl:lwjgl-vulkan` 从 **26.2-snapshot-1** 起出现,26.1 全线(含 `26w14a`)没有。
//! 所以「库在不在」是判断版本带不带 Vulkan 后端的可靠依据。
use unlucky_core::game::capability::{
is_vulkan_library, library_names_have_vulkan, VersionCapabilities,
};
use unlucky_core::game::manifest::VersionJson;
use crate::helpers::parse;
/// 26.2-snapshot-1 的库表形态(Vulkan 三件套 + 常规库,实测结构)。
const VULKAN_ERA_JSON: &str = r#"{
"id": "26.2-snapshot-1",
"type": "snapshot",
"mainClass": "net.minecraft.client.main.Main",
"libraries": [
{ "name": "org.lwjgl:lwjgl:3.4.1", "downloads": { "artifact": { "path": "org/lwjgl/lwjgl/3.4.1/lwjgl-3.4.1.jar" } } },
{ "name": "org.lwjgl:lwjgl-vulkan:3.4.1", "downloads": { "artifact": { "path": "org/lwjgl/lwjgl-vulkan/3.4.1/lwjgl-vulkan-3.4.1.jar" } } },
{ "name": "org.lwjgl:lwjgl-vulkan:3.4.1:natives-macos" },
{ "name": "org.lwjgl:lwjgl-shaderc:3.4.1" },
{ "name": "com.mojang:brigadier:1.3.10" }
]
}"#;
/// 26.1(含 `26w14a` 周快照那一段)的库表:只有 opengl,没有 vulkan。
const PRE_VULKAN_JSON: &str = r#"{
"id": "26.1",
"type": "release",
"mainClass": "net.minecraft.client.main.Main",
"libraries": [
{ "name": "org.lwjgl:lwjgl:3.4.1" },
{ "name": "org.lwjgl:lwjgl-glfw:3.4.1" },
{ "name": "org.lwjgl:lwjgl-opengl:3.4.1" }
]
}"#;
#[test]
fn version_json_with_lwjgl_vulkan_carries_the_capability() {
let version = parse(VULKAN_ERA_JSON);
assert!(version.has_vulkan_backend());
let capabilities = VersionCapabilities::from_json(&version);
assert!(capabilities.has_vulkan_backend());
}
#[test]
fn version_json_without_lwjgl_vulkan_lacks_the_capability() {
let version = parse(PRE_VULKAN_JSON);
assert!(!version.has_vulkan_backend());
assert_eq!(
VersionCapabilities::from_json(&version),
VersionCapabilities::default()
);
}
#[test]
fn missing_libraries_field_is_not_a_capability() {
let version = parse(r#"{ "id": "custom", "mainClass": "a.B" }"#);
assert!(!version.has_vulkan_backend());
}
#[test]
fn coordinate_forms_are_all_recognised() {
// 主构件、带 classifier 的 natives、带 @ext 的写法都算命中(只比对 group:artifact)。
assert!(is_vulkan_library("org.lwjgl:lwjgl-vulkan:3.4.3"));
assert!(is_vulkan_library(
"org.lwjgl:lwjgl-vulkan:3.4.3:natives-macos"
));
assert!(is_vulkan_library("org.lwjgl:lwjgl-vulkan:3.4.3@jar"));
// 相邻但不该命中的(前缀相同 / group 不同)。
assert!(!is_vulkan_library("org.lwjgl:lwjgl-opengl:3.4.3"));
assert!(!is_vulkan_library("org.lwjgl:lwjgl:3.4.3"));
assert!(!is_vulkan_library("com.mojang:lwjgl-vulkan:1.0"));
assert!(!is_vulkan_library("lwjgl-vulkan"));
assert!(!is_vulkan_library(""));
}
#[test]
fn library_name_slice_helper_matches_the_json_path() {
let names = ["org.lwjgl:lwjgl:3.4.1", "org.lwjgl:lwjgl-vulkan:3.4.1"];
assert!(library_names_have_vulkan(names));
assert!(!library_names_have_vulkan(["org.lwjgl:lwjgl:3.4.1"]));
assert!(!library_names_have_vulkan(std::iter::empty()));
// 与 game 侧的库表判定同源:同一份 JSON 两条路径给同一结论。
let version = parse(VULKAN_ERA_JSON);
assert_eq!(
library_names_have_vulkan(
version
.libraries
.as_deref()
.unwrap_or_default()
.iter()
.map(|l| l.name.as_str())
),
version.has_vulkan_backend()
);
}
#[test]
fn capability_bit_is_not_the_parameter_gate() {
// 26.2-snapshot-1 已经有库,却还没有 `--graphicsBackend`(实测差两天)。
// 能力位是「必要条件」,下发门限另有精确版本门(见 launch 侧
// `graphics_backend_allowed`),两者不能被压成一个判断。
let snapshot_one = parse(VULKAN_ERA_JSON);
assert!(
snapshot_one.has_vulkan_backend(),
"26.2-snapshot-1 有 Vulkan 库"
);
assert_eq!(snapshot_one.id.as_deref(), Some("26.2-snapshot-1"));
}
#[test]
fn version_json_accessor_delegates_to_capability_module() {
for json in [VULKAN_ERA_JSON, PRE_VULKAN_JSON] {
let version: VersionJson = parse(json);
assert_eq!(
version.has_vulkan_backend(),
VersionCapabilities::from_json(&version).has_vulkan_backend()
);
}
}