def setUp(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('GPS_Time', '21:23:48.021') self.test_state.set_data_item('GPS_Date', '15-05-19') self.test_state.set_data_item('Latitude', 39.739242) self.test_state.set_data_item('Longitude', 104.9903299) self.test_state.set_data_item('Altitude', 1609) self.test_state.set_data_item('X', 0.15) self.test_state.set_data_item('Y', 0.86) self.test_state.set_data_item('Z', 1.18) self.test_state.set_data_item('KPH', 86.3) self.test_state.set_data_item('Lap', 3) self.test_state.set_data_item('RPM', 5891) self.test_state.set_data_item('Gear', 3) self.test_state.set_data_item('Throttle', 97) self.test_state.set_data_item('ECU_Throttle', 95) self.test_state.set_data_item('Brake', 1) self.test_state.set_data_item('Brake_Pressure', 42) self.test_state.set_data_item('Clutch', 0) self.test_state.set_data_item('Steering_Angle', 6.21) self.test_state.set_data_item('Steering_Rate', 0.42) self.test_state.set_data_item('Coolant_Temperature', 99) self.test_state.set_data_item('Oil_Pressure', 240) self.test_state.set_data_item('Oil_Temperature', 96) self.test_state.set_data_item('LF_KPH', 85.2) self.test_state.set_data_item('RF_KPH', 86.9) self.test_state.set_data_item('LR_KPH', 85.0) self.test_state.set_data_item('RR_KPH', 86.7) self.test_state.set_data_item('PSM', 0) self.test_state.set_data_item('GPS_KPH', 0.86) self.test_state.set_data_item('GPS_Heading', 321.41) self.test_state.set_data_item('Accuracy', 0.10) self.test_formatter = CsvFormatter(dict()) pass
def process(input_paths, output_url, output_format, tags, output_batch_size, start_date_datum, start_time_datum): data = DataState() time_util = TimeUtils(start_date_datum, start_time_datum) data.set_data_item('DateTime', time_util.calculateTimestamp(None, None, 0.0)) last_data_time = data.state_time parser = Parser(data) formatter = FormatterFactory.getFormatter(output_format, tags) ostream = io.StringIO() header_line = formatter.formatHeading(data) if header_line is not None: if verbose > 0: print(header_line) print(header_line, end='\n', file=ostream) line_count = 0 for path in input_paths: print("Processing {0}".format(path)) with open(path, "r") as ifile: for data_line in ifile: input_line = data_line.strip() if verbose > 0: print(input_line) parser.parse(input_line) output_lines = formatter.formatData(data) if output_lines is not None: for output_line in output_lines: if verbose > 0: print(output_line) print(output_line, end='\n', file=ostream) line_count = line_count + 1 if data.state_time > last_data_time: last_data_time = data.state_time data.set_data_item( 'DateTime', time_util.calculateTimestamp( data.get_data_item('GPS_Date'), data.get_data_item('GPS_Time'), data.state_time)) output_line = formatter.formatTimeIncrement(data) if output_line is not None: if verbose > 0: print(output_line) print(output_line, end='\n', file=ostream) line_count = line_count + 1 if line_count >= output_batch_size: writeBatch(output_url, ostream) ostream.close() ostream = io.StringIO() line_count = 0 footer_line = formatter.formatFooter(data) if footer_line is not None: if verbose > 0: print(footer_line) print(footer_line, end='\n', file=ostream) writeBatch(output_url, ostream) ostream.close()
def testOilTemperature(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('Oil_Temperature', 96) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'oil_temperature,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 value=96 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for oil_temperature was not as expected.') self.assertTrue('Oil_Temperature' not in self.test_state.get_dirty_fields(), 'Oil_Temperature still dirty after formatting.')
def testClutch(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('Clutch', 0) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'clutch,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 released=0 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for clutch was not as expected.') self.assertTrue('Clutch' not in self.test_state.get_dirty_fields(), 'Clutch still dirty after formatting.')
def testBrake(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('Brake', 1) self.test_state.set_data_item('Brake_Pressure', 42) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'brake,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 applied=1,pressure=42 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for brake was not as expected.') self.assertTrue('Brake' not in self.test_state.get_dirty_fields(), 'Brake still dirty after formatting.') self.assertTrue('Brake_Pressure' not in self.test_state.get_dirty_fields(), 'Brake_Pressure still dirty after formatting.')
def testThrottle(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('Throttle', 97) self.test_state.set_data_item('ECU_Throttle', 95) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'throttle,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 driver=97,ecu=95 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for throttle was not as expected.') self.assertTrue('Throttle' not in self.test_state.get_dirty_fields(), 'Throttle still dirty after formatting.') self.assertTrue('ECU_Throttle' not in self.test_state.get_dirty_fields(), 'ECU_Throttle still dirty after formatting.')
def testSteering(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('Steering_Angle', 6.21) self.test_state.set_data_item('Steering_Rate', 0.42) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'steering,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 angle=6.21,rate=0.42 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for steering was not as expected.') self.assertTrue('Steering_Angle' not in self.test_state.get_dirty_fields(), 'Steering_Angle still dirty after formatting.') self.assertTrue('Steering_Rate' not in self.test_state.get_dirty_fields(), 'Steering_Rate still dirty after formatting.')
def testPModes(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('Sport_Mode', 1) self.test_state.set_data_item('Pasm_Sport_Mode', 1) self.test_state.set_data_item('PSM_Disable', 0) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'pmodes,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 sport=1,pasm_sport=1,psm_off=0 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for pmodes was not as expected.') self.assertTrue('Sport_Mode' not in self.test_state.get_dirty_fields(), 'Sport_Mode still dirty after formatting.') self.assertTrue('Pasm_Sport_Mode' not in self.test_state.get_dirty_fields(), 'Pasm_Sport_Mode still dirty after formatting.') self.assertTrue('PSM_Disable' not in self.test_state.get_dirty_fields(), 'PSM_Disable still dirty after formatting.')
def testLocation(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('GPS_Time', '21:23:48.021') self.test_state.set_data_item('GPS_Date', '15-05-19') self.test_state.set_data_item('Latitude', 39.739242) self.test_state.set_data_item('Longitude', 104.9903299) self.test_state.set_data_item('Altitude', 1609) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'location,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3,geohash=00000000 latitude=39.739242,longitude=104.9903299,altitude=1609 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for locaation was not as expected.') self.assertTrue('Latitude' not in self.test_state.get_dirty_fields(), 'Latitude still dirty after formatting.') self.assertTrue('Longitude' not in self.test_state.get_dirty_fields(), 'Longitude still dirty after formatting.')
def testAcceleration(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('GPS_Time', '21:23:48.021') self.test_state.set_data_item('GPS_Date', '15-05-19') self.test_state.set_data_item('X', 0.15) self.test_state.set_data_item('Y', 0.86) self.test_state.set_data_item('Z', 1.18) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'acceleration,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 x=0.15,y=0.86,z=1.18 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for acceleration was not as expected.') self.assertTrue('X' not in self.test_state.get_dirty_fields(), 'X still dirty after formatting.') self.assertTrue('Y' not in self.test_state.get_dirty_fields(), 'Y still dirty after formatting.') self.assertTrue('Z' not in self.test_state.get_dirty_fields(), 'Z still dirty after formatting.')
def testWheelSpeed(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('LF_KPH', 85.2) self.test_state.set_data_item('RF_KPH', 86.9) self.test_state.set_data_item('LR_KPH', 85.0) self.test_state.set_data_item('RR_KPH', 86.7) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'wheel_speed,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 left_front=85.2,right_front=86.9,left_rear=85.0,right_rear=86.7 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for wheel_speed was not as expected.') self.assertTrue('LF_KPH' not in self.test_state.get_dirty_fields(), 'LF_KPH still dirty after formatting.') self.assertTrue('RF_KPH' not in self.test_state.get_dirty_fields(), 'RF_KPH still dirty after formatting.') self.assertTrue('LR_KPH' not in self.test_state.get_dirty_fields(), 'LR_KPH still dirty after formatting.') self.assertTrue('RR_KPH' not in self.test_state.get_dirty_fields(), 'RR_KPH still dirty after formatting.')
def scan(inpath, verbose): data = DataState() parser = Parser(data) line_count = 0 datum_datetime = None accumulated_delta = 0.0 delta_count = 0 with open(inpath, "r") as ifile: for data_line in ifile: input_line = data_line.strip() if verbose > 0: print(input_line) if input_line.startswith('$AC') or input_line.startswith('$GPRMC'): parser.parse(input_line) print("Line {3} - Time: {0} GPS Timestamp: {1} {2}".format( data.get_data_item('Time'), data.get_data_item('GPS_Date'), data.get_data_item('GPS_Time'), line_count)) if data.is_dirty('GPS_Date') and data.is_dirty('GPS_Time'): data_datetime = datetime.strptime( "{0} {1}".format(data.get_data_item('GPS_Date'), data.get_data_item('GPS_Time')), '%Y-%m-%d %H:%M:%S.%f') data_deltatime = timedelta(0, data.get_data_item('Time')) calculated_datum_datetime = data_datetime - data_deltatime if datum_datetime is None: datum_datetime = calculated_datum_datetime print("Calculated Datum: {0}".format( calculated_datum_datetime.isoformat())) datum_delta = calculated_datum_datetime - datum_datetime print("Calculated Delta: {0}".format( datum_delta.total_seconds())) accumulated_delta = accumulated_delta + datum_delta.total_seconds( ) delta_count = delta_count + 1 average_delta = accumulated_delta / delta_count print("Average Delta: {0}".format(average_delta)) datum_datetime = datum_datetime + timedelta(0, average_delta) print("Datum: {0}".format(datum_datetime.isoformat()))
class NmeaParserTest(unittest.TestCase): test_state = DataState() test_parser = NmeaParser(test_state) def test_rmc_1(self): test_fields = [ "$GPRMC", "040338.445", "A", "3943.8653", "N", "10456.9499", "W", "042.7", "203.2", "190519", "", "", "A*7D" ] test_extractor = NmeaRmcExtractor() test_extractor.extractData(test_fields, NmeaParserTest.test_state) self.assertAlmostEqual( self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Latitude)), 39.7310883333, 8) self.assertAlmostEqual( self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Longitude)), -104.949165000, 8) self.assertAlmostEqual( self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.GPS_KPH)), 79.08040000000001, 8) self.assertAlmostEqual( self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.GPS_Heading)), 203.20000000, 8) self.assertEqual( self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.GPS_Date)), '2019-05-19') self.assertEqual( self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.GPS_Time)), '04:03:38.445') pass
def setUp(self): self.test_state = DataState() self.test_parser = AccelerometerParser(self.test_state)
class CanFrameParserTest(unittest.TestCase): test_state = DataState() test_parser = CanFrameParser(test_state) def testFrame242_1(self): test_fields = [ "$CNDRV", "476.72", "242", "01", "00", "00", "00", "58", "00", "65", "00" ] test_extractor = CanFrame242Extractor() test_extractor.extractData(test_fields, CanFrameParserTest.test_state) self.assertEqual( 0, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Clutch)), 'Clutch Pedal was not parsed correctly.') self.assertEqual( 0, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.RPM)), 'Engine RPM was not parsed correctly.') self.assertEqual( 0, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.ECU_Throttle)), 'ECU commanded throttle was not parsed correctly.') pass def testFrame242_2(self): test_fields = [ "$CNDRV", "476.72", "242", "09", "00", "C8", "50", "58", "C3", "65", "00" ] test_extractor = CanFrame242Extractor() test_extractor.extractData(test_fields, CanFrameParserTest.test_state) self.assertEqual( 1, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Clutch)), 'Clutch Pedal was not parsed correctly.') self.assertEqual( 5170, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.RPM)), 'Engine RPM was not parsed correctly.') self.assertAlmostEqual( 76, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.ECU_Throttle)), 2, 'ECU commanded throttle was not parsed correctly.') pass def testFrame245(self): test_fields = [ "$CNDRV", "476.72", "245", "01", "6C", "02", "00", "58", "00", "65", "00" ] test_extractor = CanFrame245Extractor() test_extractor.extractData(test_fields, CanFrameParserTest.test_state) self.assertEqual( 96, self.test_state.get_data_item( DataState.get_data_name_at_idx( DataState.names.Coolant_Temperature)), 'Coolant temperature was not parsed correctly.') self.assertEqual( 1, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Brake)), 'Brake pedal was not parsed correctly.') pass def testFrame246(self): test_fields = [ "$CNDRV", "476.72", "246", "0B", "00", "C8", "E1", "58", "C3", "65", "00" ] test_extractor = CanFrame246Extractor() test_extractor.extractData(test_fields, CanFrameParserTest.test_state) self.assertEqual( 3, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Gear)), 'Gear indicator was not parsed correctly.') self.assertAlmostEqual( 88, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Throttle)), 2, 'ECU commanded throttle was not parsed correctly.') pass def testFrame24A(self): test_fields = [ "$CNDRV", "476.72", "24A", "0B", "10", "C8", "10", "0E", "10", "D2", "10" ] test_extractor = CanFrame24AExtractor() test_extractor.extractData(test_fields, CanFrameParserTest.test_state) self.assertAlmostEqual( 41.07, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.LF_KPH)), 2, 'LF wheel speed was not parsed correctly.') self.assertAlmostEqual( 42.96, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.RF_KPH)), 2, 'RF wheel speed was not parsed correctly.') self.assertAlmostEqual( 41.10, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.LR_KPH)), 2, 'LR wheel speed was not parsed correctly.') self.assertAlmostEqual( 41.12, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.RR_KPH)), 2, 'RR wheel speed was not parsed correctly.') pass def testFrame441(self): test_fields = [ "$CNDRV", "476.72", "441", "0B", "10", "C8", "10", "0E", "67", "82", "10" ] test_extractor = CanFrame441Extractor() test_extractor.extractData(test_fields, CanFrameParserTest.test_state) self.assertAlmostEqual( 89.33, self.test_state.get_data_item( DataState.get_data_name_at_idx( DataState.names.Oil_Temperature)), 2, 'Oil temperature was not parsed correctly.') self.assertEqual( 325, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Oil_Pressure)), 'Oil pressure was not parsed correctly.') pass def testFrame44B(self): test_fields = [ "$CNDRV", "476.72", "44B", "2B", "10", "C8", "10", "0E", "10", "D2", "10" ] test_extractor = CanFrame44BExtractor() test_extractor.extractData(test_fields, CanFrameParserTest.test_state) self.assertEqual( 43, self.test_state.get_data_item( DataState.get_data_name_at_idx( DataState.names.Brake_Pressure)), 'Brake pressure was not parsed correctly.') pass def testParserFrame242(self): test_line = "$CNDRV,477.72,242,09,00,C8,50,58,C3,65,00" CanFrameParserTest.test_parser.parse(test_line) self.assertEqual( 477.72, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Time)), 'Time was not parsed correctly.') self.assertEqual( 1, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Clutch)), 'Clutch Pedal was not parsed correctly.') self.assertEqual( 5170, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.RPM)), 'Engine RPM was not parsed correctly.') self.assertAlmostEqual( 76, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.ECU_Throttle)), 2, 'ECU commanded throttle was not parsed correctly.') pass def testParserFrame245(self): test_line = "$CNDRV,477.72,245,09,6E,C8,50,58,C3,65,00" CanFrameParserTest.test_parser.parse(test_line) self.assertAlmostEqual( 477.72, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Time)), 2, 'Time was not parsed correctly.') self.assertAlmostEqual( 98.67, self.test_state.get_data_item( DataState.get_data_name_at_idx( DataState.names.Coolant_Temperature)), 2, 'Coolant temperature was not parsed correctly.') self.assertEqual( 0, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Brake)), 'Brake pedal was not parsed correctly.') pass def testParserFrame246(self): test_line = "$CNDRV,478.50,246,04,00,C8,FA,58,C3,65,00" CanFrameParserTest.test_parser.parse(test_line) self.assertEqual( 478.50, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Time)), 'Time was not parsed correctly.') self.assertEqual( 4, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Gear)), 'Gear indicator was not parsed correctly.') self.assertAlmostEqual( 98, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Throttle)), 2, 'ECU commanded throttle was not parsed correctly.') pass def testParserFrame24A(self): test_line = "$CNDRV,480.17,24A,0B,20,C8,20,F7,20,02,21" CanFrameParserTest.test_parser.parse(test_line) self.assertEqual( 480.17, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Time)), 'Time was not parsed correctly.') self.assertAlmostEqual( 82.030, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.LF_KPH)), 3, 'LF wheel speed was not parsed correctly.') self.assertAlmostEqual( 83.920, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.RF_KPH)), 3, 'RF wheel speed was not parsed correctly.') self.assertAlmostEqual( 84.390, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.LR_KPH)), 3, 'LR wheel speed was not parsed correctly.') self.assertAlmostEqual( 84.810, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.RR_KPH)), 3, 'RR wheel speed was not parsed correctly.') pass
class Test(unittest.TestCase): object_under_test = DataState() def test_get_data_name_at_index(self): actual_name = Test.object_under_test.get_data_name_at_idx( DataState.names.RPM) self.assertEqual( "RPM", actual_name, "The field name for RPM was not looked up correctly.") actual_name = Test.object_under_test.get_data_name_at_idx( DataState.names.Oil_Pressure) self.assertEqual( "Oil_Pressure", actual_name, "The field name for Oil Pressure was not looked up correctly.") pass def test_dirty_marking(self): Test.object_under_test.set_data_item('Time', 321.36) Test.object_under_test.set_data_item('GPS_Date', '15-05-19') Test.object_under_test.set_data_item('GPS_Time', '21:23:48.021') Test.object_under_test.set_data_item('X', 0.14) Test.object_under_test.set_data_item('Time', 321.41) Test.object_under_test.set_data_item('X', 0.10) dirty_fields = Test.object_under_test.get_dirty_fields() expected_dirty = set({'Time', 'GPS_Date', 'GPS_Time', 'X'}) self.assertSetEqual( dirty_fields, expected_dirty, 'Expected dirty fields didn' 't match the returned actual dirty fields.') def test_cleaning_dirty_marking(self): Test.object_under_test.set_data_item('Time', 321.36) Test.object_under_test.set_data_item('GPS_Date', '15-05-19') Test.object_under_test.set_data_item('GPS_Time', '21:23:48.021') Test.object_under_test.set_data_item('X', 0.14) Test.object_under_test.set_data_item('Time', 321.41) Test.object_under_test.set_data_item('X', 0.10) dirty_fields = Test.object_under_test.get_dirty_fields() self.assertTrue('X' in dirty_fields, 'Expected field X to be dirty.') Test.object_under_test.clean_fields(['X', 'GPS_Date', 'GPS_Time']) dirty_fields = Test.object_under_test.get_dirty_fields() self.assertTrue(Test.object_under_test.is_dirty('Time'), 'Expected field Time to be dirty') self.assertFalse(Test.object_under_test.is_dirty('GPS_Date'), 'Expected field GPS_Date to not be dirty') self.assertFalse(Test.object_under_test.is_dirty('GPS_Time'), 'Expected field GPS_Time to not be dirty') self.assertFalse(Test.object_under_test.is_dirty('X'), 'Expected field X to not be dirty') def test_set_data_item(self): Test.object_under_test.set_data_item('RPM', 3787) self.assertTrue( Test.object_under_test.get_data_item('RPM') == 3787, 'Expected RPM to have value 3787') pass def test_set_data_item_multi(self): Test.object_under_test.set_data_item('Time', 321.36) Test.object_under_test.set_data_item( 'DateTime', datetime(2019, 5, 15, 21, 23, 48, 21000, timezone.utc)) Test.object_under_test.set_data_item('GPS_Date', '15-05-19') Test.object_under_test.set_data_item('GPS_Time', '21:23:48.021') Test.object_under_test.set_data_item('X', 0.14) Test.object_under_test.set_data_item('Y', 0.86) Test.object_under_test.set_data_item('Time', 321.41) Test.object_under_test.set_data_item('X', 0.10) self.assertTrue( Test.object_under_test.get_data_item('Time') == 321.41, 'Expected Time to have value 321.41') self.assertTrue( Test.object_under_test.get_data_item('DateTime') == datetime( 2019, 5, 15, 21, 23, 48, 21000, timezone.utc), 'Expected DateTime didn' 't match') self.assertTrue( Test.object_under_test.get_data_item('GPS_Date') == '15-05-19', 'Expected GPS Date to have value 15-05-19') self.assertTrue( Test.object_under_test.get_data_item('GPS_Time') == '21:23:48.021', 'Expected GPS Time to have value 21:23:48.021') self.assertTrue( Test.object_under_test.get_data_item('X') == 0.10, 'Expected X accel to have value 0.10') self.assertTrue( Test.object_under_test.get_data_item('Y') == 0.86, 'Expected Y accel to have value 0.86') pass def test_get_data_names(self): names = Test.object_under_test.get_data_names() self.assertTrue('Time' in names) self.assertTrue('DateTime' in names) self.assertTrue('GPS_Time' in names) self.assertTrue('GPS_Date' in names) self.assertTrue('Longitude' in names) self.assertTrue('Latitude' in names) self.assertTrue('Altitude' in names) self.assertTrue('X' in names) self.assertTrue('Y' in names) self.assertTrue('Z' in names) self.assertTrue('KPH' in names) self.assertTrue('Lap' in names) self.assertTrue('RPM' in names) self.assertTrue('Gear' in names) self.assertTrue('Throttle' in names) self.assertTrue('Brake' in names) self.assertTrue('Clutch' in names) self.assertTrue('Steering_Angle' in names) self.assertTrue('Steering_Rate' in names) self.assertTrue('Coolant_Temperature' in names) self.assertTrue('Oil_Pressure' in names) self.assertTrue('Oil_Temperature' in names) self.assertTrue('PSM' in names) self.assertTrue('GPS_KPH' in names) self.assertTrue('GPS_Heading' in names) pass