feat(mcfold): P1 按实例文件夹解析版本(inheritsFrom 归一化 + 加载器判定)+ 回归测试
This commit is contained in:
75
tests/test_version.py
Normal file
75
tests/test_version.py
Normal file
@ -0,0 +1,75 @@
|
||||
"""P1 回归:按文件夹解析版本。"""
|
||||
import sys, os
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
from pathlib import Path
|
||||
from mcfold.version import list_versions, resolve_version, parse_version_json
|
||||
import json, tempfile
|
||||
|
||||
def mk(d, vid, obj):
|
||||
p = Path(d)/"versions"/vid; p.mkdir(parents=True)
|
||||
(p/f"{vid}.json").write_text(json.dumps(obj))
|
||||
|
||||
def test_vanilla():
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
mk(d, "1.20.1", {"id":"1.20.1","mainClass":"net.minecraft.client.main.Main","assets":"5","libraries":[{}]*88})
|
||||
vs = list_versions(d)
|
||||
assert len(vs)==1, vs
|
||||
v = vs[0]
|
||||
assert v.mc_version=="1.20.1" and v.loader=="vanilla" and not v.is_modded
|
||||
print(" ✓ vanilla: 1.20.1 -> loader=vanilla, assets=5, libs=88")
|
||||
|
||||
def test_forge_inherits():
|
||||
"""核心用例:forge 的 id 不能当协议版本,必须走 inheritsFrom。"""
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
mk(d, "1.20.1-forge-47.4.0", {
|
||||
"id":"1.20.1-forge-47.4.0","inheritsFrom":"1.20.1",
|
||||
"mainClass":"io.github.zekerzhayard.forgewrapper.installer.Main"})
|
||||
v = list_versions(d)[0]
|
||||
assert v.mc_version=="1.20.1", v.mc_version # ← 归一化
|
||||
assert v.version_id=="1.20.1-forge-47.4.0"
|
||||
assert v.loader=="forge" and v.is_modded
|
||||
print(" ✓ forge: id=1.20.1-forge-47.4.0 -> mc_version=1.20.1, loader=forge")
|
||||
|
||||
def test_fabric_inherits():
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
mk(d, "fabric-loader-0.19.5-1.20.1", {
|
||||
"id":"fabric-loader-0.19.5-1.20.1","inheritsFrom":"1.20.1",
|
||||
"mainClass":"net.fabricmc.loader.impl.launch.knot.KnotClient"})
|
||||
v = list_versions(d)[0]
|
||||
assert v.mc_version=="1.20.1" and v.loader=="fabric", (v.mc_version,v.loader)
|
||||
print(" ✓ fabric: -> mc_version=1.20.1, loader=fabric")
|
||||
|
||||
def test_prefer_and_vanilla_priority():
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
mk(d, "1.20.1", {"id":"1.20.1","mainClass":"net.minecraft.client.main.Main"})
|
||||
mk(d, "1.20.1-forge-47.4.0", {"id":"1.20.1-forge-47.4.0","inheritsFrom":"1.20.1",
|
||||
"mainClass":"io.github.zekerzhayard.forgewrapper.installer.Main"})
|
||||
# 不指定时 prior vanilla(最稳)
|
||||
assert resolve_version(d).loader=="vanilla"
|
||||
# 指定时按指定来
|
||||
assert resolve_version(d, "1.20.1-forge-47.4.0").loader=="forge"
|
||||
print(" ✓ 默认优先 vanilla;prefer 可显式选 forge")
|
||||
|
||||
def test_garbage_skipped():
|
||||
"""半途安装的残留目录(无 json)必须跳过,而不是崩。"""
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
(Path(d)/"versions"/"broken").mkdir(parents=True)
|
||||
mk(d, "1.20.1", {"id":"1.20.1","mainClass":"net.minecraft.client.main.Main"})
|
||||
vs = list_versions(d)
|
||||
assert len(vs)==1, [v.version_id for v in vs]
|
||||
assert resolve_version(d) is not None
|
||||
print(" ✓ 无 json 的残留目录被跳过")
|
||||
|
||||
def test_real_install():
|
||||
"""对真实 mcview 安装目录验证(若存在)。"""
|
||||
real = "/home/newqqagent/mcview/store/vanilla-1.20.1"
|
||||
if not Path(real).is_dir(): print(" - 真实安装目录不存在,跳过"); return
|
||||
v = resolve_version(real)
|
||||
assert v is not None
|
||||
print(f" ✓ 真实安装: {v.version_id} -> mc={v.mc_version} loader={v.loader} libs={v.libs_count} jar={'有' if v.jar_path else '无'}")
|
||||
|
||||
if __name__=="__main__":
|
||||
for fn in [test_vanilla, test_forge_inherits, test_fabric_inherits,
|
||||
test_prefer_and_vanilla_priority, test_garbage_skipped, test_real_install]:
|
||||
fn()
|
||||
print("\nP1 版本解析:全部通过")
|
||||
Reference in New Issue
Block a user