8 Tests the XBee (IEEE 802.15.4) implementation class for XBee API compliance    16     Base initalization class    20         Initialize XBee object    26     _build_command should properly build a command packet    31         if not enough or incorrect data is provided, an exception should    35             self.
xbee._build_command(
"at")
    42             "An exception was not raised with improper data supplied"    47         if data of incorrect length is provided, an exception should be     51             self.
xbee._build_command(
"at", frame_id=
"AB", command=
"MY")
    58             "An exception was not raised with improper data length"    63         _build_command should build a valid at command packet which has    64         no parameter data to be saved    69         data = self.
xbee._build_command(
    75         expected_data = 
'\x08+MY'    76         self.assertEqual(data, expected_data)
    80         _build_command should build a valid at command packet which has    81         no parameter data to be saved and no frame specified (the     82         default value of \x00 should be used)    86         data = self.
xbee._build_command(
"at", command=at_command) 
    88         expected_data = 
'\x08\x00MY'    89         self.assertEqual(data, expected_data)
    93     _split_response should properly split a response packet    98         if a response begins with an unrecognized id byte,     99         _split_response should raise an exception   101         data = 
'\x23\x00\x00\x00'   104             self.
xbee._split_response(data)
   114         if a response doesn't match the specification's layout,    115         _split_response should raise an exception   118         data = 
'\x8a\x00\x00\x00'   119         self.assertRaises(ValueError, self.
xbee._split_response, data)
   123         if a response doesn't match the specification's layout,    124         _split_response should raise an exception   128         self.assertRaises(ValueError, self.
xbee._split_response, data)
   132         _split_response should properly split a status response packet   136         info = self.
xbee._split_response(data)
   137         expected_info = {
'id':
'status',
   140         self.assertEqual(info, expected_info)
   144         _split_response should properly split an at_response packet which   145         has no parameter data   149         info = self.
xbee._split_response(data)
   150         expected_info = {
'id':
'at_response',
   154         self.assertEqual(info, expected_info)
   158         _split_response should properly split an at_response packet which   162         data = 
'\x88DMY\x01ABCDEF'   163         info = self.
xbee._split_response(data)
   164         expected_info = {
'id':
'at_response',
   168                          'parameter':
'ABCDEF'}
   169         self.assertEqual(info, expected_info)
   174     XBee class should properly parse IO data received from an XBee    180         _parse_samples should properly parse a packet containing a single    181         sample of only digital io data   184         header = 
'\x01\x01\xFF'   188         data = header + sample
   190         expected_results = [{
'dio-0':
True,
   200         results = self.
xbee._parse_samples(data)
   202         self.assertEqual(results, expected_results)
   206         _parse_samples should properly parse a packet containing a single    207         sample of only digital io data, which alternates between on and    211         header = 
'\x01\x01\xFF'   215         data = header + sample
   217         expected_results = [{
'dio-0':
False,
   227         results = self.
xbee._parse_samples(data)
   229         self.assertEqual(results, expected_results)
   233         _parse_samples should properly parse a packet containing a single    234         sample of only digital io data for only a subset of the    239         header = 
'\x01\x00\xAA'   243         data = header + sample
   245         expected_results = [{
'dio-1':
True,
   250         results = self.
xbee._parse_samples(data)
   252         self.assertEqual(results, expected_results)
   256         _parse_samples should properly parse a packet containing a single    257         sample of only digital io data for only a subset of the    262         header = 
'\x01\x00\x01'   266         data = header + sample
   268         expected_results = [{
'dio-0':
False}]
   270         results = self.
xbee._parse_samples(data)
   272         self.assertEqual(results, expected_results)
   276         _parse_samples should properly parse a packet containing two    277         samples of only digital io data for one dio line   281         header = 
'\x02\x00\x01'   284         sample = 
'\x00\xAA' + 
'\x00\x01'   285         data = header + sample
   287         expected_results = [{
'dio-0':
False},
   290         results = self.
xbee._parse_samples(data)
   292         self.assertEqual(results, expected_results)
   296         _parse_samples should properly parse a packet containing three    297         samples of only digital io data   300         header = 
'\x03\x01\xFF'   306         sample = 
'\x01\xFF' + 
'\x00\xAA' + 
'\x00\x00'   307         data = header + sample
   309         expected_results = [{
'dio-0':
True,
   337         results = self.
xbee._parse_samples(data)
   339         self.assertEqual(results, expected_results)
   343         _parse_samples should parse a data packet containing multiple   344         samples of adc data from multiple pins in the proper order   348         header = 
'\x02\x06\x00'   355         sample = 
'\x00\x00' + 
'\x00\xFF' + 
'\x00\x05' + 
'\x00\x07'   356         data = header + sample
   358         expected_results = [{
'adc-0':0,
   363         results = self.
xbee._parse_samples(data)
   365         self.assertEqual(results, expected_results)
   369         _parse_samples should properly parse a packet containing a single    370         sample of digital and analog io data for only a subset of the    375         header = 
'\x01\x02\xAA'   379         sample = 
'\x00\xAA\x00\xFF'   380         data = header + sample
   382         expected_results = [{
'dio-1':
True,
   388         results = self.
xbee._parse_samples(data)
   390         self.assertEqual(results, expected_results)
   394     XBee class should properly write binary data in a valid API   395     frame to a given serial device, including a valid command packet.   400         calling send should write a full API frame containing the   401         API AT command packet to the serial device.   405         xbee = 
XBee(serial_port)
   408         xbee.send(
'at', frame_id=
'A', command=
'MY')
   411         expected_data = 
'\x7E\x00\x04\x08AMY\x10'   412         self.assertEqual(serial_port.data, expected_data)
   417         calling send should write a full API frame containing the   418         API AT command packet to the serial device.   422         xbee = 
XBee(serial_port)
   433         expected_data = 
'\x7E\x00\x06\x08AMY\x00\x00\x10'   434         self.assertEqual(serial_port.data, expected_data)
   438     Tests shorthand for sending commands to an XBee provided by   444         Prepare a fake device to read from   451         Send an AT command with a shorthand call   454         self.
xbee.at(frame_id=
'A', command=
'MY')
   457         expected_data = 
'\x7E\x00\x04\x08AMY\x10'   458         self.assertEqual(self.
ser.data, expected_data)
   462         calling send should write a full API frame containing the   463         API AT command packet to the serial device.   467         self.
xbee.at(frame_id=
'A', command=
'MY', parameter=
'\x00\x00')
   470         expected_data = 
'\x7E\x00\x06\x08AMY\x00\x00\x10'   471         self.assertEqual(self.
ser.data, expected_data)
   475         When shorthand is disabled, any attempt at calling a    476         non-existant attribute should raise AttributeError   482         except AttributeError:
   485             self.fail(
"Specified shorthand command should not exist")
   489     XBee class should properly read and parse binary data from a serial    494         read and parse a parameterless AT command   499         info = xbee.wait_read_frame()
   500         expected_info = {
'id':
'at_response',
   504         self.assertEqual(info, expected_info)
   508         read and parse an AT command with a parameter   511             '\x7E\x00\x08\x88DMY\x01\x00\x00\x00\x8c'   515         info = xbee.wait_read_frame()
   516         expected_info = {
'id':
'at_response',
   520                          'parameter':
'\x00\x00\x00'}
   521         self.assertEqual(info, expected_info)
   525         XBee class should properly read and parse incoming IO data   530         header = 
'\x01\x02\xAA'   534         sample = 
'\x00\xAA\x00\xFF'   535         data = header + sample
   539         rx_io_resp = 
'\x83\x00\x01\x28\x00'   542             '\x7E\x00\x0C'+ rx_io_resp + data + 
'\xfd'   546         info = xbee.wait_read_frame()
   547         expected_info = {
'id':
'rx_io_data',
   548                          'source_addr':
'\x00\x01',
   551                          'samples': [{
'dio-1':
True,
   557         self.assertEqual(info, expected_info)
   560 if __name__ == 
'__main__':
 def test_bad_data_short(self)
def test_parse_single_dio_subset_again(self)
def test_split_short_at_response(self)
def test_parse_multiple_dio_subset(self)
def test_send_at_command_with_param(self)
def test_build_at_data_len_mismatch(self)
def test_parse_single_dio_subset(self)
def test_send_at_command(self)
def test_bad_data_long(self)
def test_parse_multiple_dio(self)
def test_read_at_params(self)
def test_send_at_command(self)
def test_send_at_command_with_param(self)
def test_parse_single_dio_again(self)
def test_read_io_data(self)
def test_split_status_response(self)
def test_parse_single_dio(self)
def test_split_at_resp_with_param(self)
def test_parse_multiple_adc_subset(self)
def test_unrecognized_response(self)
def test_parse_single_dio_adc_subset(self)
def test_build_at_with_default(self)
def test_build_at_data_mismatch(self)
def test_shorthand_disabled(self)