Files
agentmc/tests/test_version.py

76 lines
3.6 KiB
Python
Raw Permalink 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.

"""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 版本解析:全部通过")