1#!/usr/bin/env python
2#
3# This file is part of pySerial - Cross platform serial port support for Python
4# (C) 2015 Chris Liechti <[email protected]>
5#
6# SPDX-License-Identifier:    BSD-3-Clause
7"""\
8Test RS485 related functionality.
9"""
10
11import unittest
12import serial
13import serial.rs485
14
15# on which port should the tests be performed:
16PORT = 'loop://'
17
18
19class Test_RS485_settings(unittest.TestCase):
20    """Test RS485 related functionality"""
21
22    def setUp(self):
23        # create a closed serial port
24        self.s = serial.serial_for_url(PORT, do_not_open=True)
25
26    def tearDown(self):
27        self.s.close()
28
29    def test_enable_RS485(self):
30        # XXX open() port - but will result in fail for most HW...
31        #~ self.s.open()
32        self.assertEqual(self.s._rs485_mode, None, 'RS485 is disabled by default')
33        self.assertEqual(self.s.rs485_mode, None, 'RS485 is disabled by default')
34        self.s.rs485_mode = serial.rs485.RS485Settings()
35        self.assertTrue(self.s._rs485_mode is not None, 'RS485 is enabled')
36        self.assertTrue(self.s.rs485_mode is not None, 'RS485 is enabled')
37        self.s.rs485_mode = None
38        self.assertEqual(self.s._rs485_mode, None, 'RS485 is disabled again')
39        self.assertEqual(self.s.rs485_mode, None, 'RS485 is disabled again')
40
41
42class Test_RS485_class(unittest.TestCase):
43    """Test RS485 class"""
44
45    def setUp(self):
46        if not isinstance(serial.serial_for_url(PORT), serial.Serial):
47            raise unittest.SkipTest("RS485 test only compatible with real serial port")
48        self.s = serial.rs485.RS485(PORT, timeout=1)
49
50    def tearDown(self):
51        self.s.close()
52
53    def test_RS485_class(self):
54        self.s.rs485_mode = serial.rs485.RS485Settings()
55        self.s.write(b'hello')
56        self.assertEqual(self.s.read(5), b'hello')
57
58
59if __name__ == '__main__':
60    import sys
61    sys.stdout.write(__doc__)
62    if len(sys.argv) > 1:
63        PORT = sys.argv[1]
64    sys.stdout.write("Testing port: {!r}\n".format(PORT))
65    sys.argv[1:] = ['-v']
66    # When this module is executed from the command-line, it runs all its tests
67    unittest.main()
68