spritetagger/test_labelstore.py
2026-05-23 21:32:55 -04:00

70 lines
2.6 KiB
Python

import json
import unittest
import tempfile
from pathlib import Path
import labelstore
class SaveLoadRoundTrip(unittest.TestCase):
def setUp(self):
self._tmp = tempfile.TemporaryDirectory()
self.dir = Path(self._tmp.name)
self.path = self.dir / 'tags.json'
def tearDown(self):
self._tmp.cleanup()
def test_save_then_load_round_trips_assignments(self):
assignments = {'frame_000.png': 'idle', 'frame_001.png': 'walk'}
labelstore.save_labels(self.path, assignments, ['idle', 'walk'])
loaded, _labels = labelstore.load_labels(self.path)
self.assertEqual(loaded, assignments)
def test_save_persists_label_list(self):
labelstore.save_labels(self.path, {}, ['idle', 'walk', 'crouch'])
_assignments, labels = labelstore.load_labels(self.path)
self.assertEqual(labels, ['idle', 'walk', 'crouch'])
def test_save_writes_filenames_not_indices(self):
labelstore.save_labels(self.path, {'frame_007.png': 'jump'}, ['jump'])
raw = json.loads(self.path.read_text())
self.assertIn('frame_007.png', raw['assignments'])
self.assertEqual(raw['assignments']['frame_007.png'], 'jump')
def test_load_missing_file_returns_empty(self):
loaded, labels = labelstore.load_labels(self.dir / 'does_not_exist.json')
self.assertEqual(loaded, {})
self.assertEqual(labels, [])
def test_load_invalid_json_returns_empty(self):
self.path.write_text('{not valid json at all')
loaded, labels = labelstore.load_labels(self.path)
self.assertEqual(loaded, {})
self.assertEqual(labels, [])
class IndexNameConversion(unittest.TestCase):
def setUp(self):
self.frames = [Path('a.png'), Path('b.png'), Path('c.png')]
def test_to_name_keyed_maps_index_to_filename(self):
result = labelstore.to_name_keyed({0: 'idle', 2: 'run'}, self.frames)
self.assertEqual(result, {'a.png': 'idle', 'c.png': 'run'})
def test_to_index_keyed_maps_filename_to_index(self):
result = labelstore.to_index_keyed({'a.png': 'idle', 'c.png': 'run'}, self.frames)
self.assertEqual(result, {0: 'idle', 2: 'run'})
def test_to_index_keyed_skips_files_no_longer_present(self):
result = labelstore.to_index_keyed({'a.png': 'idle', 'gone.png': 'walk'}, self.frames)
self.assertEqual(result, {0: 'idle'})
def test_to_index_keyed_remaps_after_reorder(self):
reordered = [Path('c.png'), Path('a.png'), Path('b.png')]
result = labelstore.to_index_keyed({'a.png': 'idle'}, reordered)
self.assertEqual(result, {1: 'idle'})
if __name__ == '__main__':
unittest.main()