874b6f20c2
Основа — Horizon (MIT). История апстрима не переносится: этот репозиторий ведёт свою.
151 lines
9.0 KiB
Python
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()
|