import os import sys import tempfile import unittest sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) import config from board import Board class TestBoard(unittest.TestCase): def setUp(self): self.dir = tempfile.mkdtemp() self.path = os.path.join(self.dir, "config.json") def _board(self): return Board(self.path) def test_add_button_defaults_label_to_basename(self): b = self._board() btn = b.add_button("/sounds/airhorn.mp3") self.assertEqual(btn["label"], "airhorn") self.assertEqual(btn["id"], "btn_001") self.assertEqual(len(b.buttons), 1) def test_add_button_custom_label(self): b = self._board() btn = b.add_button("/sounds/x.wav", label="Custom") self.assertEqual(btn["label"], "Custom") def test_ids_increment_and_persist(self): b = self._board() b.add_button("/a.wav") b.add_button("/b.wav") self.assertEqual([x["id"] for x in b.buttons], ["btn_001", "btn_002"]) # Reload: new ids continue after the highest existing one. b2 = self._board() btn = b2.add_button("/c.wav") self.assertEqual(btn["id"], "btn_003") def test_remove_button(self): b = self._board() b.add_button("/a.wav") btn = b.add_button("/b.wav") b.remove_button("btn_001") self.assertEqual([x["id"] for x in b.buttons], ["btn_002"]) # persisted self.assertEqual(len(self._board().buttons), 1) def test_remove_unknown_raises(self): b = self._board() with self.assertRaises(KeyError): b.remove_button("nope") def test_rename_button(self): b = self._board() b.add_button("/a.wav") b.rename_button("btn_001", " Renamed ") self.assertEqual(b.get_button("btn_001")["label"], "Renamed") def test_rename_empty_raises(self): b = self._board() b.add_button("/a.wav") with self.assertRaises(ValueError): b.rename_button("btn_001", " ") def test_settings_persist(self): b = self._board() b.set_output_device("CABLE Input") b.set_volume(42) reloaded = self._board() self.assertEqual(reloaded.output_device, "CABLE Input") self.assertEqual(reloaded.volume, 42) def test_volume_clamped(self): b = self._board() b.set_volume(150) self.assertEqual(b.volume, 100) b.set_volume(-10) self.assertEqual(b.volume, 0) def test_on_change_fires(self): b = self._board() calls = [] b.on_change = lambda: calls.append(1) b.add_button("/a.wav") b.rename_button("btn_001", "z") b.remove_button("btn_001") self.assertEqual(len(calls), 3) def test_to_config_matches_schema(self): b = self._board() b.add_button("/a.wav", "A") cfg = b.to_config() self.assertEqual(set(cfg.keys()), set(config.default_config().keys())) if __name__ == "__main__": unittest.main()