Files
RustNotMC/tests/test_worldgen_parity.py
SashegDev 874b6f20c2 Клиент: начальный импорт кодовой базы
Основа — Horizon (MIT). История апстрима не переносится: этот репозиторий ведёт свою.
2026-10-29 22:04:28 +03:00

151 lines
9.0 KiB
Python

from pathlib import Path
import itertools
import json
import tempfile
import unittest
from unittest import mock
from tools import test_worldgen_parity as parity
class WorldgenRunnerTests(unittest.TestCase):
def test_failed_verification_removes_previous_success(self):
with tempfile.TemporaryDirectory() as temp:
report = Path(temp)/"rust-worldgen-parity/report.json"
report.parent.mkdir()
report.write_text('{"previous_success":true}')
with mock.patch.object(parity.lab,"LOCAL",Path(temp)), mock.patch("sys.argv",["parity"]), \
mock.patch.object(parity.base,"verify_artifacts",side_effect=ValueError("corrupt artifact")):
with self.assertRaisesRegex(ValueError,"corrupt artifact"):
parity.main()
self.assertFalse(report.exists())
def test_corpus_keeps_numeric_text_and_checks_all_sampling_modes(self):
resources = {"fixture":"{\"base_octave\":-7}"}
commands = list(parity.corpus(resources))
self.assertEqual(commands,list(parity.corpus(resources)))
self.assertEqual(len(commands),599)
self.assertEqual({tuple(line.split(" ",4)[2:4]) for line in commands}, {(str(a),str(b)) for a in [0,1] for b in [0,1]})
text = "\n".join(commands)
for retained in ["4294967295","-4294967297.9","1.9999999999999999999","[-0]","[-0.0]","0.000009999999747378751","0.000009999999747378752"]:
self.assertIn(retained,text)
def test_different_client_registry_is_rejected_before_building(self):
with tempfile.TemporaryDirectory() as temp:
with mock.patch.object(parity.lab,"LOCAL",Path(temp)), mock.patch("sys.argv",["parity"]), \
mock.patch.object(parity.base,"verify_artifacts",return_value=({}, {"server":"server", "client":"client"}, [])), \
mock.patch.object(parity,"noise_resources",side_effect=[{"a":"{}"},{"a":"{\"different\":true}"}]), \
mock.patch.object(parity.base,"run") as run:
with self.assertRaisesRegex(ValueError,"resources differ"):
parity.main()
run.assert_not_called()
def test_density_and_settings_mismatches_are_rejected_before_building(self):
for kind in ["density", "settings"]:
with self.subTest(kind=kind), tempfile.TemporaryDirectory() as temp:
matching = [{"a":"{}"},{"a":"{}"}]
mismatch = [{"a":"{}"},{"a":"{\"changed\":true}"}]
outputs = mismatch if kind == "density" else matching + mismatch
with mock.patch.object(parity.lab,"LOCAL",Path(temp)), mock.patch("sys.argv",["parity"]), \
mock.patch.object(parity.base,"verify_artifacts",return_value=({}, {"server":"server", "client":"client"}, [])), \
mock.patch.object(parity,"noise_resources",return_value={"a":"{}"}), \
mock.patch.object(parity,"registry_resources",side_effect=outputs), \
mock.patch.object(parity.base,"run") as run:
with self.assertRaisesRegex(ValueError,"resources differ"):
parity.main()
run.assert_not_called()
def test_climate_corpus_is_deterministic_and_retains_nonfinite_inputs(self):
commands = list(parity.climate_corpus())
self.assertEqual(commands,list(parity.climate_corpus()))
self.assertEqual(len(commands),4116)
text = "\n".join(commands)
for retained in ["7f800001","ff800000","80000000",str(-2**63),str(2**63-1)]:
self.assertIn(retained,text)
def test_index_corpus_preserves_ordered_warm_tie_queries(self):
commands = list(itertools.islice(parity.index_corpus(),5))
self.assertEqual(commands,list(itertools.islice(parity.index_corpus(),5)))
values = json.loads(commands[0].split(" ",2)[2])
self.assertEqual([v["coordinates"][0] for v in values["entries"]],[[-10,-10],[10,10]])
self.assertEqual([v[0] for v in values["targets"]],[10,0,-10,0,10,0])
self.assertEqual(json.loads(commands[-1].split(" ",2)[2])["entries"],[])
def test_climate_codec_corpus_retains_precision_and_missing_fields(self):
commands = list(parity.climate_codec_corpus())
self.assertEqual(commands,list(parity.climate_codec_corpus()))
self.assertEqual(len(commands),208)
self.assertIn("climate_parameter 2.0000001192092895507812500000000001",commands)
self.assertIn("climate_parameter [0,-0]",commands)
point_inputs = [json.loads(command.split(" ",1)[1]) for command in commands if command.startswith("climate_point ")]
self.assertTrue(any("offset" not in value for value in point_inputs))
def test_settings_corpus_keeps_json_and_runtime_construction_separate(self):
resources = {"fixture":'{"noise":{"min_y":-64,"height":384}}'}
commands = list(parity.settings_corpus(resources))
self.assertEqual(commands,list(parity.settings_corpus(resources)))
self.assertEqual(len(commands),393)
self.assertIn("settings_create -2147483648 -2147483648",commands)
self.assertIn('noise_settings {"min_y":16.9999999999999999999,"height":16}',commands)
def test_aquifer_corpus_keeps_nan_density_and_fluid_cutoff_boundaries(self):
commands = list(parity.aquifer_corpus())
self.assertEqual(commands,list(parity.aquifer_corpus()))
self.assertEqual(len(commands),9136)
self.assertIn("aquifer 63 0 0 -54 0 7ff0000000000001",commands)
self.assertIn("aquifer -64 4 0 -65 0 8000000000000000",commands)
def test_noise_aquifer_corpus_preserves_stateful_queries_and_all_failures(self):
resources={"minecraft:overworld":"{}"}
commands=list(parity.noise_aquifer_corpus("bundle.json",resources))
self.assertEqual(commands,list(parity.noise_aquifer_corpus("bundle.json",resources)))
fixtures=[json.loads(command.split(" ",5)[5]) for command in commands]
self.assertEqual({tuple(f["fail"]) for f in fixtures if "fail" in f},
{(field,occurrence) for field in range(6) for occurrence in [1,2,8]})
for field in range(6):
overrides={f["overrides"][field] for f in fixtures if "overrides" in f}
self.assertTrue({"7fc00000","7f800001","7f800000","ff800000","80000000"} <= overrides)
text="\n".join(commands)
self.assertIn("7ff0000000000001",text)
self.assertIn("minecraft:missing",text)
self.assertTrue(any(f["fluid"]==7 for f in fixtures))
self.assertTrue(any(f["steps"]==[4,2,4] for f in fixtures))
def test_tag_corpus_covers_cycles_replacement_and_codec_numeric_types(self):
commands=list(parity.tag_corpus({"minecraft:example":'{"values":["stone"]}'}))
self.assertEqual(commands,list(parity.tag_corpus({"minecraft:example":'{"values":["stone"]}'})))
self.assertIn('tag_entry {"id":"stone","required":0.5}',commands)
self.assertIn('tag_entry "#"',commands)
fixtures=[json.loads(command[5:]) for command in commands if command.startswith("tags ")]
self.assertTrue(any('"replace":true' in row[2] for f in fixtures for row in f["files"]))
self.assertTrue(any('"#a"' in row[2] and row[0]=="b" for f in fixtures for row in f["files"]))
self.assertTrue(any(row[2]=="{}" for f in fixtures for row in f["files"]))
def test_different_builtin_biome_tables_fail_before_rust_build(self):
with tempfile.TemporaryDirectory() as temp:
exports = []
def run(command, **kwargs):
if "dev.horizonlab.parity.VanillaBiomeExport" in command:
destination = Path(command[-1])
destination.write_text(json.dumps({"minecraft:fixture":str(len(exports))}))
exports.append(destination)
self.assertNotIn("cargo",command)
resources = [
{"data/minecraft/worldgen/density_function/a.json":"0"},
{"data/minecraft/worldgen/noise_settings/a.json":"{}"},
]
with mock.patch.object(parity.lab,"LOCAL",Path(temp)), mock.patch("sys.argv",["parity"]), \
mock.patch.object(parity.base,"verify_artifacts",return_value=({"minecraft":{"java_major":25}}, {"server":"server", "client":"client"}, [])), \
mock.patch.object(parity,"noise_resources",return_value={"data/minecraft/worldgen/noise/a.json":"{}"}), \
mock.patch.object(parity,"registry_resources",side_effect=[resources[0],resources[0],resources[1],resources[1]]), \
mock.patch.object(parity,"tag_resources",return_value={"minecraft:a":'{"values":[]}'}), \
mock.patch.object(parity.base,"source_hashes",return_value={}), \
mock.patch.object(parity.base,"run",side_effect=run):
with self.assertRaisesRegex(ValueError,"biome parameter tables differ"):
parity.main()
self.assertEqual(len(exports),2)
if __name__ == "__main__":
unittest.main()