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()