101 lines
3.0 KiB
Python
101 lines
3.0 KiB
Python
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()
|