aboutsummaryrefslogtreecommitdiffziptar.gz
path: root/tests/test_tilecap.py
diff options
context:
space:
mode:
authorgodosa <godosa@godosa.eu>2026-10-07 00:14:38 +0200
committergodosa <godosa@godosa.eu>2026-10-07 00:14:38 +0200
commit3443c1c65e9f1753e1e656b35d08416c1fa298f2 (patch)
tree4e43236f460145a4d75d1b4616dcb7aa6ef08f51 /tests/test_tilecap.py
downloadworldmap-viewer-3443c1c65e9f1753e1e656b35d08416c1fa298f2.tar.gz
worldmap-viewer-3443c1c65e9f1753e1e656b35d08416c1fa298f2.zip
worldmap-viewer: initial public history
Diffstat (limited to 'tests/test_tilecap.py')
-rw-r--r--tests/test_tilecap.py81
1 files changed, 81 insertions, 0 deletions
diff --git a/tests/test_tilecap.py b/tests/test_tilecap.py
new file mode 100644
index 0000000..fbcb5e7
--- /dev/null
+++ b/tests/test_tilecap.py
@@ -0,0 +1,81 @@
+import os
+import shutil
+import tempfile
+import time
+import unittest
+from pathlib import Path
+
+from tilecap import TileCap, tile_key
+
+
+class TileCapTest(unittest.TestCase):
+ def setUp(self):
+ self.root = Path(tempfile.mkdtemp())
+
+ def tearDown(self):
+ shutil.rmtree(self.root)
+
+ def put(self, rel, size, age):
+ f = self.root / "v5.4-abc" / rel
+ f.parent.mkdir(parents=True, exist_ok=True)
+ f.write_bytes(b"x" * size)
+ t = time.time() - age
+ os.utime(f, (t, t))
+ return f
+
+ def test_tile_key(self):
+ self.assertEqual(tile_key("t/v5/relief/9/12/34.jpg"), ("relief", 9))
+ self.assertEqual(tile_key("t/v5/mesh/12/1/2.bin"), ("mesh", 12))
+ self.assertIsNone(tile_key("t/v5/manifest.npz"))
+ self.assertIsNone(tile_key("t/v5/relief/9/12/tmpab.part"))
+ self.assertIsNone(tile_key("t/v5/relief/9/x/3.jpg"))
+
+ def test_sweep_deletes_least_recently_used_down_to_slack(self):
+ # 10 deep tiles of 100 B, the oldest first; cap 700 → goal 630: the 4 oldest go (1000 → 600)
+ fs = [self.put(f"relief/12/{i}/0.jpg", 100, age=100 - i) for i in range(10)]
+ keep = self.put("relief/5/0/0.jpg", 5000, age=1000) # prerendered: kept and not counted
+ other = self.put("biomes/5/0/0.jpg", 100, age=1) # another layer at a kept zoom: counted
+ man = self.put("manifest.npz", 100, age=1000) # not a tile
+ cap = TileCap(700, keep_z=9)
+ cap.add_root(self.root)
+ freed = cap.sweep()
+ self.assertEqual(freed, 500) # 1100 → 600: the 5 oldest of 11 counted
+ self.assertEqual([f.exists() for f in fs], [False] * 5 + [True] * 5)
+ self.assertTrue(keep.exists() and other.exists() and man.exists())
+ self.assertEqual(cap.total, 600)
+ self.assertFalse((self.root / "v5.4-abc" / "relief" / "12" / "0").exists(), "empty folders go")
+
+ def test_used_tile_survives(self):
+ fs = [self.put(f"relief/12/{i}/0.jpg", 100, age=100 - i) for i in range(4)]
+ cap = TileCap(300, keep_z=-1)
+ cap.add_root(self.root)
+ cap.used(fs[0]) # the oldest is read again
+ cap.sweep() # 400 → goal 270: two go
+ self.assertEqual([f.exists() for f in fs], [True, False, False, True])
+
+ def test_under_cap_deletes_nothing_and_saves_count(self):
+ fs = [self.put(f"relief/12/{i}/0.jpg", 100, age=10) for i in range(3)]
+ cap = TileCap(1000)
+ cap.add_root(self.root)
+ self.assertEqual(cap.sweep(), 0)
+ self.assertEqual(cap.total, 300)
+ cap.saved(self.root / "v5.4-abc" / "relief" / "5" / "0" / "0.jpg", 50)
+ self.assertEqual(cap.total, 350)
+ self.assertTrue(all(f.exists() for f in fs))
+
+ def test_save_past_cap_sweeps(self):
+ cap = TileCap(250)
+ cap.add_root(self.root)
+ cap.sweep()
+ fs = [self.put(f"mesh/13/{i}/0.bin", 100, age=10 - i) for i in range(3)]
+ started = []
+ cap.start = lambda: started.append(1)
+ cap.saved(fs[0], 100)
+ cap.saved(fs[1], 100)
+ self.assertEqual(started, [])
+ cap.saved(fs[2], 100)
+ self.assertEqual(started, [1])
+
+
+if __name__ == "__main__":
+ unittest.main()