Files
urh/tests/test_decoding_gui.py
Johannes Pohl 889dd05f25 proper support for complex16u (2xuint8) signals (#772)
* proper support for complex16 (2xint8) signals
  * fix Modulator: give correct iq type
  * fix View: Use general min/max and not from signal
  * Remove Padding

* fix requirements.txt (skip PyQt5.14.2 on Windows)

* fix noise area drawing

* fix demod view range for FSK and PSK

* Autofit signal in ModulatorDialog.py

* optimize Unittests
2020-05-01 13:49:32 +02:00

142 lines
5.8 KiB
Python

import os
import tempfile
from PyQt5.QtCore import QPoint, QTimer
from PyQt5.QtWidgets import qApp, QInputDialog, QMessageBox
from tests.QtTestCase import QtTestCase
from urh import settings
from urh.controller.dialogs.DecoderDialog import DecoderDialog
from urh.signalprocessing.Encoding import Encoding
class TestDecodingGUI(QtTestCase):
def setUp(self):
super().setUp()
self.add_signal_to_form("esaver.complex16s")
# add empty signal
path = os.path.join(tempfile.gettempdir(), "empty.complex")
open(path, "w").close()
self.form.add_signalfile(path)
signal = self.form.signal_tab_controller.signal_frames[0].signal
empty_signal = self.form.signal_tab_controller.signal_frames[1].signal
self.dialog = DecoderDialog(decodings=self.form.compare_frame_controller.decodings,
signals=[signal, empty_signal], parent=self.form,
project_manager=self.form.project_manager)
if self.SHOW:
self.dialog.show()
def test_edit_decoding(self):
self.dialog.ui.combobox_decodings.setCurrentIndex(1) # NRZI
self.assertEqual(self.dialog.ui.decoderchain.count(), 1) # One Invert
self.dialog.save_to_file()
def test_build_decoding(self):
self.dialog.ui.combobox_decodings.setCurrentIndex(4)
chain = [(settings.DECODING_INVERT,),
(settings.DECODING_ENOCEAN,),
(settings.DECODING_DIFFERENTIAL,),
(settings.DECODING_CARRIER,),
(settings.DECODING_BITORDER,),
(settings.DECODING_EDGE,),
(settings.DECODING_INVERT,),
(settings.DECODING_DATAWHITENING,),
(settings.DECODING_REDUNDANCY, "2"),
(settings.DECODING_MORSE, "1;3;1"),
(settings.DECODING_SUBSTITUTION, "0:1;1:0;"),
(settings.DECODING_EXTERNAL, "./;./"),
(settings.DECODING_CUT, "0;1010")]
decoding = Encoding(chain=[c for chain_item in chain for c in chain_item])
self.dialog.decodings[4] = decoding
self.dialog.set_e()
self.assertEqual(len(chain), self.dialog.ui.decoderchain.count())
for i in range(0, self.dialog.ui.decoderchain.count()):
self.dialog.ui.decoderchain.setCurrentRow(i)
self.dialog.set_information(2)
self.assertIn(chain[i][0], self.dialog.ui.info.text())
def test_set_signal(self):
self.dialog.ui.combobox_signals.setCurrentText("esaver")
bits = "".join(self.form.signal_tab_controller.signal_frames[0].proto_analyzer.plain_bits_str)
self.assertEqual(self.dialog.ui.inpt.text(), bits)
self.dialog.ui.combobox_signals.setCurrentIndex(0)
self.assertEqual(self.dialog.ui.inpt.text(), "10010110")
def test_set_signal_empty_message(self):
self.dialog.ui.combobox_signals.setCurrentText("empty")
self.assertEqual(self.dialog.ui.inpt.text(), "")
def test_select_items(self):
for i in range(0, self.dialog.ui.basefunctions.count()):
self.dialog.ui.basefunctions.setCurrentRow(i)
self.assertIn(self.dialog.ui.basefunctions.currentItem().text(), self.dialog.ui.info.text())
for i in range(0, self.dialog.ui.additionalfunctions.count()):
self.dialog.ui.additionalfunctions.setCurrentRow(i)
self.assertIn(self.dialog.ui.additionalfunctions.currentItem().text(), self.dialog.ui.info.text())
def test_context_menu(self):
self.dialog.ui.combobox_decodings.setCurrentIndex(4)
decoding = Encoding(chain=[settings.DECODING_INVERT])
self.dialog.decodings[4] = decoding
self.dialog.set_e()
self.assertEqual(1, self.dialog.ui.decoderchain.count())
self.dialog.ui.decoderchain.context_menu_pos = QPoint(0, 0)
menu = self.dialog.ui.decoderchain.create_context_menu()
menu_actions = [action.text() for action in menu.actions() if action.text()]
self.assertEqual(3, len(menu_actions))
def test_disable_enable_decoding_item(self):
self.dialog.ui.decoderchain.addItem(settings.DECODING_INVERT)
self.dialog.decoderchainUpdate()
self.assertEqual(self.dialog.ui.decoderchain.count(), 1)
self.dialog.ui.decoderchain.context_menu_pos = QPoint(0, 0)
self.dialog.ui.decoderchain.on_disable_function_triggered()
self.assertIn(settings.DECODING_DISABLED_PREFIX, self.dialog.ui.decoderchain.item(0).text())
self.dialog.ui.decoderchain.on_disable_function_triggered()
self.assertNotIn(self.dialog.ui.decoderchain.item(0).text(), settings.DECODING_DISABLED_PREFIX)
def test_save_remove_decoding(self):
def set_save_name():
timer.stop()
input_dialog = next(w for w in qApp.topLevelWidgets() if isinstance(w, QInputDialog))
input_dialog.setTextValue("Test decoding")
input_dialog.accept()
def accept_delete():
timer.stop()
message_box = next(w for w in qApp.topLevelWidgets() if isinstance(w, QMessageBox))
message_box.button(QMessageBox.Yes).click()
self.dialog.ui.decoderchain.addItem(settings.DECODING_CUT)
self.dialog.decoderchainUpdate()
self.assertEqual(self.dialog.ui.decoderchain.count(), 1)
timer = QTimer(self.dialog)
timer.setSingleShot(True)
timer.timeout.connect(set_save_name)
timer.start(10)
self.dialog.ui.saveas.click()
self.assertEqual(self.dialog.ui.combobox_decodings.currentText(), "Test decoding")
timer.timeout.disconnect(set_save_name)
timer.timeout.connect(accept_delete)
timer.start(10)
self.dialog.ui.delete_decoding.click()
self.assertNotEqual(self.dialog.ui.combobox_decodings.currentText(), "Test decoding")