def test_too_many_messages(self): with self.assertRaises(TooManyMessagesException) as err: decode_msg( b'!AIVDM,2,1,1,A,538CQ>02A;h?D9QC800pu8@T>0P4l9E8L0000017Ah:;;5r50Ahm5;C0,0*07', b'!AIVDM,2,2,1,A,F@V@00000000000,2*35', b'!AIVDM,2,1,9,A,538CQ>02A;h?D9QC800pu8@T>0P4l9E8L0000017Ah:;;5r50Ahm5;C0,0*0F', b'!AIVDM,2,2,9,A,F@V@00000000000,2*3D', ) self.assertEqual(str(err.exception), "Got 4 messages, but fragment count is 2")
def test_decode_multiline_message(self): decoded = decode_msg( b'!AIVDM,2,1,1,A,538CQ>02A;h?D9QC800pu8@T>0P4l9E8L0000017Ah:;;5r50Ahm5;C0,0*07', b'!AIVDM,2,2,1,A,F@V@00000000000,2*35', ) self.assertIsInstance(decoded, dict) self.assertEqual(decoded["mmsi"], "210035000") self.assertEqual(decoded["callsign"], "5BXT2") self.assertEqual(decoded["shipname"], "NORDIC HAMBURG") self.assertEqual(decoded["destination"], "CTT-LAYBY") decoded = decode_msg( b'!AIVDM,2,1,1,A,538CQ>02A;h?D9QC800pu8@T>0P4l9E8L0000017Ah:;;5r50Ahm5;C0,0*07', b'!AIVDM,2,2,1,A,F@V@00000000000,2*35', b'!AIVDM,2,1,9,A,538CQ>02A;h?D9QC800pu8@T>0P4l9E8L0000017Ah:;;5r50Ahm5;C0,0*0F', b'!AIVDM,2,2,9,A,F@V@00000000000,2*3D', )
def test_decode_encode(): """Create each message with default values and test that it can be decoded again""" mmsi = 123 for typ in ENCODE_MSG.keys(): encoded = encode_dict({ 'mmsi': mmsi, 'dest_mmsi': 656634123, 'type': typ }) decoded = decode_msg(*encoded) assert decoded['mmsi'] == '000000123' if 'dest_mmsi' in decoded: assert decoded['dest_mmsi'] == '656634123'
def test_multipart_error_message(self): """Refer to issue #37""" msg_1 = "!AIVDM,2,1,0,A,539p4OT00000@7W3K@08ThiLE8@E:0000000001S0h9135Pl?0R0C@UDQp00,0*68" msg_2 = "!AIVDM,2,2,0,A,00000000000,2*24" with self.assertRaises(MissingMultipartMessageException) as err: decode_msg(msg_1) self.assertEqual(str(err.exception), "Missing fragment numbers: [2]") with self.assertRaises(MissingMultipartMessageException) as err: decode_msg(msg_2) self.assertEqual(str(err.exception), "Missing fragment numbers: [1]") with self.assertRaises(MissingMultipartMessageException) as err: decode_msg( "!AIVDM,3,2,0,A,539p4OT00000@7W3K@08ThiLE8@E:0000000001S0h9135Pl?0R0C@UDQp00,0*68", ) self.assertEqual(str(err.exception), "Missing fragment numbers: [1, 3]") decode_msg(msg_1, msg_2)
def test_empty_channel(self): msg = b"!AIVDO,1,1,,,B>qc:003wk?8mP=18D3Q3wgTiT;T,0*13" self.assertEqual(NMEAMessage(msg).channel, "") content = decode_msg(msg) self.assertEqual(content["type"], 18) self.assertEqual(content["repeat"], 0) self.assertEqual(content["mmsi"], "1000000000") self.assertEqual(format(content["speed"], ".1f"), "102.3") self.assertEqual(content["accuracy"], 0) self.assertEqual(str(content["lon"]), "181.0") self.assertEqual(str(content["lat"]), "91.0") self.assertEqual(str(content["course"]), "360.0") self.assertEqual(content["heading"], 511) self.assertEqual(content["second"], 31) self.assertEqual(content["regional"], 0) self.assertEqual(content["cs"], 1) self.assertEqual(content["display"], 0) self.assertEqual(content["band"], 1) self.assertEqual(content["radio"], 410340)
def test_msg_with_more_that_82_chars_payload(self): content = decode_msg( "!AIVDM,1,1,,B,53ktrJ82>ia4=50<0020<5=@Dhv0t8T@u<0000001PV854Si0;mR@CPH13p0hDm1C3h0000,2*35" ) self.assertEqual(content["type"], 5) self.assertEqual(content["mmsi"], "255801960") self.assertEqual(content["repeat"], 0) self.assertEqual(content["ais_version"], 2) self.assertEqual(content["imo"], 9356945) self.assertEqual(content["callsign"], "CQPC") self.assertEqual(content["shipname"], "CASTELO OBIDOS") self.assertEqual(content["shiptype"], ShipType.NotAvailable) self.assertEqual(content["to_bow"], 12) self.assertEqual(content["to_stern"], 38) self.assertEqual(content["to_port"], 8) self.assertEqual(content["to_starboard"], 5) self.assertEqual(content["epfd"], EpfdType.GPS) self.assertEqual(content["month"], 2) self.assertEqual(content["day"], 7) self.assertEqual(content["hour"], 17) self.assertEqual(content["minute"], 0) self.assertEqual(content["draught"], 4.7) self.assertEqual(content["destination"], "VIANA DO CASTELO")
def test_bytes_valid(self): msg = decode_msg(b"!AIVDM,1,1,,A,403Ovl@000Htt<tSF0l4Q@100`Pq,0*28") self.assertIsNotNone(msg) self.assertIsInstance(msg, dict) self.assertEqual(msg['mmsi'], "003669713") self.assertEqual(msg['lon'], 181.0)
def should_raise(msg): with self.assertRaises(InvalidNMEAMessageException): decode_msg(msg)
def test_str_invalid(self): with self.assertRaises(InvalidNMEAMessageException): decode_msg("AIVDM,1,1,,A")