-
Kien Le authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
test_gps.py 9.52 KiB
from unittest import TestCase
import math
from sohstationviewer.model.mseed.mseed import MSeed
from sohstationviewer.view.util.enums import LogType
class TestCheckGPSStatusFormatQ330(TestCase):
def setUp(self) -> None:
self.status_lines = [
'GPS Status',
'Time: 18:28:49',
'Date: 27/08/2018',
'Fix Type: 3-D',
'Height: 47.6M',
'Latitude: 5906.7572N',
'Longitude: 15651.4038W',
'On Time: 15min',
'Sat. Used: 6',
'In View: 11',
'Checksum Errors: 0',
'Last GPS timemark: 2018-08-27 18:28:48',
'PLL Status'
]
def test_not_enough_status_lines(self):
self.status_lines.pop()
with self.assertRaises(ValueError):
MSeed.check_gps_status_format_q330(self.status_lines)
def test_too_many_status_lines(self):
self.status_lines.append('')
with self.assertRaises(ValueError):
MSeed.check_gps_status_format_q330(self.status_lines)
def test_gps_status_not_followed_by_pll_status(self):
self.status_lines[12] = ''
with self.assertRaises(ValueError):
MSeed.check_gps_status_format_q330(self.status_lines)
def test_good_data(self):
try:
MSeed.check_gps_status_format_q330(self.status_lines)
except ValueError:
self.fail()
def test_fix_type_bad_data(self):
self.status_lines[3] = ''
with self.assertRaises(ValueError):
MSeed.check_gps_status_format_q330(self.status_lines)
def test_height_bad_data(self):
self.status_lines[4] = ''
with self.assertRaises(ValueError):
MSeed.check_gps_status_format_q330(self.status_lines)
def test_latitude_bad_data(self):
self.status_lines[5] = ''
with self.assertRaises(ValueError):
MSeed.check_gps_status_format_q330(self.status_lines)
def test_longitude_bad_data(self):
self.status_lines[6] = ''
with self.assertRaises(ValueError):
MSeed.check_gps_status_format_q330(self.status_lines)
def test_sat_used_bad_data(self):
self.status_lines[8] = ''
with self.assertRaises(ValueError):
MSeed.check_gps_status_format_q330(self.status_lines)
def test_gps_timemark_bad_data(self):
self.status_lines[11] = ''
with self.assertRaises(ValueError):
MSeed.check_gps_status_format_q330(self.status_lines)
class TestExtractGPSPointQ330(TestCase):
def setUp(self) -> None:
self.gps_lines = ['GPS Status',
'Time: 03:37:39',
'Date: 05/07/2021',
'Fix Type: 3-D',
'Height: 1000.6M',
'Latitude: 3853.9013N',
'Longitude: 04610.8865E',
'On Time: 65535min',
'Sat. Used: 7',
'In View: 11',
'Checksum Errors: 0',
'Last GPS timemark: 2021-07-05 03:37:38']
def test_not_enough_gps_lines(self):
self.gps_lines.pop()
with self.assertRaises(ValueError):
MSeed.extract_gps_point_q330(self.gps_lines)
def test_too_many_gps_lines(self):
self.gps_lines.append('')
with self.assertRaises(ValueError):
MSeed.extract_gps_point_q330(self.gps_lines)
def test_last_timemark_extracted_correctly(self):
with self.subTest('test_data_from_file'):
result = MSeed.extract_gps_point_q330(self.gps_lines)
expected = '2021-07-05 03:37:38'
self.assertEqual(result.last_timemark, expected)
with self.subTest('test_made_up_data'):
self.gps_lines[11] = 'Last GPS timemark: test time mark'
result = MSeed.extract_gps_point_q330(self.gps_lines)
expected = 'test time mark'
self.assertEqual(result.last_timemark, expected)
def test_fix_type_extracted_correctly(self):
with self.subTest('test_data_from_file'):
result = MSeed.extract_gps_point_q330(self.gps_lines)
expected = '3-D'
self.assertEqual(result.fix_type, expected)
with self.subTest('test_made_up_data'):
self.gps_lines[3] = 'Fix Type: test fix type'
result = MSeed.extract_gps_point_q330(self.gps_lines)
expected = 'test fix type'
self.assertEqual(result.fix_type, expected)
def test_height_extracted_correctly(self):
with self.subTest('test_data_from_file'):
result = MSeed.extract_gps_point_q330(self.gps_lines)
expected = 1000.6
self.assertTrue(math.isclose(result.height, expected))
with self.subTest('test_made_up_data'):
self.gps_lines[4] = 'Height: 3522362.623623MMMSM'
result = MSeed.extract_gps_point_q330(self.gps_lines)
expected = 3522362.623623
self.assertTrue(math.isclose(result.height, expected))
def test_height_unit_extracted_correctly(self):
with self.subTest('test_data_from_file'):
result = MSeed.extract_gps_point_q330(self.gps_lines)
expected = 'M'
self.assertEqual(result.height_unit, expected)
with self.subTest('test_made_up_data'):
self.gps_lines[4] = 'Height: 3522362.623623MMMSM'
result = MSeed.extract_gps_point_q330(self.gps_lines)
expected = 'MMMSM'
self.assertEqual(result.height_unit, expected)
def test_latitude_extracted_correctly(self):
with self.subTest('test_latitude_in_the_north'):
result = MSeed.extract_gps_point_q330(self.gps_lines)
expected = 38.898355
self.assertTrue(math.isclose(result.latitude, expected))
with self.subTest('test_latitude_in_the_south'):
self.gps_lines[5] = 'Latitude: 3853.9013S'
result = MSeed.extract_gps_point_q330(self.gps_lines)
expected = -38.898355
self.assertTrue(math.isclose(result.latitude, expected))
def test_longitude_extracted_correctly(self):
with self.subTest('test_longitude_in_the_east'):
result = MSeed.extract_gps_point_q330(self.gps_lines)
expected = 46.18144166666666667
self.assertTrue(math.isclose(result.longitude, expected))
with self.subTest('test_longitude_in_the_west'):
self.gps_lines[6] = 'Longitude: 04610.8865W'
result = MSeed.extract_gps_point_q330(self.gps_lines)
expected = -46.18144166666666667
self.assertTrue(math.isclose(result.longitude, expected))
def test_num_sat_used_extracted_correctly(self):
with self.subTest('test_longitude_in_the_east'):
result = MSeed.extract_gps_point_q330(self.gps_lines)
expected = 7
self.assertEqual(result.num_satellite_used, expected)
with self.subTest('test_longitude_in_the_west'):
self.gps_lines[8] = 'Sat. Used: 53252352'
result = MSeed.extract_gps_point_q330(self.gps_lines)
expected = 53252352
self.assertEqual(result.num_satellite_used, expected)
def test_no_location_data(self):
self.gps_lines[4] = 'Height: '
self.gps_lines[5] = 'Latitude: '
self.gps_lines[6] = 'Longitude: '
self.gps_lines[8] = 'Sat. Used: '
result = MSeed.extract_gps_point_q330(self.gps_lines)
self.assertEqual(result.last_timemark, '2021-07-05 03:37:38')
self.assertEqual(result.fix_type, '3-D')
self.assertEqual(result.height, 0)
self.assertEqual(result.latitude, 0)
self.assertEqual(result.longitude, 0)
self.assertEqual(result.num_satellite_used, 0)
class MockMSeed(MSeed):
"""
This class mocks out some methods of MSeed that are used in
MSeed.get_gps_channel_prefix but which would make testing it more
cumbersome. The methods mocked out either run very long or change the GUI
and/or terminal in some way.
"""
def __init__(self): # noqa
self.notification_signal = None
self.tmp_dir = ''
def track_info(self, text: str, type: LogType) -> None:
print(text)
def __del__(self):
pass
class TestGetGPSChannelPrefix(TestCase):
def setUp(self) -> None:
self.mseed_obj = MockMSeed()
self.mseed_obj.channels = set()
def test_pegasus_data_type(self):
data_type = 'Pegasus'
expected = 'V'
result = self.mseed_obj.get_gps_channel_prefix(data_type)
self.assertEqual(result, expected)
def test_centaur_data_type(self):
data_type = 'Centaur'
expected = 'G'
result = self.mseed_obj.get_gps_channel_prefix(data_type)
self.assertEqual(result, expected)
def test_unknown_data_type_pegasus_gps_channels(self):
data_type = 'Unknown'
self.mseed_obj.channels = {'VNS', 'VLA', 'VLO', 'VEL'}
expected = 'V'
result = self.mseed_obj.get_gps_channel_prefix(data_type)
self.assertEqual(expected, result)
def test_unknown_data_type_centaur_gps_channels(self):
data_type = 'Unknown'
self.mseed_obj.channels = {'GNS', 'GLA', 'GLO', 'GEL'}
expected = 'G'
result = self.mseed_obj.get_gps_channel_prefix(data_type)
self.assertEqual(expected, result)
def test_unknown_data_type_channels_do_not_match_either_data_type(self):
data_type = 'Unknown'
result = self.mseed_obj.get_gps_channel_prefix(data_type)
self.assertIsNone(result)