Spaces:
Sleeping
Sleeping
File size: 3,736 Bytes
37e3d5a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | """Tests for the per-module code cache (Plan 1.3 Phase 6, Workstream I)."""
import shutil
import sys
import tempfile
import unittest
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "stage3_build"))
from module_cache import ( # noqa: E402
get_module,
invalidate_attached,
module_cache_key,
put_module,
)
class ModuleCacheTests(unittest.TestCase):
def setUp(self):
self.tmp = Path(tempfile.mkdtemp())
self.manifest = self.tmp / ".cache" / "module_cache.json"
self.generator = self.tmp / "generator.py"
self.generator.write_bytes(b"# generator v1\nprint('hi')\n")
def tearDown(self):
shutil.rmtree(self.tmp, ignore_errors=True)
def test_key_changes_with_spec(self):
key_a = module_cache_key({"id": "blade", "len": 10}, self.generator)
key_b = module_cache_key({"id": "blade", "len": 20}, self.generator)
self.assertNotEqual(key_a, key_b)
def test_key_changes_with_generator_source(self):
spec = {"id": "blade", "len": 10}
gen2 = self.tmp / "generator2.py"
gen2.write_bytes(b"# generator v2 -- different bytes\nprint('yo')\n")
self.assertNotEqual(
module_cache_key(spec, self.generator),
module_cache_key(spec, gen2),
)
def test_key_stable_regardless_of_dict_order(self):
self.assertEqual(
module_cache_key({"a": 1, "b": 2}, self.generator),
module_cache_key({"b": 2, "a": 1}, self.generator),
)
def test_put_get_roundtrip(self):
spec = {"id": "blade", "len": 10}
code = "function makeBlade(){ return mesh; }"
put_module(self.manifest, spec, self.generator, code)
self.assertEqual(get_module(self.manifest, spec, self.generator), code)
# unknown spec -> miss
self.assertIsNone(
get_module(self.manifest, {"id": "ghost"}, self.generator)
)
def test_invalidate_attached_removes_dependents_only(self):
specs = {
"root": {"id": "root"},
"blade": {"id": "blade", "parent": "root"},
"handle": {"id": "handle", "parent": "root"},
"pommel": {"id": "pommel", "attachment": {"parentId": "handle"}},
}
for spec in specs.values():
put_module(self.manifest, spec, self.generator, f"code_{spec['id']}")
components = list(specs.values())
invalidated = invalidate_attached(self.manifest, "handle", components)
self.assertEqual(invalidated, ["pommel"])
# pommel gone, everyone else remains
self.assertIsNone(
get_module(self.manifest, specs["pommel"], self.generator)
)
self.assertEqual(
get_module(self.manifest, specs["root"], self.generator), "code_root"
)
self.assertEqual(
get_module(self.manifest, specs["blade"], self.generator), "code_blade"
)
self.assertEqual(
get_module(self.manifest, specs["handle"], self.generator), "code_handle"
)
def test_invalidate_returns_empty_when_no_dependents(self):
specs = {
"root": {"id": "root"},
"leaf": {"id": "leaf", "parent": "root"},
}
for spec in specs.values():
put_module(self.manifest, spec, self.generator, f"code_{spec['id']}")
# leaf has no dependents attached to it
self.assertEqual(invalidate_attached(self.manifest, "leaf", list(specs.values())), [])
# nothing removed
self.assertEqual(
get_module(self.manifest, specs["leaf"], self.generator), "code_leaf"
)
if __name__ == "__main__":
unittest.main(verbosity=2)
|