def test_uncompress_archives(self): temp_dir = tempfile.gettempdir() os.chdir(temp_dir) with tarfile.open("test.tar.gz", "w:gz") as tar: for name in ["1.complex", "2.complex", "3.complex"]: data = np.ndarray(10, dtype=np.complex64) data.tofile(name) tar.add(name) with ZipFile('test.zip', 'w') as zip: for name in ["4.complex", "5.complex"]: data = np.ndarray(10, dtype=np.complex64) data.tofile(name) zip.write(name) form = MainController() form.add_files( FileOperator.uncompress_archives(["test.tar.gz", "test.zip"], QDir.tempPath())) self.assertEqual(len(form.signal_tab_controller.signal_frames), 5) tar_md5 = hashlib.md5( open(os.path.join(temp_dir, "test.tar.gz"), 'rb').read()).hexdigest() form.signal_tab_controller.signal_frames[0].signal._fulldata = np.ones( 5, dtype=np.complex64) form.signal_tab_controller.signal_frames[0].signal.changed = True form.signal_tab_controller.signal_frames[0].ui.btnSaveSignal.click() tar_md5_after_save = hashlib.md5( open(os.path.join(temp_dir, "test.tar.gz"), 'rb').read()).hexdigest() self.assertNotEqual(tar_md5, tar_md5_after_save) zip_md5 = hashlib.md5( open(os.path.join(temp_dir, "test.zip"), 'rb').read()).hexdigest() form.signal_tab_controller.signal_frames[4].signal._fulldata = np.ones( 5, dtype=np.complex64) form.signal_tab_controller.signal_frames[4].signal.changed = True form.signal_tab_controller.signal_frames[4].ui.btnSaveSignal.click() zip_md5_after_save = hashlib.md5( open(os.path.join(temp_dir, "test.zip"), 'rb').read()).hexdigest() self.assertNotEqual(zip_md5, zip_md5_after_save)
class TestSignalTabGUI(unittest.TestCase): def setUp(self): constants.SETTINGS.setValue("not_show_save_dialog", True) self.form = MainController() self.form.add_signalfile(get_path_for_data_file("esaver.complex")) self.frame = self.form.signal_tab_controller.signal_frames[0] def test_close_all(self): self.form.close_all() QTest.qWait(250) self.assertEqual(self.form.signal_tab_controller.num_signals, 0) # Add a bunch of signals num_signals = 10 for _ in range(num_signals): self.form.add_signalfile(get_path_for_data_file("esaver.complex")) self.assertEqual(self.form.signal_tab_controller.num_signals, num_signals) self.form.close_all() QTest.qWait(250) self.form.add_signalfile(get_path_for_data_file("ask.complex")) self.assertEqual(self.form.signal_tab_controller.num_signals, 1) def test_zoom(self): x_zoom = self.frame.ui.spinBoxXZoom.value() self.assertEqual(x_zoom, 100) for _ in range(10): self.frame.ui.gvSignal.zoom(1.01) self.assertGreater(self.frame.ui.spinBoxXZoom.value(), x_zoom) x_zoom = self.frame.ui.spinBoxXZoom.value() for _ in range(10): self.frame.ui.gvSignal.zoom(0.99) self.assertLess(self.frame.ui.spinBoxXZoom.value(), x_zoom) x_zoom = self.frame.ui.spinBoxXZoom.value() samples_in_view = self.frame.ui.lSamplesInView.text() self.frame.ui.spinBoxXZoom.setValue(self.frame.ui.spinBoxXZoom.value() + 400) self.assertNotEqual(samples_in_view, self.frame.ui.lSamplesInView.text()) def test_load_proto(self): self.form.add_files([get_path_for_data_file("protocol.proto")]) self.assertEqual(self.form.signal_tab_controller.signal_frames[1].ui.lSignalTyp.text(), "Protocol (*.proto)") def test_graphic_view_selection(self): self.frame.ui.gvSignal.selection_area.start = 0 self.frame.ui.gvSignal.selection_area.end = 4000 self.frame.ui.gvSignal.sel_area_start_end_changed.emit(0, 4000) self.assertEqual(self.frame.ui.lNumSelectedSamples.text(), "4000") noise_val = self.frame.ui.spinBoxNoiseTreshold.value() self.frame.ui.gvSignal.set_noise_clicked.emit() self.assertNotEqual(noise_val, self.frame.ui.spinBoxNoiseTreshold.value()) self.frame.ui.spinBoxSelectionStart.setValue(300) self.assertEqual(self.frame.ui.gvSignal.selection_area.start, 300) self.frame.ui.spinBoxSelectionEnd.setValue(6000) self.assertEqual(self.frame.ui.gvSignal.selection_area.end, 6000) def test_graphic_view_zoom_to_selection(self): self.frame.ui.gvSignal.context_menu_position = QPoint(0, 0) menu = self.frame.ui.gvSignal.create_context_menu() self.assertTrue(self.frame.ui.gvSignal.selection_area.is_empty) self.assertIsNone(next((action for action in menu.actions() if action.text() == "Zoom selection"), None)) self.frame.ui.gvSignal.selection_area.start = 1337 self.frame.ui.gvSignal.selection_area.end = 4711 self.frame.ui.gvSignal.sel_area_start_end_changed.emit(1337, 4711) menu = self.frame.ui.gvSignal.create_context_menu() self.assertFalse(self.frame.ui.gvSignal.selection_area.is_empty) zoom_action = next(action for action in menu.actions() if action.text() == "Zoom selection") zoom_action.trigger() self.assertEqual(self.frame.ui.spinBoxSelectionStart.value(), 1337) self.assertEqual(self.frame.ui.spinBoxSelectionEnd.value(), 4711) def test_show_hide_start_end(self): self.assertEqual(self.frame.ui.btnShowHideStartEnd.text(), "+") self.frame.ui.btnShowHideStartEnd.click() self.assertEqual(self.frame.ui.btnShowHideStartEnd.text(), "-") def test_apply_to_all(self): self.form.add_signalfile(get_path_for_data_file("ask.complex")) frame2 = self.form.signal_tab_controller.signal_frames[1] self.frame.ui.spinBoxInfoLen.setValue(42) self.frame.ui.spinBoxInfoLen.editingFinished.emit() self.frame.ui.spinBoxCenterOffset.setValue(0.1) self.frame.ui.spinBoxCenterOffset.editingFinished.emit() self.frame.ui.spinBoxNoiseTreshold.setValue(0.5) self.frame.ui.spinBoxNoiseTreshold.editingFinished.emit() self.frame.ui.spinBoxTolerance.setValue(10) self.frame.ui.spinBoxTolerance.editingFinished.emit() self.frame.apply_to_all_clicked.emit(self.frame.signal) self.assertEqual(42, frame2.ui.spinBoxInfoLen.value()) self.assertEqual(0.1, frame2.ui.spinBoxCenterOffset.value()) self.assertEqual(0.5, frame2.ui.spinBoxNoiseTreshold.value()) self.assertEqual(10, frame2.ui.spinBoxTolerance.value()) def test_save_all(self): self.form.add_signalfile(get_path_for_data_file("ask.complex")) frame2 = self.form.signal_tab_controller.signal_frames[1] self.frame.signal.changed = True self.frame.signal.filename = os.path.join(QDir.tempPath(), "sig1.complex") frame2.signal.changed = True frame2.signal.filename = os.path.join(QDir.tempPath(), "sig2.complex") self.assertFalse(os.path.isfile(self.frame.signal.filename)) self.assertFalse(os.path.isfile(frame2.signal.filename)) self.form.signal_tab_controller.save_all() self.assertTrue(os.path.isfile(self.frame.signal.filename)) self.assertTrue(os.path.isfile(frame2.signal.filename)) os.remove(self.frame.signal.filename) os.remove(frame2.signal.filename) def test_crop_and_save_signal(self): self.frame.ui.gvSignal.selection_area.end = 4000 self.frame.ui.gvSignal.selection_area.start = 1000 self.assertEqual(self.frame.ui.gvSignal.selection_area.end, 4000) self.assertEqual(self.frame.ui.gvSignal.selection_area.width, 3000) self.frame.ui.gvSignal.sel_area_start_end_changed.emit(1000, 4000) self.frame.ui.gvSignal.on_crop_action_triggered() self.assertEqual(self.frame.signal.num_samples, 3000) self.assertTrue(self.frame.signal.changed) self.frame.signal.filename = os.path.join(QDir.tempPath(), "sig.complex") self.assertFalse(os.path.isfile(self.frame.signal.filename)) self.frame.ui.btnSaveSignal.click() self.form.close_signal_frame(self.frame) QTest.qWait(50) self.form.add_signalfile(os.path.join(QDir.tempPath(), "sig.complex")) self.assertEqual(self.form.signal_tab_controller.signal_frames[0].signal.num_samples, 3000) os.remove(os.path.join(QDir.tempPath(), "sig.complex"))
class TestSignalTabGUI(unittest.TestCase): def setUp(self): self.form = MainController() def test_close_all(self): # Add a bunch of signals NUM_SIGNALS = 10 for _ in range(NUM_SIGNALS): self.form.add_signalfile(get_path_for_data_file("esaver.complex")) self.assertEqual(self.form.signal_tab_controller.num_signals, NUM_SIGNALS) self.form.close_all() QTest.qWait(100) self.assertEqual(self.form.signal_tab_controller.num_signals, 0) self.form.add_signalfile(get_path_for_data_file("ask.complex")) self.assertEqual(self.form.signal_tab_controller.num_signals, 1) def test_zoom(self): self.form.add_signalfile(get_path_for_data_file("esaver.complex")) frame = self.form.signal_tab_controller.signal_frames[0] x_zoom = frame.ui.spinBoxXZoom.value() self.assertEqual(x_zoom, 100) for _ in range(10): frame.ui.gvSignal.zoom(1.01) self.assertGreater(frame.ui.spinBoxXZoom.value(), x_zoom) x_zoom = frame.ui.spinBoxXZoom.value() for _ in range(10): frame.ui.gvSignal.zoom(0.99) self.assertLess(frame.ui.spinBoxXZoom.value(), x_zoom) x_zoom = frame.ui.spinBoxXZoom.value() samples_in_view = frame.ui.lSamplesInView.text() frame.ui.spinBoxXZoom.setValue(frame.ui.spinBoxXZoom.value() + 400) self.assertNotEqual(samples_in_view, frame.ui.lSamplesInView.text()) def test_load_proto(self): self.form.add_files([get_path_for_data_file("protocol.proto")]) self.assertEqual( self.form.signal_tab_controller.signal_frames[0].ui.lSignalTyp. text(), "Protocol (*.proto)") def test_graphic_view_selection(self): self.form.add_signalfile(get_path_for_data_file("esaver.complex")) frame = self.form.signal_tab_controller.signal_frames[0] frame.ui.gvSignal.selection_area.start = 0 frame.ui.gvSignal.selection_area.end = 4000 frame.ui.gvSignal.sel_area_start_end_changed.emit(0, 4000) self.assertEqual(frame.ui.lNumSelectedSamples.text(), "4000") noise_val = frame.ui.spinBoxNoiseTreshold.value() frame.ui.gvSignal.set_noise_clicked.emit() self.assertNotEqual(noise_val, frame.ui.spinBoxNoiseTreshold.value()) frame.ui.spinBoxSelectionStart.setValue(300) self.assertEqual(frame.ui.gvSignal.selection_area.start, 300) frame.ui.spinBoxSelectionEnd.setValue(6000) self.assertEqual(frame.ui.gvSignal.selection_area.end, 6000) def test_show_hide_start_end(self): self.form.add_signalfile(get_path_for_data_file("esaver.complex")) frame = self.form.signal_tab_controller.signal_frames[0] self.assertEqual(frame.ui.btnShowHideStartEnd.text(), "+") frame.ui.btnShowHideStartEnd.click() self.assertEqual(frame.ui.btnShowHideStartEnd.text(), "-")
class TestSimulator(QtTestCase): def setUp(self): super().setUp() SettingsProxy.OVERWRITE_RECEIVE_BUFFER_SIZE = 10 * 10**6 self.num_zeros_for_pause = 1000 def test_performance(self): self.form = MainController() self.cfc = self.form.compare_frame_controller self.stc = self.form.simulator_tab_controller self.gtc = self.form.generator_tab_controller self.form.add_signalfile(get_path_for_data_file("esaver.complex")) self.sframe = self.form.signal_tab_controller.signal_frames[0] self.sim_frame = self.form.simulator_tab_controller self.form.ui.tabWidget.setCurrentIndex(3) self.cfc.proto_analyzer.auto_assign_labels() self.network_sdr_plugin_sender = NetworkSDRInterfacePlugin( raw_mode=True) part_a = Participant("Device A", shortname="A", color_index=0) part_b = Participant("Device B", shortname="B", color_index=1) part_b.simulate = True self.form.project_manager.participants.append(part_a) self.form.project_manager.participants.append(part_b) self.form.project_manager.project_updated.emit() sniffer = ProtocolSniffer(100, 0.01, 0.1, 5, 1, NetworkSDRInterfacePlugin.NETWORK_SDR_NAME, BackendHandler(), network_raw_mode=True) sender = EndlessSender(BackendHandler(), NetworkSDRInterfacePlugin.NETWORK_SDR_NAME) simulator = Simulator(self.stc.simulator_config, self.gtc.modulators, self.stc.sim_expression_parser, self.form.project_manager, sniffer=sniffer, sender=sender) pause = 100000 msg_a = SimulatorMessage( part_b, [1, 0] * 16 + [1, 1, 0, 0] * 8 + [0, 0, 1, 1] * 8 + [1, 0, 1, 1, 1, 0, 0, 1, 1, 1] * 4, pause=pause, message_type=MessageType("empty_message_type"), source=part_a) msg_b = SimulatorMessage( part_a, [1, 0] * 16 + [1, 1, 0, 0] * 8 + [1, 1, 0, 0] * 8 + [1, 0, 1, 1, 1, 0, 0, 1, 1, 1] * 4, pause=pause, message_type=MessageType("empty_message_type"), source=part_b) self.stc.simulator_config.add_items([msg_a, msg_b], 0, None) self.stc.simulator_config.update_active_participants() port = self.get_free_port() sniffer = simulator.sniffer sniffer.rcv_device.set_server_port(port) self.network_sdr_plugin_sender.client_port = port sender = simulator.sender port = self.get_free_port() sender.device.set_client_port(port) sender.device._VirtualDevice__dev.name = "simulator_sender" current_index = Value("L") elapsed = Value("f") target_num_samples = 113600 - pause receive_process = Process(target=receive, args=(port, current_index, target_num_samples, elapsed)) receive_process.daemon = True receive_process.start() # Ensure receiver is running time.sleep(2) # spy = QSignalSpy(self.network_sdr_plugin_receiver.rcv_index_changed) simulator.start() modulator = Modulator("test_modulator") modulator.samples_per_bit = 100 modulator.carrier_freq_hz = 55e3 # yappi.start() self.network_sdr_plugin_sender.send_raw_data( modulator.modulate(msg_a.encoded_bits), 1) QTest.qWait(10) # send some zeros to simulate the end of a message self.network_sdr_plugin_sender.send_raw_data( np.zeros(self.num_zeros_for_pause, dtype=np.complex64), 1) QTest.qWait(100) receive_process.join(10) logger.info("PROCESS TIME: {0:.2f}ms".format(elapsed.value)) self.assertEqual(current_index.value, target_num_samples) self.assertLess(elapsed.value, 200) # timeout = spy.wait(2000) # yappi.get_func_stats().print_all() # yappi.get_thread_stats().print_all() def test_simulation_flow(self): """ test a simulation flow with an increasing sequence number :return: """ profile = self.get_path_for_filename("testprofile.sim.xml") self.form.add_files([profile]) self.assertEqual( len(self.form.simulator_tab_controller.simulator_scene. get_all_message_items()), 6) port = self.get_free_port() self.alice = NetworkSDRInterfacePlugin(raw_mode=True) self.alice.client_port = port dialog = self.form.simulator_tab_controller.get_simulator_dialog() name = NetworkSDRInterfacePlugin.NETWORK_SDR_NAME dialog.device_settings_rx_widget.ui.cbDevice.setCurrentText(name) dialog.device_settings_tx_widget.ui.cbDevice.setCurrentText(name) QTest.qWait(10) simulator = dialog.simulator simulator.sniffer.rcv_device.set_server_port(port) port = self.get_free_port() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) s.bind(("", port)) s.listen(1) QTest.qWait(10) simulator.sender.device.set_client_port(port) dialog.ui.btnStartStop.click() QTest.qWait(1500) conn, addr = s.accept() msg = next(msg for msg in dialog.simulator_config.get_all_messages() if msg.source.name == "Alice") checksum_label = next( lbl for lbl in msg.message_type if lbl.is_checksum_label).label # type: ChecksumLabel modulator = dialog.project_manager.modulators[0] # type: Modulator preamble_str = "10101010" sync_str = "1001" preamble = list(map(int, preamble_str)) sync = list(map(int, sync_str)) seq = list(map(int, "00000010")) data = list(map(int, "11001101")) seq_num = int("".join(map(str, seq)), 2) checksum = list(checksum_label.calculate_checksum(seq + data)) msg1 = preamble + sync + seq + data + checksum self.alice.send_raw_data(modulator.modulate(msg1), 1) self.alice.send_raw_data( np.zeros(self.num_zeros_for_pause, dtype=np.complex64), 1) bits = self.__demodulate(conn) self.assertEqual(len(bits), 1) bits = bits[0] self.assertTrue(bits.startswith(preamble_str + sync_str)) bits = bits.replace(preamble_str + sync_str, "") self.assertEqual(int(bits, 2), seq_num + 1) seq = list(map(int, "{0:08b}".format(seq_num + 2))) checksum = list(checksum_label.calculate_checksum(seq + data)) msg2 = preamble + sync + seq + data + checksum self.alice.send_raw_data(modulator.modulate(msg2), 1) self.alice.send_raw_data( np.zeros(self.num_zeros_for_pause, dtype=np.complex64), 1) bits = self.__demodulate(conn) self.assertEqual(len(bits), 1) bits = bits[0] self.assertTrue(bits.startswith(preamble_str + sync_str)) bits = bits.replace(preamble_str + sync_str, "") self.assertEqual(int(bits, 2), seq_num + 3) seq = list(map(int, "{0:08b}".format(seq_num + 4))) checksum = list(checksum_label.calculate_checksum(seq + data)) msg3 = preamble + sync + seq + data + checksum self.alice.send_raw_data(modulator.modulate(msg3), 1) self.alice.send_raw_data( np.zeros(self.num_zeros_for_pause, dtype=np.complex64), 1) bits = self.__demodulate(conn) self.assertEqual(len(bits), 1) bits = bits[0] self.assertTrue(bits.startswith(preamble_str + sync_str)) bits = bits.replace(preamble_str + sync_str, "") self.assertEqual(int(bits, 2), seq_num + 5) QTest.qWait(50) self.assertTrue(simulator.simulation_is_finished()) time.sleep(1) conn.close() s.close() QTest.qWait(100) def test_external_program_simulator(self): stc = self.form.simulator_tab_controller stc.ui.btnAddParticipant.click() stc.ui.btnAddParticipant.click() stc.simulator_scene.add_counter_action(None, 0) action = next(item for item in stc.simulator_scene.items() if isinstance(item, CounterActionItem)) action.model_item.start = 3 action.model_item.step = 2 counter_item_str = "item" + str( action.model_item.index()) + ".counter_value" stc.ui.gvSimulator.add_empty_message(42) stc.ui.gvSimulator.add_empty_message(42) stc.ui.cbViewType.setCurrentIndex(0) stc.create_simulator_label(0, 10, 20) stc.create_simulator_label(1, 10, 20) messages = stc.simulator_config.get_all_messages() messages[0].source = stc.project_manager.participants[0] messages[0].destination = stc.project_manager.participants[1] messages[0].destination.simulate = True messages[1].source = stc.project_manager.participants[1] messages[1].destination = stc.project_manager.participants[0] stc.simulator_scene.add_trigger_command_action(None, 200) stc.simulator_scene.add_sleep_action(None, 200) lbl1 = messages[0].message_type[0] # type: SimulatorProtocolLabel lbl2 = messages[1].message_type[0] # type: SimulatorProtocolLabel lbl1.value_type_index = 3 lbl1.external_program = get_path_for_data_file( "external_program_simulator.py") + " " + counter_item_str lbl2.value_type_index = 3 lbl2.external_program = get_path_for_data_file( "external_program_simulator.py") + " " + counter_item_str action = next(item for item in stc.simulator_scene.items() if isinstance(item, SleepActionItem)) action.model_item.sleep_time = 0.001 stc.simulator_scene.clearSelection() action = next(item for item in stc.simulator_scene.items() if isinstance(item, TriggerCommandActionItem)) action.setSelected(True) self.assertEqual(stc.ui.detail_view_widget.currentIndex(), 4) fname = tempfile.mktemp() self.assertFalse(os.path.isfile(fname)) external_command = "cmd.exe /C copy NUL {}".format( fname) if os.name == "nt" else "touch {}".format(fname) stc.ui.lineEditTriggerCommand.setText(external_command) self.assertEqual(action.model_item.command, external_command) port = self.get_free_port() self.alice = NetworkSDRInterfacePlugin(raw_mode=True) self.alice.client_port = port dialog = stc.get_simulator_dialog() name = NetworkSDRInterfacePlugin.NETWORK_SDR_NAME dialog.device_settings_rx_widget.ui.cbDevice.setCurrentText(name) dialog.device_settings_tx_widget.ui.cbDevice.setCurrentText(name) QTest.qWait(10) simulator = dialog.simulator simulator.sniffer.rcv_device.set_server_port(port) port = self.get_free_port() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) s.bind(("", port)) s.listen(1) QTest.qWait(10) simulator.sender.device.set_client_port(port) dialog.ui.btnStartStop.click() QTest.qWait(1500) conn, addr = s.accept() modulator = dialog.project_manager.modulators[0] # type: Modulator self.alice.send_raw_data(modulator.modulate("100" + "10101010" * 42), 1) self.alice.send_raw_data( np.zeros(self.num_zeros_for_pause, dtype=np.complex64), 1) bits = self.__demodulate(conn) self.assertEqual(bits[0], "101010101") QTest.qWait(500) self.assertTrue(simulator.simulation_is_finished()) conn.close() s.close() QTest.qWait(100) self.assertTrue(os.path.isfile(fname)) def __demodulate(self, connection): QTest.qWait(100) data = connection.recv(65536) while len(data) % 8 != 0: data += connection.recv(65536) arr = np.array(np.frombuffer(data, dtype=np.complex64)) signal = Signal("", "") signal._fulldata = arr pa = ProtocolAnalyzer(signal) pa.get_protocol_from_signal() return pa.plain_bits_str
class TestSignalTabGUI(unittest.TestCase): def setUp(self): constants.SETTINGS.setValue("not_show_save_dialog", True) logger.debug("Init Form") tests.utils_testing.short_wait() self.form = MainController() tests.utils_testing.short_wait() logger.debug("Add Signal") self.form.add_signalfile(get_path_for_data_file("esaver.complex")) logger.debug("Added Signal") app.processEvents() self.frame = self.form.signal_tab_controller.signal_frames[0] self.frame.signal.noise_threshold = 0.0023 self.frame.signal.qad_center = 0.3817 self.frame.signal.bit_len = 84 def tearDown(self): self.form.close_all() tests.utils_testing.short_wait() self.form.close() self.form.setParent(None) self.form.deleteLater() tests.utils_testing.short_wait() def test_close_all(self): logger.debug("Close all") self.form.close_all() tests.utils_testing.short_wait() logger.debug("Called close all") app.processEvents() self.assertEqual(self.form.signal_tab_controller.num_signals, 0) # Add a bunch of signals num_signals = 5 for _ in range(num_signals): tests.utils_testing.short_wait() self.form.add_signalfile(get_path_for_data_file("esaver.complex")) self.assertEqual(self.form.signal_tab_controller.num_signals, num_signals) self.form.close_all() tests.utils_testing.short_wait() self.form.add_signalfile(get_path_for_data_file("ask.complex")) self.assertEqual(self.form.signal_tab_controller.num_signals, 1) def test_zoom(self): tests.utils_testing.short_wait() x_zoom = self.frame.ui.spinBoxXZoom.value() self.assertEqual(x_zoom, 100) for _ in range(10): self.frame.ui.gvSignal.zoom(1.01) self.assertGreater(self.frame.ui.spinBoxXZoom.value(), x_zoom) x_zoom = self.frame.ui.spinBoxXZoom.value() for _ in range(10): self.frame.ui.gvSignal.zoom(0.99) self.assertLess(self.frame.ui.spinBoxXZoom.value(), x_zoom) x_zoom = self.frame.ui.spinBoxXZoom.value() samples_in_view = self.frame.ui.lSamplesInView.text() self.frame.ui.spinBoxXZoom.setValue( self.frame.ui.spinBoxXZoom.value() + 400) self.assertNotEqual(samples_in_view, self.frame.ui.lSamplesInView.text()) def test_load_proto(self): self.form.add_files([get_path_for_data_file("protocol.proto")]) self.assertEqual( self.form.signal_tab_controller.signal_frames[1].ui.lSignalTyp. text(), "Protocol (*.proto)") def test_graphic_view_selection(self): self.frame.ui.gvSignal.selection_area.start = 0 self.frame.ui.gvSignal.selection_area.end = 4000 self.frame.ui.gvSignal.sel_area_start_end_changed.emit(0, 4000) self.assertEqual(self.frame.ui.lNumSelectedSamples.text(), "4000") noise_val = self.frame.ui.spinBoxNoiseTreshold.value() self.frame.ui.gvSignal.set_noise_clicked.emit() self.assertNotEqual(noise_val, self.frame.ui.spinBoxNoiseTreshold.value()) self.frame.ui.spinBoxSelectionStart.setValue(300) self.assertEqual(self.frame.ui.gvSignal.selection_area.start, 300) self.frame.ui.spinBoxSelectionEnd.setValue(6000) self.assertEqual(self.frame.ui.gvSignal.selection_area.end, 6000) def test_graphic_view_zoom_to_selection(self): self.frame.ui.gvSignal.context_menu_position = QPoint(0, 0) menu = self.frame.ui.gvSignal.create_context_menu() self.assertTrue(self.frame.ui.gvSignal.selection_area.is_empty) self.assertIsNone( next((action for action in menu.actions() if action.text() == "Zoom selection"), None)) self.frame.ui.gvSignal.selection_area.start = 1337 self.frame.ui.gvSignal.selection_area.end = 4711 self.frame.ui.gvSignal.sel_area_start_end_changed.emit(1337, 4711) menu = self.frame.ui.gvSignal.create_context_menu() self.assertFalse(self.frame.ui.gvSignal.selection_area.is_empty) zoom_action = next(action for action in menu.actions() if action.text() == "Zoom selection") zoom_action.trigger() self.assertEqual(self.frame.ui.spinBoxSelectionStart.value(), 1337) self.assertEqual(self.frame.ui.spinBoxSelectionEnd.value(), 4711) def test_show_hide_start_end(self): self.assertEqual(self.frame.ui.btnShowHideStartEnd.text(), "+") self.frame.ui.btnShowHideStartEnd.click() self.assertEqual(self.frame.ui.btnShowHideStartEnd.text(), "-") def test_apply_to_all(self): logger.debug("Test apply to all") tests.utils_testing.short_wait() self.form.add_signalfile(get_path_for_data_file("ask.complex")) logger.debug("added new signal") frame2 = self.form.signal_tab_controller.signal_frames[1] self.frame.ui.spinBoxInfoLen.setValue(42) self.frame.ui.spinBoxInfoLen.editingFinished.emit() self.frame.ui.spinBoxCenterOffset.setValue(0.1) self.frame.ui.spinBoxCenterOffset.editingFinished.emit() self.frame.ui.spinBoxNoiseTreshold.setValue(0.5) self.frame.ui.spinBoxNoiseTreshold.editingFinished.emit() self.frame.ui.spinBoxTolerance.setValue(10) self.frame.ui.spinBoxTolerance.editingFinished.emit() self.frame.apply_to_all_clicked.emit(self.frame.signal) self.assertEqual(42, frame2.ui.spinBoxInfoLen.value()) self.assertEqual(0.1, frame2.ui.spinBoxCenterOffset.value()) self.assertEqual(0.5, frame2.ui.spinBoxNoiseTreshold.value()) self.assertEqual(10, frame2.ui.spinBoxTolerance.value()) def test_save_all(self): logger.debug("Test save all") tests.utils_testing.short_wait() self.form.add_signalfile(get_path_for_data_file("ask.complex")) frame2 = self.form.signal_tab_controller.signal_frames[1] self.frame.signal.changed = True self.frame.signal.filename = os.path.join(QDir.tempPath(), "sig1.complex") frame2.signal.changed = True frame2.signal.filename = os.path.join(QDir.tempPath(), "sig2.complex") self.assertFalse(os.path.isfile(self.frame.signal.filename)) self.assertFalse(os.path.isfile(frame2.signal.filename)) self.form.signal_tab_controller.save_all() self.assertTrue(os.path.isfile(self.frame.signal.filename)) self.assertTrue(os.path.isfile(frame2.signal.filename)) os.remove(self.frame.signal.filename) os.remove(frame2.signal.filename) def test_crop_and_save_signal(self): self.frame.ui.gvSignal.selection_area.end = 4000 self.frame.ui.gvSignal.selection_area.start = 1000 self.assertEqual(self.frame.ui.gvSignal.selection_area.end, 4000) self.assertEqual(self.frame.ui.gvSignal.selection_area.width, 3000) self.frame.ui.gvSignal.sel_area_start_end_changed.emit(1000, 4000) self.frame.ui.gvSignal.on_crop_action_triggered() self.assertEqual(self.frame.signal.num_samples, 3000) self.assertTrue(self.frame.signal.changed) self.frame.signal.filename = os.path.join(QDir.tempPath(), "sig.complex") if os.path.isfile(self.frame.signal.filename): os.remove(self.frame.signal.filename) self.assertFalse(os.path.isfile(self.frame.signal.filename)) self.frame.ui.btnSaveSignal.click() self.form.close_signal_frame(self.frame) tests.utils_testing.short_wait() self.form.add_signalfile(os.path.join(QDir.tempPath(), "sig.complex")) self.assertEqual( self.form.signal_tab_controller.signal_frames[0].signal. num_samples, 3000) os.remove(os.path.join(QDir.tempPath(), "sig.complex")) def test_selection_sync(self): self.frame.ui.gvSignal.selection_area.end = 128440 self.frame.ui.gvSignal.selection_area.start = 89383 self.frame.ui.gvSignal.sel_area_start_end_changed.emit(89383, 128440) tests.utils_testing.short_wait() self.assertEqual(self.frame.proto_analyzer.messages[0].plain_bits_str, self.frame.ui.txtEdProto.selected_text) self.frame.ui.txtEdProto.show_proto_clicked.emit() tests.utils_testing.short_wait() self.assertAlmostEqual( (128440 - 89383) / 1000000, (self.frame.ui.gvSignal.view_rect().width()) / 1000000, places=1) def test_show_demod_view(self): self.assertTrue(self.frame.ui.gvLegend.isHidden()) self.frame.ui.cbSignalView.setCurrentIndex(1) self.assertFalse(self.frame.ui.gvLegend.isHidden()) def test_auto_detect_button(self): self.assertTrue(self.frame.ui.btnAutoDetect.isChecked()) self.frame.ui.btnAutoDetect.click() self.assertFalse(self.frame.ui.btnAutoDetect.isChecked())