diff options
| author | Paul Oliver <contact@pauloliver.dev> | 2026-07-14 17:29:02 +0200 |
|---|---|---|
| committer | Paul Oliver <contact@pauloliver.dev> | 2026-08-30 16:24:48 +0200 |
| commit | 1961b4b237083f4cfac9ca6b249c1d6cb665d149 (patch) | |
| tree | fd9fc8260360e2ac30be9747ca558bcfc824a4c4 /test/test_determinism.py | |
Diffstat (limited to 'test/test_determinism.py')
| -rw-r--r-- | test/test_determinism.py | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/test/test_determinism.py b/test/test_determinism.py new file mode 100644 index 0000000..0d40fcb --- /dev/null +++ b/test/test_determinism.py @@ -0,0 +1,50 @@ +# file : test/test_determinism.py +# project : Salis-VM +# author : Paul Oliver <contact@pauloliver.dev> +# +# This test ensures simulator produces deterministic results. +# Resulting save, eva and DB files must be exactly the same for all simulations, +# whenever the same seed value is used. + +import hashlib +import os + +from test_general import SalisTest + +class TestDeterminism(SalisTest): + SIM_OPTS = { + "anc": "55a", + "anc_path": "anc", + "name": "determinism.sim", + "ui_path": "test/ui", + "vm_arch": "v1", + } + + SIM_OPTS_ASA4 = SIM_OPTS | {"ui": "asa4"} + SIM_OPTS_PUSH = SIM_OPTS | {"ui": "push"} + + def get_asa4_sums(self): + self.run_ui_test(**self.SIM_OPTS_ASA4, clones=2, cores=2, mvec_pow=16, seed=8765432, data_push_pow=20, sync_pow=16, auto_save_pow=20) + sim_path = f"{self.tempdir.name}/{self.SIM_OPTS["name"]}" + auto_saves = sorted(f"{sim_path}/{f}" for f in os.listdir(sim_path)) + auto_saves = filter(lambda f: f.startswith(f"{sim_path}/{self.SIM_OPTS["name"]}-"), auto_saves) + auto_saves = list(auto_saves)[:4] + evas = sorted(f"{sim_path}/evas/{f}" for f in os.listdir(f"{sim_path}/evas")) + evas = list(evas)[:4] + return {f: hashlib.md5(open(f, "rb").read()).hexdigest() for f in auto_saves + evas} + + def get_db_sums(self): + self.run_ui_test(**self.SIM_OPTS_PUSH, clones=2, cores=2, mvec_pow=16, seed=8765432, data_push_pow=20, sync_pow=16, auto_save_pow=20) + sim_path = f"{self.tempdir.name}/{self.SIM_OPTS["name"]}" + db_path = f"{sim_path}/{self.SIM_OPTS["name"]}.sqlite3" + return hashlib.md5(open(db_path, "rb").read()).hexdigest() + + def test_deterministic_saves_and_evas(self): + sums_1 = self.get_asa4_sums() + sums_2 = self.get_asa4_sums() + self.assertEqual(sums_1, sums_2) + + def test_deterministic_db(self): + sum_1 = self.get_db_sums() + sum_2 = self.get_db_sums() + self.assertEqual(sum_1, sum_2) |
