mirror of
https://github.com/lowobservable/oec.git
synced 2026-04-25 19:51:42 +00:00
Initial TN3270 support
This commit is contained in:
@@ -3,7 +3,7 @@ from unittest.mock import Mock
|
||||
|
||||
import context
|
||||
|
||||
from oec.display import Dimensions, Display, encode_ascii_character, encode_string
|
||||
from oec.display import Dimensions, Display, encode_ascii_character, encode_ebcdic_character, encode_string
|
||||
|
||||
class DisplayMoveCursorTestCase(unittest.TestCase):
|
||||
def setUp(self):
|
||||
@@ -15,7 +15,16 @@ class DisplayMoveCursorTestCase(unittest.TestCase):
|
||||
|
||||
def test(self):
|
||||
# Act
|
||||
self.display.move_cursor(10, 15)
|
||||
self.display.move_cursor(index=815)
|
||||
|
||||
# Assert
|
||||
self.assertEqual(self.display.address_counter, 895)
|
||||
|
||||
self.interface.offload_load_address_counter.assert_called_with(895)
|
||||
|
||||
def test_with_row_and_column(self):
|
||||
# Act
|
||||
self.display.move_cursor(row=10, column=15)
|
||||
|
||||
# Assert
|
||||
self.assertEqual(self.display.address_counter, 895)
|
||||
@@ -24,12 +33,12 @@ class DisplayMoveCursorTestCase(unittest.TestCase):
|
||||
|
||||
def test_no_change(self):
|
||||
# Arrange
|
||||
self.display.move_cursor(0, 0)
|
||||
self.display.move_cursor(index=0)
|
||||
|
||||
self.interface.offload_load_address_counter.reset_mock()
|
||||
|
||||
# Act
|
||||
self.display.move_cursor(0, 0)
|
||||
self.display.move_cursor(index=0)
|
||||
|
||||
# Assert
|
||||
self.assertEqual(self.display.address_counter, 80)
|
||||
@@ -38,12 +47,12 @@ class DisplayMoveCursorTestCase(unittest.TestCase):
|
||||
|
||||
def test_no_change_force(self):
|
||||
# Arrange
|
||||
self.display.move_cursor(0, 0)
|
||||
self.display.move_cursor(index=0)
|
||||
|
||||
self.interface.offload_load_address_counter.reset_mock()
|
||||
|
||||
# Act
|
||||
self.display.move_cursor(0, 0, force_load=True)
|
||||
self.display.move_cursor(index=0, force_load=True)
|
||||
|
||||
# Assert
|
||||
self.assertEqual(self.display.address_counter, 80)
|
||||
@@ -60,8 +69,18 @@ class DisplayBufferedWriteTestCase(unittest.TestCase):
|
||||
|
||||
def test(self):
|
||||
# Act
|
||||
self.display.buffered_write(0x01, 0, 15)
|
||||
self.display.buffered_write(0x02, 1, 17)
|
||||
self.display.buffered_write(0x01, index=15)
|
||||
self.display.buffered_write(0x02, index=97)
|
||||
|
||||
# Assert
|
||||
self.assertEqual(self.display.buffer[15], 0x01)
|
||||
self.assertEqual(self.display.buffer[97], 0x02)
|
||||
self.assertSequenceEqual(self.display.dirty, [15, 97])
|
||||
|
||||
def test_with_row_and_column(self):
|
||||
# Act
|
||||
self.display.buffered_write(0x01, row=0, column=15)
|
||||
self.display.buffered_write(0x02, row=1, column=17)
|
||||
|
||||
# Assert
|
||||
self.assertEqual(self.display.buffer[15], 0x01)
|
||||
@@ -69,15 +88,15 @@ class DisplayBufferedWriteTestCase(unittest.TestCase):
|
||||
self.assertSequenceEqual(self.display.dirty, [15, 97])
|
||||
|
||||
def test_change(self):
|
||||
self.assertTrue(self.display.buffered_write(0x01, 0, 0))
|
||||
self.assertTrue(self.display.buffered_write(0x02, 0, 0))
|
||||
self.assertTrue(self.display.buffered_write(0x01, index=0))
|
||||
self.assertTrue(self.display.buffered_write(0x02, index=0))
|
||||
|
||||
self.assertEqual(self.display.buffer[0], 0x02)
|
||||
self.assertSequenceEqual(self.display.dirty, [0])
|
||||
|
||||
def test_no_change(self):
|
||||
self.assertTrue(self.display.buffered_write(0x01, 0, 0))
|
||||
self.assertFalse(self.display.buffered_write(0x01, 0, 0))
|
||||
self.assertTrue(self.display.buffered_write(0x01, index=0))
|
||||
self.assertFalse(self.display.buffered_write(0x01, index=0))
|
||||
|
||||
self.assertEqual(self.display.buffer[0], 0x01)
|
||||
self.assertSequenceEqual(self.display.dirty, [0])
|
||||
@@ -101,9 +120,9 @@ class DisplayFlushTestCase(unittest.TestCase):
|
||||
|
||||
def test_single_range(self):
|
||||
# Arrange
|
||||
self.display.buffered_write(0x01, 0, 0)
|
||||
self.display.buffered_write(0x02, 0, 1)
|
||||
self.display.buffered_write(0x03, 0, 2)
|
||||
self.display.buffered_write(0x01, index=0)
|
||||
self.display.buffered_write(0x02, index=1)
|
||||
self.display.buffered_write(0x03, index=2)
|
||||
|
||||
# Act
|
||||
self.display.flush()
|
||||
@@ -113,12 +132,12 @@ class DisplayFlushTestCase(unittest.TestCase):
|
||||
|
||||
def test_multiple_ranges(self):
|
||||
# Arrange
|
||||
self.display.buffered_write(0x01, 0, 0)
|
||||
self.display.buffered_write(0x02, 0, 1)
|
||||
self.display.buffered_write(0x03, 0, 2)
|
||||
self.display.buffered_write(0x05, 0, 30)
|
||||
self.display.buffered_write(0x06, 0, 31)
|
||||
self.display.buffered_write(0x04, 0, 20)
|
||||
self.display.buffered_write(0x01, index=0)
|
||||
self.display.buffered_write(0x02, index=1)
|
||||
self.display.buffered_write(0x03, index=2)
|
||||
self.display.buffered_write(0x05, index=30)
|
||||
self.display.buffered_write(0x06, index=31)
|
||||
self.display.buffered_write(0x04, index=20)
|
||||
|
||||
# Act
|
||||
self.display.flush()
|
||||
@@ -136,7 +155,7 @@ class DisplayClearTestCase(unittest.TestCase):
|
||||
|
||||
def test_excluding_status_line(self):
|
||||
# Arrange
|
||||
self.display.buffered_write(0x01, 0, 0)
|
||||
self.display.buffered_write(0x01, index=0)
|
||||
|
||||
self.assertEqual(self.display.buffer[0], 0x01)
|
||||
self.assertTrue(self.display.dirty)
|
||||
@@ -153,7 +172,7 @@ class DisplayClearTestCase(unittest.TestCase):
|
||||
|
||||
def test_including_status_line(self):
|
||||
# Arrange
|
||||
self.display.buffered_write(0x01, 0, 0)
|
||||
self.display.buffered_write(0x01, index=0)
|
||||
|
||||
self.assertEqual(self.display.buffer[0], 0x01)
|
||||
self.assertTrue(self.display.dirty)
|
||||
@@ -178,11 +197,11 @@ class DisplayFlushRangeTestCase(unittest.TestCase):
|
||||
|
||||
def test_when_start_address_is_current_address_counter(self):
|
||||
# Arrange
|
||||
self.display.move_cursor(0, 0)
|
||||
self.display.move_cursor(index=0)
|
||||
|
||||
self.display.buffered_write(0x01, 0, 0)
|
||||
self.display.buffered_write(0x02, 0, 1)
|
||||
self.display.buffered_write(0x03, 0, 2)
|
||||
self.display.buffered_write(0x01, index=0)
|
||||
self.display.buffered_write(0x02, index=1)
|
||||
self.display.buffered_write(0x03, index=2)
|
||||
|
||||
# Act
|
||||
self.display.flush()
|
||||
@@ -195,11 +214,11 @@ class DisplayFlushRangeTestCase(unittest.TestCase):
|
||||
|
||||
def test_when_start_address_is_not_current_address_counter(self):
|
||||
# Arrange
|
||||
self.display.move_cursor(0, 70)
|
||||
self.display.move_cursor(index=70)
|
||||
|
||||
self.display.buffered_write(0x01, 0, 0)
|
||||
self.display.buffered_write(0x02, 0, 1)
|
||||
self.display.buffered_write(0x03, 0, 2)
|
||||
self.display.buffered_write(0x01, index=0)
|
||||
self.display.buffered_write(0x02, index=1)
|
||||
self.display.buffered_write(0x03, index=2)
|
||||
|
||||
# Act
|
||||
self.display.flush()
|
||||
@@ -220,6 +239,16 @@ class EncodeAsciiCharacterTestCase(unittest.TestCase):
|
||||
def test_out_of_range(self):
|
||||
self.assertEqual(encode_ascii_character(ord('✓')), 0x00)
|
||||
|
||||
class EncodeEbcdicCharacterTestCase(unittest.TestCase):
|
||||
def test_mapped_character(self):
|
||||
self.assertEqual(encode_ebcdic_character(129), 0x80)
|
||||
|
||||
def test_unmapped_character(self):
|
||||
self.assertEqual(encode_ebcdic_character(185), 0x00)
|
||||
|
||||
def test_out_of_range(self):
|
||||
self.assertEqual(encode_ebcdic_character(256), 0x00)
|
||||
|
||||
class EncodeStringTestCase(unittest.TestCase):
|
||||
def test_mapped_characters(self):
|
||||
self.assertEqual(encode_string('Hello, world!'), bytes.fromhex('a7 84 8b 8b 8e 33 00 96 8e 91 8b 83 19'))
|
||||
|
||||
Reference in New Issue
Block a user