def test_normal_write(self): self.sock.sendall("IAS;121.2;0000\n".encode()) time.sleep(0.1) x = database.read("IAS") self.assertEqual(x, (121.2, False, False, False, False, False)) self.sock.sendall("IAS;121.3;1000\n".encode()) time.sleep(0.1) x = database.read("IAS") self.assertEqual(x, (121.3, True, False, False, False, False)) self.sock.sendall("IAS;121.4;0100\n".encode()) time.sleep(0.1) x = database.read("IAS") self.assertEqual(x, (121.4, False, False, True, False, False)) self.sock.sendall("IAS;121.5;0010\n".encode()) time.sleep(0.1) x = database.read("IAS") self.assertEqual(x, (121.5, False, False, False, True, False)) self.sock.sendall("IAS;121.6;0001\n".encode()) time.sleep(0.1) x = database.read("IAS") self.assertEqual(x, (121.6, False, False, False, False, True))
def test_normal_write(self): self.sock.sendall("IAS;121.2;0000\n".encode()) time.sleep(0.1) x = database.read("IAS") self.assertEqual(x, (121.2, False, False, False, False, False)) self.sock.sendall("IAS;121.3;1000\n".encode()) time.sleep(0.1) x = database.read("IAS") self.assertEqual(x, (121.3, True, False, False, False, False)) self.sock.sendall("IAS;121.4;0100\n".encode()) time.sleep(0.1) x = database.read("IAS") self.assertEqual(x, (121.4, False, False, True, False, False)) self.sock.sendall("IAS;121.5;0010\n".encode()) time.sleep(0.1) x = database.read("IAS") self.assertEqual(x, (121.5, False, False, False, True, False)) self.sock.sendall("IAS;121.6;0001\n".encode()) time.sleep(0.1) x = database.read("IAS") self.assertEqual(x, (121.6, False, False, False, False, True))
def test_wrong_datatype(self): """test using wrong datatype for item""" sf = io.StringIO(general_config) database.init(sf) database.write("DUMMY", 1234) x = database.read("DUMMY") self.assertEqual(x[0], "1234") database.write("PITCH", "23.4") x = database.read("PITCH") self.assertEqual(x[0], 23.4)
def test_similar_aux_items(self): """it would be easy for a single aux array to be pointed to by different database items.""" sf = io.StringIO(variable_config) database.init(sf) database.write("EGT11.Max", 700) database.write("EGT12.Max", 800) x = database.read("EGT11.Max") y = database.read("EGT12.Max") self.assertNotEqual(y, x)
def test_timeout_lifetime(self): """Test item timeout lifetime""" sf = io.StringIO(general_config) database.init(sf) database.write("PITCH", -11.4) x = database.read("PITCH") self.assertEqual(x, (-11.4, False, False, False, False, False)) time.sleep(0.250) x = database.read("PITCH") self.assertEqual(x, (-11.4, False, True, False, False, False)) database.write("PITCH", -11.4) x = database.read("PITCH") self.assertEqual(x, (-11.4, False, False, False, False, False))
def test_timeout_lifetime(self): """Test item timeout lifetime""" sf = io.StringIO(general_config) database.init(sf) database.write("PITCH", -11.4) x = database.read("PITCH") self.assertEqual(x, (-11.4, False, False, False, False, False)) time.sleep(0.250) x = database.read("PITCH") self.assertEqual(x, (-11.4, False, True, False, False, False)) database.write("PITCH", -11.4) x = database.read("PITCH") self.assertEqual(x, (-11.4, False, False, False, False, False))
def test_string_datatype(self): """test writing a string to an item""" sf = io.StringIO(general_config) database.init(sf) database.write("DUMMY", "test string") x = database.read("DUMMY") self.assertEqual(x[0], "test string")
def test_compute_span(self): database.write("EGT11", 300) database.write("EGT12", 320) database.write("EGT13", 340) database.write("EGT14", 360) x = database.read("EGTSPAN1") self.assertEqual(x, (60, False, False, False, False, False)) database.write("EGT13", (340, False, True, False, False)) x = database.read("EGTSPAN1") self.assertEqual(x, (60, False, False, True, False, False)) database.write("EGT13", (340, False, False, True, False)) x = database.read("EGTSPAN1") self.assertEqual(x, (0, False, False, False, True, False)) database.write("EGT13", (340, False, False, False, True)) x = database.read("EGTSPAN1") self.assertEqual(x, (60, False, False, False, False, True))
def test_compute_average(self): database.write("EGT11", 300) database.write("EGT12", 320) database.write("EGT13", 340) database.write("EGT14", 360) x = database.read("EGTAVG1") self.assertEqual(x, (330, False, False, False, False, False)) database.write("EGT13", (340, False, True, False, False)) x = database.read("EGTAVG1") self.assertEqual(x, (330, False, False, True, False, False)) database.write("EGT13", (340, False, False, True, False)) x = database.read("EGTAVG1") self.assertEqual(x, (0, False, False, False, True, False)) database.write("EGT13", (340, False, False, False, True)) x = database.read("EGTAVG1") self.assertEqual(x, (330, False, False, False, False, True))
def test_compute_average(self): database.write("EGT11", 300) database.write("EGT12", 320) database.write("EGT13", 340) database.write("EGT14", 360) x = database.read("EGTAVG1") self.assertEqual(x, (330, False, False, False, False, False)) database.write("EGT13", (340, False, True, False, False)) x = database.read("EGTAVG1") self.assertEqual(x, (330, False, False, True, False, False)) database.write("EGT13", (340, False, False, True, False)) x = database.read("EGTAVG1") self.assertEqual(x, (0, False, False, False, True, False)) database.write("EGT13", (340, False, False, False, True)) x = database.read("EGTAVG1") self.assertEqual(x, (330, False, False, False, False, True))
def test_compute_span(self): database.write("EGT11", 300) database.write("EGT12", 320) database.write("EGT13", 340) database.write("EGT14", 360) x = database.read("EGTSPAN1") self.assertEqual(x, (60, False, False, False, False, False)) database.write("EGT13", (340, False, True, False, False)) x = database.read("EGTSPAN1") self.assertEqual(x, (60, False, False, True, False, False)) database.write("EGT13", (340, False, False, True, False)) x = database.read("EGTSPAN1") self.assertEqual(x, (0, False, False, False, True, False)) database.write("EGT13", (340, False, False, False, True)) x = database.read("EGTSPAN1") self.assertEqual(x, (60, False, False, False, False, True))
def test_compute_min(self): database.write("CHT11", 300) database.write("CHT12", 320) database.write("CHT13", 340) database.write("CHT14", 360) x = database.read("CHTMIN1") self.assertEqual(x, (300, False, False, False, False, False)) database.write("CHT11", 295) x = database.read("CHTMIN1") self.assertEqual(x, (295, False, False, False, False, False)) database.write("CHT12", 290) x = database.read("CHTMIN1") self.assertEqual(x, (290, False, False, False, False, False)) database.write("CHT13", 280) x = database.read("CHTMIN1") self.assertEqual(x, (280, False, False, False, False, False)) database.write("CHT13", (280, False, True, False, False)) x = database.read("CHTMIN1") self.assertEqual(x, (280, False, False, True, False, False)) database.write("CHT13", (280, False, False, True, False)) x = database.read("CHTMIN1") self.assertEqual(x, (0, False, False, False, True, False)) database.write("CHT13", (280, False, False, False, True)) x = database.read("CHTMIN1") self.assertEqual(x, (280, False, False, False, False, True))
def test_compute_max(self): database.write("CHT11", 300) database.write("CHT12", 320) database.write("CHT13", 340) database.write("CHT14", 360) x = database.read("CHTMAX1") self.assertEqual(x, (360, False, False, False, False, False)) database.write("CHT11", 370) x = database.read("CHTMAX1") self.assertEqual(x, (370, False, False, False, False, False)) database.write("CHT12", 380) x = database.read("CHTMAX1") self.assertEqual(x, (380, False, False, False, False, False)) database.write("CHT13", 390) x = database.read("CHTMAX1") self.assertEqual(x, (390, False, False, False, False, False)) database.write("CHT13", (340, False, True, False, False)) x = database.read("CHTMAX1") self.assertEqual(x, (380, False, False, True, False, False)) database.write("CHT13", (340, False, False, True, False)) x = database.read("CHTMAX1") self.assertEqual(x, (0, False, False, False, True, False)) database.write("CHT13", (340, False, False, False, True)) x = database.read("CHTMAX1") self.assertEqual(x, (380, False, False, False, False, True))
def test_compute_min(self): database.write("CHT11", 300) database.write("CHT12", 320) database.write("CHT13", 340) database.write("CHT14", 360) x = database.read("CHTMIN1") self.assertEqual(x, (300, False, False, False, False, False)) database.write("CHT11", 295) x = database.read("CHTMIN1") self.assertEqual(x, (295, False, False, False, False, False)) database.write("CHT12", 290) x = database.read("CHTMIN1") self.assertEqual(x, (290, False, False, False, False, False)) database.write("CHT13", 280) x = database.read("CHTMIN1") self.assertEqual(x, (280, False, False, False, False, False)) database.write("CHT13", (280, False, True, False, False)) x = database.read("CHTMIN1") self.assertEqual(x, (280, False, False, True, False, False)) database.write("CHT13", (280, False, False, True, False)) x = database.read("CHTMIN1") self.assertEqual(x, (0, False, False, False, True, False)) database.write("CHT13", (280, False, False, False, True)) x = database.read("CHTMIN1") self.assertEqual(x, (280, False, False, False, False, True))
def test_compute_max(self): database.write("CHT11", 300) database.write("CHT12", 320) database.write("CHT13", 340) database.write("CHT14", 360) x = database.read("CHTMAX1") self.assertEqual(x, (360, False, False, False, False, False)) database.write("CHT11", 370) x = database.read("CHTMAX1") self.assertEqual(x, (370, False, False, False, False, False)) database.write("CHT12", 380) x = database.read("CHTMAX1") self.assertEqual(x, (380, False, False, False, False, False)) database.write("CHT13", 390) x = database.read("CHTMAX1") self.assertEqual(x, (390, False, False, False, False, False)) database.write("CHT13", (340, False, True, False, False)) x = database.read("CHTMAX1") self.assertEqual(x, (380, False, False, True, False, False)) database.write("CHT13", (340, False, False, True, False)) x = database.read("CHTMAX1") self.assertEqual(x, (0, False, False, False, True, False)) database.write("CHT13", (340, False, False, False, True)) x = database.read("CHTMAX1") self.assertEqual(x, (380, False, False, False, False, True))
def test_quality_bits(self): """Test quality bits""" sf = io.StringIO(general_config) database.init(sf) i = database.get_raw_item("OILP1") database.write("OILP1", 15.4) x = database.read("OILP1") self.assertEqual(x, (15.4, False, False, False, False, False)) i.annunciate = True x = database.read("OILP1") self.assertEqual(x, (15.4, True, False, False, False, False)) i.annunciate = False x = database.read("OILP1") self.assertEqual(x, (15.4, False, False, False, False, False)) i.fail = True x = database.read("OILP1") self.assertEqual(x, (15.4, False, False, False, True, False)) i.fail = False x = database.read("OILP1") self.assertEqual(x, (15.4, False, False, False, False, False)) i.bad = True x = database.read("OILP1") self.assertEqual(x, (15.4, False, False, True, False, False)) i.bad = False x = database.read("OILP1") self.assertEqual(x, (15.4, False, False, False, False, False))
def test_aux_data_read_write(self): """Test database auxillary data reading and writing""" sf = io.StringIO(general_config) database.init(sf) tests = [("Min", -160.0), ("Max", -130.0), ("0g", 10.0), ("Warn", 23.4), ("Stall", 45.6)] for test in tests: x = database.write("AOA." + test[0], test[1]) x = database.read("AOA." + test[0]) self.assertEqual(x, test[1])
def test_database_aux_data_bounds(self): """Test database aux data bounds checking""" sf = io.StringIO(general_config) database.init(sf) tests = [(0.0, 0.0), (-180.0, -180.0), (-180.1, -180.0), (0.0, 0, 0), (180.0, 180.0), (180.1, 180.0)] for test in tests: database.write("AOA.Warn", test[0]) x = database.read("AOA.Warn") self.assertEqual(x, test[1])
def test_parameter_writes(self): for param in ptests: msg = can.Message(is_extended_id = False, arbitration_id = param[1]) msg.data = string2data(param[2]) self.bus.send(msg) time.sleep(0.03) x = database.read(param[0]) if '.' in param[0]: val = x else: val = x[0] self.assertTrue(abs(val-param[3]) <= param[4])
def test_parameter_writes(self): for param in ptests: msg = can.Message(extended_id = False, arbitration_id = param[1]) msg.data = string2data(param[2]) self.bus.send(msg) time.sleep(0.03) x = database.read(param[0]) if '.' in param[0]: val = x else: val = x[0] self.assertTrue(abs(val-param[3]) <= param[4])
def test_compute_sum(self): database.write("FUELQ1", 10) database.write("FUELQ2", 10) x = database.read("FUELQT") self.assertEqual(x, (20, False, False, False, False, False)) database.write("FUELQ1", 10) database.write("FUELQ2", 0) x = database.read("FUELQT") self.assertEqual(x, (10, False, False, False, False, False)) database.write("FUELQ1", 0) database.write("FUELQ2", 15) x = database.read("FUELQT") self.assertEqual(x, (15, False, False, False, False, False)) database.write("FUELQ1", (10, False, True, False, False)) x = database.read("FUELQT") self.assertEqual(x, (25, False, False, True, False, False)) database.write("FUELQ1", (10, False, False, True, False)) x = database.read("FUELQT") self.assertEqual(x, (0, False, False, False, True, False)) database.write("FUELQ1", (10, False, False, False, True)) x = database.read("FUELQT") self.assertEqual(x, (25, False, False, False, False, True))
def test_compute_sum(self): database.write("FUELQ1", 10) database.write("FUELQ2", 10) x = database.read("FUELQT") self.assertEqual(x, (20, False, False, False, False, False)) database.write("FUELQ1", 10) database.write("FUELQ2", 0) x = database.read("FUELQT") self.assertEqual(x, (10, False, False, False, False, False)) database.write("FUELQ1", 0) database.write("FUELQ2", 15) x = database.read("FUELQT") self.assertEqual(x, (15, False, False, False, False, False)) database.write("FUELQ1", (10, False, True, False, False)) x = database.read("FUELQT") self.assertEqual(x, (25, False, False, True, False, False)) database.write("FUELQ1", (10, False, False, True, False)) x = database.read("FUELQT") self.assertEqual(x, (0, False, False, False, True, False)) database.write("FUELQ1", (10, False, False, False, True)) x = database.read("FUELQT") self.assertEqual(x, (25, False, False, False, False, True))
def test_aux_data_read_write(self): """Test database auxillary data reading and writing""" sf = io.StringIO(general_config) database.init(sf) tests = [("Min", -160.0), ("Max", -130.0), ("0g", 10.0), ("Warn", 23.4), ("Stall", 45.6)] for test in tests: x = database.write("AOA." + test[0], test[1]) x = database.read("AOA." + test[0]) self.assertEqual(x, test[1])
def test_bool_write(self): """test using wrong datatype for item""" sf = io.StringIO(general_config) database.init(sf) # Test actual booleans database.write("BTN1", True) x = database.read("BTN1") self.assertEqual(x[0], True) database.write("BTN1", False) x = database.read("BTN1") self.assertEqual(x[0], False) # Test strings database.write("BTN1", "True") x = database.read("BTN1") self.assertEqual(x[0], True) database.write("BTN1", "False") x = database.read("BTN1") self.assertEqual(x[0], False) database.write("BTN1", "1") x = database.read("BTN1") self.assertEqual(x[0], True) database.write("BTN1", "0") x = database.read("BTN1") self.assertEqual(x[0], False) database.write("BTN1", "Yes") x = database.read("BTN1") self.assertEqual(x[0], True) database.write("BTN1", "No") x = database.read("BTN1") self.assertEqual(x[0], False) # Test integers database.write("BTN1", 1) x = database.read("BTN1") self.assertEqual(x[0], True) database.write("BTN1", 0) x = database.read("BTN1") self.assertEqual(x[0], False)
def test_database_aux_data_bounds(self): """Test database aux data bounds checking""" sf = io.StringIO(general_config) database.init(sf) tests = [(0.0, 0.0), (-180.0, -180.0), (-180.1, -180.0), (0.0, 0,0), (180.0, 180.0), (180.1, 180.0)] for test in tests: database.write("AOA.Warn", test[0]) x = database.read("AOA.Warn") self.assertEqual(x, test[1])
def update(self): for i, key in enumerate(self.dblist): x = database.read(key) y = self.item(i, 1) y.setText(str(x[0]))
def func(key, value, parent): global AOA_pitch_history, AOA_ias_history, AOA_lift_constant, \ AOA_acc_history, AOA_vs_history, AOA_heading_history nonlocal vals, AOA_pitch_root, AOA_smooth_min_len, \ AOA_hist_count if not isinstance(key, str): return # This is to set the aux data in the output to one of the inputs o = parent.db_get_item(output) vals[key] = value Vs = read("IAS.Vs") if Vs is None: Vs = 9999 # # Accumulate history values for estimating a lift constant # if key == 'PITCH': AOA_pitch_history.append(value[0]) if len(AOA_pitch_history) > AOA_smooth_min_len: del AOA_pitch_history[0] if key == 'IAS': AOA_ias_history.append(value[0]) if len(AOA_ias_history) > AOA_smooth_min_len: del AOA_ias_history[0] if key == 'ANORM': AOA_acc_history.append(value[0]) if len(AOA_acc_history) > AOA_smooth_min_len: del AOA_acc_history[0] if key == 'VS': AOA_vs_history.append(value[0]) if len(AOA_vs_history) > AOA_smooth_min_len: del AOA_vs_history[0] AOA_hist_count += 1 if key == 'HEAD': AOA_heading_history.append(value[0]) if len(AOA_heading_history) > AOA_smooth_min_len: del AOA_heading_history[0] # # Restart value history accumulation if any input is # not perfect quality # for each in vals: ve = vals[each] if not isinstance(ve, tuple): continue if ve is None: AOA_hist_count = 0 break if ve[2]: AOA_hist_count = 0 break if ve[3]: AOA_hist_count = 0 break if ve[4]: AOA_hist_count = 0 break if ve[5]: AOA_hist_count = 0 break # # Compute AOA, one way or another # if len(AOA_ias_history): ias = AOA_ias_history[-1] else: ias = 0 if AOA_lift_constant is not None and ias > Vs: # We're flying with a known lift constant, so compute alpha directly AOA_pitch_0 = read("AOA.0g") # Alpha (AOA) = lift_constant * acc[NORMAL/Z axis] / ias^2 - # AOA_pitch_0 o.value = AOA_lift_constant * AOA_acc_history[-1] / (ias * ias) - \ AOA_pitch_0 flag_old = False flag_bad = False flag_fail = False flag_secfail = False for each in ['IAS', 'ANORM']: if vals[each] is None: flag_fail = True if vals[each][2]: flag_old = True if vals[each][3]: flag_bad = True if vals[each][4]: flag_fail = True if vals[each][5]: flag_secfail = True o.old = flag_old o.bad = flag_bad o.fail = flag_fail o.secfail = flag_secfail if flag_old or flag_bad or flag_fail or flag_secfail: AOA_hist_count = 0 elif ias < Vs and vals['PITCH'] is not None: # Give an answer for taxi'ing and/or takeoff roll pitch = vals['PITCH'] o.value = AOA_pitch_root + pitch[0] o.old, o.bad, o.fail, o.secfail = pitch[2:] # Since we're taxi'ing, we might have just refueled, # or changed the weight and balance, which drastically changes # the lift constant. Mark it as unknown to re-estimate # when possible. AOA_lift_constant = None elif vals['PITCH'] is not None: # Flying, but the lift constant is not yet established. # Give a guesstimate pitch = vals['PITCH'] o.value = AOA_pitch_root + pitch[0] o.old = pitch[2] o.bad = True o.fail = pitch[4] else: # We're not getting any basic data. Fail out. o.fail = True # # Update lift constant, if possible # if AOA_hist_count > AOA_smooth_min_len and len(AOA_vs_history) and \ len(AOA_ias_history): # Check if we've been straight and level for a sufficient time AOA_hist_count = 0 mean_vs = sum(AOA_vs_history) / len(AOA_vs_history) if mean_vs < AOA_max_mean_vs and \ is_calm(AOA_vs_history, AOA_max_vs_dev, AOA_max_vs_trend) and \ is_calm(AOA_pitch_history, AOA_max_pitch_dev, AOA_max_pitch_trend) and \ is_calm(AOA_heading_history, AOA_max_heading_dev, AOA_max_heading_trend, wrap=360): # Flying straight and level! We can estimate a lift constant acc_mean = sum(AOA_acc_history) / len(AOA_acc_history) ias_mean = sum(AOA_ias_history) / len(AOA_ias_history) pitch_mean = sum(AOA_pitch_history) / len(AOA_pitch_history) AOA_pitch_0 = read("AOA.0g") # The steady state angle of attack at wing root # Alpha [steady state] + AOA_pitch_0 = lift_constant * acc[NORMAL/Z axis] / ias^2 alpha_ss = pitch_mean + AOA_pitch_root # (Alpha [steady state] + AOA_pitch_0) * ias^2 = lift_constant * acc # lift_constant = (Alpha [steady state] + AOA_pitch_0) * ias^2 / acc new_lift_constant = (alpha_ss + AOA_pitch_0) * \ ias_mean * ias_mean / \ acc_mean if AOA_lift_constant is None: AOA_lift_constant = new_lift_constant else: filter_coefficient = .9 anti_filter_coefficient = (1 - filter_coefficient) AOA_lift_constant = \ new_lift_constant*anti_filter_coefficient + \ AOA_lift_constant* filter_coefficient print("AOA estimation lift constant %g" % AOA_lift_constant)
def test_value_write(self): self.sock.sendall("@wALT;2500\n".encode()) res = self.sock.recv(1024).decode() self.assertEqual(res, "@wALT;2500.0;00000\n") x = database.read("ALT") self.assertEqual(x, (2500.0, False, False, False, False, False))
def test_aux_write(self): self.sock.sendall("@wOILP1.lowWarn;12.5\n".encode()) res = self.sock.recv(1024).decode() x = database.read("OILP1.lowWarn") self.assertEqual(x, 12.5)
def db_read(self, key): return database.read(key)
def test_does_this_work_at_all(self): self.sock.sendall("@wALT;2500\n".encode()) res = self.sock.recv(1024).decode() self.assertEqual(res, "@wALT;2500.0;00000\n") x = database.read("ALT") self.assertEqual(x, (2500.0, False, False, False, False, False))
def db_read(self, key): return database.read(key)
def test_aux_write(self): self.sock.sendall("@wOILP1.lowWarn;12.5\n".encode()) res = self.sock.recv(1024).decode() x = database.read("OILP1.lowWarn") self.assertEqual(x, 12.5)
def update(self): for i, key in enumerate(self.dblist): x = database.read(key) y = self.item(i,1) y.setText(str(x[0]))
def test_compute_aoa(self): database.write("IAS.Vs", 72) database.write("AOA.0g", -1.0) database.write("PITCH", 0) database.write("IAS", 10) x = database.read("AOA") self.assertEqual(x, (2.0, False, False, False, False, False)) # Takeoff roll for i in range(100): database.write("PITCH", 0) database.write("IAS", 10 + i) database.write("VS", 0) database.write("ANORM", 9.8) database.write("HEAD", 0) x = database.read("AOA") self.assertEqual(x, (2.0, False, False, True, False, False)) # Climbout for i in range(100): database.write("PITCH", 5) database.write("IAS", 110) database.write("VS", 500) database.write("ANORM", 9.8) database.write("HEAD", 0) x = database.read("AOA") self.assertEqual(x, (7.0, False, False, True, False, False)) # Turn for i in range(100): database.write("PITCH", 2) database.write("IAS", 130) database.write("VS", 50) database.write("ANORM", 10.8) database.write("HEAD", i) x = database.read("AOA") self.assertEqual(x, (4.0, False, False, True, False, False)) # Straight and level for i in range(110): database.write("PITCH", 1) database.write("IAS", 130) database.write("VS", 0) database.write("ANORM", 9.8) database.write("HEAD", 100) x = database.read("AOA") y, a, o, b, f, s = x x = (round(y, 2), a, o, b, f, s) self.assertEqual(x, (3.0, False, False, False, False, False)) database.write("IAS", 100) database.write("ANORM", 10.8) x = database.read("AOA") y, a, o, b, f, s = x x = (round(y, 2), a, o, b, f, s) self.assertEqual(x, (4.72, False, False, False, False, False)) database.write("IAS", 130) database.write("ANORM", 7.8) x = database.read("AOA") y, a, o, b, f, s = x x = (round(y, 2), a, o, b, f, s) self.assertEqual(x, (2.59, False, False, False, False, False))
def test_value_write(self): self.sock.sendall("@wALT;2500\n".encode()) res = self.sock.recv(1024).decode() self.assertEqual(res, "@wALT;2500.0;00000\n") x = database.read("ALT") self.assertEqual(x, (2500.0, False, False, False, False, False))