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