Add support for TN3270 alarm and VT100 bell

This commit is contained in:
Andrew Kay
2019-12-27 14:18:51 -06:00
parent c46a3f7e54
commit d02f9844a4
8 changed files with 96 additions and 26 deletions

View File

@@ -1,6 +1,6 @@
import unittest
from unittest.mock import Mock, PropertyMock, patch
from coax import PowerOnResetCompletePollResponse, KeystrokePollResponse, ReceiveTimeout
from coax import PollAction, PowerOnResetCompletePollResponse, KeystrokePollResponse, ReceiveTimeout
from coax.protocol import TerminalId
import context
@@ -97,6 +97,23 @@ class RunLoopTestCase(unittest.TestCase):
self.assertEqual(self.create_session_mock.call_count, 2)
def test_alarm(self):
# Arrange
self._assert_run_loop(0, PowerOnResetCompletePollResponse(0xa), 0, True)
self._assert_run_loop(0, None, 0, False)
self.assertIsNotNone(self.controller.terminal)
# Act
self.controller.terminal.sound_alarm()
# Assert
self._assert_run_loop(0.5, None, 0.5, False)
self.assertEqual(self.poll_mock.call_args[0][1], PollAction.ALARM)
self.assertFalse(self.controller.terminal.alarm)
def _assert_run_loop(self, poll_time, poll_response, expected_delay, expected_poll_ack):
# Arrange
self.poll_mock.side_effect = [poll_response]

11
tests/test_terminal.py Normal file
View File

@@ -0,0 +1,11 @@
import unittest
import context
from oec.keymap_3278_2 import KEYMAP as KEYMAP_3278_2
class TerminalGetPollActionTestCase(unittest.TestCase):
def setUp(self):
self.interface = Mock()
self.terminal = Terminal(self.interface, TerminalId(0b11110100), 'c1348300', KEYMAP_3278_2)

View File

@@ -8,34 +8,50 @@ from oec.keyboard import Key, KeyboardModifiers
from oec.vt100 import VT100Session, select
class SessionHandleHostTestCase(unittest.TestCase):
@patch('oec.vt100.select')
def test(self, select_mock):
def setUp(self):
self.terminal = Mock()
self.terminal.display.dimensions = Dimensions(24, 80)
self.session = VT100Session(self.terminal, None)
self.session.host_process = Mock()
patcher = patch('oec.vt100.select')
select_mock = patcher.start()
select_mock.return_value = [[self.session.host_process]]
self.addCleanup(patch.stopall)
def test(self):
# Arrange
terminal = Mock()
terminal.display.dimensions = Dimensions(24, 80)
session = VT100Session(terminal, None)
session.host_process = Mock()
session.host_process.read = Mock(return_value=b'abc')
select_mock.return_value = [[session.host_process]]
self.session.host_process.read = Mock(return_value=b'abc')
# Act
session.handle_host()
self.session.handle_host()
# Assert
terminal.display.buffered_write.assert_any_call(0x80, row=0, column=0)
terminal.display.buffered_write.assert_any_call(0x81, row=0, column=1)
terminal.display.buffered_write.assert_any_call(0x82, row=0, column=2)
self.terminal.display.buffered_write.assert_any_call(0x80, row=0, column=0)
self.terminal.display.buffered_write.assert_any_call(0x81, row=0, column=1)
self.terminal.display.buffered_write.assert_any_call(0x82, row=0, column=2)
terminal.display.flush.assert_called()
self.terminal.display.flush.assert_called()
terminal.display.move_cursor.assert_called_with(row=0, column=3)
self.terminal.display.move_cursor.assert_called_with(row=0, column=3)
self.assertFalse(session.vt100_screen.dirty)
self.assertFalse(self.session.vt100_screen.dirty)
def test_bell(self):
# Arrange
self.session.host_process.read = Mock(return_value=b'\a')
# Act
self.session.handle_host()
# Assert
self.terminal.sound_alarm.assert_called()
class SessionHandleKeyTestCase(unittest.TestCase):
def setUp(self):