diff --git a/src/urh/controller/GeneratorTabController.py b/src/urh/controller/GeneratorTabController.py index 0fec975c..a8f22d58 100644 --- a/src/urh/controller/GeneratorTabController.py +++ b/src/urh/controller/GeneratorTabController.py @@ -253,6 +253,8 @@ class GeneratorTabController(QWidget): self.has_default_modulation = False + return c + @pyqtSlot() def on_table_selection_changed(self): min_row, max_row, start, end = self.ui.tableMessages.selection_range() diff --git a/src/urh/ui/ui_modulation.py b/src/urh/ui/ui_modulation.py index b1efb9e4..ac5c7e68 100644 --- a/src/urh/ui/ui_modulation.py +++ b/src/urh/ui/ui_modulation.py @@ -73,7 +73,7 @@ class Ui_DialogModulation(object): self.doubleSpinBoxCarrierFreq.setSuffix("") self.doubleSpinBoxCarrierFreq.setDecimals(3) self.doubleSpinBoxCarrierFreq.setMinimum(0.0) - self.doubleSpinBoxCarrierFreq.setMaximum(99999999.0) + self.doubleSpinBoxCarrierFreq.setMaximum(99999999999.0) self.doubleSpinBoxCarrierFreq.setObjectName("doubleSpinBoxCarrierFreq") self.gridLayout.addWidget(self.doubleSpinBoxCarrierFreq, 0, 1, 1, 1) self.label_2 = QtWidgets.QLabel(DialogModulation) diff --git a/tests/test_modulator_gui.py b/tests/test_modulator_gui.py new file mode 100644 index 00000000..921a4789 --- /dev/null +++ b/tests/test_modulator_gui.py @@ -0,0 +1,118 @@ +import unittest + +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QDropEvent +from PyQt5.QtTest import QTest + +import tests.utils_testing +from tests.utils_testing import get_path_for_data_file +from urh.controller.MainController import MainController + +app = tests.utils_testing.app + + +class TestModulatorGUI(unittest.TestCase): + def setUp(self): + self.form = MainController() + self.form.add_signalfile(get_path_for_data_file("esaver.complex")) + self.signal = self.form.signal_tab_controller.signal_frames[0].signal + self.gframe = self.form.generator_tab_controller + self.form.ui.tabWidget.setCurrentIndex(2) + self.dialog = self.gframe.show_modulation_dialog() + + def test_add_remove_modulator(self): + self.assertEqual(len(self.dialog.modulators), 1) + self.dialog.ui.btnAddModulation.click() + self.assertEqual(len(self.dialog.modulators), 2) + self.dialog.ui.btnRemoveModulation.click() + self.assertEqual(len(self.dialog.modulators), 1) + + def test_edit_carrier(self): + self.dialog.ui.doubleSpinBoxCarrierFreq.setValue(1e9) + self.dialog.ui.doubleSpinBoxCarrierFreq.editingFinished.emit() + self.assertEqual(self.dialog.current_modulator.carrier_freq_hz, 1e9) + + self.dialog.ui.doubleSpinBoxCarrierPhase.setValue(100) + self.dialog.ui.doubleSpinBoxCarrierPhase.editingFinished.emit() + self.assertEqual(self.dialog.current_modulator.carrier_phase_deg, 100) + + def test_edit_data(self): + bits = self.dialog.current_modulator.display_bits + self.dialog.ui.linEdDataBits.setText("10101010") + self.dialog.ui.linEdDataBits.editingFinished.emit() + self.assertEqual(self.dialog.current_modulator.display_bits, "10101010") + + self.dialog.ui.btnRestoreBits.click() + self.dialog.ui.linEdDataBits.editingFinished.emit() + self.assertEqual(self.dialog.current_modulator.display_bits, bits) + + self.dialog.ui.spinBoxBitLength.setValue(1337) + self.dialog.ui.spinBoxBitLength.editingFinished.emit() + self.assertEqual(self.dialog.current_modulator.samples_per_bit, 1337) + + self.dialog.ui.spinBoxSampleRate.setValue(5e6) + self.dialog.ui.spinBoxSampleRate.editingFinished.emit() + self.assertEqual(self.dialog.current_modulator.sample_rate, 5e6) + + def test_edit_modulation(self): + self.dialog.ui.comboBoxModulationType.setCurrentText("Amplitude Shift Keying (ASK)") + self.assertEqual(self.dialog.ui.lParameterfor0.text(), "Amplitude for 0:") + self.assertEqual(self.dialog.ui.lParameterfor1.text(), "Amplitude for 1:") + self.assertFalse(self.dialog.ui.lGaussBT.isVisible()) + self.assertFalse(self.dialog.ui.spinBoxGaussBT.isVisible()) + self.assertFalse(self.dialog.ui.lGaussWidth.isVisible()) + self.assertFalse(self.dialog.ui.spinBoxGaussFilterWidth.isVisible()) + + self.dialog.ui.comboBoxModulationType.setCurrentText("Frequency Shift Keying (FSK)") + self.assertEqual(self.dialog.ui.lParameterfor0.text(), "Frequency for 0:") + self.assertEqual(self.dialog.ui.lParameterfor1.text(), "Frequency for 1:") + self.assertFalse(self.dialog.ui.lGaussBT.isVisible()) + self.assertFalse(self.dialog.ui.spinBoxGaussBT.isVisible()) + self.assertFalse(self.dialog.ui.lGaussWidth.isVisible()) + self.assertFalse(self.dialog.ui.spinBoxGaussFilterWidth.isVisible()) + + self.dialog.ui.comboBoxModulationType.setCurrentText("Gaussian Frequency Shift Keying (GFSK)") + self.assertEqual(self.dialog.ui.lParameterfor0.text(), "Frequency for 0:") + self.assertEqual(self.dialog.ui.lParameterfor1.text(), "Frequency for 1:") + self.assertTrue(self.dialog.ui.lGaussBT.isVisible()) + self.assertTrue(self.dialog.ui.spinBoxGaussBT.isVisible()) + self.assertTrue(self.dialog.ui.lGaussWidth.isVisible()) + self.assertTrue(self.dialog.ui.spinBoxGaussFilterWidth.isVisible()) + + self.dialog.ui.comboBoxModulationType.setCurrentText("Phase Shift Keying (PSK)") + self.assertEqual(self.dialog.ui.lParameterfor0.text(), "Phase (degree) for 0:") + self.assertEqual(self.dialog.ui.lParameterfor1.text(), "Phase (degree) for 1:") + self.assertFalse(self.dialog.ui.lGaussBT.isVisible()) + self.assertFalse(self.dialog.ui.spinBoxGaussBT.isVisible()) + self.assertFalse(self.dialog.ui.lGaussWidth.isVisible()) + self.assertFalse(self.dialog.ui.spinBoxGaussFilterWidth.isVisible()) + + self.dialog.ui.comboBoxModulationType.setCurrentText("Amplitude Shift Keying (ASK)") + self.assertEqual(self.dialog.ui.lParameterfor0.text(), "Amplitude for 0:") + self.assertEqual(self.dialog.ui.lParameterfor1.text(), "Amplitude for 1:") + self.assertFalse(self.dialog.ui.lGaussBT.isVisible()) + self.assertFalse(self.dialog.ui.spinBoxGaussBT.isVisible()) + self.assertFalse(self.dialog.ui.lGaussWidth.isVisible()) + self.assertFalse(self.dialog.ui.spinBoxGaussFilterWidth.isVisible()) + + self.assertEqual(int(self.dialog.ui.lSamplesInViewModulated.text()), int(self.dialog.ui.gVModulated.view_rect().width())) + + def test_signal_view(self): + tree_view = self.dialog.ui.treeViewSignals + tree_model = tree_view.model() + item = tree_model.rootItem.children[0].children[0] + index = tree_model.createIndex(0, 0, item) + rect = tree_view.visualRect(index) + QTest.mousePress(tree_view.viewport(), Qt.LeftButton, pos=rect.center()) + self.assertEqual(tree_view.selectedIndexes()[0], index) + mime_data = tree_model.mimeData(tree_view.selectedIndexes()) + drag_drop = QDropEvent(rect.center(), Qt.CopyAction|Qt.MoveAction, mime_data, Qt.LeftButton, Qt.NoModifier) + drag_drop.acceptProposedAction() + self.dialog.ui.gVOriginalSignal.dropEvent(drag_drop) + self.assertEqual(self.dialog.ui.gVOriginalSignal.sceneRect().width(), self.signal.num_samples) + + self.dialog.ui.cbShowDataBitsOnly.click() + self.dialog.ui.chkBoxLockSIV.click() + + self.assertEqual(int(self.dialog.ui.gVOriginalSignal.view_rect().width()), + int(self.dialog.ui.gVModulated.view_rect().width())) diff --git a/ui/modulation.ui b/ui/modulation.ui index 1ba5c0ea..22aeef61 100644 --- a/ui/modulation.ui +++ b/ui/modulation.ui @@ -137,7 +137,7 @@ 0.000000000000000 - 99999999.000000000000000 + 99999999999.000000000000000