import queue import unittest from unittest.mock import patch from plsr_gui import PlsrGui from plsr_test import COMMAND_RESET, Snapshot class PollingUiTests(unittest.TestCase): def setUp(self): self.app = PlsrGui() self.app.withdraw() self.worker_jobs = self.app.jobs self.app.jobs = queue.Queue() self.snapshot = Snapshot(0, 0, 0, 0, 0, 0, 4, 1) self.app.connected = True self.app.last_snapshot = self.snapshot self.app._update_controls() def tearDown(self): self.app.closing = True self.worker_jobs.put({"name": "shutdown"}) self.app.destroy() def _states(self): widgets = ( self.app.connect_button, self.app.save_outputs_button, self.app.start_button, self.app.stop_button, self.app.emergency_button, self.app.lamp_test_button, self.app.reset_button, self.app.clear_button, self.app.pulse_output_combo, self.app.direction_output_combo, self.app.pulses_spin, self.app.frequency_spin, self.app.apply_frequency_button, self.app.forward_radio, self.app.reverse_radio, ) return tuple(str(widget.cget("state")) for widget in widgets) def test_running_state_allows_frequency_update_only(self): self.app.last_snapshot = Snapshot(2, 1, 1000, 0, 0, 10, 0, 0, 1) self.app._update_controls() self.assertEqual(str(self.app.frequency_spin.cget("state")), "normal") self.assertEqual( str(self.app.apply_frequency_button.cget("state")), "normal" ) self.assertEqual(str(self.app.pulses_spin.cget("state")), "disabled") self.assertEqual(str(self.app.forward_radio.cget("state")), "disabled") def test_background_poll_does_not_toggle_controls(self): before = self._states() self.assertTrue(self.app._submit("snapshot", purpose="poll")) self.assertTrue(self.app.poll_active) self.assertEqual(self._states(), before) self.app._handle_result( { "type": "result", "name": "snapshot", "purpose": "poll", "result": self.snapshot, } ) self.assertEqual(self._states(), before) def test_click_during_poll_is_deferred(self): self.app._submit("snapshot", purpose="poll") accepted = self.app._submit( "command", purpose="reset", command=COMMAND_RESET ) self.assertTrue(accepted) self.assertIsNotNone(self.app.deferred_job) self.app._handle_result( { "type": "result", "name": "snapshot", "purpose": "poll", "result": self.snapshot, } ) first = self.app.jobs.get_nowait() second = self.app.jobs.get_nowait() self.assertEqual(first["purpose"], "poll") self.assertEqual(second["purpose"], "reset") self.assertTrue(self.app.job_active) self.assertFalse(self.app.poll_active) def test_lamp_test_keeps_existing_cumulative_count(self): self.app.auto_phase = "forward" self.app.run_baseline = 40 self.app.lamp_test_baseline = 40 self.app._advance_lamp_test(Snapshot(5, 2, 2, 0, 0, 46, 4, 1)) reverse = self.app.jobs.get_nowait() self.assertEqual(reverse["purpose"], "auto_reverse") self.assertTrue(reverse["restart"]) with patch("plsr_gui.messagebox.showinfo"): self.app._advance_lamp_test(Snapshot(5, 2, 2, 0, 0, 40, 4, 1)) self.assertIsNone(self.app.auto_phase) if __name__ == "__main__": unittest.main(verbosity=2)