HackRF-Treasure-Chest/Software/Universal Radio Hacker/tests/test_signal_tab_GUI.py
2022-09-22 13:46:47 -07:00

270 lines
12 KiB
Python

import os
from PyQt5.QtCore import QDir, QPoint
from PyQt5.QtTest import QTest
from PyQt5.QtWidgets import QApplication
from tests.QtTestCase import QtTestCase
from tests.utils_testing import get_path_for_data_file
from urh.controller.MainController import MainController
from urh.signalprocessing.Participant import Participant
class TestSignalTabGUI(QtTestCase):
def test_close_project(self):
self.add_signal_to_form("esaver.complex16s")
self.assertEqual(self.form.signal_tab_controller.num_frames, 1)
self.form.close_all_files()
self.assertEqual(self.form.signal_tab_controller.num_frames, 0)
# Add a bunch of signals
num_frames = 5
for _ in range(num_frames):
self.add_signal_to_form("esaver.complex16s")
self.assertEqual(self.form.signal_tab_controller.num_frames, num_frames)
self.form.close_project()
self.add_signal_to_form("ask.complex")
self.assertEqual(self.form.signal_tab_controller.num_frames, 1)
def test_zoom(self):
self.add_signal_to_form("esaver.complex16s")
frame = self.form.signal_tab_controller.signal_frames[0]
QApplication.instance().processEvents()
x_zoom = frame.ui.spinBoxXZoom.value()
self.assertIn(x_zoom, range(100, 111))
for _ in range(10):
frame.ui.gvSignal.zoom(1.1)
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.xml")])
self.assertEqual(self.form.signal_tab_controller.signal_frames[0].ui.lSignalTyp.text(), "Protocol")
def test_graphic_view_selection(self):
self.add_signal_to_form("esaver.complex16s")
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")
frame.ui.spinBoxNoiseTreshold.setValue(1)
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_graphic_view_zoom_to_selection(self):
self.add_signal_to_form("esaver.complex16s")
frame = self.form.signal_tab_controller.signal_frames[0]
frame.ui.gvSignal.context_menu_position = QPoint(0, 0)
menu = frame.ui.gvSignal.create_context_menu()
self.assertTrue(frame.ui.gvSignal.selection_area.is_empty)
self.assertIsNone(next((action for action in menu.actions() if action.text() == "Zoom selection"), None))
frame.ui.gvSignal.selection_area.start = 1337
frame.ui.gvSignal.selection_area.end = 4711
frame.ui.gvSignal.sel_area_start_end_changed.emit(1337, 4711)
menu = frame.ui.gvSignal.create_context_menu()
self.assertFalse(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(frame.ui.spinBoxSelectionStart.value(), 1337)
self.assertEqual(frame.ui.spinBoxSelectionEnd.value(), 4711)
def test_show_hide_start_end(self):
self.add_signal_to_form("esaver.complex16s")
frame = self.form.signal_tab_controller.signal_frames[0]
self.assertFalse(frame.ui.btnShowHideStartEnd.isChecked())
frame.ui.btnShowHideStartEnd.click()
self.assertTrue(frame.ui.btnShowHideStartEnd.isChecked())
def test_apply_to_all(self):
self.add_signal_to_form("esaver.complex16s")
frame = self.form.signal_tab_controller.signal_frames[0]
self.add_signal_to_form("ask.complex")
frame2 = self.form.signal_tab_controller.signal_frames[1]
frame.ui.spinBoxSamplesPerSymbol.setValue(42)
frame.ui.spinBoxSamplesPerSymbol.editingFinished.emit()
frame.ui.spinBoxCenterOffset.setValue(0.1)
frame.ui.spinBoxCenterOffset.editingFinished.emit()
frame.ui.spinBoxNoiseTreshold.setValue(0.5)
frame.ui.spinBoxNoiseTreshold.editingFinished.emit()
frame.ui.spinBoxTolerance.setValue(10)
frame.ui.spinBoxTolerance.editingFinished.emit()
frame.signal.pause_threshold = 42
frame.signal.message_length_divisor = 10
frame.apply_to_all_clicked.emit(frame.signal)
self.assertEqual(42, frame2.ui.spinBoxSamplesPerSymbol.value())
self.assertEqual(0.1, frame2.ui.spinBoxCenterOffset.value())
self.assertEqual(0.5, frame2.ui.spinBoxNoiseTreshold.value())
self.assertEqual(10, frame2.ui.spinBoxTolerance.value())
self.assertEqual(42, frame2.signal.pause_threshold)
self.assertEqual(10, frame2.signal.message_length_divisor)
def test_save_all(self):
self.add_signal_to_form("esaver.complex16s")
frame = self.form.signal_tab_controller.signal_frames[0]
self.add_signal_to_form("ask.complex")
frame2 = self.form.signal_tab_controller.signal_frames[1]
frame.signal.changed = True
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(frame.signal.filename))
self.assertFalse(os.path.isfile(frame2.signal.filename))
self.form.signal_tab_controller.save_all()
self.assertTrue(os.path.isfile(frame.signal.filename))
self.assertTrue(os.path.isfile(frame2.signal.filename))
os.remove(frame.signal.filename)
os.remove(frame2.signal.filename)
def test_crop_and_save_signal(self):
self.add_signal_to_form("esaver.complex16s")
frame = self.form.signal_tab_controller.signal_frames[0]
frame.ui.gvSignal.selection_area.end = 4000
frame.ui.gvSignal.selection_area.start = 1000
self.assertEqual(frame.ui.gvSignal.selection_area.end, 4000)
self.assertEqual(frame.ui.gvSignal.selection_area.width, 3000)
frame.ui.gvSignal.sel_area_start_end_changed.emit(1000, 4000)
frame.ui.gvSignal.on_crop_action_triggered()
self.assertEqual(frame.signal.num_samples, 3000)
self.assertTrue(frame.signal.changed)
frame.signal.filename = os.path.join(QDir.tempPath(), "sig.complex")
if os.path.isfile(frame.signal.filename):
os.remove(frame.signal.filename)
self.assertFalse(os.path.isfile(frame.signal.filename))
frame.ui.btnSaveSignal.click()
self.form.close_signal_frame(frame)
self.add_signal_to_form(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.add_signal_to_form("esaver.complex16s")
frame = self.form.signal_tab_controller.signal_frames[0]
frame.ui.cbProtoView.setCurrentIndex(0) # set to bit view
frame.ui.gvSignal.selection_area.end = 128440
frame.ui.gvSignal.selection_area.start = 89383
frame.ui.gvSignal.sel_area_start_end_changed.emit(89383, 128440)
QApplication.instance().processEvents()
QTest.qWait(100)
self.assertEqual(frame.proto_analyzer.messages[0].plain_bits_str, frame.ui.txtEdProto.selected_text.strip())
frame.ui.txtEdProto.show_proto_clicked.emit()
QApplication.instance().processEvents()
self.assertAlmostEqual((128440 - 89383) / 1000000,
(frame.ui.gvSignal.view_rect().width()) / 1000000, places=1)
def test_auto_detect_button(self):
self.add_signal_to_form("esaver.complex16s")
frame = self.form.signal_tab_controller.signal_frames[0]
frame.ui.btnAutoDetect.click()
def test_create_new_signal(self):
self.add_signal_to_form("esaver.complex16s")
frame = self.form.signal_tab_controller.signal_frames[0]
start, end = 400, 8568
frame.ui.gvSignal.selection_area.end = end
frame.ui.gvSignal.selection_area.start = start
self.assertEqual(frame.ui.gvSignal.selection_area.end, end)
self.assertEqual(frame.ui.gvSignal.selection_area.width, end - start)
frame.ui.gvSignal.sel_area_start_end_changed.emit(start, end)
self.assertEqual(self.form.signal_tab_controller.num_frames, 1)
frame.ui.gvSignal.on_create_action_triggered()
QApplication.instance().processEvents()
self.assertEqual(self.form.signal_tab_controller.num_frames, 2)
self.assertEqual(self.form.signal_tab_controller.signal_frames[1].signal.num_samples, end - start)
def test_demodulated_view(self):
self.add_signal_to_form("esaver.complex16s")
frame = self.form.signal_tab_controller.signal_frames[0]
frame.ui.cbSignalView.setCurrentIndex(1)
QApplication.instance().processEvents()
self.assertEqual(frame.ui.gvSignal.scene_type, 1)
def test_context_menu_text_edit_protocol_view(self):
self.add_signal_to_form("esaver.complex16s")
self.form.signal_tab_controller.signal_frames[0].ui.cbProtoView.setCurrentIndex(2)
text_edit = self.form.signal_tab_controller.signal_frames[0].ui.txtEdProto
menu = text_edit.create_context_menu()
line_wrap_action = next(action for action in menu.actions() if action.text().startswith("Linewrap"))
checked = line_wrap_action.isChecked()
line_wrap_action.trigger()
menu = text_edit.create_context_menu()
line_wrap_action = next(action for action in menu.actions() if action.text().startswith("Linewrap"))
self.assertNotEqual(checked, line_wrap_action.isChecked())
self.assertEqual(len([action for action in menu.actions() if action.text() == "Participant"]), 0)
self.form.project_manager.participants.append(Participant("Alice", "A"))
text_edit.selectAll()
menu = text_edit.create_context_menu()
self.assertEqual(len([action for action in menu.actions() if action.text() == "Participant"]), 1)
def test_load_already_demodulated(self):
self.add_signal_to_form("demodulated.wav")
assert isinstance(self.form, MainController)
sig_frame = self.form.signal_tab_controller.signal_frames[0]
sig_frame.ui.cbProtoView.setCurrentText("Hex")
sig_frame.ui.spinBoxCenterOffset.setValue(0.0459)
sig_frame.ui.spinBoxCenterOffset.editingFinished.emit()
self.assertTrue(sig_frame.ui.txtEdProto.toPlainText().startswith("abcd"))
def test_export_demodulated(self):
self.add_signal_to_form("esaver.complex16s")
assert isinstance(self.form, MainController)
self.form.signal_tab_controller.signal_frames[0].ui.gvSignal.context_menu_position = QPoint(0,0)
cm = self.form.signal_tab_controller.signal_frames[0].ui.gvSignal.create_context_menu()
export_action = next((a for a in cm.actions() if "demodulated" in a.text().lower()), None)
self.assertIsNone(export_action)
self.form.signal_tab_controller.signal_frames[0].ui.cbSignalView.setCurrentIndex(1)
cm = self.form.signal_tab_controller.signal_frames[0].ui.gvSignal.create_context_menu()
export_action = next((a for a in cm.actions() if "demodulated" in a.text().lower()), None)
self.assertIsNotNone(export_action)